From 2c21080f414b764340d7f80f2c2ff203389de774 Mon Sep 17 00:00:00 2001 From: Marcell Mars Date: Sat, 6 Feb 2021 12:46:14 +0100 Subject: [PATCH] added pagedjsCustomizations.js and no console.log --- static/js/pagedjsCustomizations.js | 96 ++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 static/js/pagedjsCustomizations.js diff --git a/static/js/pagedjsCustomizations.js b/static/js/pagedjsCustomizations.js new file mode 100644 index 0000000..0871eef --- /dev/null +++ b/static/js/pagedjsCustomizations.js @@ -0,0 +1,96 @@ +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.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);