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") var pragmaDots = document.getElementsByClassName("pragmadots") 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 containsWord(a, b: cstring): bool {.asmNoStackFrame.} = #{.emit: """ #var escaped = `b`.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); #return new RegExp("\\b" + escaped + "\\b").test(`a`); #""".} proc isWhitespace(text: cstring): bool {.asmNoStackFrame.} = {.emit: """ return !/[^\s]/.test(`text`); """.} proc isWhitespace(x: Element): bool = x.nodeName == cstring"#text" and x.textContent.isWhitespace or x.nodeName == cstring"#comment" proc toToc(x: Element; father: TocEntry) = if x.nodeName == cstring"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 == cstring"LI" and x[i].len == 1 and x[nxt].nodeName == cstring"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; //parser=new DOMParser(); //doc=parser.parseFromString("", "text/html"); `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)