mirror of
https://github.com/naturalcrit/homebrewery.git
synced 2025-12-27 00:42:40 +00:00
Solves #513 This adds the .skipCounting and .resetCounting classes for causing a page number to not be incremented or to reset the number at 1. The ToC Snippet is corrected to match the displayed page numbers while correctly tracking the page ids.
101 lines
2.5 KiB
JavaScript
101 lines
2.5 KiB
JavaScript
const _ = require('lodash');
|
|
const dedent = require('dedent-tabs').default;
|
|
|
|
const getTOC = ()=>{
|
|
|
|
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'];
|
|
|
|
const res = [];
|
|
|
|
const pageMap = [];
|
|
|
|
const walkPages = ()=>{
|
|
let current = 0;
|
|
let skip = 0;
|
|
let reset = 0;
|
|
const pages = iframeDocument.querySelectorAll('.page');
|
|
_.each(pages, (page)=>{
|
|
current++;
|
|
if(page.querySelectorAll('.skipCounting').length > 0) {
|
|
skip += 1;
|
|
} else if(page.querySelectorAll('.resetCounting').length > 0) {
|
|
reset = current - 1;
|
|
skip = 0;
|
|
}
|
|
pageMap[current] = current - reset - skip;
|
|
});
|
|
};
|
|
|
|
const recursiveAdd = (title, page, anchor, targetDepth, child, curDepth=0)=>{
|
|
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 : null,
|
|
page : page,
|
|
anchor : anchor,
|
|
children : []
|
|
});
|
|
}
|
|
recursiveAdd(title, page, anchor, targetDepth, _.last(child).children, curDepth+1,);
|
|
}
|
|
};
|
|
|
|
walkPages();
|
|
|
|
_.each(headings, (heading)=>{
|
|
const pageAnchor = heading.closest('.page').id;
|
|
const onPage = parseInt(heading.closest('.page').id?.replace(/^p/, ''));
|
|
const ToCExclude = getComputedStyle(heading).getPropertyValue('--TOC');
|
|
|
|
if(ToCExclude != 'exclude') {
|
|
recursiveAdd(heading.textContent.trim(), pageMap[onPage], pageAnchor, headerDepth.indexOf(heading.tagName), res);
|
|
}
|
|
});
|
|
return res;
|
|
};
|
|
|
|
|
|
const ToCIterate = (entries, curDepth=0)=>{
|
|
const levelPad = ['- ###', ' - ####', ' - ', ' - ', ' - ', ' - '];
|
|
const toc = [];
|
|
if(entries.title !== null){
|
|
toc.push(`${levelPad[curDepth]} [{{ ${entries.title}}}{{ ${entries.page}}}](#${entries.anchor})`);
|
|
}
|
|
if(entries.children.length) {
|
|
_.each(entries.children, (entry, idx)=>{
|
|
const children = ToCIterate(entry, entry.title == null ? curDepth : curDepth+1);
|
|
if(children.length) {
|
|
toc.push(...children);
|
|
}
|
|
});
|
|
}
|
|
return toc;
|
|
};
|
|
|
|
module.exports = function(props){
|
|
const TOC = getTOC();
|
|
const markdown = _.reduce(TOC, (r, g1, idx1)=>{
|
|
r.push(ToCIterate(g1).join('\n'));
|
|
return r;
|
|
}, []).join('\n');
|
|
|
|
return dedent`
|
|
{{toc,wide
|
|
# Contents
|
|
|
|
${markdown}
|
|
}}
|
|
\n`;
|
|
};
|