var UID = { _current: 0, getNew: function(){ this._current++; return this._current; } }; HTMLElement.prototype.pseudoStyle = function(element,prop,value){ var _this = this; var _sheetId = "pseudoStyles"; var _head = document.head || document.getElementsByTagName('head')[0]; var _sheet = document.getElementById(_sheetId) || document.createElement('style'); _sheet.id = _sheetId; var className = "pseudoStyle" + UID.getNew(); _this.className += " "+className; _sheet.innerHTML += " ."+className+":"+element+"{"+prop+":"+value+"}"; _head.appendChild(_sheet); return this; }; class Sandpoints extends Paged.Handler { constructor(chunker, polisher, caller) { super(chunker, polisher, caller); } beforeParsed(content) { var d = {}; content.querySelectorAll('*').forEach((n, i)=> { if (n.hasAttribute("printhref")) { n.setAttribute("href", n.getAttribute("printhref")) } if (n.classList.length > 0 ) { n.classList.forEach((c, i)=>{ if (c.startsWith("css-")) { (c in d) ? d[c]++ : d[c] = 1 let s = "" Object.keys(d).filter(ks => ks.startsWith(c.slice(0, -1))).forEach((t, i)=> {if (c >= t) {s += `${d[t]}.`}}) n.pseudoStyle('before','content', `"${s} "`) } }) } }) } afterPageLayout(pageElement, page, breakToken, chunker) { // Find all split table elements let tables = pageElement.querySelectorAll("table[data-split-from]"); tables.forEach((table) => { // There is an edge case where the previous page table // has zero height (isn't visible). // To avoid double header we will only add header if there is none. let tableHeader = table.querySelector("thead"); if (tableHeader) { return; } // Get the reference UUID of the node let ref = table.dataset.ref; // Find the node in the original source let sourceTable = chunker.source.querySelector("[data-ref='" + ref + "']"); // Find if there is a header let sourceHeader = sourceTable.querySelector("thead"); if (sourceHeader) { // Clone the header element let clonedHeader = sourceHeader.cloneNode(true); // Insert the header at the start of the split table table.insertBefore(clonedHeader, table.firstChild); } }); // Find all tables tables = pageElement.querySelectorAll("table"); // special case which might not fit for everyone tables.forEach((table) => { // if the table has no rows in body, hide it. // This happens because my render engine creates empty tables. let sourceBody = table.querySelector("tbody > tr"); if (!sourceBody) { console.log("Table was hidden, because it has no rows in tbody."); table.style.visibility = "hidden"; table.style.position = "absolute"; var lineSpacer = table.nextSibling; if (lineSpacer) { lineSpacer.style.visibility = "hidden"; lineSpacer.style.position = "absolute"; } } }); } } Paged.registerHandlers(Sandpoints);