From 64d133f8f63cc1a84ec1d65ea184c687b31b3156 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Mon, 19 Jul 2021 20:04:25 -0400 Subject: [PATCH] Definition List to Markdown Extension. New syntax. --- .../editor/snippetbar/snippets/magic.gen.js | 10 ++--- .../snippetbar/snippets/monsterblock.gen.js | 14 +++---- shared/naturalcrit/markdown.js | 42 +++++++++++++++++-- themes/5ePhb.style.less | 26 +++++++----- 4 files changed, 65 insertions(+), 27 deletions(-) diff --git a/client/homebrew/editor/snippetbar/snippets/magic.gen.js b/client/homebrew/editor/snippetbar/snippets/magic.gen.js index a7765e979..caea3c4af 100644 --- a/client/homebrew/editor/snippetbar/snippets/magic.gen.js +++ b/client/homebrew/editor/snippetbar/snippets/magic.gen.js @@ -82,11 +82,11 @@ module.exports = { return [ `#### ${_.sample(spellNames)}`, `*${_.sample(level)}-level ${_.sample(spellSchools)}*`, - '___', - '- **Casting Time:** 1 action', - `- **Range:** ${_.sample(['Self', 'Touch', '30 feet', '60 feet'])}`, - `- **Components:** ${components}`, - `- **Duration:** ${_.sample(['Until dispelled', '1 round', 'Instantaneous', 'Concentration, up to 10 minutes', '1 hour'])}`, + '', + '**Casting Time:** :: 1 action', + `**Range:** :: ${_.sample(['Self', 'Touch', '30 feet', '60 feet'])}`, + `**Components:** :: ${components}`, + `**Duration:** :: ${_.sample(['Until dispelled', '1 round', 'Instantaneous', 'Concentration, up to 10 minutes', '1 hour'])}`, '', 'A flame, equivalent in brightness to a torch, springs from an object that you touch. ', 'The effect look like a regular flame, but it creates no heat and doesn\'t use oxygen. ', diff --git a/client/homebrew/editor/snippetbar/snippets/monsterblock.gen.js b/client/homebrew/editor/snippetbar/snippets/monsterblock.gen.js index c455e90f5..4db3019ea 100644 --- a/client/homebrew/editor/snippetbar/snippets/monsterblock.gen.js +++ b/client/homebrew/editor/snippetbar/snippets/monsterblock.gen.js @@ -146,18 +146,18 @@ module.exports = { ## ${getMonsterName()} *${getType()}, ${getAlignment()}* ___ - : **Armor Class** : ${_.random(10, 20)} (chain mail, shield) - : **Hit Points** : ${_.random(1, 150)}(1d4 + 5) - : **Speed** : ${_.random(0, 50)}ft. + **Armor Class** :: ${_.random(10, 20)} (chain mail, shield) + **Hit Points** :: ${_.random(1, 150)}(1d4 + 5) + **Speed** :: ${_.random(0, 50)}ft. ___ | STR | DEX | CON | INT | WIS | CHA | |:-----:|:-----:|:-----:|:-----:|:-----:|:-----:| ${getStats()} ___ - : **Condition Immunities** : ${genList(['groggy', 'swagged', 'weak-kneed', 'buzzed', 'groovy', 'melancholy', 'drunk'], 3)} - : **Senses** : darkvision 60 ft., passive Perception ${_.random(3, 20)} - : **Languages** : ${genList(['Common', 'Pottymouth', 'Gibberish', 'Latin', 'Jive'], 2)} - : **Challenge** : ${_.random(0, 15)} (${_.random(10, 10000)} XP) + **Condition Immunities** :: ${genList(['groggy', 'swagged', 'weak-kneed', 'buzzed', 'groovy', 'melancholy', 'drunk'], 3)} + **Senses** :: darkvision 60 ft., passive Perception ${_.random(3, 20)} + **Languages** :: ${genList(['Common', 'Pottymouth', 'Gibberish', 'Latin', 'Jive'], 2)} + **Challenge** :: ${_.random(0, 15)} (${_.random(10, 10000)} XP) ___ : ${_.times(_.random(genLines, genLines + 2), function(){return genAbilities();}).join('\n\t\t\t\n\t\t\t')} diff --git a/shared/naturalcrit/markdown.js b/shared/naturalcrit/markdown.js index a8c287c93..37784f740 100644 --- a/shared/naturalcrit/markdown.js +++ b/shared/naturalcrit/markdown.js @@ -74,7 +74,7 @@ const mustacheSpans = { const mustacheDivs = { name : 'mustacheDivs', level : 'block', - start(src) { return src.match(/^ *{{[^{]/)?.index; }, // Hint to Marked.js to stop and check for a match + start(src) { return src.match(/^ *{{[^{]/m)?.index; }, // Hint to Marked.js to stop and check for a match tokenizer(src, tokens) { const completeBlock = /^ *{{.*\n *}}/s; // Regex for the complete token const blockRegex = /^ *{{(?:="[\w,\-. ]*"|[^"'{}\s])*$|^ *}}$/gm; @@ -116,7 +116,43 @@ const mustacheDivs = { } }; -Markdown.use({ extensions: [mustacheSpans, mustacheDivs] }); +const definitionLists = { + name : 'definitionLists', + level : 'block', + start(src) { return src.match(/^.*?::.*/m)?.index; }, // Hint to Marked.js to stop and check for a match + tokenizer(src, tokens) { + const regex = /^([^\n]*?)::([^\n]*)/ym; + let match; + let endIndex = 0; + const definitions = []; + //if(!src.match(/^[^\n]*?::/)) {console.log('return'); return;} + while (match = regex.exec(src)) { + definitions.push({ + dt : this.inlineTokens(match[1].trim()), + dd : this.inlineTokens(match[2].trim()) + }); + //console.log(regexl) + endIndex = regex.lastIndex; + } + if(definitions.length) { + return { + type : 'definitionLists', + raw : src.slice(0, endIndex), + definitions + }; + } + }, + renderer(token) { + return `
+ ${token.definitions.reduce((html, def)=>{ + return `${html}
${this.parseInline(def.dt)}
` + + `
${this.parseInline(def.dd)}
\n`; + }, '')} +
`; + } +}; + +Markdown.use({ extensions: [mustacheSpans, mustacheDivs, definitionLists] }); //Fix local links in the Preview iFrame to link inside the frame renderer.link = function (href, title, text) { @@ -216,8 +252,6 @@ module.exports = { render : (rawBrewText)=>{ rawBrewText = rawBrewText.replace(/^\\column$/gm, `
`) .replace(/^(:+)$/gm, (match)=>`${`
`.repeat(match.length)}\n`) - .replace(/(?:^|>) *:([^:\n]*):([^\n]*)\n/gm, (match, term, def)=>`
${Markdown.parseInline(term)}
${def}
`) - .replace(/(
.*<\/dt>
.*<\/dd>\n?)+/gm, `
$1
\n\n`) .replace(/^}}/gm, '\n}}') .replace(/^({{[^\n]*)$/gm, '$1\n'); return Markdown( diff --git a/themes/5ePhb.style.less b/themes/5ePhb.style.less index ce27a89e9..cd37bc185 100644 --- a/themes/5ePhb.style.less +++ b/themes/5ePhb.style.less @@ -283,11 +283,6 @@ body { dl { .useSansSerif(); color : @headerText; - padding-left :1.3em; - text-indent :-1.3em; - } - dd { - text-indent : 0px; } // Monster Ability table @@ -581,17 +576,26 @@ body { // * DEFINITION LISTS // *****************************/ .page { - // dl { - // margin-top: 10px; - // } + dl { + line-height : 1.3em; + padding-left : 1em; + text-indent : -1em; + } + dl + p { + margin-top: 0.5em; + } + p + dl { + margin-top: -0.5em; + } dt { float: left; //clear: left; //Doesn't seem necessary margin-right: 5px; } - // dd { - // margin-left: 0px; - // } + dd { + margin-left : 0px; + text-indent : 0px; + } } //*****************************