Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | 87x 1x 1x 1x 1x 1x 43x 43x 43x 1x 1x 1x 1x 1x 1x 1x 1x 1x 43x 43x | import cheerio from 'cheerio';
import { MbNode, parseHTML } from '../utils/node.js';
import { MARKBIND_FOOTNOTE_POPOVER_ID_PREFIX } from './constants.js';
/*
* Footnotes of the main content and <include>s are stored, then combined by NodeProcessor at the end
*/
export class FootnoteProcessor {
renderedFootnotes: string[];
constructor() {
// Store footnotes of <include>s and the main content
this.renderedFootnotes = [];
}
processMbTempFootnotes(node: MbNode) {
const $ = cheerio(node);
const content = $.html();
if (content) {
this.renderedFootnotes.push(content);
}
$.remove();
}
combineFootnotes(processNode: (nd: MbNode) => any): string {
let hasFootnote = false;
const prefix = '<hr class="footnotes-sep">\n<section class="footnotes">\n<ol class="footnotes-list">\n';
const footnotesWithPopovers = this.renderedFootnotes.map((footNoteBlock) => {
const $ = cheerio.load(footNoteBlock);
let popoversHtml = '';
$('li.footnote-item').each((_index, li) => {
hasFootnote = true;
const popoverId = `${MARKBIND_FOOTNOTE_POPOVER_ID_PREFIX}${(li as MbNode).attribs.id}`;
const popoverNode = parseHTML(`<popover id="${popoverId}">
<div #content>
${$(li).html()}
</div>
</popover>`)[0] as MbNode;
processNode(popoverNode);
popoversHtml += cheerio.html(popoverNode);
});
return `${popoversHtml}\n${footNoteBlock}\n`;
}).join('\n');
const suffix = '</ol>\n</section>\n';
return hasFootnote
? prefix + footnotesWithPopovers + suffix
: '';
}
}
|