You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
3.3 KiB
JavaScript
101 lines
3.3 KiB
JavaScript
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);
|