import dom import fuzzysearch proc setTheme(theme: cstring) {.exportc.} = document.documentElement.setAttribute("data-theme", theme) window.localStorage.setItem("theme", theme) # set `data-theme` attribute early to prevent white flash setTheme: let t = window.localStorage.getItem("theme") if t.isNil: cstring"auto" else: t proc onDOMLoaded(e: Event) {.exportc.} = # set theme select value document.getElementById("theme-select").value = window.localStorage.getItem("theme") for pragmaDots in document.getElementsByClassName("pragmadots"): pragmaDots.onclick = proc (event: Event) = # Hide tease event.target.parentNode.style.display = "none" # Show actual event.target.parentNode.nextSibling.style.display = "inline" proc tree(tag: cstring; kids: varargs[Element]): Element = result = document.createElement tag for k in kids: result.appendChild k proc add(parent, kid: Element) = if parent.nodeName == "TR" and (kid.nodeName == "TD" or kid.nodeName == "TH"): let k = document.createElement("TD") appendChild(k, kid) appendChild(parent, k) else: appendChild(parent, kid) proc setClass(e: Element; value: cstring) = e.setAttribute("class", value) proc text(s: cstring): Element = cast[Element](document.createTextNode(s)) proc replaceById(id: cstring; newTree: Node) = let x = document.getElementById(id) x.parentNode.replaceChild(newTree, x) newTree.id = id proc clone(e: Element): Element {.importcpp: "#.cloneNode(true)", nodecl.} proc markElement(x: Element) {.importcpp: "#.__karaxMarker__ = true", nodecl.} proc isMarked(x: Element): bool {. importcpp: "#.hasOwnProperty('__karaxMarker__')", nodecl.} proc title(x: Element): cstring {.importcpp: "#.title", nodecl.} proc sort[T](x: var openArray[T]; cmp: proc(a, b: T): int) {.importcpp: "#.sort(#)", nodecl.} proc extractItems(x: Element; items: var seq[Element]) = if x == nil: return if x.nodeName == "A": items.add x else: for i in 0.. y: return 1 return 0 else: # ensure sorting is stable: return a.sortId - b.sortId ) for k in x.kids: let y = toHtml(k) if y != nil: ul.add tree("LI", y) if ul.len != 0: result.add ul if result.len == 0: result = nil proc isWhitespace(text: cstring): bool {.importcpp: r"!/\S/.test(#)".} proc isWhitespace(x: Element): bool = x.nodeName == "#text" and x.textContent.isWhitespace or x.nodeName == "#comment" proc toToc(x: Element; father: TocEntry) = if x.nodeName == "UL": let f = TocEntry(heading: nil, kids: @[], sortId: father.kids.len) var i = 0 while i < x.len: var nxt = i+1 while nxt < x.len and x[nxt].isWhitespace: inc nxt if nxt < x.len and x[i].nodeName == "LI" and x[i].len == 1 and x[nxt].nodeName == "UL": let e = TocEntry(heading: x[i][0], kids: @[], sortId: f.kids.len) let it = x[nxt] for j in 0..`. var s = "" for c in x: case c of '<': s.add("<") of '>': s.add(">") else: s.add(c) x = s.cstring proc dosearch(value: cstring): Element = if db.len == 0: var stuff: Element {.emit: """ var request = new XMLHttpRequest(); request.open("GET", "theindex.html", false); request.send(null); var doc = document.implementation.createHTMLDocument("theindex"); doc.documentElement.innerHTML = request.responseText; `stuff` = doc.documentElement; """.} db = stuff.getElementsByClass"reference" contents = @[] for ahref in db: contents.add ahref.getAttribute("data-doc-search-tag") let ul = tree("UL") result = tree("DIV") result.setClass"search_results" var matches: seq[(Node, int)] = @[] for i in 0.. { const div = document.createElement("div") div.classList.add("copyToClipBoard") const preTag = document.createElement("pre") preTag.innerHTML = e.innerHTML const button = document.createElement("button") button.value = e.textContent.replace('...', '') button.classList.add("copyToClipBoardBtn") button.style.cursor = "pointer" div.appendChild(preTag) div.appendChild(button) e.outerHTML = div.outerHTML }) } function copyTextToClipboard(e) { const clipBoardContent = e.target.value navigator.clipboard.writeText(clipBoardContent).then(function() { e.target.style.setProperty("--clipboard-image", "var(--clipboard-image-selected)") }, function(err) { console.error("Could not copy text: ", err); }); } window.addEventListener("click", (e) => { if (e.target.classList.contains("copyToClipBoardBtn")) { copyTextToClipboard(e) } }) window.addEventListener("mouseover", (e) => { if (e.target.nodeName === "PRE") { e.target.nextElementSibling.style.setProperty("--clipboard-image", "var(--clipboard-image-normal)") } }) window.addEventListener("DOMContentLoaded", updatePreTags) """ .} copyToClipboard() window.addEventListener("DOMContentLoaded", onDOMLoaded)