mirror of
https://github.com/naturalcrit/homebrewery.git
synced 2026-01-05 10:12:41 +00:00
Merge branch 'master' into scrollbar
This commit is contained in:
@@ -64,6 +64,12 @@ jobs:
|
|||||||
- run:
|
- run:
|
||||||
name: Test - Mustache Spans
|
name: Test - Mustache Spans
|
||||||
command: npm run test:mustache-syntax
|
command: npm run test:mustache-syntax
|
||||||
|
- run:
|
||||||
|
name: Test - Definition Lists
|
||||||
|
command: npm run test:definition-lists
|
||||||
|
- run:
|
||||||
|
name: Test - Variables
|
||||||
|
command: npm run test:variables
|
||||||
- run:
|
- run:
|
||||||
name: Test - Routes
|
name: Test - Routes
|
||||||
command: npm run test:route
|
command: npm run test:route
|
||||||
|
|||||||
73
changelog.md
73
changelog.md
@@ -84,7 +84,70 @@ pre {
|
|||||||
## changelog
|
## changelog
|
||||||
For a full record of development, visit our [Github Page](https://github.com/naturalcrit/homebrewery).
|
For a full record of development, visit our [Github Page](https://github.com/naturalcrit/homebrewery).
|
||||||
|
|
||||||
### Wednesday 21/2/2024 - v3.11.0
|
### Monday 18/3/2024 - v3.12.0
|
||||||
|
{{taskList
|
||||||
|
|
||||||
|
##### 5e-Cleric
|
||||||
|
|
||||||
|
* [x] Fix language-specific hyphenation on print page
|
||||||
|
|
||||||
|
Fixes issue [#3294](https://github.com/naturalcrit/homebrewery/issues/3294)
|
||||||
|
|
||||||
|
* [x] Upgrade Font-Awesome to v6.51
|
||||||
|
|
||||||
|
* [x] Allow downloaded files to be uploaded via {{openSans **NEW {{fa,fa-plus-square}} → FROM UPLOAD {{fa,fa-upload}}**}}
|
||||||
|
|
||||||
|
##### G-Ambatte
|
||||||
|
|
||||||
|
* [x] Fix an edge case crash with empty documents
|
||||||
|
|
||||||
|
Fixes issue [#3315](https://github.com/naturalcrit/homebrewery/issues/3315)
|
||||||
|
|
||||||
|
* [x] Brews on the user page can be searched by tag; clicking a tag adds it to the filter
|
||||||
|
|
||||||
|
Fixes issue [#3164](https://github.com/naturalcrit/homebrewery/issues/3164)
|
||||||
|
|
||||||
|
* [x] Add *DiceFont* icons {{df,d20-20}} `{{df,icon-name}}`
|
||||||
|
|
||||||
|
##### abquintic
|
||||||
|
|
||||||
|
* [x] Fix ^super^ and ^^sub^^ highlighting in the text editor
|
||||||
|
|
||||||
|
* [x] Add new syntax for multiline Definition Lists:
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
Term
|
||||||
|
::Definition 1
|
||||||
|
::Definition 2
|
||||||
|
with more text
|
||||||
|
```
|
||||||
|
|
||||||
|
produces:
|
||||||
|
|
||||||
|
Term
|
||||||
|
::Definition 1
|
||||||
|
::Definition 2
|
||||||
|
with more text
|
||||||
|
|
||||||
|
Fixes issue [#2340](https://github.com/naturalcrit/homebrewery/issues/2340)
|
||||||
|
|
||||||
|
##### RKuerten :
|
||||||
|
* [x] Fix monster stat block backgrounds on print page
|
||||||
|
|
||||||
|
Fixes issue [#3275](https://github.com/naturalcrit/homebrewery/issues/3275)
|
||||||
|
|
||||||
|
* [x] Added new text editor theme: "Darkvision".
|
||||||
|
|
||||||
|
##### calculuschild, G-Ambatte, 5e-Cleric
|
||||||
|
|
||||||
|
* [x] Codebase and UI cleanup
|
||||||
|
}}
|
||||||
|
|
||||||
|
\page
|
||||||
|
|
||||||
|
|
||||||
|
### Friday 21/2/2024 - v3.11.0
|
||||||
{{taskList
|
{{taskList
|
||||||
|
|
||||||
##### Gazook89
|
##### Gazook89
|
||||||
@@ -166,14 +229,16 @@ Fixes issue [1488](https://github.com/naturalcrit/homebrewery/issues/1488)
|
|||||||
Fixes issues [2510](https://github.com/naturalcrit/homebrewery/issues/2510),
|
Fixes issues [2510](https://github.com/naturalcrit/homebrewery/issues/2510),
|
||||||
[2975](https://github.com/naturalcrit/homebrewery/issues/2975)
|
[2975](https://github.com/naturalcrit/homebrewery/issues/2975)
|
||||||
|
|
||||||
* [x] New Variables syntax. See below for details.
|
* [x] Brew Variables
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
\
|
||||||
|
|
||||||
{{wide
|
{{wide
|
||||||
|
|
||||||
### Brew Variable Syntax
|
### Brew Variable Syntax
|
||||||
|
|
||||||
You may already be familiar with `[link](url)` and `` syntax. We have expanded this to include a third `$[variable](text)` syntax. All three of these syntaxes now share a common set of features:
|
You may already be familiar with `[link](url)` and `` synax. We have expanded this to include a third `$[variable](text)` syntax. All three of these syntaxes now share a common set of features:
|
||||||
|
|
||||||
{{varSyntaxTable
|
{{varSyntaxTable
|
||||||
| syntax | description |
|
| syntax | description |
|
||||||
@@ -1512,7 +1577,7 @@ myStyle {color: black}
|
|||||||
### Sunday, 29/05/2016 - v2.1.0
|
### Sunday, 29/05/2016 - v2.1.0
|
||||||
- Finally added a syntax for doing spell lists. A bit in-depth about why this took so long. Essentially I'm running out of syntax to use in stardard Markdown. There are too many unique elements in the PHB-style to be mapped. I solved this earlier by stacking certain elements together (eg. an `<hr>` before a `blockquote` turns it into moster state block), but those are getting unweildly. I would like to simply wrap these in `div`s with classes, but unfortunately Markdown stops processing when within HTML blocks. To get around this I wrote my own override to the Markdown parser and lexer to process Markdown within a simple div class wrapper. This should open the door for more unique syntaxes in the future. Big step!
|
- Finally added a syntax for doing spell lists. A bit in-depth about why this took so long. Essentially I'm running out of syntax to use in stardard Markdown. There are too many unique elements in the PHB-style to be mapped. I solved this earlier by stacking certain elements together (eg. an `<hr>` before a `blockquote` turns it into moster state block), but those are getting unweildly. I would like to simply wrap these in `div`s with classes, but unfortunately Markdown stops processing when within HTML blocks. To get around this I wrote my own override to the Markdown parser and lexer to process Markdown within a simple div class wrapper. This should open the door for more unique syntaxes in the future. Big step!
|
||||||
- Override Ctrl+P (and cmd+P) to launch to the print page. Many people try to just print either the editing or share page to get a PDF. While this dones;t make much sense, I do get a ton of issues about it. So now if you try to do this, it'll just bring you imediately to the print page. Everybody wins!
|
- Override Ctrl+P (and cmd+P) to launch to the print page. Many people try to just print either the editing or share page to get a PDF. While this dones;t make much sense, I do get a ton of issues about it. So now if you try to do this, it'll just bring you imediately to the print page. Everybody wins!
|
||||||
- The onboarding flow has also been confusing a few users (Homepage -> new -> save -> edit page). If you edit the Homepage text now, a Call to Action to save your work will pop-up.
|
- The onboarding flow has also been confusing a few users (Homepage → new → save → edit page). If you edit the Homepage text now, a Call to Action to save your work will pop-up.
|
||||||
- Added a 'Recently Edited' and 'Recently Viewed' nav item to the edit and share page respectively. Each will remember the last 8 items you edited or viewed and when you viewed it. Makes use of the new title attribute of brews to easy navigatation.
|
- Added a 'Recently Edited' and 'Recently Viewed' nav item to the edit and share page respectively. Each will remember the last 8 items you edited or viewed and when you viewed it. Makes use of the new title attribute of brews to easy navigatation.
|
||||||
- Paragraphs now indent properly after lists (thanks u/slitjen!)
|
- Paragraphs now indent properly after lists (thanks u/slitjen!)
|
||||||
|
|
||||||
|
|||||||
@@ -122,6 +122,16 @@ const errorIndex = (props)=>{
|
|||||||
An error occurred while attempting to remove the user from the Homebrewery document author list!
|
An error occurred while attempting to remove the user from the Homebrewery document author list!
|
||||||
|
|
||||||
**Brew ID:** ${props.brew.brewId}`,
|
**Brew ID:** ${props.brew.brewId}`,
|
||||||
|
|
||||||
|
// Brew locked by Administrators error
|
||||||
|
'100' : dedent`
|
||||||
|
## This brew has been locked.
|
||||||
|
|
||||||
|
Please contact the Administrators to unlock this document.
|
||||||
|
|
||||||
|
**Brew ID:** ${props.brew.brewId}
|
||||||
|
|
||||||
|
**Brew Title:** ${props.brew.brewTitle}`,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
771
package-lock.json
generated
771
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
16
package.json
16
package.json
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "homebrewery",
|
"name": "homebrewery",
|
||||||
"description": "Create authentic looking D&D homebrews using only markdown",
|
"description": "Create authentic looking D&D homebrews using only markdown",
|
||||||
"version": "3.11.0",
|
"version": "3.12.0",
|
||||||
"engines": {
|
"engines": {
|
||||||
"npm": "^10.2.x",
|
"npm": "^10.2.x",
|
||||||
"node": "^20.8.x"
|
"node": "^20.8.x"
|
||||||
@@ -31,7 +31,7 @@
|
|||||||
"test:mustache-syntax:inline": "jest '.*(mustache-syntax).*' -t '^Inline:.*' --verbose --noStackTrace",
|
"test:mustache-syntax:inline": "jest '.*(mustache-syntax).*' -t '^Inline:.*' --verbose --noStackTrace",
|
||||||
"test:mustache-syntax:block": "jest '.*(mustache-syntax).*' -t '^Block:.*' --verbose --noStackTrace",
|
"test:mustache-syntax:block": "jest '.*(mustache-syntax).*' -t '^Block:.*' --verbose --noStackTrace",
|
||||||
"test:mustache-syntax:injection": "jest '.*(mustache-syntax).*' -t '^Injection:.*' --verbose --noStackTrace",
|
"test:mustache-syntax:injection": "jest '.*(mustache-syntax).*' -t '^Injection:.*' --verbose --noStackTrace",
|
||||||
"test:marked-extensions": "jest tests/markdown/marked-extensions.test.js --verbose --noStackTrace",
|
"test:definition-lists": "jest tests/markdown/definition-lists.test.js --verbose --noStackTrace",
|
||||||
"test:route": "jest tests/routes/static-pages.test.js --verbose",
|
"test:route": "jest tests/routes/static-pages.test.js --verbose",
|
||||||
"phb": "node scripts/phb.js",
|
"phb": "node scripts/phb.js",
|
||||||
"prod": "set NODE_ENV=production && npm run build",
|
"prod": "set NODE_ENV=production && npm run build",
|
||||||
@@ -82,9 +82,9 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/core": "^7.24.0",
|
"@babel/core": "^7.24.0",
|
||||||
"@babel/plugin-transform-runtime": "^7.24.0",
|
"@babel/plugin-transform-runtime": "^7.24.3",
|
||||||
"@babel/preset-env": "^7.24.0",
|
"@babel/preset-env": "^7.24.3",
|
||||||
"@babel/preset-react": "^7.23.3",
|
"@babel/preset-react": "^7.24.1",
|
||||||
"@googleapis/drive": "^8.7.0",
|
"@googleapis/drive": "^8.7.0",
|
||||||
"body-parser": "^1.20.2",
|
"body-parser": "^1.20.2",
|
||||||
"classnames": "^2.3.2",
|
"classnames": "^2.3.2",
|
||||||
@@ -93,7 +93,7 @@
|
|||||||
"create-react-class": "^15.7.0",
|
"create-react-class": "^15.7.0",
|
||||||
"dedent-tabs": "^0.10.3",
|
"dedent-tabs": "^0.10.3",
|
||||||
"expr-eval": "^2.0.2",
|
"expr-eval": "^2.0.2",
|
||||||
"express": "^4.18.3",
|
"express": "^4.19.1",
|
||||||
"express-async-handler": "^1.2.0",
|
"express-async-handler": "^1.2.0",
|
||||||
"express-static-gzip": "2.1.7",
|
"express-static-gzip": "2.1.7",
|
||||||
"fs-extra": "11.2.0",
|
"fs-extra": "11.2.0",
|
||||||
@@ -107,7 +107,7 @@
|
|||||||
"marked-smartypants-lite": "^1.0.2",
|
"marked-smartypants-lite": "^1.0.2",
|
||||||
"markedLegacy": "npm:marked@^0.3.19",
|
"markedLegacy": "npm:marked@^0.3.19",
|
||||||
"moment": "^2.30.1",
|
"moment": "^2.30.1",
|
||||||
"mongoose": "^8.2.1",
|
"mongoose": "^8.2.3",
|
||||||
"nanoid": "3.3.4",
|
"nanoid": "3.3.4",
|
||||||
"nconf": "^0.12.1",
|
"nconf": "^0.12.1",
|
||||||
"react": "^18.2.0",
|
"react": "^18.2.0",
|
||||||
@@ -121,7 +121,7 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"eslint": "^8.57.0",
|
"eslint": "^8.57.0",
|
||||||
"eslint-plugin-jest": "^27.9.0",
|
"eslint-plugin-jest": "^27.9.0",
|
||||||
"eslint-plugin-react": "^7.34.0",
|
"eslint-plugin-react": "^7.34.1",
|
||||||
"jest": "^29.7.0",
|
"jest": "^29.7.0",
|
||||||
"jest-expect-message": "^1.1.3",
|
"jest-expect-message": "^1.1.3",
|
||||||
"postcss-less": "^6.0.0",
|
"postcss-less": "^6.0.0",
|
||||||
|
|||||||
@@ -54,6 +54,10 @@ const api = {
|
|||||||
});
|
});
|
||||||
stub = stub?.toObject();
|
stub = stub?.toObject();
|
||||||
|
|
||||||
|
if(stub?.lock?.locked && accessType != 'edit') {
|
||||||
|
throw { HBErrorCode: '100', code: stub.lock.code, message: stub.lock.message, brewId: stub.shareId, brewTitle: stub.title };
|
||||||
|
}
|
||||||
|
|
||||||
// If there is a google id, try to find the google brew
|
// If there is a google id, try to find the google brew
|
||||||
if(!stubOnly && (googleId || stub?.googleId)) {
|
if(!stubOnly && (googleId || stub?.googleId)) {
|
||||||
let googleError;
|
let googleError;
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ describe('Tests for api', ()=>{
|
|||||||
id : '123456789012345678901234567890123abcdefghijkl'
|
id : '123456789012345678901234567890123abcdefghijkl'
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(googleId).toEqual('123456789012345678901234567890123');
|
expect(googleId).toEqual('123456789012345678901234567890123');
|
||||||
expect(id).toEqual('abcdefghijkl');
|
expect(id).toEqual('abcdefghijkl');
|
||||||
});
|
});
|
||||||
@@ -128,7 +128,7 @@ describe('Tests for api', ()=>{
|
|||||||
id : '123456789012345678901234567890123abcdefghij'
|
id : '123456789012345678901234567890123abcdefghij'
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(googleId).toEqual('123456789012345678901234567890123');
|
expect(googleId).toEqual('123456789012345678901234567890123');
|
||||||
expect(id).toEqual('abcdefghij');
|
expect(id).toEqual('abcdefghij');
|
||||||
});
|
});
|
||||||
@@ -298,6 +298,18 @@ describe('Tests for api', ()=>{
|
|||||||
expect(model.get).toHaveBeenCalledWith({ shareId: '1' });
|
expect(model.get).toHaveBeenCalledWith({ shareId: '1' });
|
||||||
expect(google.getGoogleBrew).toHaveBeenCalledWith('2', '1', 'share');
|
expect(google.getGoogleBrew).toHaveBeenCalledWith('2', '1', 'share');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('access is denied to a locked brew', async()=>{
|
||||||
|
const lockBrew = { title: 'test brew', shareId: '1', lock: { locked: true, code: 404, message: 'brew locked' } };
|
||||||
|
model.get = jest.fn(()=>toBrewPromise(lockBrew));
|
||||||
|
api.getId = jest.fn(()=>({ id: '1', googleId: undefined }));
|
||||||
|
|
||||||
|
const fn = api.getBrew('share', false);
|
||||||
|
const req = { brew: {} };
|
||||||
|
const next = jest.fn();
|
||||||
|
|
||||||
|
await expect(fn(req, null, next)).rejects.toEqual({ 'HBErrorCode': '100', 'brewId': '1', 'brewTitle': 'test brew', 'code': 404, 'message': 'brew locked' });
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('mergeBrewText', ()=>{
|
describe('mergeBrewText', ()=>{
|
||||||
|
|||||||
@@ -321,7 +321,7 @@ const definitionListsInline = {
|
|||||||
renderer(token) {
|
renderer(token) {
|
||||||
return `<dl>${token.definitions.reduce((html, def)=>{
|
return `<dl>${token.definitions.reduce((html, def)=>{
|
||||||
return `${html}<dt>${this.parser.parseInline(def.dt)}</dt>`
|
return `${html}<dt>${this.parser.parseInline(def.dt)}</dt>`
|
||||||
+ `<dd>${this.parser.parseInline(def.dd)}</dd>`;
|
+ `<dd>${this.parser.parseInline(def.dd)}</dd>\n`;
|
||||||
}, '')}</dl>`;
|
}, '')}</dl>`;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -337,12 +337,14 @@ const definitionListsMultiline = {
|
|||||||
const definitions = [];
|
const definitions = [];
|
||||||
while (match = regex.exec(src)) {
|
while (match = regex.exec(src)) {
|
||||||
if(match[1]) {
|
if(match[1]) {
|
||||||
|
if(this.lexer.blockTokens(match[1].trim())[0]?.type !== 'paragraph') // DT must not be another block-level token besides <p>
|
||||||
|
break;
|
||||||
definitions.push({
|
definitions.push({
|
||||||
dt : this.lexer.inlineTokens(match[1].trim()),
|
dt : this.lexer.inlineTokens(match[1].trim()),
|
||||||
dds : []
|
dds : []
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if(match[2]) {
|
if(match[2] && definitions.length) {
|
||||||
definitions[definitions.length - 1].dds.push(
|
definitions[definitions.length - 1].dds.push(
|
||||||
this.lexer.inlineTokens(match[2].trim().replace(/\s/g, ' '))
|
this.lexer.inlineTokens(match[2].trim().replace(/\s/g, ' '))
|
||||||
);
|
);
|
||||||
@@ -615,7 +617,7 @@ function MarkedVariables() {
|
|||||||
//^=====--------------------< Variable Handling >-------------------=====^//
|
//^=====--------------------< Variable Handling >-------------------=====^//
|
||||||
|
|
||||||
Marked.use(MarkedVariables());
|
Marked.use(MarkedVariables());
|
||||||
Marked.use({ extensions: [mustacheSpans, mustacheDivs, mustacheInjectInline, definitionListsInline, definitionListsMultiline, superSubScripts] });
|
Marked.use({ extensions: [definitionListsMultiline, definitionListsInline, superSubScripts, mustacheSpans, mustacheDivs, mustacheInjectInline] });
|
||||||
Marked.use(mustacheInjectBlock);
|
Marked.use(mustacheInjectBlock);
|
||||||
Marked.use({ renderer: renderer, tokenizer: tokenizer, mangle: false });
|
Marked.use({ renderer: renderer, tokenizer: tokenizer, mangle: false });
|
||||||
Marked.use(MarkedExtendedTables(), MarkedGFMHeadingId(), MarkedSmartypantsLite());
|
Marked.use(MarkedExtendedTables(), MarkedGFMHeadingId(), MarkedSmartypantsLite());
|
||||||
|
|||||||
@@ -6,19 +6,19 @@ describe('Inline Definition Lists', ()=>{
|
|||||||
test('No Term 1 Definition', function() {
|
test('No Term 1 Definition', function() {
|
||||||
const source = ':: My First Definition\n\n';
|
const source = ':: My First Definition\n\n';
|
||||||
const rendered = Markdown.render(source).trim();
|
const rendered = Markdown.render(source).trim();
|
||||||
expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('<dl><dt></dt><dd>My First Definition</dd></dl>');
|
expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('<dl><dt></dt><dd>My First Definition</dd>\n</dl>');
|
||||||
});
|
});
|
||||||
|
|
||||||
test('Single Definition Term', function() {
|
test('Single Definition Term', function() {
|
||||||
const source = 'My term :: My First Definition\n\n';
|
const source = 'My term :: My First Definition\n\n';
|
||||||
const rendered = Markdown.render(source).trim();
|
const rendered = Markdown.render(source).trim();
|
||||||
expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('<dl><dt>My term</dt><dd>My First Definition</dd></dl>');
|
expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('<dl><dt>My term</dt><dd>My First Definition</dd>\n</dl>');
|
||||||
});
|
});
|
||||||
|
|
||||||
test('Multiple Definition Terms', function() {
|
test('Multiple Definition Terms', function() {
|
||||||
const source = 'Term 1::Definition of Term 1\nTerm 2::Definition of Term 2\n\n';
|
const source = 'Term 1::Definition of Term 1\nTerm 2::Definition of Term 2\n\n';
|
||||||
const rendered = Markdown.render(source).trim();
|
const rendered = Markdown.render(source).trim();
|
||||||
expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('<dl><dt>Term 1</dt><dd>Definition of Term 1</dd><dt>Term 2</dt><dd>Definition of Term 2</dd></dl>');
|
expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('<dl><dt>Term 1</dt><dd>Definition of Term 1</dd>\n<dt>Term 2</dt><dd>Definition of Term 2</dd>\n</dl>');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -68,7 +68,7 @@ describe('Multiline Definition Lists', ()=>{
|
|||||||
test('Multiple Term, Single multi-line definition, followed by an inline dl', function() {
|
test('Multiple Term, Single multi-line definition, followed by an inline dl', function() {
|
||||||
const source = 'Term 1\n::Definition 1\nand more and more\n\nTerm 2\n::Definition 1\n::Definition 2\n\n::Inline Definition (no term)';
|
const source = 'Term 1\n::Definition 1\nand more and more\n\nTerm 2\n::Definition 1\n::Definition 2\n\n::Inline Definition (no term)';
|
||||||
const rendered = Markdown.render(source).trim();
|
const rendered = Markdown.render(source).trim();
|
||||||
expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('<dl><dt>Term 1</dt>\n<dd>Definition 1 and more and more</dd>\n<dt>Term 2</dt>\n<dd>Definition 1</dd>\n<dd>Definition 2</dd></dl><dl><dt></dt><dd>Inline Definition (no term)</dd></dl>');
|
expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('<dl><dt>Term 1</dt>\n<dd>Definition 1 and more and more</dd>\n<dt>Term 2</dt>\n<dd>Definition 1</dd>\n<dd>Definition 2</dd></dl><dl><dt></dt><dd>Inline Definition (no term)</dd>\n</dl>');
|
||||||
});
|
});
|
||||||
|
|
||||||
test('Multiple Term, Single multi-line definition, followed by paragraph', function() {
|
test('Multiple Term, Single multi-line definition, followed by paragraph', function() {
|
||||||
@@ -76,4 +76,16 @@ describe('Multiline Definition Lists', ()=>{
|
|||||||
const rendered = Markdown.render(source).trim();
|
const rendered = Markdown.render(source).trim();
|
||||||
expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('<dl><dt>Term 1</dt>\n<dd>Definition 1 and more and more</dd>\n<dt>Term 2</dt>\n<dd>Definition 1</dd>\n<dd>Definition 2</dd></dl><p>Paragraph</p>');
|
expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('<dl><dt>Term 1</dt>\n<dd>Definition 1 and more and more</dd>\n<dt>Term 2</dt>\n<dd>Definition 1</dd>\n<dd>Definition 2</dd></dl><p>Paragraph</p>');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('Block Token cannot be the Term of a multi-line definition', function() {
|
||||||
|
const source = '## Header\n::Definition 1 of a single-line DL\n::Definition 1 of another single-line DL';
|
||||||
|
const rendered = Markdown.render(source).trim();
|
||||||
|
expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('<h2 id="header">Header</h2>\n<dl><dt></dt><dd>Definition 1 of a single-line DL</dd>\n<dt></dt><dd>Definition 1 of another single-line DL</dd>\n</dl>');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Inline DL has priority over Multiline', function() {
|
||||||
|
const source = 'Term 1 :: Inline definition 1\n:: Inline definition 2 (no DT)';
|
||||||
|
const rendered = Markdown.render(source).trim();
|
||||||
|
expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe('<dl><dt>Term 1</dt><dd>Inline definition 1</dd>\n<dt></dt><dd>Inline definition 2 (no DT)</dd>\n</dl>');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
@import (less) './themes/assets/assets.less';
|
@import (less) './themes/assets/assets.less';
|
||||||
@import (less) './themes/fonts/icon fonts/font-icons.less';
|
@import (less) './themes/fonts/icon fonts/font-icons.less';
|
||||||
|
@import (less) './themes/fonts/icon fonts/dicefont.less';
|
||||||
|
|
||||||
:root {
|
:root {
|
||||||
//Colors
|
//Colors
|
||||||
|
|||||||
@@ -1,118 +1,114 @@
|
|||||||
/*
|
/* Icon Font: dicefont */
|
||||||
Icon Font: dicefont
|
|
||||||
*/
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'DiceFont';
|
font-family : 'DiceFont';
|
||||||
src: url('../../../fonts/5e/dicefont.woff2') format('woff2'),
|
font-style : normal;
|
||||||
url('../../../fonts/5e/dicefont.woff') format('woff');
|
font-weight : normal;
|
||||||
font-weight: normal;
|
src : url('../../../fonts/icon fonts/dicefont.woff2');
|
||||||
font-style: normal;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
.df {
|
.df {
|
||||||
display: inline-block;
|
display : inline-block;
|
||||||
font-family: 'DiceFont';
|
font-family : 'DiceFont';
|
||||||
font-style: normal;
|
font-style : normal;
|
||||||
font-weight: normal;
|
font-weight : normal;
|
||||||
font-variant: normal;
|
font-variant : normal;
|
||||||
line-height: 1;
|
line-height : 1;
|
||||||
text-decoration: inherit;
|
text-decoration : inherit;
|
||||||
text-rendering: optimizeLegibility;
|
text-transform : none;
|
||||||
text-transform: none;
|
text-rendering : optimizeLegibility;
|
||||||
-moz-osx-font-smoothing: grayscale;
|
-moz-osx-font-smoothing : grayscale;
|
||||||
-webkit-font-smoothing: antialiased;
|
-webkit-font-smoothing : antialiased;
|
||||||
font-smooth: antialiased;
|
&.F::before { content : '\f190'; }
|
||||||
&.F:before { content: '\f190'; }
|
&.F-minus::before { content : '\f191'; }
|
||||||
&.F-minus:before { content: '\f191'; }
|
&.F-plus::before { content : '\f192'; }
|
||||||
&.F-plus:before { content: '\f192'; }
|
&.F-zero::before { content : '\f193'; }
|
||||||
&.F-zero:before { content: '\f193'; }
|
&.d10::before { content : '\f194'; }
|
||||||
&.d10:before { content: '\f194'; }
|
&.d10-0::before { content : '\f100'; }
|
||||||
&.d10-0:before { content: '\f100'; }
|
&.d10-1::before { content : '\f101'; }
|
||||||
&.d10-1:before { content: '\f101'; }
|
&.d10-10::before { content : '\f102'; }
|
||||||
&.d10-10:before { content: '\f102'; }
|
&.d10-2::before { content : '\f103'; }
|
||||||
&.d10-2:before { content: '\f103'; }
|
&.d10-3::before { content : '\f104'; }
|
||||||
&.d10-3:before { content: '\f104'; }
|
&.d10-4::before { content : '\f105'; }
|
||||||
&.d10-4:before { content: '\f105'; }
|
&.d10-5::before { content : '\f106'; }
|
||||||
&.d10-5:before { content: '\f106'; }
|
&.d10-6::before { content : '\f107'; }
|
||||||
&.d10-6:before { content: '\f107'; }
|
&.d10-7::before { content : '\f108'; }
|
||||||
&.d10-7:before { content: '\f108'; }
|
&.d10-8::before { content : '\f109'; }
|
||||||
&.d10-8:before { content: '\f109'; }
|
&.d10-9::before { content : '\f10a'; }
|
||||||
&.d10-9:before { content: '\f10a'; }
|
&.d12::before { content : '\f195'; }
|
||||||
&.d12:before { content: '\f195'; }
|
&.d12-1::before { content : '\f10b'; }
|
||||||
&.d12-1:before { content: '\f10b'; }
|
&.d12-10::before { content : '\f10c'; }
|
||||||
&.d12-10:before { content: '\f10c'; }
|
&.d12-11::before { content : '\f10d'; }
|
||||||
&.d12-11:before { content: '\f10d'; }
|
&.d12-12::before { content : '\f10e'; }
|
||||||
&.d12-12:before { content: '\f10e'; }
|
&.d12-2::before { content : '\f10f'; }
|
||||||
&.d12-2:before { content: '\f10f'; }
|
&.d12-3::before { content : '\f110'; }
|
||||||
&.d12-3:before { content: '\f110'; }
|
&.d12-4::before { content : '\f111'; }
|
||||||
&.d12-4:before { content: '\f111'; }
|
&.d12-5::before { content : '\f112'; }
|
||||||
&.d12-5:before { content: '\f112'; }
|
&.d12-6::before { content : '\f113'; }
|
||||||
&.d12-6:before { content: '\f113'; }
|
&.d12-7::before { content : '\f114'; }
|
||||||
&.d12-7:before { content: '\f114'; }
|
&.d12-8::before { content : '\f115'; }
|
||||||
&.d12-8:before { content: '\f115'; }
|
&.d12-9::before { content : '\f116'; }
|
||||||
&.d12-9:before { content: '\f116'; }
|
&.d2::before { content : '\f196'; }
|
||||||
&.d2:before { content: '\f196'; }
|
&.d2-1::before { content : '\f117'; }
|
||||||
&.d2-1:before { content: '\f117'; }
|
&.d2-2::before { content : '\f118'; }
|
||||||
&.d2-2:before { content: '\f118'; }
|
&.d20::before { content : '\f197'; }
|
||||||
&.d20:before { content: '\f197'; }
|
&.d20-1::before { content : '\f119'; }
|
||||||
&.d20-1:before { content: '\f119'; }
|
&.d20-10::before { content : '\f11a'; }
|
||||||
&.d20-10:before { content: '\f11a'; }
|
&.d20-11::before { content : '\f11b'; }
|
||||||
&.d20-11:before { content: '\f11b'; }
|
&.d20-12::before { content : '\f11c'; }
|
||||||
&.d20-12:before { content: '\f11c'; }
|
&.d20-13::before { content : '\f11d'; }
|
||||||
&.d20-13:before { content: '\f11d'; }
|
&.d20-14::before { content : '\f11e'; }
|
||||||
&.d20-14:before { content: '\f11e'; }
|
&.d20-15::before { content : '\f11f'; }
|
||||||
&.d20-15:before { content: '\f11f'; }
|
&.d20-16::before { content : '\f120'; }
|
||||||
&.d20-16:before { content: '\f120'; }
|
&.d20-17::before { content : '\f121'; }
|
||||||
&.d20-17:before { content: '\f121'; }
|
&.d20-18::before { content : '\f122'; }
|
||||||
&.d20-18:before { content: '\f122'; }
|
&.d20-19::before { content : '\f123'; }
|
||||||
&.d20-19:before { content: '\f123'; }
|
&.d20-2::before { content : '\f124'; }
|
||||||
&.d20-2:before { content: '\f124'; }
|
&.d20-20::before { content : '\f125'; }
|
||||||
&.d20-20:before { content: '\f125'; }
|
&.d20-3::before { content : '\f126'; }
|
||||||
&.d20-3:before { content: '\f126'; }
|
&.d20-4::before { content : '\f127'; }
|
||||||
&.d20-4:before { content: '\f127'; }
|
&.d20-5::before { content : '\f128'; }
|
||||||
&.d20-5:before { content: '\f128'; }
|
&.d20-6::before { content : '\f129'; }
|
||||||
&.d20-6:before { content: '\f129'; }
|
&.d20-7::before { content : '\f12a'; }
|
||||||
&.d20-7:before { content: '\f12a'; }
|
&.d20-8::before { content : '\f12b'; }
|
||||||
&.d20-8:before { content: '\f12b'; }
|
&.d20-9::before { content : '\f12c'; }
|
||||||
&.d20-9:before { content: '\f12c'; }
|
&.d4::before { content : '\f198'; }
|
||||||
&.d4:before { content: '\f198'; }
|
&.d4-1::before { content : '\f12d'; }
|
||||||
&.d4-1:before { content: '\f12d'; }
|
&.d4-2::before { content : '\f12e'; }
|
||||||
&.d4-2:before { content: '\f12e'; }
|
&.d4-3::before { content : '\f12f'; }
|
||||||
&.d4-3:before { content: '\f12f'; }
|
&.d4-4::before { content : '\f130'; }
|
||||||
&.d4-4:before { content: '\f130'; }
|
&.d6::before { content : '\f199'; }
|
||||||
&.d6:before { content: '\f199'; }
|
&.d6-1::before { content : '\f131'; }
|
||||||
&.d6-1:before { content: '\f131'; }
|
&.d6-2::before { content : '\f132'; }
|
||||||
&.d6-2:before { content: '\f132'; }
|
&.d6-3::before { content : '\f133'; }
|
||||||
&.d6-3:before { content: '\f133'; }
|
&.d6-4::before { content : '\f134'; }
|
||||||
&.d6-4:before { content: '\f134'; }
|
&.d6-5::before { content : '\f135'; }
|
||||||
&.d6-5:before { content: '\f135'; }
|
&.d6-6::before { content : '\f136'; }
|
||||||
&.d6-6:before { content: '\f136'; }
|
&.d8::before { content : '\f19a'; }
|
||||||
&.d8:before { content: '\f19a'; }
|
&.d8-1::before { content : '\f137'; }
|
||||||
&.d8-1:before { content: '\f137'; }
|
&.d8-2::before { content : '\f138'; }
|
||||||
&.d8-2:before { content: '\f138'; }
|
&.d8-3::before { content : '\f139'; }
|
||||||
&.d8-3:before { content: '\f139'; }
|
&.d8-4::before { content : '\f13a'; }
|
||||||
&.d8-4:before { content: '\f13a'; }
|
&.d8-5::before { content : '\f13b'; }
|
||||||
&.d8-5:before { content: '\f13b'; }
|
&.d8-6::before { content : '\f13c'; }
|
||||||
&.d8-6:before { content: '\f13c'; }
|
&.d8-7::before { content : '\f13d'; }
|
||||||
&.d8-7:before { content: '\f13d'; }
|
&.d8-8::before { content : '\f13e'; }
|
||||||
&.d8-8:before { content: '\f13e'; }
|
&.dot-d6::before { content : '\f19b'; }
|
||||||
&.dot-d6:before { content: '\f19b'; }
|
&.dot-d6-1::before { content : '\f13f'; }
|
||||||
&.dot-d6-1:before { content: '\f13f'; }
|
&.dot-d6-2::before { content : '\f140'; }
|
||||||
&.dot-d6-2:before { content: '\f140'; }
|
&.dot-d6-3::before { content : '\f141'; }
|
||||||
&.dot-d6-3:before { content: '\f141'; }
|
&.dot-d6-4::before { content : '\f142'; }
|
||||||
&.dot-d6-4:before { content: '\f142'; }
|
&.dot-d6-5::before { content : '\f143'; }
|
||||||
&.dot-d6-5:before { content: '\f143'; }
|
&.dot-d6-6::before { content : '\f18f'; }
|
||||||
&.dot-d6-6:before { content: '\f18f'; }
|
&.small-dot-d6-1::before { content : '\f183'; }
|
||||||
&.small-dot-d6-1:before { content: '\f183'; }
|
&.small-dot-d6-2::before { content : '\f184'; }
|
||||||
&.small-dot-d6-2:before { content: '\f184'; }
|
&.small-dot-d6-3::before { content : '\f185'; }
|
||||||
&.small-dot-d6-3:before { content: '\f185'; }
|
&.small-dot-d6-4::before { content : '\f186'; }
|
||||||
&.small-dot-d6-4:before { content: '\f186'; }
|
&.small-dot-d6-5::before { content : '\f187'; }
|
||||||
&.small-dot-d6-5:before { content: '\f187'; }
|
&.small-dot-d6-6::before { content : '\f188'; }
|
||||||
&.small-dot-d6-6:before { content: '\f188'; }
|
&.solid-small-dot-d6-1::before { content : '\f189'; }
|
||||||
&.solid-small-dot-d6-1:before { content: '\f189'; }
|
&.solid-small-dot-d6-2::before { content : '\f18a'; }
|
||||||
&.solid-small-dot-d6-2:before { content: '\f18a'; }
|
&.solid-small-dot-d6-3::before { content : '\f18b'; }
|
||||||
&.solid-small-dot-d6-3:before { content: '\f18b'; }
|
&.solid-small-dot-d6-4::before { content : '\f18c'; }
|
||||||
&.solid-small-dot-d6-4:before { content: '\f18c'; }
|
&.solid-small-dot-d6-5::before { content : '\f18d'; }
|
||||||
&.solid-small-dot-d6-5:before { content: '\f18d'; }
|
&.solid-small-dot-d6-6::before { content : '\f18e'; }
|
||||||
&.solid-small-dot-d6-6:before { content: '\f18e'; }
|
|
||||||
}
|
}
|
||||||
Binary file not shown.
@@ -1,6 +1,6 @@
|
|||||||
/* Main Font, serif */
|
/* Icon Font: Elderberry Inn */
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family : 'Eldeberry-Inn';
|
font-family : 'Elderberry-Inn';
|
||||||
font-style : normal;
|
font-style : normal;
|
||||||
font-weight : normal;
|
font-weight : normal;
|
||||||
src : url('../../../fonts/icon fonts/Elderberry-Inn-Icons.woff2');
|
src : url('../../../fonts/icon fonts/Elderberry-Inn-Icons.woff2');
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
span.ei {
|
span.ei {
|
||||||
display : inline-block;
|
display : inline-block;
|
||||||
margin-right : 3px;
|
margin-right : 3px;
|
||||||
font-family : 'Eldeberry-Inn';
|
font-family : 'Elderberry-Inn';
|
||||||
line-height : 1;
|
line-height : 1;
|
||||||
vertical-align : baseline;
|
vertical-align : baseline;
|
||||||
-moz-osx-font-smoothing : grayscale;
|
-moz-osx-font-smoothing : grayscale;
|
||||||
|
|||||||
Reference in New Issue
Block a user