diff --git a/themes/V3/5ePHB/snippets/tableOfContents.gen.js b/themes/V3/5ePHB/snippets/tableOfContents.gen.js index 3aea01735..44655c625 100644 --- a/themes/V3/5ePHB/snippets/tableOfContents.gen.js +++ b/themes/V3/5ePHB/snippets/tableOfContents.gen.js @@ -1,44 +1,71 @@ const _ = require('lodash'); const dedent = require('dedent-tabs').default; -const getTOC = (pages)=>{ +const mapPages = (iframeDocument, pageMap)=>{ + let actualPage = 0; + let mappedPage = 0; + const pages = iframeDocument.querySelectorAll('.page'); + _.each(pages, (page)=>{ + actualPage++; + const doSkip = page.querySelector('.skipCounting'); + const doReset = page.querySelector('.resetCounting'); - const recursiveAdd = (title, page, targetDepth, child, curDepth=0)=>{ - if(curDepth > 5) return; // Something went wrong. - if(curDepth == targetDepth) { + if(doReset) + mappedPage = 1; + if(!doSkip && !doReset) + mappedPage++; + + pageMap[actualPage] = { + mappedPage : mappedPage, + showPage : !doSkip + }; + }); +}; + +const recursiveAdd = (title, page, actualPage, targetDepth, child, curDepth=0)=>{ + const anchor = `p${actualPage}`; + if(curDepth > 5) return; // Something went wrong. + if(curDepth == targetDepth) { + child.push({ + title : title, + page : page, + anchor : anchor, + children : [] + }); + } else { + if(child.length == 0) { child.push({ - title : title, + title : null, page : page, + anchor : anchor, children : [] }); - } else { - if(child.length == 0) { - child.push({ - title : null, - page : page, - children : [] - }); - } - recursiveAdd(title, page, targetDepth, _.last(child).children, curDepth+1,); } - }; + recursiveAdd(title, page, anchor, targetDepth, _.last(child).children, curDepth+1,); + } +}; - const res = []; + +const getTOC = ()=>{ + const pageMap = []; + const entries = []; const iframe = document.getElementById('BrewRenderer'); const iframeDocument = iframe.contentDocument || iframe.contentWindow.document; const headings = iframeDocument.querySelectorAll('h1, h2, h3, h4, h5, h6'); const headerDepth = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6']; + mapPages(iframeDocument, pageMap); + _.each(headings, (heading)=>{ const onPage = parseInt(heading.closest('.page').id?.replace(/^p/, '')); const ToCExclude = getComputedStyle(heading).getPropertyValue('--TOC'); if(ToCExclude != 'exclude') { - recursiveAdd(heading.textContent.trim(), onPage, headerDepth.indexOf(heading.tagName), res); + recursiveAdd(heading.textContent.trim(), pageMap[onPage], onPage, headerDepth.indexOf(heading.tagName), entries); } }); - return res; + return entries; }; @@ -46,7 +73,7 @@ const ToCIterate = (entries, curDepth=0)=>{ const levelPad = ['- ###', ' - ####', ' - ', ' - ', ' - ', ' - ']; const toc = []; if(entries.title !== null){ - toc.push(`${levelPad[curDepth]} [{{ ${entries.title}}}{{ ${entries.page}}}](#p${entries.page})`); + if(entries.page.showPage) toc.push(`${levelPad[curDepth]} [{{ ${entries.title}}}{{ ${entries.page.mappedPage}}}](#${entries.anchor})`); } if(entries.children.length) { _.each(entries.children, (entry, idx)=>{ @@ -60,12 +87,11 @@ const ToCIterate = (entries, curDepth=0)=>{ }; module.exports = function(props){ - const pages = props.brew.text.split('\\page'); - const TOC = getTOC(pages); + const TOC = getTOC(); const markdown = _.reduce(TOC, (r, g1, idx1)=>{ r.push(ToCIterate(g1).join('\n')); return r; - }, []).join('\n'); + }, []).join('\n').replace('\n\n', '\n'); return dedent` {{toc,wide diff --git a/themes/V3/Blank/style.less b/themes/V3/Blank/style.less index 0f3766342..f03ca90d3 100644 --- a/themes/V3/Blank/style.less +++ b/themes/V3/Blank/style.less @@ -12,7 +12,7 @@ } @page { margin : 0; } -body { counter-reset : page-numbers; } +body { counter-reset : page-numbers 0; } * { -webkit-print-color-adjust : exact; } //***************************** @@ -51,7 +51,6 @@ body { counter-reset : page-numbers; } height : 279.4mm; padding : 1.4cm 1.9cm 1.7cm; overflow : hidden; - counter-increment : page-numbers; background-color : var(--HB_Color_Background); text-rendering : optimizeLegibility; contain : size; @@ -494,4 +493,13 @@ body { counter-reset : page-numbers; } &:nth-child(even) { .pageNumber { left : 30px; } } -} + + .resetCounting { + counter-set : page-numbers 1; + } + + &:not(:has(.skipCounting)) { + counter-increment : page-numbers; + } + +} \ No newline at end of file