From 7fc0cadb81b36c2e09ea846240b6bf6fcf28243e Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Sun, 21 Jul 2024 23:11:21 +1200 Subject: [PATCH 01/61] Initial functionality pass --- client/homebrew/brewRenderer/brewRenderer.jsx | 61 ++++++++++++++++++- .../homebrew/brewRenderer/brewRenderer.less | 35 +++++++++-- 2 files changed, 90 insertions(+), 6 deletions(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index 3c36244c1..5d48cc4e8 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -65,9 +65,11 @@ const BrewRenderer = (props)=>{ height : PAGE_HEIGHT, isMounted : false, visibility : 'hidden', + showHeaderNav : false }); const mainRef = useRef(null); + const pagesRef = useRef(null); if(props.renderer == 'legacy') { rawPages = props.text.split('\\page'); @@ -188,6 +190,60 @@ const BrewRenderer = (props)=>{ document.dispatchEvent(new MouseEvent('click')); }; + const toggleHeaderNav = ()=>{ + setState((prevState)=>({ + ...prevState, + showHeaderNav : !prevState.showHeaderNav + })); + }; + + const renderHeaderNav = ()=>{ + return <> + + {state.showHeaderNav && renderHeaderLinks()} + ; + }; + + const renderHeaderLinks = ()=>{ + if(!pagesRef.current) return; + const elements = pagesRef.current.querySelectorAll('[id]'); + if(!elements) return; + const navList = []; + + elements.forEach((el)=>{ + if(el.className.match(/\bpage\b/)) { + navList.push({ + depth : 0, + text : `Page ${el.id.slice(1)}`, + link : el.id + }); + return; + } + if(el.localName.match(/^h[1-6]/)){ + navList.push({ + depth : el.localName[1], + text : el.innerText, + link : el.id + }); + return; + } + navList.push({ + depth : 7, + text : el.innerText, + link : el.id + }); + }); + + return _.map(navList, (navItem)=>{ + return

+ {`${'-'.repeat(navItem.depth)}${navItem.text}`} +

; + }); + }; + const rendererPath = props.renderer == 'V3' ? 'V3' : 'Legacy'; const themePath = props.theme ?? '5ePHB'; const baseThemePath = Themes[rendererPath][themePath].baseTheme; @@ -232,12 +288,15 @@ const BrewRenderer = (props)=>{ && <> {renderStyle()} -
+
{renderPages()}
}
+
+ {renderHeaderNav()} +
{renderPageInfo()} diff --git a/client/homebrew/brewRenderer/brewRenderer.less b/client/homebrew/brewRenderer/brewRenderer.less index 28ea8005e..1482a09b4 100644 --- a/client/homebrew/brewRenderer/brewRenderer.less +++ b/client/homebrew/brewRenderer/brewRenderer.less @@ -31,12 +31,8 @@ visibility: hidden; } } - - - - - } + .pane { position : relative; } .pageInfo { position : absolute; @@ -65,6 +61,32 @@ background-color : #333333; } +.headerNav { + position: fixed; + top: 0px; + left: 0px; + padding: 5px 10px; + background-color: #ccc; + border-radius: 5px; + max-height: 100vh; + overflow-y: auto; + .navIcon { + cursor: pointer; + } + p { + padding: 2px; + a { + color: inherit; + text-decoration: none; + cursor: pointer; + &:hover { + text-decoration: underline; + } + } + } +} + + @media print { .brewRenderer { height: 100%; @@ -76,4 +98,7 @@ } } } + .headerNav { + visibility: hidden; + } } \ No newline at end of file From 17b081b18be4dfec488608ef42cb93754ebff7d4 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Mon, 22 Jul 2024 17:30:29 +1200 Subject: [PATCH 02/61] Added showHeaderNav prop to make nav menu conditional --- client/homebrew/brewRenderer/brewRenderer.jsx | 11 ++++++++--- client/homebrew/pages/editPage/editPage.jsx | 1 + client/homebrew/pages/sharePage/sharePage.jsx | 1 + 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index 5d48cc4e8..e18af0782 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -57,6 +57,7 @@ const BrewRenderer = (props)=>{ lang : '', errors : [], currentEditorPage : 0, + showHeaderNav : false, ...props }; @@ -294,9 +295,13 @@ const BrewRenderer = (props)=>{ } -
- {renderHeaderNav()} -
+ {props.showHeaderNav ? +
+ {renderHeaderNav()} +
+ : + <> + } {renderPageInfo()} diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index 48d0f3fe5..8473a63b3 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -416,6 +416,7 @@ const EditPage = createClass({ lang={this.state.brew.lang} currentEditorPage={this.state.currentEditorPage} allowPrint={true} + showHeaderNav={true} /> diff --git a/client/homebrew/pages/sharePage/sharePage.jsx b/client/homebrew/pages/sharePage/sharePage.jsx index 9695ee810..6c3c943b8 100644 --- a/client/homebrew/pages/sharePage/sharePage.jsx +++ b/client/homebrew/pages/sharePage/sharePage.jsx @@ -100,6 +100,7 @@ const SharePage = createClass({ renderer={this.props.brew.renderer} theme={this.props.brew.theme} allowPrint={true} + showHeaderNav={true} /> ; From c269d32247dc0a9f6dc473530b7aa45cedfa9d7d Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Mon, 22 Jul 2024 18:45:36 +1200 Subject: [PATCH 03/61] Move headerNav to separate component --- client/homebrew/brewRenderer/brewRenderer.jsx | 67 +---------------- .../homebrew/brewRenderer/brewRenderer.less | 25 ------- .../brewRenderer/headerNav/headerNav.jsx | 73 +++++++++++++++++++ .../brewRenderer/headerNav/headerNav.less | 30 ++++++++ 4 files changed, 107 insertions(+), 88 deletions(-) create mode 100644 client/homebrew/brewRenderer/headerNav/headerNav.jsx create mode 100644 client/homebrew/brewRenderer/headerNav/headerNav.less diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index e18af0782..9a55eb657 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -15,6 +15,8 @@ const Frame = require('react-frame-component').default; const dedent = require('dedent-tabs').default; const { printCurrentBrew } = require('../../../shared/helpers.js'); +import HeaderNav from './headerNav/headerNav.jsx'; + const DOMPurify = require('dompurify'); const purifyConfig = { FORCE_BODY: true, SANITIZE_DOM: false }; @@ -65,8 +67,7 @@ const BrewRenderer = (props)=>{ viewablePageNumber : 0, height : PAGE_HEIGHT, isMounted : false, - visibility : 'hidden', - showHeaderNav : false + visibility : 'hidden' }); const mainRef = useRef(null); @@ -191,60 +192,6 @@ const BrewRenderer = (props)=>{ document.dispatchEvent(new MouseEvent('click')); }; - const toggleHeaderNav = ()=>{ - setState((prevState)=>({ - ...prevState, - showHeaderNav : !prevState.showHeaderNav - })); - }; - - const renderHeaderNav = ()=>{ - return <> - - {state.showHeaderNav && renderHeaderLinks()} - ; - }; - - const renderHeaderLinks = ()=>{ - if(!pagesRef.current) return; - const elements = pagesRef.current.querySelectorAll('[id]'); - if(!elements) return; - const navList = []; - - elements.forEach((el)=>{ - if(el.className.match(/\bpage\b/)) { - navList.push({ - depth : 0, - text : `Page ${el.id.slice(1)}`, - link : el.id - }); - return; - } - if(el.localName.match(/^h[1-6]/)){ - navList.push({ - depth : el.localName[1], - text : el.innerText, - link : el.id - }); - return; - } - navList.push({ - depth : 7, - text : el.innerText, - link : el.id - }); - }); - - return _.map(navList, (navItem)=>{ - return

- {`${'-'.repeat(navItem.depth)}${navItem.text}`} -

; - }); - }; - const rendererPath = props.renderer == 'V3' ? 'V3' : 'Legacy'; const themePath = props.theme ?? '5ePHB'; const baseThemePath = Themes[rendererPath][themePath].baseTheme; @@ -295,13 +242,7 @@ const BrewRenderer = (props)=>{ } - {props.showHeaderNav ? -
- {renderHeaderNav()} -
- : - <> - } + {props.showHeaderNav ? : <>} {renderPageInfo()} diff --git a/client/homebrew/brewRenderer/brewRenderer.less b/client/homebrew/brewRenderer/brewRenderer.less index 1482a09b4..ad34c6221 100644 --- a/client/homebrew/brewRenderer/brewRenderer.less +++ b/client/homebrew/brewRenderer/brewRenderer.less @@ -61,31 +61,6 @@ background-color : #333333; } -.headerNav { - position: fixed; - top: 0px; - left: 0px; - padding: 5px 10px; - background-color: #ccc; - border-radius: 5px; - max-height: 100vh; - overflow-y: auto; - .navIcon { - cursor: pointer; - } - p { - padding: 2px; - a { - color: inherit; - text-decoration: none; - cursor: pointer; - &:hover { - text-decoration: underline; - } - } - } -} - @media print { .brewRenderer { diff --git a/client/homebrew/brewRenderer/headerNav/headerNav.jsx b/client/homebrew/brewRenderer/headerNav/headerNav.jsx new file mode 100644 index 000000000..360a77dfd --- /dev/null +++ b/client/homebrew/brewRenderer/headerNav/headerNav.jsx @@ -0,0 +1,73 @@ +require('./headerNav.less'); + +import * as React from 'react'; +import * as _ from 'lodash'; + + +const HeaderNav = React.forwardRef(({}, pagesRef)=>{ + + const [state, setState] = React.useState({ + showHeaderNav : false + }); + + const toggleHeaderNav = ()=>{ + setState((prevState)=>({ + ...prevState, + showHeaderNav : !prevState.showHeaderNav + })); + }; + + const renderHeaderLinks = ()=>{ + if(!pagesRef.current) return; + const elements = pagesRef.current.querySelectorAll('[id]'); + if(!elements) return; + const navList = []; + + elements.forEach((el)=>{ + if(el.className.match(/\bpage\b/)) { + navList.push({ + depth : 0, + text : `Page ${el.id.slice(1)}`, + link : el.id + }); + return; + } + if(el.localName.match(/^h[1-6]/)){ + navList.push({ + depth : el.localName[1], + text : el.innerText, + link : el.id + }); + return; + } + navList.push({ + depth : 7, + text : el.innerText, + link : el.id + }); + }); + + return _.map(navList, (navItem, index)=>{ + return ; + }); + + }; + + return
+ + {state.showHeaderNav && renderHeaderLinks()} +
; +} +); + +const HeaderNavItem = ({ index, link, text, depth })=>{ + return

+ {`${'-'.repeat(depth)}${text}`} +

; +}; + +export default HeaderNav; \ No newline at end of file diff --git a/client/homebrew/brewRenderer/headerNav/headerNav.less b/client/homebrew/brewRenderer/headerNav/headerNav.less new file mode 100644 index 000000000..381d1aa53 --- /dev/null +++ b/client/homebrew/brewRenderer/headerNav/headerNav.less @@ -0,0 +1,30 @@ +.headerNav { + position: fixed; + top: 0px; + left: 0px; + padding: 5px 10px; + background-color: #ccc; + border-radius: 5px; + max-height: 100vh; + overflow-y: auto; + &.active { + padding-bottom: 10px; + .navIcon { + padding-bottom: 10px; + } + } + .navIcon { + cursor: pointer; + } + p { + padding: 2px; + a { + color: inherit; + text-decoration: none; + cursor: pointer; + &:hover { + text-decoration: underline; + } + } + } +} \ No newline at end of file From effeffd9068b670080b9b7825094ee53bb10d5df Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Mon, 22 Jul 2024 19:07:58 +1200 Subject: [PATCH 04/61] Add styling to page links --- .../brewRenderer/headerNav/headerNav.jsx | 17 ++++++++++------- .../brewRenderer/headerNav/headerNav.less | 3 +++ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/client/homebrew/brewRenderer/headerNav/headerNav.jsx b/client/homebrew/brewRenderer/headerNav/headerNav.jsx index 360a77dfd..40f6cf4af 100644 --- a/client/homebrew/brewRenderer/headerNav/headerNav.jsx +++ b/client/homebrew/brewRenderer/headerNav/headerNav.jsx @@ -26,9 +26,10 @@ const HeaderNav = React.forwardRef(({}, pagesRef)=>{ elements.forEach((el)=>{ if(el.className.match(/\bpage\b/)) { navList.push({ - depth : 0, - text : `Page ${el.id.slice(1)}`, - link : el.id + depth : 0, + text : `Page ${el.id.slice(1)}`, + link : el.id, + className : 'pageLink' }); return; } @@ -48,7 +49,7 @@ const HeaderNav = React.forwardRef(({}, pagesRef)=>{ }); return _.map(navList, (navItem, index)=>{ - return ; + return ; }); }; @@ -64,9 +65,11 @@ const HeaderNav = React.forwardRef(({}, pagesRef)=>{ } ); -const HeaderNavItem = ({ index, link, text, depth })=>{ - return

- {`${'-'.repeat(depth)}${text}`} +const HeaderNavItem = ({ link, text, depth, className })=>{ + return

+ + {`${'-'.repeat(depth)}${text}`} +

; }; diff --git a/client/homebrew/brewRenderer/headerNav/headerNav.less b/client/homebrew/brewRenderer/headerNav/headerNav.less index 381d1aa53..588687d88 100644 --- a/client/homebrew/brewRenderer/headerNav/headerNav.less +++ b/client/homebrew/brewRenderer/headerNav/headerNav.less @@ -25,6 +25,9 @@ &:hover { text-decoration: underline; } + &.pageLink { + font-weight: 900; + } } } } \ No newline at end of file From a59135430cd02f791f7deef5bc046c56a12494c0 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Mon, 26 Aug 2024 15:30:58 +1200 Subject: [PATCH 05/61] Fix missing comma --- client/homebrew/brewRenderer/brewRenderer.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index c891b07d1..a7b93522d 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -67,7 +67,7 @@ const BrewRenderer = (props)=>{ viewablePageNumber : 0, height : PAGE_HEIGHT, isMounted : false, - visibility : 'hidden' + visibility : 'hidden', zoom : 100, currentPageNumber : 1, }); From 380c1444ca71ac3b48dd67e8e6498e325e469ad8 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Mon, 26 Aug 2024 16:01:12 +1200 Subject: [PATCH 06/61] Tweak position to account for new toolbar --- client/homebrew/brewRenderer/headerNav/headerNav.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/homebrew/brewRenderer/headerNav/headerNav.less b/client/homebrew/brewRenderer/headerNav/headerNav.less index 588687d88..c03887413 100644 --- a/client/homebrew/brewRenderer/headerNav/headerNav.less +++ b/client/homebrew/brewRenderer/headerNav/headerNav.less @@ -1,6 +1,6 @@ .headerNav { position: fixed; - top: 0px; + top: 30px; left: 0px; padding: 5px 10px; background-color: #ccc; From e57b88a019c98acb14b166515bfb62feacdc64ec Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Mon, 26 Aug 2024 16:06:11 +1200 Subject: [PATCH 07/61] Limit max width of header navigation --- client/homebrew/brewRenderer/headerNav/headerNav.less | 1 + 1 file changed, 1 insertion(+) diff --git a/client/homebrew/brewRenderer/headerNav/headerNav.less b/client/homebrew/brewRenderer/headerNav/headerNav.less index c03887413..371081cbd 100644 --- a/client/homebrew/brewRenderer/headerNav/headerNav.less +++ b/client/homebrew/brewRenderer/headerNav/headerNav.less @@ -6,6 +6,7 @@ background-color: #ccc; border-radius: 5px; max-height: 100vh; + max-width: 40vw; overflow-y: auto; &.active { padding-bottom: 10px; From 708cbdc9e50c5df32ea717c0f9eec25a61dd8e71 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Mon, 26 Aug 2024 21:26:30 +1200 Subject: [PATCH 08/61] Change to list items --- client/homebrew/brewRenderer/headerNav/headerNav.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/homebrew/brewRenderer/headerNav/headerNav.jsx b/client/homebrew/brewRenderer/headerNav/headerNav.jsx index 40f6cf4af..37eb0185c 100644 --- a/client/homebrew/brewRenderer/headerNav/headerNav.jsx +++ b/client/homebrew/brewRenderer/headerNav/headerNav.jsx @@ -66,11 +66,11 @@ const HeaderNav = React.forwardRef(({}, pagesRef)=>{ ); const HeaderNavItem = ({ link, text, depth, className })=>{ - return

+ return

  • {`${'-'.repeat(depth)}${text}`} -

    ; +
  • ; }; export default HeaderNav; \ No newline at end of file From a1c275479febb902f6f6f0db09c06d50d1ee25bc Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Mon, 26 Aug 2024 21:27:09 +1200 Subject: [PATCH 09/61] Change toolbar to relative positioning --- client/homebrew/brewRenderer/brewRenderer.less | 1 - client/homebrew/brewRenderer/toolBar/toolBar.less | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.less b/client/homebrew/brewRenderer/brewRenderer.less index 04e70f09b..56447d63b 100644 --- a/client/homebrew/brewRenderer/brewRenderer.less +++ b/client/homebrew/brewRenderer/brewRenderer.less @@ -1,7 +1,6 @@ @import (multiple, less) 'shared/naturalcrit/styles/reset.less'; .brewRenderer { - padding-top : 30px; overflow-y : scroll; will-change : transform; :where(.pages) { diff --git a/client/homebrew/brewRenderer/toolBar/toolBar.less b/client/homebrew/brewRenderer/toolBar/toolBar.less index 33a6836ef..93b2bb7f6 100644 --- a/client/homebrew/brewRenderer/toolBar/toolBar.less +++ b/client/homebrew/brewRenderer/toolBar/toolBar.less @@ -1,5 +1,5 @@ .toolBar { - position : absolute; + position : relative; z-index : 1; box-sizing : border-box; display : flex; From ba4c9745a26004b26ed47647e9042ad3022ef041 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Mon, 26 Aug 2024 21:27:41 +1200 Subject: [PATCH 10/61] Tweak styling for recent changes --- client/homebrew/brewRenderer/headerNav/headerNav.less | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/client/homebrew/brewRenderer/headerNav/headerNav.less b/client/homebrew/brewRenderer/headerNav/headerNav.less index 371081cbd..c9bc7918d 100644 --- a/client/homebrew/brewRenderer/headerNav/headerNav.less +++ b/client/homebrew/brewRenderer/headerNav/headerNav.less @@ -1,6 +1,6 @@ .headerNav { position: fixed; - top: 30px; + top: 0px; left: 0px; padding: 5px 10px; background-color: #ccc; @@ -17,7 +17,9 @@ .navIcon { cursor: pointer; } - p { + li { + font-family: 'Open Sans'; + font-size: 12px; padding: 2px; a { color: inherit; From 30dac3a73c8500bcd5cd31451aea9fbe39e9e534 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Mon, 26 Aug 2024 21:53:15 +1200 Subject: [PATCH 11/61] Revert toolBar.less change --- client/homebrew/brewRenderer/toolBar/toolBar.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/homebrew/brewRenderer/toolBar/toolBar.less b/client/homebrew/brewRenderer/toolBar/toolBar.less index 93b2bb7f6..33a6836ef 100644 --- a/client/homebrew/brewRenderer/toolBar/toolBar.less +++ b/client/homebrew/brewRenderer/toolBar/toolBar.less @@ -1,5 +1,5 @@ .toolBar { - position : relative; + position : absolute; z-index : 1; box-sizing : border-box; display : flex; From 929469d0c05852712db71b3cf15971c7e6cd1af9 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Fri, 22 Nov 2024 20:11:14 -0600 Subject: [PATCH 12/61] Working feature. --- shared/naturalcrit/markdown.js | 40 +++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/shared/naturalcrit/markdown.js b/shared/naturalcrit/markdown.js index 4c1a2f92a..6dfc64d25 100644 --- a/shared/naturalcrit/markdown.js +++ b/shared/naturalcrit/markdown.js @@ -370,6 +370,44 @@ const superSubScripts = { } }; + +const justifiedParagraphClasses = []; +justifiedParagraphClasses[2] = 'mdParagraphJiustifyLeft'; +justifiedParagraphClasses[4] = 'mdParagraphJiustifyRight'; +justifiedParagraphClasses[6] = 'mdParagraphJiustifyCenter'; + +const justifiedParagraphs = { + name : 'justifiedParagraphs', + level : 'block', + start(src) { + return src.match(/\n(?:-:|:-|:-:) {1}/m)?.index; + + }, // Hint to Marked.js to stop and check for a match + tokenizer(src, tokens) { + const regex = /^((:- ).*)|((-: ).*)|((:-:) .*)(?:\n|$)/ym; + const match = regex.exec(src); + if(match?.length) { + let whichJustify; + if(match[2]?.length) whichJustify = 2; + if(match[4]?.length) whichJustify = 4; + if(match[6]?.length) whichJustify = 6; + return { + type : 'justifiedParagraphs', // Should match "name" above + raw : match[0], // Text to consume from the source + length : match[whichJustify].length, + text : match[0].slice(match[whichJustify].length), + class : justifiedParagraphClasses[whichJustify], + tokens : this.lexer.inlineTokens(match[0].slice(match[whichJustify].length)) + }; + } + }, + renderer(token) { + return `

    ${this.parser.parseInline(token.tokens)}

    `; + } + +}; + + const forcedParagraphBreaks = { name : 'hardBreaks', level : 'block', @@ -748,7 +786,7 @@ const tableTerminators = [ ]; Marked.use(MarkedVariables()); -Marked.use({ extensions : [definitionListsMultiLine, definitionListsSingleLine, forcedParagraphBreaks, superSubScripts, +Marked.use({ extensions : [justifiedParagraphs, definitionListsMultiLine, definitionListsSingleLine, forcedParagraphBreaks, superSubScripts, mustacheSpans, mustacheDivs, mustacheInjectInline] }); Marked.use(mustacheInjectBlock); Marked.use({ renderer: renderer, tokenizer: tokenizer, mangle: false }); From 440ad516df6317ee529723f6055a42da05b4f9f6 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Fri, 22 Nov 2024 20:39:31 -0600 Subject: [PATCH 13/61] Add justification token testing --- shared/naturalcrit/markdown.js | 8 ++++---- tests/markdown/justification.test.js | 27 +++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 tests/markdown/justification.test.js diff --git a/shared/naturalcrit/markdown.js b/shared/naturalcrit/markdown.js index 6dfc64d25..5e81be3f0 100644 --- a/shared/naturalcrit/markdown.js +++ b/shared/naturalcrit/markdown.js @@ -372,9 +372,9 @@ const superSubScripts = { const justifiedParagraphClasses = []; -justifiedParagraphClasses[2] = 'mdParagraphJiustifyLeft'; -justifiedParagraphClasses[4] = 'mdParagraphJiustifyRight'; -justifiedParagraphClasses[6] = 'mdParagraphJiustifyCenter'; +justifiedParagraphClasses[2] = 'mdParagraphJustifyLeft'; +justifiedParagraphClasses[4] = 'mdParagraphJustifyRight'; +justifiedParagraphClasses[6] = 'mdParagraphJustifyCenter'; const justifiedParagraphs = { name : 'justifiedParagraphs', @@ -384,7 +384,7 @@ const justifiedParagraphs = { }, // Hint to Marked.js to stop and check for a match tokenizer(src, tokens) { - const regex = /^((:- ).*)|((-: ).*)|((:-:) .*)(?:\n|$)/ym; + const regex = /^((:- ).*)|((-: ).*)|((:-: ).*)(?:\n|$)/ym; const match = regex.exec(src); if(match?.length) { let whichJustify; diff --git a/tests/markdown/justification.test.js b/tests/markdown/justification.test.js new file mode 100644 index 000000000..e3639eb81 --- /dev/null +++ b/tests/markdown/justification.test.js @@ -0,0 +1,27 @@ +/* eslint-disable max-lines */ + +import Markdown from 'naturalcrit/markdown.js'; + +describe('Justification', ()=>{ + test('Left Justify', function() { + const source = ':- Hello'; + const rendered = Markdown.render(source); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

    Hello

    `); + }); + test('Right Justify', function() { + const source = '-: Hello'; + const rendered = Markdown.render(source); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

    Hello

    `); + }); + test('Center Justify', function() { + const source = ':-: Hello'; + const rendered = Markdown.render(source); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

    Hello

    `); + }); + + test('Ignored inside a code block', function() { + const source = '```\n\n:- Hello\n\n```\n'; + const rendered = Markdown.render(source); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`
    \n:- Hello\n
    \n`); + }); +}); From deb9c6651fdf4849f7d0554fa58706fbc7d07b44 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Fri, 22 Nov 2024 20:45:58 -0600 Subject: [PATCH 14/61] Add Styles for Forced Justifcation Tokens --- themes/V3/Blank/style.less | 21 +- themes/V4/Blank/dropdownPreview.png | Bin 0 -> 142231 bytes themes/V4/Blank/dropdownTexture.png | Bin 0 -> 236 bytes themes/V4/Blank/settings.json | 6 + themes/V4/Blank/snippets.js | 506 ++++++++++++++++++++ themes/V4/Blank/snippets/footer.gen.js | 17 + themes/V4/Blank/snippets/imageMask.gen.js | 46 ++ themes/V4/Blank/snippets/watercolor.gen.js | 5 + themes/V4/Blank/style.less | 524 +++++++++++++++++++++ themes/themes.json | 9 + 10 files changed, 1133 insertions(+), 1 deletion(-) create mode 100644 themes/V4/Blank/dropdownPreview.png create mode 100644 themes/V4/Blank/dropdownTexture.png create mode 100644 themes/V4/Blank/settings.json create mode 100644 themes/V4/Blank/snippets.js create mode 100644 themes/V4/Blank/snippets/footer.gen.js create mode 100644 themes/V4/Blank/snippets/imageMask.gen.js create mode 100644 themes/V4/Blank/snippets/watercolor.gen.js create mode 100644 themes/V4/Blank/style.less diff --git a/themes/V3/Blank/style.less b/themes/V3/Blank/style.less index 8229baa28..0c7864399 100644 --- a/themes/V3/Blank/style.less +++ b/themes/V3/Blank/style.less @@ -503,4 +503,23 @@ body { counter-reset : page-numbers 0; } counter-increment : page-numbers; } -} \ No newline at end of file +} + +//***************************** +//* Forced Justification +//* DELETE WHEN V4 GOES LIVE +//*****************************/ + +.page { + .mdParagraphJustifyLeft { + text-align: left; + } + + .mdParagraphJustifyRight { + text-align: right; + } + + .mdParagraphJustifyCenter { + text-align: center; + } +} diff --git a/themes/V4/Blank/dropdownPreview.png b/themes/V4/Blank/dropdownPreview.png new file mode 100644 index 0000000000000000000000000000000000000000..7ff524ad486550e2c948769ff273066c0f3d2290 GIT binary patch literal 142231 zcmeGD^;;Z4*EI@bArJ^ILvVL8KyVEjJh;nXNpN>(fB=KLC&As_2N($M?iwVx>zTaY zb3fnx{tf5+)YtSi-L-3X)vi@*tqT9FEc^D&yEh032yf*+NvRD$9-q7O27EsBg57MZTKCl za!uSZT2I}e_DV)JWhc~5BXa? z#YgzR(TL;zK|zuS2yu=Ge)>;@|K7hy`vY7p;&xx~-$7=Hi=&${7U;hIznb!fhu+Yy zyr%JAo&151#soU*{cuS2-%Wju3BZG0&+ljaPpALS#RUl-R931bdES3F^%vgvc?uz4 z_5aFUpfVLaDEz6i;Qy;B5qSJdW`*|uS5ML5LAjZxyT<-^Q+2ZN_`Q!VmHxY@f`Ra$ zloe~S)c(7vYk2(sUsC_ymQ<5jTz-~0dm8KR%TkU)#QX(lb0oWL#ejg`kx7U9h*t8XeqocL=;Csenb2Pv0w(Z~J6s^>oTCJQ6r(o(nYpH6-& zeHHDQkmy$NABdoB!MzAtGX#@xJ>N2J_7gI(Ace6+{;jq5M?KF|hgHf3lQvmqzFL07 zSjRoH?VdUhR9<11bCW;iQp46xPq1*l0dlg+F?s& z7j)%~0Bl5dKQ<1kwY28VSXg|EpcBgXvL#z}W?rO?z46q!7BJJ?+V_BN6lftnf^TZxKC%tta5Anp0g%*zu(gOO3#;mPkTc#CulmDXzm&T`mC<+}k_qp@7a6%8?J z)^y3niU3yY{5c;Ivp;BN<5^^k?VBwm7x~#0a&ghxxT!qwg2w{N#7cYGv*o{NE^T<9 z@$x|Hu@#wvbbE`_AbQ8vX7{XGWhH#OK~$FMO&(o}%LW}ydNtqS(|%7(51Ha@FDxbY z1Wz;qO$jouDmtVl2ZES%sL)}}+Z8RRHHgU07Z2YE%ziVnH;zp4EC{~)pN#S&L2pl2 z+5fz3z2(2%z+OK!j$9&Y|Dv_NJSb?>)`s-uMPGbX)DPk0<@EJ^p+4%9xD#Sjn+t>#y}iqH^?KDCH%y@x7bUuRnDwYUU}PxJ72g-;R@2I|7s z)2+|oGiow_GeWHnx3BhR5&q6Yrw3vk=&i=)qtnJKLE71V6xTuTiONUX>#$|lb}Hs$ zK&P{)Y)|`vw<~>}^I@(!VU>@*VBqr{0#?T(TN#F<{|tY&K_K7iLfFWd>FjsDn%b&| zXY%>mF`Py!X9 zUo$Sla}s{vOAsRf=Fa*Mhu^Oj<2%>tPs;8+RMnv}IX13qxh3DSL3KLpKkW_$vk;pl z5eU0RwxXNgm;EaM!bmF&ki9jq|HCNDaO9K+<-PwsiAP`W*n-%aJm2m0#p(Y0wUV`L z?>EUgyyZ`*sErt<#%GOattXV-r8#|+_kd_){h<7z5Y3Utk*6DrTg*p&i~O?H4!76Q zHj2h)H)kr9&~r*V+Mwik$<>>fjnh&QkLwd0eIBimRYt_;L(#{j7_p-8Kg$e{>&K)H z6*cjbZ%>!k41!dAwpiNb(Cc?N=WA7QWuD;>gc&rx_8+hk2t#wp0P+S!##I=v1ZY3U zXwEy^3fCgbinXCcj`}}FBI_6%gdz9;HahN+UDN$}ykoo?P~O>&J>=hvHPm^-Ty*5| zxH5JO&AKtJ|7M9m0gV###nf6W5fZ!UBcFdU&ZshhK2wl&uWIv|JQ&)vnESpg99B8F z4Yhc&tMX_KpOk$(X^eRBza7)wSl+Xe@Vd@$UmrCVg1&P~x-vO~3g|rdPzYbYT&*uB z5qhu?8som3 zDU*%o!IVCisF@hA=;HkxwDIMcgMTOaenGx}xnn3>=a*BqOmn@wz-XxHCqC7stMicIs>5__KJ6bYIe(w*tc&63`*MXN+O!h( z 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⁡=B5jVo;0X`3P=$s9!NKPdFDdo_JNk=8&=mx?x} ztjuX7<5_DPL|A=Iw&07Lf9h6gbb?d303ECIcF9WGr_tmTTCDkax=as9%bs8wIdv$a zWaZ`#*6`sU1g(+jwFfgEF>=$?IIVDhacioL{HXRd?<>+tn!Euy%hY~r38HXI{3lw$6#6`hQiKlUYuT)UWWWEtZIeE z{6T_*QMrOLvoN$Q`x^1lCqxR^o^lelDs$RM`I91BGnMsd&3x72emp-lxwgPw)=@sW zS4FH`E>RsZDxz-|!q+D)9Hd9Ir2DVdfM7$ICpXc#m2*e$J)*wX&4-Lncdvy6eMqgX z&r(uS#C0r*T3T9I1q1@7rr2nL#qgQ)O!au&-96a2g~GPVG*lSzl*Iwo6%~VD9W;MB zqj&r%>x_yd;$iBW^g5_+ZJnu8BfeR!HDTcAhaTM2$_Miu`2&hsV8Go4t7gMRIywB$ zfK*VlzFy!|a(KNnu6P3DTLua!p((CV*0`I548-Gaz-t0*|)!|51_n$L3 z8hwwevSKR+xcdsg``L3s6#4Fv6CtNr%Wj#ARKk9wjpCENR|&AE=ey33+$*x}I~UP$SnjvYT&s>Ze2; zM%h77S~3=Yi)m2<;-K0*-ZZvAc(0H_z57U>MDgQcN~kQN-Fl!3)0-3)c%sD1DBkBhTz1^y0rbDe6ZW!o|Gh1N_B=AuZ_Q2wa0M;+MJ;gEYwW@nrX)~%P>qNhI z`KN!jHxx7c{$}3a)`T4M>AI}y8P{~(i)cnoEhQ~$YurqhFP@jDFf}Z2jg+KEkLdB& z`o#J`@H%Pv@nP5OC?hkPp0J!8j&@o)+?|H+Cw+rPD;X(h(B66<@zmI?we+>WIy#)) z1H-{4=DH6Vj}2O#7es2n!fMSK?(*fhQTN5?B)hOAQB(}VwJeCIc-kk&MMx$J;c`CP zbA_1|etaZ7c{_{VZv0-&^P`Hz7kxE50@W`WYblg@3auUIq_*EDUMc=~n<4#e(#Zoq z{f_^R^nbW!<#_wc_v;^ied${}F{+p2TqlHH3A0Z;Z`ne7lCt(hk@M5+KmD%?#iXzR zeA0EqkD*PpeZfs|vnfahlYaNB{IxCZA5Ti?)(NO-#^8*bM{jzr!+IliAU!3eE86ET zWyZ^|H@KHb^;OzIv9SOe=#o61UZ$QEs_WzJ$3`oeEm%;*Vs!^T`V{bo={Ht;FT}I6 z-D}m}!9l0`h6Y1N$BdWTrM1pLIF?nDdrK_y6q86Hfj@I(Uf)=6P=a!I9|B?MFaA6C5qjxX)LZ43QkC&>Rt31gB9Cqyw-DC7?nqW!xcpO7wX9Ye(Rpmw_baz!V~NbHtwkV}$RJ}d82mBL(8Yn{G6y7T_l&4AQaMCPh`|>QsErpqNR_7gdg$p_D&Rg>nt&kP%y`g&a26;7t1fM%YNyEowQd z^sq}ZB4-_Bb6L+CqHq#tDrXW zxO>5uOleT8Ja$jxOuK``a%0y3GwvmEB(&eC%~~h@SEfExgFmzX@uD-jW=bbiTpCdO znu*CeLzEW5O8>22A{1^xM?`^TB!JS}--sVkX`y){CWg^gdps}E5n-&ui%i&%a#ct7 z=Q^v~a$3Yt^7Rfc)K3DB%r@)9B0|YKoa_MpxG5PZ*N*z`#J&$Oqpp6X#vXsmwt!S&&or!H94mOM74>Q=_@mU`q053tDhTTT@qOt> zNn=p(+1*-*!Q-7rjhjQMb~0?BnT_3l>!hd2{vMm# zwgYvBgWxu@Cc?eC84`0BN8|n-B+tc2$RBG7jm3jP^VS!5Of>U#F*MI>^x|=-SG4_4!yeB(yweS=DTRa$~oNLczN2`YS8crPfg{NdYwN7jAsa+pYowg zlxI=N|ENfr7cRlc%M}55PSwX%DZu6885kY2LoZkZgZcQvthjqxpxO691HUeueWKb+ z_1O8VM!q}eG22?W5|Fe9!C|DKJ52;UDu&z~&!GxbFRhR(QzFlDLDa#??M5?cE9+!4o)`~80wk!SJtKAz}aXaT$+nSbcGdL5@>Q+9Rsg6YG5iN8_}7lMMZDole*aO zdL^dx5TVtlSoL`CPcU#}D zOaZwrEU5@{KG4_BC+)Upcz=W?)4(R@W&mo~41GfFp#FUC&S3jFts;r^HOR^Kd8LyL zLQF)olO`UHrTPS769d_ejVYw0W^FMaxia=Ug#lz0csRdDQlc2rV*6u-YXpW-akW6B zqH6!RR4N;W04+RojpY>;E}u_Y7B*`JNPCLNp55x};}-8=2I4>&xj0919;-!P7_lbd zN4yB8znlBWZ~X{`;h{x7HXWS+OuB?;qT?AkU-lNJ*0_fysgUqv8#(_&!%7p`?T&_X z=#-Sm+Ph{V31V0s;Nne39&&!$B#BWq5pDJ?Uvp^W(;ucUfi-9_vuK0x=X*<_98^im zWB&8Q_Ycf;Fxm`w{qp*@2;C93Q~n2R$$PoaC69@%S&k)tvEiqyO3esuWkuTaHj0WV z?uA}{k-Y#Gq$=xvH5N-1AX7?U6JbS$&$9CsKv$dm`uh>X9k#td;lITZYEllNKWxlw zoNGX_*H?f3@VZDuM@2#ANV234Zm%|f*KMFp>1_4DgtGuEmyi9J>1#_#Z*_iNb zy@Noa1g>rmQ1Z0?Nb1a~Bv8fhKy&5uFJBEAcSAyN5iV$AK>-6f)PBv7dIz=sQSE#E z84g?MHrY9@vyXP(Py*ouKQ%_7990IA8XaW!s(4ED2`sN~xn((`RN3x5135sW*ynPx z^p3?f~O;iBO6d69ExmrR%p*f9UYlRX-|7NcHGW?S#{DN^S(zl=nY2qLRD0V z<bif_!D?IMmw+fn%PM_W&-2A#!B~ejCAT>B3t$S8*v)JDnr=eT}zTcTVjICpwoSe(}!#m z+nyLOuY$X}OvyXveT%lD5qPnAXaZMMEvSw;XZ=UAA?Aglt<_Bnb=CKYHk9dPes99Z zGu-lJ1(K#!h!;>W)dg^d@dmEu@8Sb>%kHvVSiMNQMsCwOZlXhp?#o3L8? z{SxElJ#lsjC{mnP!=)TXD|93Cw{^nXyL%aGI-b#ec(#&~l_tE=-&#F~C3&UN)Pq&b z0c+9`w>jSH`}zjR=#75M^PIbH%{m0m439C5&B~AUMo&)? z;2kmN3@v|JN1>MMXOh?9$4`F- zKEX$}V`$#%UboxMvZl}>ba8BSJg2M-m2yF9a(WfksTPk4kbaPw7MPtC6<6V`$4${x z6_W=sALE8$#i^mqu}?P_Tc$~ydgu^!X6K|0f}D(`YMjR`Ry{7je^z%oYspVKBJf#^ z?2Y1(21~qaD=H#qrkR+SJ`YS2Pm)&?!|P(3h>Kaa_&!5SigcV&1`HKH1j4c2H|tqU zgo5TjmrCBS%-$n;!lNb5qBt4Fsia1VODXa1Mn?W9WQBQj@1tYGQEpM1H(jNf2~QK>?0aA`SkY9@NSRX~=h+c%;MqPmykSC}L{)c_ z%#-mIvvs|-2qX!lNYQhwQ9{k~Bh~>uUBpo2j+^;(S2*#^$1iREO_rfflqZ~+dekK7 z6Q{&0J|kdQH5a)xWZ|QIvLj(`H6kD@II zPe+8(-hWopPFGzNzdm1H3^8y$#czIG_EvevBLNOeSVrd(k=ASa?pI}QVevlox?BPn zlts1l#^&&Z17SU)b#!zJp8(EMkGx7zYo&eQnzu1I)ooDNSHkn}Edq<}&>&_aJIpZ~ zYGHmw&PVU8rgTh~OLEd49l9_?45XBsimipn9uEQHg%6Z$?5Y$WA4%MT@RDWD2DY^QpskQi~hXM+DG>J2F17MAG3!1%q=;2sB3d#?%=#^%VM8*F z98@6LqnpPIAK#|}x!7?5SH2Xv);I74Zr3Nj{TF2?yt!9`xR?Tp*YqRU380b6S0DK* zmLrOA-yTj1VCTVm+b0d=a&kQ7CvZL~BCO1|%TEc45F*(XJn>any2)|`e6>Gxm&E^Q zq=~D@D!vZ)WcHF@640f% zklH8kMFOFZGBdxs&zXeo_tfufjm>0tA%A#zt#i^up?*5mRUUSKS3{S*EFm39V>gcf z@-i39J*d_pa{GLnU3H)vv84A%ee3l7(#Kr6(5sTKmJ^FVD(-YF_tU39Q*Wuu zd5EVfZ|N~3eSvC409OJPTYg5%f% zAoR7~o4{)iMnW9eh6B>*=%|sERYJv6C~utRpD`jHHa@m)|BZAW+ur$#mC2czh{oH` z(%RZF+z`RLExruFdrD7U&fXOlCr3jk4Sbybjt-&Q`18XwkZghl*NZ}_e$AaRMRL<-aPYxj>AZ^9T{Ta%u)duy*`=~S#IV9J5LLBR!<6$f)4(Cjr(XrcO< z5^ks76ecfDvY-tiV*lhOawh>@E%Jz0%{E+HdDEp*wfPPNwRnR`~0{emR!|YD3 z3t{}@tbkiAJ*8;w;+Cw0jfOZ`ys+y~KTB4|EpYoH54FSJ#IRR$=dm%|0QN@{DHMrP zEi6fpQ=X!-_`dx;@d+FD5S2OcgDrQushqF~UN=?DZDDqpA$CmxCwGLqX`MV(YK(S4 zY`QkK-MmGCI(uQTPKka^Nf^;r-o!QGAqxNnmAwGBP}B%M%l7gwRvH=_HaPVKPuT3t zpXubhO-uSgb8Wrq+j?I6H4`w*`G-PMQj)iQZE4DnOD}VkS^=FqQ%`Tv zc>;WRuCMduYIHcmi{sc`_+LHx`r8S6#1dcD@Z!i)YiYSYr6$h<#v5|yP_(7}68&L{ z-D0#mjC4e#1&&~xe&K9uY*lYUUXWCypsPic&bOYB=nTt!x>0`>C(>9p-nN^xf<4+u zHZyOz3c!s`u4J*86`dDPT5VuIR}}5^1L4Cr#C6O1@ok4_cz@oDU(56EO+zewT&kQg z)6Ms~c<58e+G#pk+QA@S*zH7xNP$_-p(dVqBr+x7(`6(Ln=L4-?ub*0tfY)j5&-L$ zr12j6l9qZ~=zwiUWh4aLoF;Sd1m!9gVvLvTG2}HY-7FW#KMP2G(7A8t?WzT% zn_0*jIar_;6_)MkwBtHhj6<-L0r1+BLnV&)3{bml@Fopj6Fje5JAav zHDFf!L!R7JH7g8{x3ksUd(GmoM)F03t+!E*6q>F^VxlQ(oDo1^eE^Wbj^K%${tl-e zKPaZQvY8=kiJKGEZ<--NH(BJ)vNXc0KP-zq)J;a2Y)j49mpPUvTNk~|fNPxl_sx{t zX#%-tgg=!9SNbxWqD}NKggIVK4P+LP5I5*am%NkEc;cgIO8rx|#1aq%1Xx;@M9_~6 z6s|4l>Wxn=MTLESahcZMJ3@{_Zke7_C1z0f;~_ovxj>e z!BJYWbqFL9wXIX99bcT!4owb^indD@I+Xx`e*{m&eANz~klaQP>r}=2s@Ah#0Zk}E z?4;gd*Wry!J7V=Q9GmZEp=u+q33#g+-PRYr`xBiB~^QRaT7izkC!+mnA6kmWoE^ zqmo~W_0QXRme`I>vt+Ob0oL#`hs_3Wr1q(BzU1?K=Sp1s)R0Cf*23kIiZh(U^9xmCr@vbl(y4V&1)r;5w%0E!VgdT~=k}ILvy|Oh-oBb#4KIC%&Gaxvr!Ur{7)l+1C*a*$Y;|%^YL*$Ru_A3 zAa5MlTJ))V|D*zGdD^%j7|NL2P%|5Us-~LpsX3npW~=ocv=s`ZtQyGuC~T_}f-Ai! zOZ*%BJ32h6_zaDJmjds@Kutg>AIz~{bkyn=-{zu z7?n8iG%x0Jci7(O#x<#z@D+fBsA>On(QX zh~G&ee$5hz@K_TK(rch^yz;d1CaAGK^eyz3fKKk5S^_!Thq#RPF1p&M)~JWP#ug=EC`ebPF++K|#8XN~>NNPJ(f zviI2betqXE__yYL#QGet_CnDw?dZ%(_f2wak?q*?{L8h&e$VX*rHrkuUfnOg0ZwEV zLD*P@O>lcR_LDC9g@N!+1r2dgMNE}iXZo(ZK3j}5YUDgbyoRZ*p1J7I_l+T%HF(@D*4 zWAm4Kj_`Cd+DVl5W^uf|&*aAun^s+e(bl8Ga$OD~mgqH=`>A)rkj41X+QO3sGnI;NIdtjKPHqElHNIsdLZiV8C zW=QCb5@|(@6q&uir<|X6lECAoiYo|mGUM#;h5B2-551X$yONvZg>YiJYT+|L#sx zXC4*CF^Uf~g?JGoYNGzP_z$232wSA$dR$CT#`yo#pX!7^JXXCv1YGg2_08D!q%cc! z@(D`Xv&mXsf{0Sdbj_537*gO$#&P0_1O@p;7UXBIE}F1!W@F(=i!`ON0yWC;6hUK ze}4srt2339#Z+8dU6O$bo+ZepB=i9tDA~du=zE6qVH2O4kv2opy_i|1`$sRN~f~a|S*bYfnpr3pby%!cFKh zcM^CCigbdYQ-j#biPY8q(S zwK!DrF!uFAtPOk-A!p{g{Q0Md43->ISokk1m#PRFfXZuTaLWRzQ1S*cO&fbXK5cwR z5~7t7R;<7t2cz!3-qXLAW<) z5@GX&@s1(Xa}dSD3g$4L;96ze-4)H0bI7ry3OLA zQ$kjAowRbiWvHh!M|bB}W61Tah?IC#zAG-(Mj*8g-NvMAGsMkzLVIan6qIRI@(Usu zCiy^(0(FYBLDw;uir1P}f^o$HZLo*qO*NSPPqeZ-C9y<@o1q7(OW{C<(v+>O?JFH; z`@V20@L7A`z^TqsL}tvhNLo6n^IDtUM3px}Zk6==n%J?*Z`4verd870E;Y~mBtE%S z_|Q-R-1XL*yWwL2l3eF@3-4_ILeq&`7!|0^1k-7t(}GO}p60@w&SRoC`aD7>T;Fi_ z10FwO`aOL4u3f`@`&WhRv1ZHj;tcp*sR6?wtGmJf>>cLYjn4Y3pXctwOXKZ1;YFFm zaQ~`cv}Ax2@<6)>K~Dz7D--6+1f0kqeNAtY;pgC~x!aA!vj8N+2S@hJuK#5Z5p2|G zfthNL_2l5{;`gFAqn7+h+0&4>RQ+y;z0l!3&|$MS|Jzla*1K21=c9uumU%@CW_NCG z58kE4a87_E#;?YVaWmSV(wM9g4q<$(!`Rp~5{$u(QnbP5*@I3m?~fb zCDZc&0+gj|g%8lja>9!$c99?Sv-&*~9YUkM7ZDvIF=qj(Oh{{;4eqC%U0OiM`soKD zj_XNA^ovzCXN8Ve7I(2{bS3JLwzq$3^Pg`4(XS73=)&70?tAkPzc*)sfwx0E%8l_7 zlV9sMumE@03Z)on9DO=we5lFIQP(P%9aK3)K zFD)@Hi-;*C4*p_fP9<*UU}uMCx#maOAU(h##1|2j%w}xjEAd@Kt%3XBuCi9G`N@DP zA7E1E$@T9-_1%^(a27}lkoGb$ei&f1mPcADizB9p+7CC?4vw-V|5CF1UdvF0VA(x4 zF(K4F(;}FF#>+^pjm8T&00q%aEG`F+Mr-KLd7k+#Rrx*f;i2hRx*VU{;gG$hpS^yx zTowKoT;+4aByu^}6D~tq`Kb;X!4T6x{dZ33zzzTgY|7ClOfLTncF|n~^nUkU!c9jh zoxxB_Id6)R;^9Dv0c2S@`wT=OMXO7jqR@}nx2(+vCEIdo_1kdg=_?@~#&U#q+T-?D z5nd#YvTq`1bsGAf`;pC~8XZdc7C>HaH6lC?@#>+wa>^N{eE=+K2t(bWO= zvHvxTO$8sPG{&XV`u##=xA;8v_zs|Q`!g#owQqVFy{OpI!V)T1q?3}a+J5{n3}FO7 zSRUnq-LlCw%v8;=C4}Et06~Cd=_gf10Dpt>2Up;<=%|WWTwdJfJZ-wD! z4zZVm4-=CKz5VTOzGRc0v?j7|pQ>f8&0mF&6epXui5vWl1MKvyCpB|x5knY+m{0|z zk_EP8-}Y0Gwq31x`0Dbg7sE|B&jv9$hrs;;OmY(nkAGn8ggmu!7%b12%{ok0^heR_ zk;8-rSS920D@*iSddu6q7-e5hhe&i+ayfDVq<&}O=pN^(HPK^(IEc;)Q#$-li%RD_{r=aiB30?R8NwIzj#!%|PYSH$ zSM9J)Quz$|V??w24NdFoR6ti>&J}38cuSinU0ad8yq3ktW%u6W)9zv!3t^y0^@QMn?UcI?9!&DX%l;XuBd-S#!fVKw3hc!i${lw zxcFB^P@{NEiA9N{{!Emj!W#Ks=3DsR=9^#6gtwP^<1LO1y310jP9o7+4o7yO@p447C<=UoMR*ySuTg5F>*X zWj9`Mj$0ssaq9ys3^Y)!b}EV7B##-L?b5;)jpeb!3nzu%cv>-0o~UPXypu>tGypG% zQWk^VPtxJ)A3|oQpU=gNVVyQCl220L(N^z#X)Q=fHAuGPLH7U5tUun(ux0tYiMDdx ze{J+XNtKEJrMlK}>zvBB; z8_JVuZiUxManB4}x>PD%7$xyO5{!DuG`TPWIQ)0@u?A3NQ9z2Q4=d->*wXZ$Uhvw* z9_T%DHFUWScw#{&_kW%yTF#Kd$Z*<(o{F-223~6vhND5>uwQ3PCv14XD)K_I>bs?pZ)q_v7(x@UJugug z^+1N|W%IGBz$yHB9)s=YHS+tO3$EyQi`F&(>5RZn_R{|j3c}y3SQ16iEKL6t1Wwe{ zr?-?0Rhip(zvrRDnNS*2s)?q7N`5X{!7#;UpJ0#}sCiZBO-h%QofnP(n&M0lVRr*G z%XLE{hKOHZV0H>b|Bb5bz5V=fHq^=V5qzheJZy?Nbcm@587?mFG3FGEvA(V6tF7gu zfm&_rf&h>UE5wN4;=EcvTV#~x&)tgCo~R2H>H87;%ms&1X4Qj=oB&bBq64G|JQZc3 zB-xwzq)$-KB@CGaxR3qQIjpyzHc7rnvi#^T)UX&LMHGPzG>cE-l3;N*o1Izyb}-}G zc>&=?cfVxg?TO$1{RFq{i9bP)OWxnR(RV#PMDD8Ns#8(r9s=Lr=k0}Zl8s+iU;Xo$ z=n##_nN!;AJG{L+N5j8FuoSl@-lr(50*7qyk7VcC^O2&4Y z1dOIzVQ`V#Ge42~T@^y2-&hERF=q>!%mNUoXvH$=%%H)N8&rR40v+Szb5D;j zR#OnJw_6O4IN(8ZjrpqLI)ct+o%1FO`QiHvBy*0W=wA-~C|_jR2p5*`jF_`ME$H?s zZ!n)Qp`UGgVs$n2pH>B6VKNfP0+aZkNhs)%%BYrPa1uwE_!&~x`#-CR%q}eO6c!Z; zE(-eE6ZQ1W#VQr0Qc35jV=aWw{MIs^Djb2S<`JR-2l9}53zTdQQwUyIregucIp5eB zd%HvGauq2a{2UCbY$OEDmB=Rv+{r|1@0?KtD7z+!aDr9#zwq&SRGP)W%DUZu^y+`X zIR6)tQVM|S6NUVrW5hZO&?tYEH$iVOBZ#7vK%6L_FkbG4VstQHhbo%k%>!MrV)de!d|oU6~Qh5LwjkZ&tRr@ z?Yj^?nJE`BU15fMeO?48xr~lTAue>=HM|%{<5L|)X=3dSaRiXBAE+kFLeX=6?glhb zDfUrEcN_G2h5d*@YvaQdZ*lEGJkLTKk2p2 zhaW>ja?ev(0fAR%9YOs-Jd}zdh4sUm^b|SE@zuqC#9(B6=w}=CoOd+58Okf)^c1*B zNO4mXEjbi1SUA6QA}+u+Yk6?|pn-D)L<32z*ZMsXU^9&rBAg~W2b*0h6Ok;V^e?3s zdGGN7_CTZb^z`w?3^Ny5Gsxr$Fjc^woZ8Ten!;cm(*k=W&x*$D+f<566B$f(9}%jJ zxANOZd#$R8ap+Cavf9f2tn-xpnPgGZ4L}fcb-~c>c{|+Vc~&0Kcc^*!JKEUJ1l2UY zMs^Q%kWi|e%FRs;vJFFXn-z+TvH4!MXxKUpLwyeJ*xx3AMCAblU9Lma1(R|HvUUTy zNzXVhyY;@<3TN8ns|hYevZb+m*t7}J$#w@o77LpN+r6p!XBy66=ZC#c@PG6m2XdJ# zqQhD{Bs=37uHu`>Km`*m`PA&>&zygAjcirrb%}ELP!WJlzO$?gH_*aiIm<|Oc6RnJ zluf?ILT+GU(lY;~1T78OTu%>;a6=_61(4ipk8>elVQHZaUsMosd`%)?LI~+k)mN>J z&y5DwOFKZEf%a}Pq?#VJd7Ri=x^i?e`jU)fmdDflFCgCVS`6sK#RccE#iVaEZ>H_| z>TI`}9babu^f3!;y*Bnd{N5k&J8Tvb14@` z2%8xDBS~}>IekIDNxuzVh3l$0KsN?yq(HbCaePXg%$KH3RzZBh&J(|QKm2DIhQWJ2 z_y&j7UfUvn@V~tPivy(Hi57R>(QmDPRldjz({FN`aS7J%<~>U05E6BrRLLb(TU$Hq zo|;D5^qHzezp7|`&zIGWbOrq_){Gsbk|GW90VSbe^8a?y;yWNg-IP4gmbX{?n{tR# zqRE*`3+X445slDxt8b_dLTh7C%=(Alm<5$(hB5$Jrp+d&f%QJv%H?#$#zj@w-%c_? zng`2j+}tTU*B*GR_L=*~x{xG3`5ivz$jtq@ogCM}5hatAL(J_ius%&w**AS+Aa4KX9{Yq+8H%y-92Q2c}n^tskw#!|Hy!M)J|8siWz=S zhR&~+XH?0lUDMOFe0MjShl7e{)xgzG6{#=VKzj;vUq;oG?DU@PZM>!Pz7oby1ba%x zrD*wg3nd|+3@<@{!+Sq%=5sOxm+1^IS?6MJ$4w3av%vtXk1mX-cScEdqRctMeIGgQ~ zj8E62+G={NPsmW3Tv~M$M?(#kt;wk`88|-v+yg{f#easj)3Hiv?Wa3crAGqin#QMc z(v(`zB1jEogSckHfz{+yjdC*SUz-SFfMX<5n*+Y6ow#dgAjq$L2RGJ#M@;}{Q?q7$ zBL(5VwNwaxH^Y%7cE{~|KH6boamnYf+&;o+=pvURjR!DNr)L;64CW!X=qaK_=;72r2yWy zIeoGN=y47TqxR?7U`4ef68E2+>_LHGn9il2d0^s=$Ei1|rDVdb^XEGK<2Riw67nLE zvNRen&m8H8@iCGlBj`ZqBmi+5;5q#}_ZlPsf#JZt=KR4K#-!_+~2nxZ)C zj_6qn^fihPQ1Q6(oc+1!V|0%zoYW{OMgXztB*9l?O0%41tED%TOsUfBZHAp?vN=p8 zB}Erj0RIpz4ojh;y1TDSIk1PHN@FnqZW>>ez`0d9fhO*uC^S%0AvP)0c-T2@`xL@jGEyeyb#SQx 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

    a8x0C{*b{eu)Hn%0G_vP)GoanFI=% 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 TG>HB$;A5m`a=r4JL->CI;&2u+ literal 0 HcmV?d00001 diff --git a/themes/V4/Blank/dropdownTexture.png b/themes/V4/Blank/dropdownTexture.png new file mode 100644 index 0000000000000000000000000000000000000000..d0c0256c0930789944d3b6567692a532620bdc84 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!YL8Sly literal 0 HcmV?d00001 diff --git a/themes/V4/Blank/settings.json b/themes/V4/Blank/settings.json new file mode 100644 index 000000000..3786248fb --- /dev/null +++ b/themes/V4/Blank/settings.json @@ -0,0 +1,6 @@ +{ + "name" : "Blank", + "renderer" : "V3", + "baseTheme" : false, + "baseSnippets" : false +} diff --git a/themes/V4/Blank/snippets.js b/themes/V4/Blank/snippets.js new file mode 100644 index 000000000..e92e757cf --- /dev/null +++ b/themes/V4/Blank/snippets.js @@ -0,0 +1,506 @@ +/* eslint-disable max-lines */ + +const WatercolorGen = require('./snippets/watercolor.gen.js'); +const ImageMaskGen = require('./snippets/imageMask.gen.js'); +const FooterGen = require('./snippets/footer.gen.js'); +const dedent = require('dedent-tabs').default; + +module.exports = [ + + { + groupName : 'Text Editor', + icon : 'fas fa-pencil-alt', + view : 'text', + snippets : [ + { + name : 'Column Break', + icon : 'fas fa-columns', + gen : '\n\\column\n' + }, + { + name : 'New Page', + icon : 'fas fa-file-alt', + gen : '\n\\page\n' + }, + { + name : 'Page Numbering', + icon : 'fas fa-bookmark', + subsnippets : [ + { + name : 'Page Number', + icon : 'fas fa-bookmark', + gen : '{{pageNumber 1}}\n' + }, + { + name : 'Auto-incrementing Page Number', + icon : 'fas fa-sort-numeric-down', + gen : '{{pageNumber,auto}}\n' + }, + { + name : 'Skip Page Number Increment this Page', + icon : 'fas fa-xmark', + gen : '{{skipCounting}}\n' + }, + { + name : 'Restart Numbering', + icon : 'fas fa-arrow-rotate-left', + gen : '{{resetCounting}}\n' + }, + ] + }, + { + name : 'Footer', + icon : 'fas fa-shoe-prints', + gen : FooterGen.createFooterFunc(), + subsnippets : [ + { + name : 'Footer from H1', + icon : 'fas fa-dice-one', + gen : FooterGen.createFooterFunc(1) + }, + { + name : 'Footer from H2', + icon : 'fas fa-dice-two', + gen : FooterGen.createFooterFunc(2) + }, + { + name : 'Footer from H3', + icon : 'fas fa-dice-three', + gen : FooterGen.createFooterFunc(3) + }, + { + name : 'Footer from H4', + icon : 'fas fa-dice-four', + gen : FooterGen.createFooterFunc(4) + }, + { + name : 'Footer from H5', + icon : 'fas fa-dice-five', + gen : FooterGen.createFooterFunc(5) + }, + { + name : 'Footer from H6', + icon : 'fas fa-dice-six', + gen : FooterGen.createFooterFunc(6) + } + ] + }, + { + name : 'Vertical Spacing', + icon : 'fas fa-arrows-alt-v', + gen : '\n::::\n' + }, + { + name : 'Horizontal Spacing', + icon : 'fas fa-arrows-alt-h', + gen : ' {{width:100px}} ' + }, + { + name : 'Wide Block', + icon : 'fas fa-window-maximize', + gen : dedent`\n + {{wide + Everything in here will be extra wide. Tables, text, everything! + Beware though, CSS columns can behave a bit weird sometimes. You may + have to manually place column breaks with \`\column\` to make the + surrounding text flow with this wide block the way you want. + }} + \n` + }, + { + name : 'QR Code', + icon : 'fas fa-qrcode', + gen : (brew)=>{ + return `![]` + + `(https://api.qrserver.com/v1/create-qr-code/?data=` + + `https://homebrewery.naturalcrit.com${brew.shareId ? `/share/${brew.shareId}` : ''}` + + `&size=100x100) {width:100px;mix-blend-mode:multiply}`; + } + }, + { + name : 'Link to page', + icon : 'fas fa-link', + gen : '[Click here](#p3) to go to page 3\n' + }, + { + name : 'Add Comment', + icon : 'fas fa-code', + gen : '' + }, + { + name : 'Homebrewery Credit', + icon : 'fas fa-dice-d20', + gen : function(){ + return dedent` + {{homebreweryCredits + Made With + + {{homebreweryIcon}} + + The Homebrewery + [Homebrewery.Naturalcrit.com](https://homebrewery.naturalcrit.com) + }}\n\n`; + }, + } + ] + }, + { + groupName : 'Style Editor', + icon : 'fas fa-pencil-alt', + view : 'style', + snippets : [ + { + name : 'Add Comment', + icon : 'fas fa-code', + gen : '/* This is a comment that will not be rendered into your brew. */' + }, + ] + }, + + /*********************** IMAGES *******************/ + { + groupName : 'Images', + icon : 'fas fa-images', + view : 'text', + snippets : [ + { + name : 'Image', + icon : 'fas fa-image', + gen : dedent` + ![cat warrior](https://s-media-cache-ak0.pinimg.com/736x/4a/81/79/4a8179462cfdf39054a418efd4cb743e.jpg) {width:325px,mix-blend-mode:multiply}` + }, + { + name : 'Image Wrap Left', + icon : 'fac image-wrap-left', + gen : dedent` + ![homebrewery_mug](http://i.imgur.com/hMna6G0.png) {width:280px,margin-right:-3cm,wrapLeft}` + }, + { + name : 'Image Wrap Right', + icon : 'fac image-wrap-right', + gen : dedent` + ![homebrewery_mug](http://i.imgur.com/hMna6G0.png) {width:280px,margin-left:-3cm,wrapRight}` + }, + { + name : 'Background Image', + icon : 'fas fa-tree', + gen : dedent` + ![homebrew mug](http://i.imgur.com/hMna6G0.png) {position:absolute,top:50px,right:30px,width:280px}` + }, + { + name : 'Watercolor Splatter', + icon : 'fas fa-fill-drip', + gen : WatercolorGen, + }, + { + name : 'Watercolor Center', + icon : 'fac mask-center', + gen : ImageMaskGen.center, + experimental : true, + }, + { + name : 'Watercolor Edge', + icon : 'fac mask-edge', + gen : ImageMaskGen.edge('bottom'), + experimental : true, + subsnippets : [ + { + name : 'Top', + icon : 'fac position-top', + gen : ImageMaskGen.edge('top'), + }, + { + name : 'Right', + icon : 'fac position-right', + gen : ImageMaskGen.edge('right'), + }, + { + name : 'Bottom', + icon : 'fac position-bottom', + gen : ImageMaskGen.edge('bottom'), + }, + { + name : 'Left', + icon : 'fac position-left', + gen : ImageMaskGen.edge('left'), + }, + ] + }, + { + name : 'Watercolor Corner', + icon : 'fac mask-corner', + gen : ImageMaskGen.corner, + experimental : true, + subsnippets : [ + { + name : 'Top-Left', + icon : 'fac position-top-left', + gen : ImageMaskGen.corner('top', 'left'), + }, + { + name : 'Top-Right', + icon : 'fac position-top-right', + gen : ImageMaskGen.corner('top', 'right'), + }, + { + name : 'Bottom-Left', + icon : 'fac position-bottom-left', + gen : ImageMaskGen.corner('bottom', 'left'), + }, + { + name : 'Bottom-Right', + icon : 'fac position-bottom-right', + gen : ImageMaskGen.corner('bottom', 'right'), + } + ] + }, + { + name : 'Watermark', + icon : 'fas fa-id-card', + gen : dedent` + {{watermark Homebrewery}}\n` + }, + ] + }, + + /********************* TABLES *********************/ + + { + groupName : 'Tables', + icon : 'fas fa-table', + view : 'text', + snippets : [ + { + name : 'Table', + icon : 'fas fa-th-list', + gen : function(){ + return dedent` + ##### Character Advancement + | Experience Points | Level | Proficiency Bonus | + |:------------------|:-----:|:-----------------:| + | 0 | 1 | +2 | + | 300 | 2 | +2 | + | 900 | 3 | +2 | + | 2,700 | 4 | +2 | + | 6,500 | 5 | +3 | + | 14,000 | 6 | +3 | + \n`; + } + }, + { + name : 'Wide Table', + icon : 'fas fa-list', + gen : function(){ + return dedent` + {{wide + ##### Weapons + | Name | Cost | Damage | Weight | Properties | + |:------------------------|:-----:|:----------------|--------:|:-----------| + | *Simple Melee Weapons* | | | | | + |   Club | 1 sp | 1d4 bludgeoning | 2 lb. | Light | + |   Dagger | 2 gp | 1d4 piercing | 1 lb. | Finesse | + |   Spear | 1 gp | 1d6 piercing | 3 lb. | Thrown | + | *Simple Ranged Weapons* | | | | | + |   Dart | 5 cp | 1d4 piercig | 1/4 lb. | Finesse | + |   Shortbow | 25 gp | 1d6 piercing | 2 lb. | Ammunition | + |   Sling | 1 sp | 1d4 bludgeoning | — | Ammunition | + }} + \n`; + } + }, + { + name : 'Split Table', + icon : 'fas fa-th-large', + gen : function(){ + return dedent` + ##### Typical Difficulty Classes + {{column-count:2 + | Task Difficulty | DC | + |:----------------|:--:| + | Very easy | 5 | + | Easy | 10 | + | Medium | 15 | + + | Task Difficulty | DC | + |:------------------|:--:| + | Hard | 20 | + | Very hard | 25 | + | Nearly impossible | 30 | + }} + \n`; + } + } + ] + }, + /**************** FONTS *************/ + { + groupName : 'Fonts', + icon : 'fas fa-keyboard', + view : 'text', + snippets : [ + { + name : 'Open Sans', + icon : 'font OpenSans', + gen : dedent`{{font-family:OpenSans Dummy Text}}` + }, + { + name : 'Code Bold', + icon : 'font CodeBold', + gen : dedent`{{font-family:CodeBold Dummy Text}}` + }, + { + name : 'Code Light', + icon : 'font CodeLight', + gen : dedent`{{font-family:CodeLight Dummy Text}}` + }, + { + name : 'Scaly Sans', + icon : 'font ScalySansRemake', + gen : dedent`{{font-family:ScalySansRemake Dummy Text}}` + }, + { + name : 'Book Insanity', + icon : 'font BookInsanityRemake', + gen : dedent`{{font-family:BookInsanityRemake Dummy Text}}` + }, + { + name : 'Mr Eaves', + icon : 'font MrEavesRemake', + gen : dedent`{{font-family:MrEavesRemake Dummy Text}}` + }, + { + name : 'Pagella', + icon : 'font Pagella', + gen : dedent`{{font-family:Pagella Dummy Text}}` + }, + { + name : 'Solbera Imitation', + icon : 'font SolberaImitationRemake', + gen : dedent`{{font-family:SolberaImitationRemake Dummy Text}}` + }, + { + name : 'Scaly Sans Small Caps', + icon : 'font ScalySansSmallCapsRemake', + gen : dedent`{{font-family:ScalySansSmallCapsRemake Dummy Text}}` + }, + { + name : 'Walter Turncoat', + icon : 'font WalterTurncoat', + gen : dedent`{{font-family:WalterTurncoat Dummy Text}}` + }, + { + name : 'Lato', + icon : 'font Lato', + gen : dedent`{{font-family:Lato Dummy Text}}` + }, + { + name : 'Courier', + icon : 'font Courier', + gen : dedent`{{font-family:Courier Dummy Text}}` + }, + { + name : 'Nodesto Caps Condensed', + icon : 'font NodestoCapsCondensed', + gen : dedent`{{font-family:NodestoCapsCondensed Dummy Text}}` + }, + { + name : 'Overpass', + icon : 'font Overpass', + gen : dedent`{{font-family:Overpass Dummy Text}}` + }, + { + name : 'Davek', + icon : 'font Davek', + gen : dedent`{{font-family:Davek Dummy Text}}` + }, + { + name : 'Iokharic', + icon : 'font Iokharic', + gen : dedent`{{font-family:Iokharic Dummy Text}}` + }, + { + name : 'Rellanic', + icon : 'font Rellanic', + gen : dedent`{{font-family:Rellanic Dummy Text}}` + }, + { + name : 'Times New Roman', + icon : 'font TimesNewRoman', + gen : dedent`{{font-family:"Times New Roman" Dummy Text}}` + } + ] + }, + + /**************** LAYOUT *************/ + + { + groupName : 'Print', + icon : 'fas fa-print', + view : 'style', + snippets : [ + { + name : 'A3 Page Size', + icon : 'far fa-file', + gen : dedent`/* A3 Page Size */ + .page { + width : 297mm; + height : 420mm; + }\n\n`, + }, + { + name : 'A4 Page Size', + icon : 'far fa-file', + gen : dedent`/* A4 Page Size */ + .page { + width : 210mm; + height : 296.8mm; + }\n\n` + }, + { + name : 'A5 Page Size', + icon : 'far fa-file', + gen : dedent`/* A5 Page Size */ + .page { + width : 148mm; + height : 210mm; + }\n\n`, + }, + { + name : 'Square Page Size', + icon : 'far fa-file', + gen : dedent`/* Square Page Size */ + .page { + width : 125mm; + height : 125mm; + padding : 12.5mm; + columns : unset; + }\n\n` + }, + { + name : 'Card Page Size', + icon : 'far fa-file', + gen : dedent`/* Card Size */ + .page { + width : 63.5mm; + height : 88.9mm; + padding : 5mm; + columns : unset; + }\n\n` + }, + { + name : 'Ink Friendly', + icon : 'fas fa-tint', + gen : dedent` + /* Ink Friendly */ + *:is(.page) { + background : white !important; + filter : drop-shadow(0px 0px 3px #888) !important; + } + + .page img { + visibility : hidden; + }\n\n` + }, + ] + }, +]; diff --git a/themes/V4/Blank/snippets/footer.gen.js b/themes/V4/Blank/snippets/footer.gen.js new file mode 100644 index 000000000..9384baed7 --- /dev/null +++ b/themes/V4/Blank/snippets/footer.gen.js @@ -0,0 +1,17 @@ +import Markdown from '../../../../shared/naturalcrit/markdown.js'; + +module.exports = { + createFooterFunc : function(headerSize=1){ + return (props)=>{ + const cursorPos = props.cursorPos; + + const markdownText = props.brew.text.split('\n').slice(0, cursorPos.line).join('\n'); + const markdownTokens = Markdown.marked.lexer(markdownText); + const headerToken = markdownTokens.findLast((lexerToken)=>{ return lexerToken.type === 'heading' && lexerToken.depth === headerSize; }); + const headerText = headerToken?.tokens.map((token)=>{ return token.text; }).join(''); + const outputText = headerText || 'PART 1 | SECTION NAME'; + + return `\n{{footnote ${outputText}}}\n`; + }; + } +}; \ No newline at end of file diff --git a/themes/V4/Blank/snippets/imageMask.gen.js b/themes/V4/Blank/snippets/imageMask.gen.js new file mode 100644 index 000000000..323f89a1f --- /dev/null +++ b/themes/V4/Blank/snippets/imageMask.gen.js @@ -0,0 +1,46 @@ +const _ = require('lodash'); +const dedent = require('dedent-tabs').default; + +module.exports = { + center : ()=>{ + return dedent` + {{imageMaskCenter${_.random(1, 16)},--offsetX:0%,--offsetY:0%,--rotation:0 + ![](https://i.imgur.com/GZfjDWV.png){height:100%} + }} + \n\n`; + }, + + edge : (side = 'bottom')=>{ + const rotation = { + 'bottom' : 0, + 'top' : 180, + 'left' : 90, + 'right' : 270 + }[side]; + return dedent` + {{imageMaskEdge${_.random(1, 8)},--offset:0%,--rotation:${rotation} + ![](https://i.imgur.com/GZfjDWV.png){height:100%} + }} + \n\n`; + }, + + corner : (y = 'top', x = 'left')=>{ + const offsetX = (x == 'left' ? '-50%' : '50%'); + const offsetY = (y == 'top' ? '50%' : '-50%'); + return dedent` + {{imageMaskCorner${_.random(1, 37)},--offsetX:${offsetX},--offsetY:${offsetY},--rotation:0 + ![](https://i.imgur.com/GZfjDWV.png){height:100%} + }} + \n\n`; + } + +}; + +()=>{ + +}; diff --git a/themes/V4/Blank/snippets/watercolor.gen.js b/themes/V4/Blank/snippets/watercolor.gen.js new file mode 100644 index 000000000..735a35602 --- /dev/null +++ b/themes/V4/Blank/snippets/watercolor.gen.js @@ -0,0 +1,5 @@ +const _ = require('lodash'); + +module.exports = ()=>{ + return `{{watercolor${_.random(1, 12)},top:20px,left:30px,width:300px,background-color:#BBAD82,opacity:80%}}\n\n`; +}; diff --git a/themes/V4/Blank/style.less b/themes/V4/Blank/style.less new file mode 100644 index 000000000..68d2ff07d --- /dev/null +++ b/themes/V4/Blank/style.less @@ -0,0 +1,524 @@ +@import (less) './themes/fonts/Blank/fonts.less'; +@import (less) './themes/fonts/5e/fonts.less'; +@import (less) './themes/assets/assets.less'; +@import (less) './themes/fonts/iconFonts/elderberryInn.less'; +@import (less) './themes/fonts/iconFonts/diceFont.less'; +@import (less) './themes/fonts/iconFonts/gameIcons.less'; +@import (less) './themes/fonts/iconFonts/fontAwesome.less'; + +:root { + //Colors + --HB_Color_Background : #FFFFFF; // White + --HB_Color_WatercolorStain : #000000; // Black +} + +@page { margin : 0; } +body { counter-reset : page-numbers 0; } +* { -webkit-print-color-adjust : exact; } + +//***************************** +// * MUSTACHE DIVS/SPANS +// *****************************/ +.page { + .block { + break-inside : avoid; + display : inline-block; + width : 100%; + img { z-index : 0; } + } + .inline-block { + display : inline-block; + text-indent : initial; + } +} + +.useColumns(@multiplier : 1, @fillMode: auto) { + column-fill : @fillMode; + column-count : 2; +} +.columnWrapper { + column-gap : inherit; + max-height : 100%; + column-span : all; + columns : inherit; + column-fill : inherit; +} +.page { + .useColumns(); + position : relative; + z-index : 15; + box-sizing : border-box; + width : 215.9mm; + height : 279.4mm; + padding : 1.4cm 1.9cm 1.7cm; + overflow : hidden; + background-color : var(--HB_Color_Background); + text-rendering : optimizeLegibility; + contain : size; +} +//***************************** +// * BASE + // *****************************/ +.page { + p { + display : block; + overflow-wrap : break-word; + } + strong { font-weight : bold; } + em { font-style : italic; } + sup { + font-size : smaller; + line-height : 0; + vertical-align : super; + } + sub { + font-size : smaller; + line-height : 0; + vertical-align : sub; + } + ul { + padding-left : 1.4em; + list-style-position : outside; //Needed for multiline list items + list-style-type : disc; + } + ol { + padding-left : 1.4em; + list-style-position : outside; + list-style-type : decimal; + } + img { z-index : -1; } + + //***************************** + // * HEADERS + // *****************************/ + h1,h2,h3,h4,h5,h6 { + font-weight : bold; + line-height : 1.2em; + } + h1 { font-size : 2em; } + h2 { font-size : 1.5em; } + h3 { font-size : 1.17em; } + h4 { font-size : 1em; } + h5 { font-size : 0.83em; } + //***************************** + // * TABLE + // *****************************/ + table { + width : 100%; + thead { + display : table-row-group; + font-weight : bold; + } + } + div:not(.columnWrapper) > table + table { // Side-by-side tables should not + margin-top : 0; // have vertical spacing. + } + + //************************************ + // * CODE BLOCKS + // ************************************/ + code { + font-family : 'Courier New', "Courier", monospace; + overflow-wrap : break-word; + white-space : pre-wrap; + } + + pre code { + display : inline-block; + width : 100%; + } + //***************************** + // * EXTRAS + // *****************************/ + .columnSplit { + margin-top : 0; + visibility : hidden; + -webkit-column-break-after : always; + break-after : always; + -moz-column-break-after : always; + & + * { margin-top : 0; } + } + //Avoid breaking up + blockquote,table { + z-index : 15; + -webkit-column-break-inside : avoid; + page-break-inside : avoid; + break-inside : avoid; + } + // Nested lists + ul ul,ol ol,ul ol,ol ul { + margin-bottom : 0px; + margin-left : 1.5em; + } + li { + -webkit-column-break-inside : avoid; + page-break-inside : avoid; + break-inside : avoid; + } + + /* Wrap Text */ + .wrapLeft { + shape-outside : var(--HB_src); + float : right; + shape-margin : 0.2cm; + } + + .wrapRight { + shape-outside : var(--HB_src); + float : left; + shape-margin : 0.2cm; + } + + /* Watermark */ + .watermark { + position : absolute; + top : 0; + left : 0; + z-index : 500; + display : grid !important; + place-items : center; + justify-content : center; + width : 100%; + height : 100%; + margin : 0; + font-size : 120px; + text-transform : uppercase; + opacity : 30%; + transform : rotate(-45deg); + p { margin-bottom : none; } + } + + /* Watercolor */ + [class*='watercolor'] { + position : absolute; + z-index : -2; + width : 2000px; /* dimensions need to be real big so the user can set */ + height : 2000px; /* height or width and the image will maintain aspect ratio */ + background-color : var(--HB_Color_WatercolorStain); /* default color */ + background-size : cover; + -webkit-mask-image : var(--wc); + -webkit-mask-size : contain; + -webkit-mask-repeat : no-repeat; + mask-image : var(--wc); + mask-size : contain; + mask-repeat : no-repeat; + --wc : @watercolor1; /* default image */ + } + + .watercolor1 { --wc : @watercolor1; } + .watercolor2 { --wc : @watercolor2; } + .watercolor3 { --wc : @watercolor3; } + .watercolor4 { --wc : @watercolor4; } + .watercolor5 { --wc : @watercolor5; } + .watercolor6 { --wc : @watercolor6; } + .watercolor7 { --wc : @watercolor7; } + .watercolor8 { --wc : @watercolor8; } + .watercolor9 { --wc : @watercolor9; } + .watercolor10 { --wc : @watercolor10; } + .watercolor11 { --wc : @watercolor11; } + .watercolor12 { --wc : @watercolor12; } + + /* Image Masks */ + + [class*='imageMask'] { + position : absolute; + bottom : 50%; + left : 50%; + z-index : -1; + width : 200%; + height : 200%; + background-image : var(--checkerboard); + background-size : 20px; + transform : translateY(50%) translateX(-50%) rotate(calc(1deg * var(--rotation))) scaleX(var(--scaleX)) scaleY(var(--scaleY)); + -webkit-mask-image : var(--wc), var(--revealer); + -webkit-mask-repeat : repeat-x; + -webkit-mask-size : 50%; //Scale only X to fit page width, leave height at aspect ratio, designed to hang off the edge + -webkit-mask-position : 50% calc(50% - var(--offset)); + mask-image : var(--wc); + mask-repeat : repeat-x; + mask-size : 50%; + mask-position : 50% calc(50% - var(--offset)); + --rotation : 0; + --revealer : none; + --checkerboard : none; + --scaleX : 1; + --scaleY : 1; + & > p:has(img) { + position : absolute; + bottom : 50%; + left : 50%; + width : 50%; + height : 50%; + transform : translateX(-50%) translateY(50%) scaleX(calc(1 / var(--scaleX))) scaleY(calc(1 / var(--scaleY))) rotate(calc(-1deg * var(--rotation))); + } + & img { + position : absolute; + bottom : 0; + display : block; + } + &.bottom { + --rotation : 0; + & img {bottom : 0;} + } + &.top { + --rotation : 180; + & img {top : 0;} + } + &.left { + --rotation : 90; + & img {left : 0;} + } + &.right { + --rotation : -90; + & img {right : 0;} + } + &.revealImage { + --revealer : linear-gradient(0deg, rgba(0,0,0,0.2) 0%, rgba(0,0,0,0.2)); + --checkerboard : url("/assets/waterColorMasks/missingImage.png"); //shows any masked regions not filled by image + } + } + + .imageMaskEdge { + &1 { --wc : url("/assets/waterColorMasks/edge/0001.webp"); } + &2 { --wc : url("/assets/waterColorMasks/edge/0002.webp"); } + &3 { --wc : url("/assets/waterColorMasks/edge/0003.webp"); } + &4 { --wc : url("/assets/waterColorMasks/edge/0004.webp"); } + &5 { --wc : url("/assets/waterColorMasks/edge/0005.webp"); } + &6 { --wc : url("/assets/waterColorMasks/edge/0006.webp"); } + &7 { --wc : url("/assets/waterColorMasks/edge/0007.webp"); } + &8 { --wc : url("/assets/waterColorMasks/edge/0008.webp"); } + } + + [class*='imageMaskCenter'] { + bottom : calc(var(--offsetY)); + left : calc(var(--offsetX)); + width : 100%; + height : 100%; + transform : rotate(calc(1deg * var(--rotation))) scaleX(var(--scaleX)) scaleY(var(--scaleY)); + -webkit-mask-image : var(--wc), var(--revealer); + -webkit-mask-repeat : no-repeat; + -webkit-mask-size : 100% 100%; //Scale both dimensions to fit page size + -webkit-mask-position : 0% 0%; + mask-image : var(--wc), var(--revealer); + mask-repeat : no-repeat; + mask-size : 100% 100%; //Scale both dimensions to fit page size + mask-position : 50% 50%; + + & > p:has(img) { + position : absolute; + bottom : 0; + left : 0; + width : 100%; + height : 100%; + transform : unset; + transform : scaleX(calc(1 / var(--scaleX))) scaleY(calc(1 / var(--scaleY))) + rotate(calc(-1deg * var(--rotation))) + translateX(calc(-1 * var(--offsetX))) + translateY(calc(1 * var(--offsetY))); + } + } + + .imageMaskCenter { + &1 { --wc : url("/assets/waterColorMasks/center/0001.webp"); } + &2 { --wc : url("/assets/waterColorMasks/center/0002.webp"); } + &3 { --wc : url("/assets/waterColorMasks/center/0003.webp"); } + &4 { --wc : url("/assets/waterColorMasks/center/0004.webp"); } + &5 { --wc : url("/assets/waterColorMasks/center/0005.webp"); } + &6 { --wc : url("/assets/waterColorMasks/center/0006.webp"); } + &7 { --wc : url("/assets/waterColorMasks/center/0007.webp"); } + &8 { --wc : url("/assets/waterColorMasks/center/0008.webp"); } + &9 { --wc : url("/assets/waterColorMasks/center/0009.webp"); } + &10 { --wc : url("/assets/waterColorMasks/center/0010.webp"); } + &11 { --wc : url("/assets/waterColorMasks/center/0011.webp"); } + &12 { --wc : url("/assets/waterColorMasks/center/0012.webp"); } + &13 { --wc : url("/assets/waterColorMasks/center/0013.webp"); } + &14 { --wc : url("/assets/waterColorMasks/center/0014.webp"); } + &15 { --wc : url("/assets/waterColorMasks/center/0015.webp"); } + &16 { --wc : url("/assets/waterColorMasks/center/0016.webp"); } + &special { --wc : url("/assets/waterColorMasks/center/special.webp"); } + } + + + [class*='imageMaskCorner'] { + bottom : calc(-50% + var(--offsetY)); + left : calc(-50% + var(--offsetX)); + width : 200%; + height : 200%; + transform : rotate(calc(1deg * var(--rotation))) scaleX(var(--scaleX)) scaleY(var(--scaleY)); + -webkit-mask-image : var(--wc), var(--revealer); + -webkit-mask-repeat : no-repeat; + -webkit-mask-size : 100% 100%; //Scale both dimensions to fit page size + -webkit-mask-position : 50% 50%; + mask-image : var(--wc), var(--revealer); + mask-repeat : no-repeat; + mask-size : 100% 100%; //Scale both dimensions to fit page size + mask-position : 50% 50%; + & > p:has(img) { + bottom : 25%; + left : 25%; + width : 50%; + height : 50%; //Complex transform below to handle mix of % and cm offsets + transform : scaleX(calc(1 / var(--scaleX))) scaleY(calc(1 / var(--scaleY))) + rotate(calc(-1deg * var(--rotation))) + translateX(calc(-1 * var(--offsetX))) + translateY(calc(1 * var(--offsetY))); + } + } + .imageMaskCorner { + &1 { --wc : url("/assets/waterColorMasks/corner/0001.webp"); } + &2 { --wc : url("/assets/waterColorMasks/corner/0002.webp"); } + &3 { --wc : url("/assets/waterColorMasks/corner/0003.webp"); } + &4 { --wc : url("/assets/waterColorMasks/corner/0004.webp"); } + &5 { --wc : url("/assets/waterColorMasks/corner/0005.webp"); } + &6 { --wc : url("/assets/waterColorMasks/corner/0006.webp"); } + &7 { --wc : url("/assets/waterColorMasks/corner/0007.webp"); } + &8 { --wc : url("/assets/waterColorMasks/corner/0008.webp"); } + &9 { --wc : url("/assets/waterColorMasks/corner/0009.webp"); } + &10 { --wc : url("/assets/waterColorMasks/corner/0010.webp"); } + &11 { --wc : url("/assets/waterColorMasks/corner/0011.webp"); } + &12 { --wc : url("/assets/waterColorMasks/corner/0012.webp"); } + &13 { --wc : url("/assets/waterColorMasks/corner/0013.webp"); } + &14 { --wc : url("/assets/waterColorMasks/corner/0014.webp"); } + &15 { --wc : url("/assets/waterColorMasks/corner/0015.webp"); } + &16 { --wc : url("/assets/waterColorMasks/corner/0016.webp"); } + &17 { --wc : url("/assets/waterColorMasks/corner/0017.webp"); } + &18 { --wc : url("/assets/waterColorMasks/corner/0018.webp"); } + &19 { --wc : url("/assets/waterColorMasks/corner/0019.webp"); } + &20 { --wc : url("/assets/waterColorMasks/corner/0020.webp"); } + &21 { --wc : url("/assets/waterColorMasks/corner/0021.webp"); } + &22 { --wc : url("/assets/waterColorMasks/corner/0022.webp"); } + &23 { --wc : url("/assets/waterColorMasks/corner/0023.webp"); } + &24 { --wc : url("/assets/waterColorMasks/corner/0024.webp"); } + &25 { --wc : url("/assets/waterColorMasks/corner/0025.webp"); } + &26 { --wc : url("/assets/waterColorMasks/corner/0026.webp"); } + &27 { --wc : url("/assets/waterColorMasks/corner/0027.webp"); } + &28 { --wc : url("/assets/waterColorMasks/corner/0028.webp"); } + &29 { --wc : url("/assets/waterColorMasks/corner/0029.webp"); } + &30 { --wc : url("/assets/waterColorMasks/corner/0030.webp"); } + &31 { --wc : url("/assets/waterColorMasks/corner/0031.webp"); } + &32 { --wc : url("/assets/waterColorMasks/corner/0032.webp"); } + &33 { --wc : url("/assets/waterColorMasks/corner/0033.webp"); } + &34 { --wc : url("/assets/waterColorMasks/corner/0034.webp"); } + &35 { --wc : url("/assets/waterColorMasks/corner/0035.webp"); } + &36 { --wc : url("/assets/waterColorMasks/corner/0036.webp"); } + &37 { --wc : url("/assets/waterColorMasks/corner/0037.webp"); } + } +} + +//***************************** +// * DEFINITION LISTS +// *****************************/ +.page { + dl { + padding-left : 1em; + white-space : pre-line; + } + dt { + display : inline; + margin-right : 0.5ch; + margin-left : -1em; + } + dd { + display : inline; + margin-left : 0; + text-indent : 0; + } +} + +//***************************** +// * BLANK LINE +// *****************************/ +.page { + .blank { + height : 1em; + margin-top : 0; + & + * { margin-top : 0; } + } +} + +//***************************** +// * WIDE +// *****************************/ +.page { + .wide { + column-span : all; + display : block; + margin-bottom : 1em; + & + * { margin-top : 0; } + } +} + +//***************************** +//* CREDITS +//*****************************/ +.page .homebreweryCredits { + p { + font-family : 'NodestoCapsWide'; + font-size : 0.4cm; + line-height : 1em; + text-align : center; + text-indent : 0; + letter-spacing : 0.08em; + } + a { + color : inherit; + text-decoration : none; + &:hover { text-decoration : underline; } + } + .homebreweryIcon { + display : block; + height : 1.5cm; + margin : 0 auto; + background-color : black; + -webkit-mask : url("/assets/naturalCritLogoWhite.svg") center / contain no-repeat; + mask : url("/assets/naturalCritLogoWhite.svg") center / contain no-repeat; + } + .homebreweryIcon.red { background-color : red; } + .homebreweryIcon.gold { background-image : linear-gradient(to top left, brown 22.5%, gold 40%, white 60%, gold 67.5%, brown 82.5%); } +} + +//***************************** +//* Page Number +//*****************************/ +.page { + .pageNumber { + position : absolute; + right : 30px; + bottom : 30px; + width : 50px; + font-size : 0.9em; + text-align : center; + &.auto::after { content : counter(page-numbers); } + } + + &:nth-child(even) { + .pageNumber { left : 30px; } + } + + .resetCounting { + counter-set : page-numbers 1; + } + + &:not(:has(.skipCounting)) { + counter-increment : page-numbers; + } + +} + +//***************************** +//* Forced Justification +//*****************************/ + +.page { + .mdParagraphJustifyLeft { + text-align: left; + } + + .mdParagraphJustifyRight { + text-align: right; + } + + .mdParagraphJustifyCenter { + text-align: center; + } +} diff --git a/themes/themes.json b/themes/themes.json index 16a4b9b13..46b6e57c3 100644 --- a/themes/themes.json +++ b/themes/themes.json @@ -36,5 +36,14 @@ "baseSnippets": "5ePHB", "path": "Journal" } + }, + "V4": { + "Blank": { + "name": "Blank", + "renderer": "V3", + "baseTheme": false, + "baseSnippets": false, + "path": "Blank" + } } } \ No newline at end of file From 89bd0829675bac840bcfebd7a5a85231cf6b3567 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Tue, 10 Dec 2024 23:28:06 -0600 Subject: [PATCH 15/61] Shift alignment assignment from CSS to HTML --- shared/naturalcrit/markdown.js | 8 ++++---- themes/themes.json | 9 --------- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/shared/naturalcrit/markdown.js b/shared/naturalcrit/markdown.js index 5e81be3f0..6c76194cb 100644 --- a/shared/naturalcrit/markdown.js +++ b/shared/naturalcrit/markdown.js @@ -372,9 +372,9 @@ const superSubScripts = { const justifiedParagraphClasses = []; -justifiedParagraphClasses[2] = 'mdParagraphJustifyLeft'; -justifiedParagraphClasses[4] = 'mdParagraphJustifyRight'; -justifiedParagraphClasses[6] = 'mdParagraphJustifyCenter'; +justifiedParagraphClasses[2] = 'Left'; +justifiedParagraphClasses[4] = 'Right'; +justifiedParagraphClasses[6] = 'Center'; const justifiedParagraphs = { name : 'justifiedParagraphs', @@ -402,7 +402,7 @@ const justifiedParagraphs = { } }, renderer(token) { - return `

    ${this.parser.parseInline(token.tokens)}

    `; + return `

    ${this.parser.parseInline(token.tokens)}

    `; } }; diff --git a/themes/themes.json b/themes/themes.json index 46b6e57c3..16a4b9b13 100644 --- a/themes/themes.json +++ b/themes/themes.json @@ -36,14 +36,5 @@ "baseSnippets": "5ePHB", "path": "Journal" } - }, - "V4": { - "Blank": { - "name": "Blank", - "renderer": "V3", - "baseTheme": false, - "baseSnippets": false, - "path": "Blank" - } } } \ No newline at end of file From 7c69d2a74db3e7dd22a05a6b6c8d40d72498046d Mon Sep 17 00:00:00 2001 From: David Bolack Date: Tue, 10 Dec 2024 23:37:48 -0600 Subject: [PATCH 16/61] Update tests to match --- tests/markdown/justification.test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/markdown/justification.test.js b/tests/markdown/justification.test.js index e3639eb81..48b311e85 100644 --- a/tests/markdown/justification.test.js +++ b/tests/markdown/justification.test.js @@ -6,17 +6,17 @@ describe('Justification', ()=>{ test('Left Justify', function() { const source = ':- Hello'; const rendered = Markdown.render(source); - expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

    Hello

    `); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

    Hello

    `); }); test('Right Justify', function() { const source = '-: Hello'; const rendered = Markdown.render(source); - expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

    Hello

    `); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

    Hello

    `); }); test('Center Justify', function() { const source = ':-: Hello'; const rendered = Markdown.render(source); - expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

    Hello

    `); + expect(rendered, `Input:\n${source}`, { showPrefix: false }).toBe(`

    Hello

    `); }); test('Ignored inside a code block', function() { From 08b0f47ea25005d80579079b10cc1a8717da39f9 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Tue, 17 Dec 2024 21:33:33 -0600 Subject: [PATCH 17/61] Fix Regex for Justified paragraphs --- shared/naturalcrit/markdown.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/shared/naturalcrit/markdown.js b/shared/naturalcrit/markdown.js index 6c76194cb..7a5c45d99 100644 --- a/shared/naturalcrit/markdown.js +++ b/shared/naturalcrit/markdown.js @@ -380,11 +380,10 @@ const justifiedParagraphs = { name : 'justifiedParagraphs', level : 'block', start(src) { - return src.match(/\n(?:-:|:-|:-:) {1}/m)?.index; - + return src.match(/\n(?:-:|:-|-:) {1}/m)?.index; }, // Hint to Marked.js to stop and check for a match tokenizer(src, tokens) { - const regex = /^((:- ).*)|((-: ).*)|((:-: ).*)(?:\n|$)/ym; + const regex = /^(((:-))|((-:))|((:-:))) .+\n([^\n].*\n)*\n/ygm; const match = regex.exec(src); if(match?.length) { let whichJustify; From 99d3d287543c84257e09e6432045dcf8ff4e40e9 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Tue, 17 Dec 2024 21:48:11 -0600 Subject: [PATCH 18/61] Correct end of match criteria for justified paragraph to account for end of stream --- shared/naturalcrit/markdown.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shared/naturalcrit/markdown.js b/shared/naturalcrit/markdown.js index 7a5c45d99..c87121ddc 100644 --- a/shared/naturalcrit/markdown.js +++ b/shared/naturalcrit/markdown.js @@ -383,7 +383,7 @@ const justifiedParagraphs = { return src.match(/\n(?:-:|:-|-:) {1}/m)?.index; }, // Hint to Marked.js to stop and check for a match tokenizer(src, tokens) { - const regex = /^(((:-))|((-:))|((:-:))) .+\n([^\n].*\n)*\n/ygm; + const regex = /^(((:-))|((-:))|((:-:))) .+(\n(([^\n].*\n)*(\n|$))|$)/ygm; const match = regex.exec(src); if(match?.length) { let whichJustify; @@ -396,7 +396,7 @@ const justifiedParagraphs = { length : match[whichJustify].length, text : match[0].slice(match[whichJustify].length), class : justifiedParagraphClasses[whichJustify], - tokens : this.lexer.inlineTokens(match[0].slice(match[whichJustify].length)) + tokens : this.lexer.inlineTokens(match[0].slice(match[whichJustify].length + 1)) }; } }, From 90632b78cefaee367b929b3f9ab6a6e33534e226 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Fri, 20 Dec 2024 14:58:56 -0600 Subject: [PATCH 19/61] Add direct tests for paragraph justification --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 2ce79f112..76e00f809 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "test:definition-lists": "jest tests/markdown/definition-lists.test.js --verbose --noStackTrace", "test:hard-breaks": "jest tests/markdown/hard-breaks.test.js --verbose --noStackTrace", "test:non-breaking-spaces": "jest tests/markdown/non-breaking-spaces.test.js --verbose --noStackTrace", + "test:paragraph-justification": "jest tests/markdown/paragraph-justification.test.js --verbose --noStackTrace", "test:emojis": "jest tests/markdown/emojis.test.js --verbose --noStackTrace", "test:route": "jest tests/routes/static-pages.test.js --verbose", "test:safehtml": "jest tests/html/safeHTML.test.js --verbose", From 79c8309291180606615ac4f9824c446240dbd949 Mon Sep 17 00:00:00 2001 From: David Bolack Date: Fri, 20 Dec 2024 19:54:25 -0600 Subject: [PATCH 20/61] Add circleci --- .circleci/config.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 2025e8fe7..c195df81c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -73,6 +73,9 @@ jobs: - run: name: Test - Non-Breaking Spaces command: npm run test:non-breaking-spaces + - run: + name: Test - Paragraph Justification + command: npm run test:paragraph-justification - run: name: Test - Variables command: npm run test:variables From 4a4a14b2abc1bc7d863af8bbe99d0cdb8417f8bb Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Fri, 3 Jan 2025 11:37:51 +1300 Subject: [PATCH 21/61] Add ref correctly, fix typo --- client/homebrew/brewRenderer/brewRenderer.jsx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index efd92167b..aa684b77d 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -54,7 +54,8 @@ const BrewPage = (props)=>{ else props.onVisibilityChange(props.index + 1, false, false); } - )}, + ); + }, { threshold: .3, rootMargin: '0px 0px 0px 0px' } // detect when >30% of page is within bounds. ); @@ -65,7 +66,8 @@ const BrewPage = (props)=>{ if(entry.isIntersecting) props.onVisibilityChange(props.index + 1, true, true); // Set this page as the center page } - )}, + ); + }, { threshold: 0, rootMargin: '-50% 0px -50% 0px' } // Detect when the page is at the center ); @@ -101,7 +103,7 @@ const BrewRenderer = (props)=>{ currentBrewRendererPageNum : 1, themeBundle : {}, onPageChange : ()=>{}, - showHeavderNav : false, + showHeaderNav : false, ...props }; @@ -311,7 +313,7 @@ const BrewRenderer = (props)=>{ && <> {renderedStyle} -
    +
    {renderedPages}
    From bbf6c3589ae97a954eab96a37cac7818d10cc029 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Fri, 3 Jan 2025 11:53:29 +1300 Subject: [PATCH 22/61] Switch from innerText to textContent --- client/homebrew/brewRenderer/headerNav/headerNav.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/homebrew/brewRenderer/headerNav/headerNav.jsx b/client/homebrew/brewRenderer/headerNav/headerNav.jsx index 37eb0185c..20382520d 100644 --- a/client/homebrew/brewRenderer/headerNav/headerNav.jsx +++ b/client/homebrew/brewRenderer/headerNav/headerNav.jsx @@ -36,14 +36,14 @@ const HeaderNav = React.forwardRef(({}, pagesRef)=>{ if(el.localName.match(/^h[1-6]/)){ navList.push({ depth : el.localName[1], - text : el.innerText, + text : el.textContent, link : el.id }); return; } navList.push({ depth : 7, - text : el.innerText, + text : el.textContent, link : el.id }); }); From a95eef05450bea8797aeca7339bd2a56b4bb32d4 Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Fri, 3 Jan 2025 13:34:52 +1300 Subject: [PATCH 23/61] Add maximum length, use span for spacing --- .../brewRenderer/headerNav/headerNav.jsx | 17 +++++++++++--- .../brewRenderer/headerNav/headerNav.less | 23 +++++++++---------- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/client/homebrew/brewRenderer/headerNav/headerNav.jsx b/client/homebrew/brewRenderer/headerNav/headerNav.jsx index 20382520d..19ee0b1d6 100644 --- a/client/homebrew/brewRenderer/headerNav/headerNav.jsx +++ b/client/homebrew/brewRenderer/headerNav/headerNav.jsx @@ -4,6 +4,8 @@ import * as React from 'react'; import * as _ from 'lodash'; +const MAX_TEXT_LENGTH = 40; + const HeaderNav = React.forwardRef(({}, pagesRef)=>{ const [state, setState] = React.useState({ @@ -66,11 +68,20 @@ const HeaderNav = React.forwardRef(({}, pagesRef)=>{ ); const HeaderNavItem = ({ link, text, depth, className })=>{ - return
  • + + const trimString = (text, prefixLength = 0)=>{ + const maxLength = MAX_TEXT_LENGTH - prefixLength; + if(text.trim().length > maxLength){ + return `${text.trim().slice(0, maxLength)}...`; + } + return text.trim(); + }; + + return

    - {`${'-'.repeat(depth)}${text}`} + {trimString(text, depth)} -

  • ; +

    ; }; export default HeaderNav; \ No newline at end of file diff --git a/client/homebrew/brewRenderer/headerNav/headerNav.less b/client/homebrew/brewRenderer/headerNav/headerNav.less index c9bc7918d..d58c4b093 100644 --- a/client/homebrew/brewRenderer/headerNav/headerNav.less +++ b/client/homebrew/brewRenderer/headerNav/headerNav.less @@ -1,6 +1,6 @@ .headerNav { position: fixed; - top: 0px; + top: 30px; left: 0px; padding: 5px 10px; background-color: #ccc; @@ -17,20 +17,19 @@ .navIcon { cursor: pointer; } - li { + a { font-family: 'Open Sans'; font-size: 12px; padding: 2px; - a { - color: inherit; - text-decoration: none; - cursor: pointer; - &:hover { - text-decoration: underline; - } - &.pageLink { - font-weight: 900; - } + color: inherit; + text-decoration: none; + cursor: pointer; + &:hover { + text-decoration: underline; } + &.pageLink { + font-weight: 900; + } + } } \ No newline at end of file From 34f104b406e2b39b250c11d68109e473fa8a484d Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Mon, 6 Jan 2025 22:29:22 +1300 Subject: [PATCH 24/61] Remove showHeaderNav prop from Edit and Share page BrewRenderer --- client/homebrew/pages/editPage/editPage.jsx | 69 +++++++++---------- client/homebrew/pages/sharePage/sharePage.jsx | 1 - 2 files changed, 34 insertions(+), 36 deletions(-) diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index 7e29ac92b..ffb6a6b40 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -432,41 +432,40 @@ const EditPage = createClass({ {this.renderNavbar()} {this.props.brew.lock && } -
    - - - - +
    + + + +
    ; } diff --git a/client/homebrew/pages/sharePage/sharePage.jsx b/client/homebrew/pages/sharePage/sharePage.jsx index db787c665..15eae54f7 100644 --- a/client/homebrew/pages/sharePage/sharePage.jsx +++ b/client/homebrew/pages/sharePage/sharePage.jsx @@ -116,7 +116,6 @@ const SharePage = (props)=>{ onPageChange={handleBrewRendererPageChange} currentBrewRendererPageNum={state.currentBrewRendererPageNum} allowPrint={true} - showHeaderNav={true} />
    From cf16566da8a0f1f80410258e76c36823a45815bd Mon Sep 17 00:00:00 2001 From: "G.Ambatte" Date: Mon, 6 Jan 2025 22:30:03 +1300 Subject: [PATCH 25/61] Move Header Navigation button to Toolbar --- client/homebrew/brewRenderer/brewRenderer.jsx | 7 ++++--- .../brewRenderer/headerNav/headerNav.jsx | 20 ++----------------- .../homebrew/brewRenderer/toolBar/toolBar.jsx | 9 ++++++--- .../brewRenderer/toolBar/toolBar.less | 6 ++++-- 4 files changed, 16 insertions(+), 26 deletions(-) diff --git a/client/homebrew/brewRenderer/brewRenderer.jsx b/client/homebrew/brewRenderer/brewRenderer.jsx index aa684b77d..7d9648ead 100644 --- a/client/homebrew/brewRenderer/brewRenderer.jsx +++ b/client/homebrew/brewRenderer/brewRenderer.jsx @@ -103,7 +103,6 @@ const BrewRenderer = (props)=>{ currentBrewRendererPageNum : 1, themeBundle : {}, onPageChange : ()=>{}, - showHeaderNav : false, ...props }; @@ -121,6 +120,8 @@ const BrewRenderer = (props)=>{ pageShadows : true }); + const [headerState, setHeaderState] = useState(false); + const mainRef = useRef(null); const pagesRef = useRef(null); @@ -294,7 +295,7 @@ const BrewRenderer = (props)=>{ - 0 ? state.visiblePages : [state.centerPage]} totalPages={rawPages.length}/> + 0 ? state.visiblePages : [state.centerPage]} totalPages={rawPages.length} headerState={headerState} setHeaderState={setHeaderState}/> {/*render in iFrame so broken code doesn't crash the site.*/} { } - {props.showHeaderNav ? : <>} + {headerState ? : <>} ); diff --git a/client/homebrew/brewRenderer/headerNav/headerNav.jsx b/client/homebrew/brewRenderer/headerNav/headerNav.jsx index 19ee0b1d6..50c2ba86b 100644 --- a/client/homebrew/brewRenderer/headerNav/headerNav.jsx +++ b/client/homebrew/brewRenderer/headerNav/headerNav.jsx @@ -8,17 +8,6 @@ const MAX_TEXT_LENGTH = 40; const HeaderNav = React.forwardRef(({}, pagesRef)=>{ - const [state, setState] = React.useState({ - showHeaderNav : false - }); - - const toggleHeaderNav = ()=>{ - setState((prevState)=>({ - ...prevState, - showHeaderNav : !prevState.showHeaderNav - })); - }; - const renderHeaderLinks = ()=>{ if(!pagesRef.current) return; const elements = pagesRef.current.querySelectorAll('[id]'); @@ -56,13 +45,8 @@ const HeaderNav = React.forwardRef(({}, pagesRef)=>{ }; - return
    - - {state.showHeaderNav && renderHeaderLinks()} + return
    + {renderHeaderLinks()}
    ; } ); diff --git a/client/homebrew/brewRenderer/toolBar/toolBar.jsx b/client/homebrew/brewRenderer/toolBar/toolBar.jsx index ce60971aa..f11d1f127 100644 --- a/client/homebrew/brewRenderer/toolBar/toolBar.jsx +++ b/client/homebrew/brewRenderer/toolBar/toolBar.jsx @@ -9,7 +9,7 @@ import { Anchored, AnchoredBox, AnchoredTrigger } from '../../../components/Anch const MAX_ZOOM = 300; const MIN_ZOOM = 10; -const ToolBar = ({ displayOptions, onDisplayOptionsChange, visiblePages, totalPages })=>{ +const ToolBar = ({ displayOptions, onDisplayOptionsChange, visiblePages, totalPages, headerState, setHeaderState })=>{ const [pageNum, setPageNum] = useState(1); const [toolsVisible, setToolsVisible] = useState(true); @@ -62,7 +62,7 @@ const ToolBar = ({ displayOptions, onDisplayOptionsChange, visiblePages, totalPa // find the page with the largest single dim (height or width) so that zoom can be adapted to fit it. if(displayOptions.spread === 'facing') minDimRatio = [...pages].reduce((minRatio, page)=>Math.min(minRatio, iframeWidth / page.offsetWidth / 2), Infinity); // if 'facing' spread, fit two pages in view - else + else minDimRatio = [...pages].reduce((minRatio, page)=>Math.min(minRatio, iframeWidth / page.offsetWidth, iframeHeight / page.offsetHeight), Infinity); desiredZoom = minDimRatio * 100; @@ -76,7 +76,10 @@ const ToolBar = ({ displayOptions, onDisplayOptionsChange, visiblePages, totalPa return (