diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 000000000..2ee9f5856 --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,88 @@ +# Copilot Instructions for PreTeXt + +## What is PreTeXt + +PreTeXt is an XML-based authoring and publishing system for STEM textbooks and academic documents. A single XML source file is transformed into multiple output formats (HTML5, LaTeX/PDF, EPUB, Braille, Jupyter notebooks, reveal.js, etc.) via XSLT stylesheets. The Python CLI orchestrates the conversion pipeline, calling external tools (LaTeX, Asymptote, SageMath, Playwright, etc.) as needed. + +## Repository Layout + +| Directory | Role | +|-----------|------| +| `xsl/` | XSLT 1.0 stylesheets — the core conversion engine (~72K lines) | +| `pretext/` | Python CLI (`pretext/pretext`) and library (`pretext/lib/pretext.py`) | +| `css/` | SCSS/CSS theming system; `script/cssbuilder/` compiles it | +| `js/` | Client-side JavaScript for interactive HTML output | +| `schema/` | RELAX-NG schema; `pretext.xml` is the **only** file to edit directly | +| `examples/` | Sample PreTeXt documents (`minimal/`, `sample-article/`) | +| `doc/` | Author and Publisher guides | + +## Build & Test Commands + +### XSLT tests +```bash +cd xsl/tests +xsltproc pretext-text-utilities-test.xsl null.xml +# Success prints "Tests complete!"; failures print error details +``` + +### CSS build +```bash +cd script/cssbuilder +npm install # one-time setup +npm run build # compiles SCSS → css/dist/ +``` + +### Python CLI (development use) +```bash +# Run conversions directly via the CLI entry point: +python3 pretext/pretext -c -f -s -p -d +# Example: build HTML +python3 pretext/pretext -f html -s source/main.ptx -p publication.xml -d output/ +``` + +There is no automated test suite or CI pipeline. For Python, `pretext/module-test.py` is an informal integration example, not a test runner. + +## Architecture: How a Conversion Works + +1. **Assembly pass** — `xsl/pretext-assembly.xsl` pre-processes source XML into an "enhanced" document (resolves `xi:include`, computes IDs, etc.). +2. **Format pass** — a format-specific stylesheet (e.g., `xsl/pretext-html.xsl`) imports the assembly and common base, then templates match elements to produce output. +3. **Extraction passes** — `xsl/extract-*.xsl` stylesheets isolate embeddable content (LaTeX images, Asymptote diagrams, WeBWorK problems) for separate processing by external tools. +4. **Python orchestration** — `pretext/lib/pretext.py` calls `xsltproc` and external tools in the correct sequence, manages temp directories, and assembles the final output. + +### XSL import hierarchy (example for HTML) +``` +pretext-html.xsl + ├── pretext-assembly.xsl + ├── pretext-common.xsl ← shared base templates + ├── pretext-runestone.xsl + └── html-symbols.xsl (include, not import) +``` +Format-specific sheets override base templates via XSLT import precedence. + +## Key Conventions + +### XSLT +- All stylesheets use **XSLT 1.0** with EXSL extensions (`exsl`, `str`, `dyn`). +- Internal namespace: `xmlns:pi="http://pretextbook.org/2020/pretext/internal"`. +- Shared entity references live in `entities.ent` and are included via DOCTYPE. +- Template names use `kebab-case`; modes are also `kebab-case` strings. +- `pretext-common.xsl` is the base library; format sheets extend it via ``. +- `extract-*.xsl` files follow the convention of isolating one content type per file. + +### Python +- **Never** use `from foo import *` or `from foo import bar`. Always `import foo` or `import foo as ALIAS` (stated explicitly in the module header). +- Infrequently-used libraries are imported **inside functions**, not at module level. +- All logging goes through `log = logging.getLogger('ptxlogger')`. +- Function names follow `verb_noun()` style; private helpers use `_verb_noun()`. +- The single library module is `pretext/lib/pretext.py` (~6300 lines); there is no split into sub-modules. + +### Schema +- **Edit only `schema/pretext.xml`** (literate RELAX-NG compact notation). The `.rnc`, `.rng`, and `.xsd` files are generated via `schema/build.sh` using the `trang` tool. +- Schematron rules for author-facing validation are in `schema/pretext.sch` / `schema/pretext-schematron.xsl`. + +## Development Workflow (from CONTRIBUTING.md) + +- Discuss changes on the [pretext-dev Google Group](https://groups.google.com/forum/#!forum/pretext-dev) **before** writing code. +- Work on a topic branch; **rebase onto `master`** (never merge `master` into your branch). +- Keep commits minimal — maintainers reorganize history during integration. +- Submit via pull request; do not add commits or rebase after submission unless asked. diff --git a/js/dist/pretext-core.js b/js/dist/pretext-core.js new file mode 100644 index 000000000..5f3828fa0 --- /dev/null +++ b/js/dist/pretext-core.js @@ -0,0 +1,1615 @@ +(() => { + // ../../js/src/toc.js + function getOffsetTop(e) { + if (!e) return 0; + return getOffsetTop(e.offsetParent) + e.offsetTop; + } + function scrollTocToActive() { + let fileNameWHash = window.location.href.split("/").pop(); + let fileName = fileNameWHash.split("#")[0]; + let tocEntry = document.querySelector( + '#ptx-toc a[href="' + fileName + '"]' + ); + if (!tocEntry) return; + let tocEntryTop = 0; + if (fileNameWHash.includes("#")) { + let tocEntryWHash = document.querySelector( + '#ptx-toc a[href="' + fileNameWHash + '"]' + ); + if (tocEntryWHash) { + tocEntry.closest("li").querySelectorAll("li").forEach((li) => { + li.classList.remove("active"); + }); + tocEntryWHash.closest("li").classList.add("active"); + tocEntryTop = getOffsetTop(tocEntryWHash); + } + } + if (!tocEntryTop) { + tocEntryTop = getOffsetTop(tocEntry); + } + tocEntry.closest("li").classList.add("active"); + let toc = document.querySelector("#ptx-toc"); + let tocTop = getOffsetTop(toc); + toc.scrollTop = tocEntryTop - tocTop - 0.4 * self.innerHeight; + } + function toggletoc() { + const thesidebar = document.getElementById("ptx-sidebar"); + if (thesidebar.classList.contains("hidden") || thesidebar.classList.contains("visible")) { + thesidebar.classList.toggle("hidden"); + thesidebar.classList.toggle("visible"); + } else if (thesidebar.offsetParent === null) { + thesidebar.classList.toggle("visible"); + } else { + thesidebar.classList.toggle("hidden"); + } + scrollTocToActive(); + } + function samePageLink(a) { + if (!(a instanceof HTMLAnchorElement)) return false; + try { + const linkUrl = new URL(a.href, document.baseURI); + const currentUrl = new URL(window.location.href); + const sameDocument = linkUrl.origin === currentUrl.origin && linkUrl.pathname === currentUrl.pathname && linkUrl.search === currentUrl.search; + return sameDocument && !!linkUrl.hash; + } catch (e) { + return false; + } + } + function getTOCItemType(item) { + for (let className of item.classList) { + if (className !== "toc-item" && className.length > 3 && className.slice(0, 4) === "toc-") + return className.slice(4); + } + return ""; + } + function getTOCItemDepth(item) { + let depth = 0; + let curParent = item.closest(".toc-item-list"); + while (curParent !== null) { + depth++; + curParent = curParent.parentElement.closest(".toc-item-list"); + } + return depth; + } + function toggleTOCItem(expander) { + let listItem = expander.closest(".toc-item"); + listItem.classList.toggle("expanded"); + let expanded = listItem.classList.contains("expanded"); + let itemType = getTOCItemType(listItem); + if (expanded) { + expander.title = "Close" + (itemType !== "" ? " " + itemType : ""); + } else { + expander.title = "Expand" + (itemType !== "" ? " " + itemType : ""); + } + for (const childUL of listItem.querySelectorAll( + ":scope > ul.toc-item-list" + )) { + for (const childItem of childUL.querySelectorAll( + ":scope > li.toc-item" + )) { + if (expanded) { + childItem.classList.add("visible"); + childItem.classList.remove("hidden"); + } else { + childItem.classList.remove("visible"); + childItem.classList.add("hidden"); + } + } + } + } + function initToc() { + const thetocbutton = document.getElementsByClassName("toc-toggle")[0]; + if (thetocbutton) { + thetocbutton.addEventListener("click", (e) => { + toggletoc(); + e.stopPropagation(); + }); + } + if (getComputedStyle(document.documentElement).getPropertyValue( + "--auto-collapse-toc" + ) == "yes") { + const sidebar = document.getElementById("ptx-sidebar"); + window.addEventListener("click", function(event2) { + if (sidebar.classList.contains("visible")) { + if (!event2.composedPath().includes(sidebar)) { + toggletoc(); + } + } + }); + sidebar.addEventListener("click", function(event2) { + if (samePageLink(event2.target.closest("a"))) { + toggletoc(); + } + }); + window.addEventListener("pageshow", (e) => { + if (e.persisted) { + sidebar.classList.remove("visible"); + sidebar.classList.add("hidden"); + } + }); + } + } + function initFocusedToc() { + if (document.querySelector(".ptx-toc.focused") === null) return; + let maxDepth = 1e3; + for (let className of document.querySelector(".ptx-toc").classList) + if (className.length > 5 && className.slice(0, 5) === "depth") + maxDepth = Number(className.slice(5)); + let preexpandedLevels = 1; + let tocDataSet = document.querySelector(".ptx-toc").dataset; + if (typeof tocDataSet.preexpandedLevels !== "undefined") + preexpandedLevels = Number(tocDataSet.preexpandedLevels); + let tocItems = document.querySelectorAll( + ".ptx-toc ul.structural > .toc-item" + ); + for (const tocItem of tocItems) { + let hasChildren = tocItem.querySelector("ul.structural") !== null; + let depth = getTOCItemDepth(tocItem); + if (hasChildren && depth < maxDepth) { + let expander = document.createElement("button"); + expander.classList.add("toc-expander"); + expander.classList.add("toc-chevron-surround"); + expander.title = "toc-expander"; + expander.innerHTML = ''; + tocItem.querySelector(".toc-title-box").append(expander); + expander.addEventListener("click", () => { + toggleTOCItem(expander); + }); + let isActive = tocItem.classList.contains("contains-active") || tocItem.classList.contains("active"); + let preExpanded = isActive || depth < preexpandedLevels; + let itemType = getTOCItemType(tocItem); + if (preExpanded) { + toggleTOCItem(expander); + } else { + expander.title = "Expand" + (itemType !== "" ? " " + itemType : ""); + } + } + } + if (window.location.hash) { + let hash = window.location.hash; + let hashLink = document.querySelector( + `.ptx-toc a[href$="${hash}"]` + ); + if (hashLink) { + let parentTocItem = hashLink.closest(".toc-item"); + while (parentTocItem && !parentTocItem.classList.contains("contains-active")) { + parentTocItem.classList.add("contains-active"); + let expander = parentTocItem.querySelector(".toc-expander"); + if (expander) { + if (!parentTocItem.classList.contains("expanded")) { + toggleTOCItem(expander); + } + } + parentTocItem = parentTocItem.parentElement.closest(".toc-item"); + } + } + } + } + function initScrollToc() { + scrollTocToActive(); + window.onhashchange = scrollTocToActive; + } + + // ../../js/src/knowl.js + var SlideRevealer = class _SlideRevealer { + static STATE = Object.freeze({ + INACTIVE: 0, + CLOSING: 1, + EXPANDING: 2 + }); + constructor(triggerElement, contentElement, animatedElement) { + this.triggerElement = triggerElement; + this.contentElement = contentElement; + this.animatedElement = animatedElement; + this.animation = null; + this.animationState = _SlideRevealer.STATE.INACTIVE; + this.triggerElement.addEventListener("click", (e) => this.onClick(e)); + } + onClick(e) { + if (e) e.preventDefault(); + this.animatedElement.style.overflow = "hidden"; + if (this.animationState === _SlideRevealer.STATE.CLOSING || !this.animatedElement.hasAttribute("open")) { + this.animatedElement.setAttribute("open", ""); + this.triggerElement.setAttribute("open", ""); + this.contentElement.style.display = ""; + MathJax.typesetPromise().then( + () => window.requestAnimationFrame(() => this.toggle(true)) + ); + } else if (this.animationState === _SlideRevealer.STATE.EXPANDING || this.animatedElement.hasAttribute("open")) { + this.toggle(false); + } + } + toggle(expanding) { + let closedHeight = 0; + if (this.animatedElement.contains(this.triggerElement)) + closedHeight = this.triggerElement.offsetHeight; + const fullHeight = closedHeight + this.contentElement.offsetHeight; + const startHeight = `${expanding ? closedHeight : fullHeight}px`; + const endHeight = `${expanding ? fullHeight : closedHeight}px`; + const padding = this.animatedElement.offsetHeight - this.animatedElement.clientHeight; + const startPad = `${expanding ? 0 : padding}px`; + const endPad = `${expanding ? padding : 0}px`; + if (this.animation) this.animation.cancel(); + const animDuration = Math.max( + Math.min( + Math.abs(closedHeight - fullHeight) / 400 * 1e3, + 750 + ), + 250 + ); + this.animationState = expanding ? _SlideRevealer.STATE.EXPANDING : _SlideRevealer.STATE.CLOSING; + this.animation = this.animatedElement.animate( + { + height: [startHeight, endHeight], + paddingTop: [startPad, endPad], + paddingBottom: [startPad, endPad] + }, + { duration: animDuration, easing: "ease" } + ); + this.animation.onfinish = () => { + this.onAnimationFinish(expanding); + }; + this.animation.oncancel = () => { + this.animationState = _SlideRevealer.STATE.INACTIVE; + }; + } + onAnimationFinish(isOpen) { + this.animation = null; + this.animationState = _SlideRevealer.STATE.INACTIVE; + if (!isOpen) { + this.animatedElement.removeAttribute("open"); + this.triggerElement.removeAttribute("open"); + } + this.animatedElement.style.overflow = ""; + if (!isOpen) this.contentElement.style.display = "none"; + if (isOpen) { + let hasCallback = this.contentElement.querySelectorAll( + "[data-knowl-callback]" + ); + hasCallback.forEach((el) => { + window[el.getAttribute("data-knowl-callback")](el, open); + }); + } + } + }; + var LinkKnowl = class _LinkKnowl { + static xrefCount = 0; + static initializeXrefKnowl(knowlLinkElement) { + if (knowlLinkElement.getAttribute("data-knowl-uid") === null) { + return new _LinkKnowl(knowlLinkElement); + } + } + constructor(knowlLinkElement) { + this.linkElement = knowlLinkElement; + this.outputElement = null; + this.uid = _LinkKnowl.xrefCount++; + knowlLinkElement.setAttribute("data-knowl-uid", this.uid); + knowlLinkElement.setAttribute("role", "button"); + knowlLinkElement.setAttribute( + "data-base-title", + knowlLinkElement.getAttribute("title") || this.linkElement.textContent + ); + knowlLinkElement.classList.add("knowl__link"); + this.updateLabels(false); + knowlLinkElement.addEventListener( + "click", + this.handleLinkClick.bind(this) + ); + } + updateLabels(isVisible) { + const verb = isVisible ? this.linkElement.getAttribute("data-close-label") || "Close" : this.linkElement.getAttribute("data-reveal-label") || "Reveal"; + const targetDescript = this.linkElement.getAttribute("data-base-title"); + const helpText = verb + " " + targetDescript; + this.linkElement.setAttribute("aria-label", helpText); + this.linkElement.setAttribute("title", helpText); + } + toggle() { + this.linkElement.classList.toggle("active"); + const isActive = this.linkElement.classList.contains("active"); + this.updateLabels(isActive); + if (isActive) { + const h = this.outputElement.getBoundingClientRect().height; + if (h > window.innerHeight) { + this.outputElement.scrollIntoView(true); + } else { + if (this.outputElement.getBoundingClientRect().bottom > window.innerHeight) + this.outputElement.scrollIntoView(false); + } + } + } + findOutputLocation() { + const invalidParents = "table, mjx-container, div.tabular-box, .runestone > .parsons"; + let el = this.linkElement.parentElement; + let problemAncestor = el.closest(invalidParents); + while (problemAncestor && problemAncestor !== el) { + el = problemAncestor; + problemAncestor = el.closest(invalidParents); + } + return el; + } + createOutputElement() { + const outputId = "knowl-uid-" + this.uid; + const outputContentsId = "knowl-output-" + this.uid; + const linkTarget = this.linkElement.getAttribute("data-knowl"); + const placeholderText = ``; + const temp = document.createElement("template"); + temp.innerHTML = placeholderText; + this.outputElement = temp.content.children[0]; + const insertLoc = this.findOutputLocation(this.linkElement); + insertLoc.after(this.outputElement); + } + async getContent() { + const contentURL = this.linkElement.getAttribute("data-knowl"); + const knowlContent = await fetch(contentURL).then((response) => response.text()).then((data) => { + let knowlDoc = new DOMParser().parseFromString( + data, + "text/html" + ); + let tempContainer2 = knowlDoc.body; + let scripts = knowlDoc.querySelectorAll("head script"); + tempContainer2.append(...scripts); + return tempContainer2; + }).catch((error) => { + const destination = this.linkElement.getAttribute("href"); + const text = this.linkElement.textContent; + const err_message = `
Error fetching content. (${error})
If you are viewing this book from your local filesystem, this is expected behavior. To view the book with all features, you must serve the book from a web server. See the PreTeXt FAQ for more information.
`; + return err_message; + }); + return knowlContent; + } + handleLinkClick(event) { + event.preventDefault(); + if (this.outputElement !== null) { + this.toggle(); + } else { + this.createOutputElement(); + const slideHandler = new SlideRevealer( + this.linkElement, + this.outputElement, + this.outputElement + ); + this.linkElement.addEventListener("click", slideHandler); + let loadingTimeout = setTimeout(() => { + loadingTimeout = null; + slideHandler.onClick(); + this.toggle(); + }, 500); + const content = this.getContent(); + content.then((tempContainer) => { + if (loadingTimeout !== null) { + clearTimeout(loadingTimeout); + } + setTimeout(() => { + slideHandler.onClick(); + this.toggle(); + }, 100); + const runestoneElements = tempContainer.querySelectorAll( + ".ptx-runestone-container" + ); + [...runestoneElements].forEach((e) => { + const rsId = e.querySelector("[data-component]")?.id; + const onPage = document.getElementById(rsId); + if (onPage) { + e.innerHTML = `
The interactive that belongs here is already on the page and cannot appear multiple times. Scroll to interactive.`; + } else { + window.runestoneComponents.renderOneComponent( + e + ); + } + }); + const children = [...tempContainer.children]; + this.outputElement.innerHTML = ""; + this.outputElement.append(...children); + addKnowls(this.outputElement); + Prism.highlightAllUnder(this.outputElement); + [ + ...this.outputElement.getElementsByTagName( + "script" + ) + ].forEach((s) => { + if (s.getAttribute("type") === null || s.getAttribute("type") === "text/javascript") { + eval(s.innerHTML); + } + }); + }).catch((data) => { + console.log( + "Error fetching knowl content: " + data + ); + }); + } + } + }; + function addKnowls(target) { + const xrefs = target.querySelectorAll("[data-knowl]"); + for (const xref of xrefs) { + LinkKnowl.initializeXrefKnowl(xref); + } + const bornHiddens = target.querySelectorAll(".born-hidden-knowl"); + for (const bhk of bornHiddens) { + const summary = bhk.querySelector(":scope > summary"); + if (!summary) continue; + const contents = bhk.querySelector(":scope > summary + *"); + new SlideRevealer(summary, contents, bhk); + } + } + function initKnowls() { + addKnowls(document); + } + + // ../../js/src/lti-iframe-resizer.js + function initLtiIframeResizer() { + window.addEventListener("message", function(event2) { + let edata = event2.data; + if (typeof event2.data == "string" && event2.data.match(/lti\.frameResize/)) { + edata = JSON.parse(event2.data); + } + if (edata.subject === "lti.frameResize") { + if ("frame_id" in edata) { + const el = document.getElementById(edata["frame_id"]); + if (el) { + el.style.height = edata.height + "px"; + } + if (edata.wrapheight && document.getElementById(edata["frame_id"] + "wrap")) { + document.getElementById( + edata["frame_id"] + "wrap" + ).style.height = edata.wrapheight + "px"; + } + } else if ("iframe_resize_id" in edata) { + const el = document.getElementById( + edata["iframe_resize_id"] + ); + if (el) { + el.style.height = edata.height + "px"; + } + } else { + const iFrames = document.getElementsByTagName("iframe"); + for (const iFrame of iFrames) { + if (iFrame.contentWindow === event2.source) { + if (edata.height) { + iFrame.height = edata.height; + iFrame.style.height = edata.height + "px"; + } + if (edata.width) { + iFrame.width = edata.width; + iFrame.style.width = edata.width + "px"; + } + break; + } + } + } + } + }); + } + + // ../../js/src/permalink.js + async function copyPermalink(linkNode) { + if (!navigator.clipboard) { + console.log("Error: Clipboard API not available"); + return; + } + const elem = linkNode.parentElement; + if (!linkNode) { + console.log("Error: Something went wrong finding permalink URL"); + return; + } + const url = linkNode.href; + const description = elem.getAttribute("data-description"); + const link = `${description}`; + const msgLink = `${description}`; + const textFallback = description + " \r\n" + url; + let copySuccess = true; + try { + await navigator.clipboard.write([ + new ClipboardItem({ + "text/html": new Blob([link], { type: "text/html" }), + "text/plain": new Blob([textFallback], { type: "text/plain" }) + }) + ]); + } catch (err) { + console.log( + "Permalink-to-clipboard using ClipboardItem failed, falling back to clipboard.writeText", + err + ); + copySuccess = false; + } + if (!copySuccess) { + try { + await navigator.clipboard.writeText(textFallback); + } catch (err) { + console.log( + "Permalink-to-clipboard using clipboard.writeText failed", + err + ); + console.error("Failed to copy link to clipboard!"); + return; + } + } + console.log(`copied '${url}' to clipboard`); + const copiedMsg = document.createElement("p"); + copiedMsg.setAttribute("role", "alert"); + copiedMsg.className = "permalink-alert"; + copiedMsg.innerHTML = "Link to " + msgLink + " copied to clipboard"; + elem.parentElement.insertBefore(copiedMsg, elem); + await new Promise((resolve) => setTimeout(resolve, 1500)); + copiedMsg.remove(); + } + function initPermalinks() { + const permalinks = document.querySelectorAll(".autopermalink > a"); + permalinks.forEach((link) => { + link.addEventListener("click", function(event2) { + event2.preventDefault(); + copyPermalink(link); + }); + }); + } + + // ../../js/src/image-magnify.js + function outermostMatchingAncestor(el, selector) { + let match = null; + let current = el.parentElement; + while (current) { + if (current.matches(selector)) { + match = current; + } + current = current.parentElement; + } + return match; + } + function initImageMagnify() { + const imgSelector = ".image-box > img:not(.draw_on_me):not(.mag_popup), .sbspanel > img:not(.draw_on_me):not(.mag_popup), figure > img:not(.draw_on_me):not(.mag_popup), figure > div > img:not(.draw_on_me):not(.mag_popup)"; + document.body.addEventListener("click", function(event2) { + const img = event2.target.closest(imgSelector); + if (!img) return; + const container = document.createElement("div"); + container.setAttribute("style", "background:#fff;"); + container.setAttribute("class", "mag_popup_container"); + container.innerHTML = ''; + let placement = outermostMatchingAncestor( + img, + ".image-box, .sbsrow, figure, li, .cols2 article:nth-of-type(2n)" + ); + if (placement && placement.tagName === "ARTICLE") { + const prev = placement.previousElementSibling; + if (prev) { + placement = prev.firstElementChild || prev; + } + } + if (placement) { + placement.parentNode.insertBefore(container, placement); + } + }); + document.body.addEventListener("click", function(event2) { + if (event2.target.classList.contains("mag_popup")) { + event2.target.parentNode.remove(); + } + }); + } + + // ../../js/src/deprecated/scrollbar-width.js + function getScrollbarWidth() { + const outer = document.createElement("div"); + outer.style.visibility = "hidden"; + outer.style.width = "100px"; + outer.style.msOverflowStyle = "scrollbar"; + document.body.appendChild(outer); + const widthNoScroll = outer.offsetWidth; + outer.style.overflow = "scroll"; + const inner = document.createElement("div"); + inner.style.width = "100%"; + outer.appendChild(inner); + const widthWithScroll = inner.offsetWidth; + outer.parentNode.removeChild(outer); + return widthNoScroll - widthWithScroll; + } + + // ../../js/src/geogebra.js + function calculatorOnload() { + const toggle = document.getElementById("calculator-toggle"); + if (toggle) toggle.focus(); + const inputField = document.querySelector( + "input.gwt-SuggestBox.TextField" + ); + if (inputField) inputField.focus(); + } + function initGeoGebra() { + const scrollWidth = getScrollbarWidth(); + const calcOffsetR = 5; + const calcOffsetB = 5; + document.body.addEventListener("mouseover", function(event2) { + if (!event2.target.closest("#geogebra-calculator canvas")) return; + document.body.style.overflow = "hidden"; + document.documentElement.style.marginRight = "15px"; + const container = document.getElementById("calculator-container"); + if (container) { + container.style.right = calcOffsetR + scrollWidth + "px"; + container.style.bottom = calcOffsetB + scrollWidth + "px"; + } + }); + document.body.addEventListener("mouseout", function(event2) { + if (!event2.target.closest("#geogebra-calculator canvas")) return; + document.body.style.overflow = "scroll"; + document.documentElement.style.marginRight = "0"; + const container = document.getElementById("calculator-container"); + if (container) { + container.style.right = calcOffsetR + "px"; + container.style.bottom = calcOffsetB + "px"; + } + }); + document.body.addEventListener("click", function(event2) { + const toggle = event2.target.closest("#calculator-toggle"); + if (!toggle) return; + const container = document.getElementById("calculator-container"); + if (!container) return; + if (container.style.display === "none" || !container.style.display) { + container.style.display = "block"; + toggle.classList.add("open"); + toggle.setAttribute("title", "Hide calculator"); + toggle.setAttribute("aria-expanded", "true"); + const existingScript = document.getElementById("create_ggb_calc"); + if (!existingScript) { + const ggbScript = document.createElement("script"); + ggbScript.id = "create_ggb_calc"; + ggbScript.innerHTML = "ggbApp.inject('geogebra-calculator')"; + document.body.appendChild(ggbScript); + } else { + calculatorOnload(); + } + } else { + container.style.display = "none"; + toggle.classList.remove("open"); + toggle.setAttribute("title", "Show calculator"); + toggle.setAttribute("aria-expanded", "false"); + } + }); + } + + // ../../js/src/keyboard-nav.js + var justHitEscape = false; + function processWorkspace() { + if (typeof MathJax !== "undefined" && MathJax.typesetPromise) { + MathJax.typesetPromise(); + } + } + function initKeyboardNav() { + document.onkeyup = function(event2) { + const e = event2 || window.event; + switch (e.keyCode) { + case 13: + justHitEscape = false; + if (document.activeElement.classList.contains("workspace")) { + processWorkspace(); + } + break; + // Fixed: was missing, caused fallthrough to ESC handler + case 27: { + const parentSageCell = document.activeElement.closest(".sagecell_editor"); + if (parentSageCell && !justHitEscape) { + justHitEscape = true; + setTimeout(function() { + justHitEscape = false; + }, 1e3); + } else if (typeof knowl_focus_stack !== "undefined" && knowl_focus_stack.length > 0) { + const mostRecentlyOpened = knowl_focus_stack.pop(); + if (typeof knowl_focus_stack_uid !== "undefined") { + knowl_focus_stack_uid.pop(); + } + mostRecentlyOpened.focus(); + } else { + break; + } + break; + } + } + }; + } + function initAnchorKnowl() { + if (!window.location.hash.length) return; + const id = window.location.hash.substring(1); + const anchor = document.getElementById(id); + if (!anchor) return; + if (anchor.tagName === "ARTICLE") { + const containedKnowl = anchor.querySelector("a[data-knowl]"); + if (containedKnowl && containedKnowl.parentElement === anchor) { + containedKnowl.click(); + } + } else if (anchor.hasAttribute("data-knowl")) { + anchor.click(); + } else { + const hiddenContent = anchor.closest(".hidden-content"); + if (hiddenContent) { + const refId = hiddenContent.id; + const knowl = document.querySelector( + '[data-refid="' + refId + '"]' + ); + if (knowl) knowl.click(); + } + } + } + + // ../../js/src/print-preview/geometry.js + function toPixels(value) { + if (typeof value === "number") return value; + if (typeof value !== "string") return 0; + value = value.trim(); + if (value.endsWith("px")) { + return parseFloat(value); + } else if (value.endsWith("in")) { + return Math.floor(parseFloat(value) * 96); + } else if (value.endsWith("cm")) { + return Math.floor(parseFloat(value) * 37.8); + } else if (value.endsWith("mm")) { + return Math.floor(parseFloat(value) * 3.78); + } else if (value.endsWith("pt")) { + return Math.floor(parseFloat(value) * (96 / 72)); + } else { + return parseFloat(value) || 0; + } + } + function getElementTotalHeight(elem) { + const style = getComputedStyle(elem); + const marginTop = parseFloat(style.marginTop); + const marginBottom = parseFloat(style.marginBottom); + const height = elem.offsetHeight; + return height + marginTop + marginBottom; + } + function getElemWorkspaceHeight(elem) { + if (elem.classList.contains("sidebyside")) { + const sbspanels = elem.querySelectorAll(".sbspanel"); + let max = 0; + sbspanels.forEach((panel) => { + const workspaces2 = panel.querySelectorAll(".workspace"); + let totalHeight2 = 0; + workspaces2.forEach((workspace) => { + const workspaceHeight = workspace.offsetHeight; + if (workspaceHeight) { + totalHeight2 += workspaceHeight; + } + }); + if (totalHeight2 > max) { + max = totalHeight2; + } + }); + return max; + } + let columns = 1; + if (elem.classList.contains("exercisegroup")) { + for (let i = 2; i <= 6; i++) { + if (elem.querySelector(`.cols${i}`)) { + columns = i; + break; + } + } + } + const workspaces = elem.querySelectorAll(".workspace"); + let totalHeight = 0; + workspaces.forEach((ws) => { + const workspaceHeight = ws.offsetHeight; + if (workspaceHeight) { + totalHeight += workspaceHeight; + } + }); + return totalHeight / columns; + } + function setPageGeometryCSS({ paperSize, margins }) { + const existingStyle = document.getElementById("page-geometry-css"); + if (existingStyle) { + existingStyle.remove(); + } + const wsWidth = paperSize === "letter" ? "816px" : "794px"; + const wsHeight = paperSize === "letter" ? "1056px" : "1123px"; + const style = document.createElement("style"); + style.id = "page-geometry-css"; + style.textContent = ` + :root { + --ws-width: ${wsWidth}; + --ws-height: ${wsHeight}; + --ws-top-margin: ${margins.top}px; + --ws-right-margin: ${margins.right}px; + --ws-bottom-margin: ${margins.bottom}px; + --ws-left-margin: ${margins.left}px; + } + @page { + margin: var(--ws-top-margin, ${margins.top}px) var(--ws-right-margin, ${margins.right}px) var(--ws-bottom-margin, ${margins.bottom}px) var(--ws-left-margin, ${margins.left}px); + } + `; + document.head.appendChild(style); + } + + // ../../js/src/print-preview/workspace.js + function setInitialWorkspaceHeights() { + const workspaces = document.querySelectorAll(".workspace"); + workspaces.forEach((ws) => { + ws.style.height = ws.getAttribute("data-space") || "0px"; + ws.setAttribute("contenteditable", "true"); + }); + } + function adjustWorkspaceToFitPage({ paperSize, margins }) { + const highlightCheckbox = document.getElementById( + "highlight-workspace-checkbox" + ); + const wasHighlighted = highlightCheckbox && highlightCheckbox.checked; + if (wasHighlighted) { + toggleWorkspaceHighlight(false); + } + let paperWidth, paperHeight; + if (paperSize === "a4" || document.body.classList.contains("a4")) { + paperWidth = 794; + paperHeight = 1122.5; + } else { + paperWidth = 816; + paperHeight = 1056; + } + const paperContentHeight = paperHeight - (margins.top + margins.bottom); + setInitialWorkspaceHeights(); + const pages = document.querySelectorAll(".onepage"); + pages.forEach((page) => { + page.style.width = paperWidth + "px"; + const rows = page.children; + let totalContentHeight = 0; + let totalWorkspaceHeight = 0; + for (const row of rows) { + totalContentHeight += getElementTotalHeight(row); + totalWorkspaceHeight += getElemWorkspaceHeight(row); + } + if (totalWorkspaceHeight === 0) { + page.style.width = ""; + return; + } + const extraHeight = paperContentHeight - totalContentHeight; + const workspaceAdjustmentFactor = (totalWorkspaceHeight + extraHeight) / totalWorkspaceHeight; + const pageWorkspaces = page.querySelectorAll(".workspace"); + pageWorkspaces.forEach((ws) => { + const originalHeight = ws.offsetHeight; + const newHeight = originalHeight * workspaceAdjustmentFactor; + ws.style.height = newHeight + "px"; + }); + page.style.width = ""; + }); + if (wasHighlighted) { + toggleWorkspaceHighlight(true); + } + } + function toggleWorkspaceHighlight(isChecked) { + if (isChecked) { + document.body.classList.add("highlight-workspace"); + if (!document.querySelector(".workspace-container")) { + document.querySelectorAll(".workspace").forEach((workspace) => { + const container = document.createElement("div"); + container.classList.add("workspace-container"); + container.style.height = window.getComputedStyle(workspace).height; + const original = document.createElement("div"); + original.classList.add("original-workspace"); + const originalHeight = workspace.getAttribute("data-space") || "0px"; + original.setAttribute( + "title", + "Author-specified workspace height (" + originalHeight + ")" + ); + original.style.height = originalHeight; + container.appendChild(original); + if (original.offsetHeight > workspace.offsetHeight) { + original.classList.add("warning"); + } + workspace.parentNode.insertBefore(container, workspace); + container.appendChild(workspace); + }); + } + } else { + document.body.classList.remove("highlight-workspace"); + document.querySelectorAll(".workspace-container").forEach((container) => { + const workspace = container.querySelector(".workspace"); + container.parentNode.insertBefore(workspace, container); + container.remove(); + }); + } + } + + // ../../js/src/print-preview/page-breaks.js + function findPageBreaks(rows, pageHeight) { + let pageBreaks = []; + let minCost = Array(rows.length + 1).fill(Infinity); + minCost[rows.length] = 0; + let nextPageBreak = Array(rows.length).fill(-1); + for (let i = rows.length - 1; i >= 0; i--) { + let cumulativeHeight = 0; + for (let j = i; j < rows.length; j++) { + cumulativeHeight += rows[j].height; + if (cumulativeHeight > pageHeight) { + if (j === i) { + minCost[i] = 0; + nextPageBreak[i] = i + 1; + } + break; + } + const cost = (pageHeight - cumulativeHeight) ** 2 + minCost[j + 1]; + if (cost < minCost[i]) { + minCost[i] = cost; + nextPageBreak[i] = j + 1; + } + } + } + let nextPage = 1; + while (nextPage < rows.length) { + pageBreaks.push(nextPageBreak[nextPage]); + nextPage = nextPageBreak[nextPage]; + } + return pageBreaks; + } + + // ../../js/src/print-preview/pages.js + function flattenParagraphsSections(printout) { + const paragraphsSections = printout.querySelectorAll( + "section.paragraphs" + ); + paragraphsSections.forEach((section) => { + const parent = section.parentNode; + while (section.firstChild) { + parent.insertBefore(section.firstChild, section); + } + parent.removeChild(section); + }); + } + function waitForImages(container, timeoutMs = 5e3) { + const images = container.querySelectorAll("img"); + const promises = []; + for (const img of images) { + if (!img.complete) { + promises.push( + new Promise((resolve) => { + img.addEventListener("load", resolve, { once: true }); + img.addEventListener("error", resolve, { once: true }); + }) + ); + } + } + if (promises.length === 0) return Promise.resolve(); + return Promise.race([ + Promise.all(promises), + new Promise((resolve) => setTimeout(resolve, timeoutMs)) + ]); + } + function adjustPrintoutPages() { + const printout = document.querySelector( + "section.worksheet, section.handout" + ); + if (!printout) return; + const pages = printout.querySelectorAll(".onepage"); + if (pages.length === 0) return; + const firstPage = pages[0]; + const lastPage = pages[pages.length - 1]; + const pageFirstChild = firstPage.firstChild; + let currentChild = printout.firstChild; + while (currentChild && currentChild !== firstPage) { + const nextChild2 = currentChild.nextSibling; + firstPage.insertBefore(currentChild, pageFirstChild); + currentChild = nextChild2; + } + let nextChild = lastPage.nextSibling; + while (nextChild) { + const tempChild = nextChild; + nextChild = nextChild.nextSibling; + lastPage.appendChild(tempChild); + } + } + function createPrintoutPages(margins) { + const conservativeContentHeight = 1056 - (margins.top + margins.bottom); + const conservativeContentWidth = 794 - (margins.left + margins.right); + const printout = document.querySelector( + "section.worksheet, section.handout" + ); + if (!printout) return; + printout.style.width = (conservativeContentWidth + margins.left + margins.right).toString() + "px"; + setInitialWorkspaceHeights(printout); + let rows = []; + for (const child of printout.children) { + if (child.classList.contains("sidebyside")) { + rows.push(child); + } else if (child.querySelector(".task")) { + rows.push(child); + const tasks = child.querySelectorAll(".task, .conclusion"); + for (let i = 0; i < tasks.length; i++) { + let parent = tasks[i].parentElement; + let grandparent = parent.parentElement; + if (grandparent.classList.contains("task")) { + tasks[i].classList.add("subsubtask"); + } else if (parent.classList.contains("task")) { + tasks[i].classList.add("subtask"); + } + } + for (let i = tasks.length - 1; i > 0; i--) { + printout.insertBefore(tasks[i], child.nextSibling); + } + } else { + rows.push(child); + } + } + let blockList = []; + for (const row of rows) { + let blockHeight = getElementTotalHeight(row); + if (blockHeight === 0) continue; + let totalWorkspaceHeight = 0; + if (row.querySelector(".workspace")) { + totalWorkspaceHeight = getElemWorkspaceHeight(row); + } + blockList.push({ + elem: row, + height: blockHeight, + workspaceHeight: totalWorkspaceHeight + }); + } + const pageBreaks = findPageBreaks(blockList, conservativeContentHeight); + for (let i = 0; i < pageBreaks.length; i++) { + const pageDiv = document.createElement("section"); + pageDiv.classList.add("onepage"); + if (i === 0) pageDiv.classList.add("firstpage"); + if (i === pageBreaks.length - 1) pageDiv.classList.add("lastpage"); + const start = pageBreaks[i - 1] || 0; + const end = pageBreaks[i]; + for (let j = start; j < end; j++) { + pageDiv.appendChild(blockList[j].elem); + } + printout.appendChild(pageDiv); + } + for (const child of Array.from(printout.children)) { + if (!child.classList.contains("onepage")) { + printout.removeChild(child); + } + } + } + + // ../../js/src/print-preview/headers-footers.js + function addHeadersAndFootersToPrintout() { + const printout = document.querySelector( + "section.worksheet, section.handout" + ); + if (!printout) return; + const pages = printout.querySelectorAll(".onepage"); + pages.forEach((page, index) => { + const isFirstPage = index === 0; + const headerDiv = document.createElement("div"); + headerDiv.classList.add( + isFirstPage ? "first-page-header" : "running-header", + "hidden" + ); + headerDiv.innerHTML = `
`; + page.insertBefore(headerDiv, page.firstChild); + const footerDiv = document.createElement("div"); + footerDiv.classList.add( + isFirstPage ? "first-page-footer" : "running-footer", + "hidden" + ); + footerDiv.innerHTML = ``; + page.appendChild(footerDiv); + }); + const keys = [ + "header-first-left", + "header-first-center", + "header-first-right", + "footer-first-left", + "footer-first-center", + "footer-first-right", + "header-running-left", + "header-running-center", + "header-running-right", + "footer-running-left", + "footer-running-center", + "footer-running-right" + ]; + const content2 = {}; + keys.forEach((key) => { + content2[key] = localStorage.getItem(key) || printout.getAttribute(`data-${key}`) || ""; + }); + const firstHeader = document.querySelector(".first-page-header"); + if (firstHeader) { + firstHeader.querySelector(".header-left").innerHTML = content2["header-first-left"]; + firstHeader.querySelector(".header-center").innerHTML = content2["header-first-center"]; + firstHeader.querySelector(".header-right").innerHTML = content2["header-first-right"]; + } + const firstFooter = document.querySelector(".first-page-footer"); + if (firstFooter) { + firstFooter.querySelector(".footer-left").innerHTML = content2["footer-first-left"]; + firstFooter.querySelector(".footer-center").innerHTML = content2["footer-first-center"]; + firstFooter.querySelector(".footer-right").innerHTML = content2["footer-first-right"]; + } + document.querySelectorAll(".running-header").forEach((headerDiv) => { + headerDiv.querySelector(".header-left").innerHTML = content2["header-running-left"]; + headerDiv.querySelector(".header-center").innerHTML = content2["header-running-center"]; + headerDiv.querySelector(".header-right").innerHTML = content2["header-running-right"]; + }); + document.querySelectorAll(".running-footer").forEach((footerDiv) => { + footerDiv.querySelector(".footer-left").innerHTML = content2["footer-running-left"]; + footerDiv.querySelector(".footer-center").innerHTML = content2["footer-running-center"]; + footerDiv.querySelector(".footer-right").innerHTML = content2["footer-running-right"]; + }); + const selectorMap = { + "header-first-left": ".first-page-header .header-left", + "header-first-center": ".first-page-header .header-center", + "header-first-right": ".first-page-header .header-right", + "footer-first-left": ".first-page-footer .footer-left", + "footer-first-center": ".first-page-footer .footer-center", + "footer-first-right": ".first-page-footer .footer-right", + "header-running-left": ".running-header .header-left", + "header-running-center": ".running-header .header-center", + "header-running-right": ".running-header .header-right", + "footer-running-left": ".running-footer .footer-left", + "footer-running-center": ".running-footer .footer-center", + "footer-running-right": ".running-footer .footer-right" + }; + keys.forEach((key) => { + const elements = document.querySelectorAll(selectorMap[key]); + elements.forEach((elem) => { + elem.addEventListener("input", () => { + localStorage.setItem(key, elem.innerHTML); + }); + }); + }); + } + + // ../../js/src/print-preview/paper-size.js + function getPaperSize() { + let paperSize = localStorage.getItem("papersize"); + if (paperSize) return paperSize; + try { + fetch("https://ipapi.co/json/").then((response) => response.json()).then((data) => { + const continent = data && data.continent_code ? data.continent_code : ""; + paperSize = continent === "NA" || continent === "SA" ? "letter" : "a4"; + const radio = document.querySelector( + `input[name="papersize"][value="${paperSize}"]` + ); + if (radio) { + radio.checked = true; + localStorage.setItem("papersize", paperSize); + } + document.body.classList.remove("a4", "letter"); + document.body.classList.add(paperSize); + }).catch((err) => { + throw err; + }); + } catch (e) { + const radio = document.querySelector( + 'input[name="papersize"][value="letter"]' + ); + if (radio) radio.checked = true; + } + return paperSize || "letter"; + } + + // ../../js/src/print-preview/section-swap.js + async function loadPrintout(printableSectionID) { + const themeStylesheetLink = document.querySelector( + 'link[rel="stylesheet"][href*="theme"]' + ); + const themeStylesheetHref = themeStylesheetLink ? themeStylesheetLink.getAttribute("href") : null; + if (themeStylesheetHref) { + const printStylesheetHref = themeStylesheetHref.replace( + /theme.*\.css/, + "print-worksheet.css" + ); + themeStylesheetLink.setAttribute("href", printStylesheetHref); + await new Promise((resolve) => { + themeStylesheetLink.addEventListener("load", resolve, { + once: true + }); + }); + } + const printableSection = document.getElementById(printableSectionID); + if (!printableSection) { + console.error("No section found with ID:", printableSectionID); + return; + } + const ptxContent = document.querySelector(".ptx-content"); + const existingSections = ptxContent.querySelectorAll(":scope > section"); + existingSections.forEach((sec) => ptxContent.removeChild(sec)); + ptxContent.appendChild(printableSection); + } + + // ../../js/src/print-preview/solutions.js + function rewriteSolutions() { + const bornHiddenKnowls = document.querySelectorAll( + ".worksheet details, .handout details" + ); + bornHiddenKnowls.forEach(function(detail) { + const summary = detail.querySelector("summary"); + const content2 = detail.innerHTML.replace(summary.outerHTML, ""); + const div = document.createElement("div"); + div.classList = detail.classList; + if (summary) { + const title = document.createElement("h5"); + title.innerHTML = summary.innerHTML; + div.appendChild(title); + } + const body = document.createElement("div"); + body.innerHTML = content2; + div.appendChild(body); + detail.parentNode.replaceChild(div, detail); + }); + } + + // ../../js/src/print-preview/index.js + async function initPrintPreview() { + const urlParams = new URLSearchParams(window.location.search); + if (!urlParams.has("printpreview")) return; + const printableSectionID = urlParams.get("printpreview"); + await loadPrintout(printableSectionID); + const marginList = document.querySelector("section.worksheet, section.handout").getAttribute("data-margins").split(" "); + const margins = { + top: toPixels(marginList[0] || "0.75in"), + right: toPixels(marginList[1] || "0.75in"), + bottom: toPixels(marginList[2] || "0.75in"), + left: toPixels(marginList[3] || "0.75in") + }; + rewriteSolutions(); + let paperSize = getPaperSize(); + if (paperSize) { + const radio = document.querySelector( + `input[name="papersize"][value="${paperSize}"]` + ); + if (radio) radio.checked = true; + document.body.classList.remove("a4", "letter"); + document.body.classList.add(paperSize); + setPageGeometryCSS({ paperSize, margins }); + } + const papersizeRadios = document.querySelectorAll( + 'input[name="papersize"]' + ); + papersizeRadios.forEach((radio) => { + radio.addEventListener("change", function() { + if (this.checked) { + document.body.classList.remove("a4", "letter"); + document.body.classList.add(this.value); + localStorage.setItem("papersize", this.value); + setPageGeometryCSS({ paperSize: this.value, margins }); + adjustWorkspaceToFitPage({ + paperSize: this.value, + margins + }); + } + }); + }); + for (const solutionType of ["hint", "answer", "solution"]) { + const checkbox = document.getElementById( + `hide-${solutionType}-checkbox` + ); + if (!checkbox) continue; + const storageKey = `hide-${solutionType}`; + if ((solutionType === "answer" || solutionType === "solution") && !localStorage.getItem(storageKey)) { + checkbox.checked = true; + localStorage.setItem(storageKey, "true"); + } + checkbox.checked = localStorage.getItem(storageKey) === "true"; + document.querySelectorAll(`div.${solutionType}`).forEach((elem) => { + if (checkbox.checked) { + elem.classList.add("hidden"); + } else { + elem.classList.remove("hidden"); + } + }); + checkbox.addEventListener("change", function() { + localStorage.setItem(storageKey, this.checked); + document.querySelectorAll(`div.${solutionType}`).forEach((elem) => { + if (checkbox.checked) { + elem.classList.add("hidden"); + } else { + elem.classList.remove("hidden"); + } + adjustWorkspaceToFitPage({ paperSize, margins }); + }); + }); + } + const printoutSection = document.querySelector( + "section.worksheet, section.handout" + ); + if (printoutSection) { + flattenParagraphsSections(printoutSection); + await waitForImages(printoutSection); + } + if (document.querySelector(".onepage")) { + adjustPrintoutPages(); + } else { + createPrintoutPages(margins); + } + addHeadersAndFootersToPrintout(); + for (const hf of [ + "first-page-header", + "running-header", + "first-page-footer", + "running-footer" + ]) { + const checkbox = document.getElementById(`print-${hf}-checkbox`); + if (!checkbox) continue; + checkbox.checked = localStorage.getItem(`print-${hf}`) === "true"; + document.querySelectorAll(`.${hf}`).forEach((elem) => { + if (checkbox.checked) { + elem.classList.remove("hidden"); + } else { + elem.classList.add("hidden"); + } + }); + checkbox.addEventListener("change", function() { + localStorage.setItem(`print-${hf}`, this.checked); + document.querySelectorAll(`.${hf}`).forEach((elem) => { + if (checkbox.checked) { + elem.classList.remove("hidden"); + } else { + elem.classList.add("hidden"); + } + adjustWorkspaceToFitPage({ paperSize, margins }); + }); + }); + } + adjustWorkspaceToFitPage({ paperSize, margins }); + const highlightCheckbox = document.getElementById( + "highlight-workspace-checkbox" + ); + if (highlightCheckbox) { + highlightCheckbox.checked = localStorage.getItem("highlightWorkspace") === "true"; + highlightCheckbox.addEventListener("change", function() { + localStorage.setItem("highlightWorkspace", this.checked); + toggleWorkspaceHighlight(this.checked); + }); + toggleWorkspaceHighlight(highlightCheckbox.checked); + } + } + + // ../../js/src/theme.js + function isDarkMode() { + if (document.documentElement.dataset.darkmode === "disabled") return false; + const currentTheme = localStorage.getItem("theme"); + if (currentTheme === "dark") return true; + if (currentTheme === "light") return false; + return window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches; + } + function setDarkMode(isDark) { + if (document.documentElement.dataset.darkmode === "disabled") return; + const parentHtml = document.documentElement; + const iframes = document.querySelectorAll( + "iframe[data-dark-mode-enabled]" + ); + if (isDark) { + parentHtml.classList.add("dark-mode"); + } else { + parentHtml.classList.remove("dark-mode"); + } + for (const iframe of iframes) { + try { + const iframeHtml = iframe.contentWindow.document.documentElement; + if (isDark) { + iframeHtml.classList.add("dark-mode"); + } else { + iframeHtml.classList.remove("dark-mode"); + } + } catch (err) { + console.warn("Dark mode sync to iframe failed:", err); + } + } + const modeButton = document.getElementById("light-dark-button"); + if (modeButton) { + modeButton.querySelector(".icon").innerText = isDark ? "light_mode" : "dark_mode"; + modeButton.querySelector(".name").innerText = isDark ? "Light Mode" : "Dark Mode"; + } + } + function initThemeToggle() { + setDarkMode(isDarkMode()); + const isDark = isDarkMode(); + setDarkMode(isDark); + const modeButton = document.getElementById("light-dark-button"); + if (modeButton) { + modeButton.addEventListener("click", function() { + const wasDark = isDarkMode(); + setDarkMode(!wasDark); + localStorage.setItem("theme", wasDark ? "light" : "dark"); + }); + } + } + + // ../../js/src/embed.js + function initShareButton() { + const shareButton = document.getElementById("embed-button"); + if (!shareButton) return; + const sharePopup = document.getElementById("embed-popup"); + const embedCode = ""; + const embedTextbox = document.getElementById("embed-code-textbox"); + if (embedTextbox) { + embedTextbox.value = embedCode; + } + shareButton.addEventListener("click", function() { + sharePopup.classList.toggle("hidden"); + }); + const copyButton = document.getElementById("copy-embed-button"); + if (copyButton) { + copyButton.addEventListener("click", function() { + const textbox = document.getElementById("embed-code-textbox"); + if (textbox) { + navigator.clipboard.writeText(embedCode).then(() => { + console.log("Embed code copied to clipboard!"); + }).catch((err) => { + console.error("Failed to copy embed code: ", err); + }); + copyButton.querySelector(".icon").innerText = "library_add_check"; + setTimeout(function() { + copyButton.querySelector(".icon").innerText = "content_copy"; + sharePopup.classList.add("hidden"); + }, 450); + } + }); + } + } + function initEmbedMode() { + const urlParams = new URLSearchParams(window.location.search); + if (!urlParams.has("embed")) return; + if (urlParams.get("embed") === "dark") { + setDarkMode(true); + } else { + setDarkMode(false); + } + const elemsToHide = [ + "ptx-navbar", + "ptx-masthead", + "ptx-page-footer", + "ptx-sidebar", + "ptx-content-footer" + ]; + for (const id of elemsToHide) { + const elem = document.getElementById(id); + if (elem) { + elem.classList.add("hidden"); + } + } + } + + // ../../js/src/code-copy.js + function initCodeCopyButtons() { + const elements = document.querySelectorAll(".clipboardable"); + for (const el of elements) { + const div = document.createElement("div"); + div.classList.add("clipboardable"); + el.classList.remove("clipboardable"); + el.replaceWith(div); + div.insertAdjacentElement("afterbegin", el); + div.insertAdjacentHTML( + "beforeend", + ` + + `.trim() + ); + } + } + function initCodeCopyHandler() { + document.addEventListener("click", (ev) => { + const codeBox = ev.target.closest(".clipboardable"); + if (!navigator.clipboard || !codeBox) return; + const button = ev.target.closest(".code-copy"); + if (!button) return; + const preContent = codeBox.querySelector("pre").textContent; + navigator.clipboard.writeText(preContent); + button.classList.toggle("copied"); + setTimeout(() => button.classList.toggle("copied"), 1e3); + }); + } + + // ../../js/src/deprecated/auto-id.js + function initAutoId() { + const noIdParagraphs = document.querySelectorAll(".main p:not([id])"); + for (let n = noIdParagraphs.length - 1; n >= 0; --n) { + const e = noIdParagraphs[n]; + if (e.hasAttribute("id")) continue; + if (e.classList.contains("watermark")) continue; + const prevParagraphs = []; + let sibling = e.previousElementSibling; + while (sibling) { + if (sibling.tagName === "P") { + prevParagraphs.push(sibling); + } + sibling = sibling.previousElementSibling; + } + if (prevParagraphs.length === 0) continue; + let partsFound = 1; + const partsToId = [e]; + for (let i = 0; i < prevParagraphs.length; ++i) { + const thisPrevious = prevParagraphs[i]; + if (!thisPrevious.hasAttribute("id")) { + partsToId.unshift(thisPrevious); + } else { + const baseId = thisPrevious.id; + for (let j = 0; j < partsToId.length; ++j) { + ++partsFound; + const nextId = baseId + "-part" + partsFound.toString(); + partsToId[j].setAttribute("id", nextId); + } + break; + } + } + } + } + + // ../../js/src/deprecated/video-magnify.js + function initVideoMagnify() { + const allIframes = document.querySelectorAll("body iframeXXXX"); + for (let i = 0; i < allIframes.length; i++) { + const thisItem = allIframes[i]; + const thisItemSrc = thisItem.src; + if (!thisItemSrc.includes("youtube")) continue; + const thisItemId = thisItem.id; + const thisItemWidth = thisItem.width; + const thisItemHeight = thisItem.height; + if (thisItemHeight < 150) continue; + const emptyDiv = document.createElement("div"); + const videomagContainer = document.createElement("div"); + const parentTag = thisItem.parentElement.tagName; + if (parentTag === "FIGURE") { + videomagContainer.setAttribute("class", "videobig"); + } else { + videomagContainer.setAttribute("class", "videobig nofigure"); + } + videomagContainer.setAttribute("video-id", thisItemId); + videomagContainer.setAttribute("data-width", thisItemWidth); + videomagContainer.setAttribute("data-height", thisItemHeight); + videomagContainer.innerHTML = "fit width"; + thisItem.insertAdjacentElement("beforebegin", emptyDiv); + thisItem.insertAdjacentElement("beforebegin", videomagContainer); + thisItem.insertAdjacentElement("beforebegin", emptyDiv); + } + document.body.addEventListener("click", function(event2) { + const bigBtn = event2.target.closest(".videobig"); + if (bigBtn) { + const videoId = bigBtn.getAttribute("video-id"); + const video = document.getElementById(videoId); + const originalWidth = parseInt(bigBtn.getAttribute("data-width")); + const originalHeight = parseInt(bigBtn.getAttribute("data-height")); + const browserWidth = window.innerWidth; + const widthRatio = browserWidth / originalWidth; + video.setAttribute("width", widthRatio * originalWidth); + video.setAttribute("height", widthRatio * originalHeight); + video.setAttribute( + "style", + "position:relative; left:-260px; z-index:1000" + ); + bigBtn.setAttribute("class", "videosmall"); + bigBtn.innerHTML = "make small"; + return; + } + const smallBtn = event2.target.closest(".videosmall"); + if (smallBtn) { + const videoId = smallBtn.getAttribute("video-id"); + const video = document.getElementById(videoId); + const originalWidth = smallBtn.getAttribute("data-width"); + const originalHeight = smallBtn.getAttribute("data-height"); + video.removeAttribute("style"); + video.setAttribute("width", originalWidth); + video.setAttribute("height", originalHeight); + smallBtn.setAttribute("class", "videobig"); + smallBtn.innerHTML = "fit width"; + } + }); + } + + // ../../js/src/pretext-core-entry.js + setDarkMode(isDarkMode()); + window.isDarkMode = isDarkMode; + window.setDarkMode = setDarkMode; + window.addEventListener("DOMContentLoaded", function() { + initToc(); + initFocusedToc(); + initScrollToc(); + initPermalinks(); + initThemeToggle(); + initShareButton(); + initEmbedMode(); + initCodeCopyButtons(); + initPrintPreview(); + }); + window.addEventListener("load", function() { + initKnowls(); + initLtiIframeResizer(); + initImageMagnify(); + initGeoGebra(); + initKeyboardNav(); + initAnchorKnowl(); + initAutoId(); + initVideoMagnify(); + }); + initCodeCopyHandler(); +})(); +//# sourceMappingURL=pretext-core.js.map diff --git a/js/dist/pretext-core.js.map b/js/dist/pretext-core.js.map new file mode 100644 index 000000000..bef08ec77 --- /dev/null +++ b/js/dist/pretext-core.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../src/toc.js", "../src/knowl.js", "../src/lti-iframe-resizer.js", "../src/permalink.js", "../src/image-magnify.js", "../src/deprecated/scrollbar-width.js", "../src/geogebra.js", "../src/keyboard-nav.js", "../src/print-preview/geometry.js", "../src/print-preview/workspace.js", "../src/print-preview/page-breaks.js", "../src/print-preview/pages.js", "../src/print-preview/headers-footers.js", "../src/print-preview/paper-size.js", "../src/print-preview/section-swap.js", "../src/print-preview/solutions.js", "../src/print-preview/index.js", "../src/theme.js", "../src/embed.js", "../src/code-copy.js", "../src/deprecated/auto-id.js", "../src/deprecated/video-magnify.js", "../src/pretext-core-entry.js"], + "sourcesContent": ["/**\r\n * TOC, sidebar, and navigation (from pretext.js).\r\n *\r\n * Manages the table-of-contents sidebar: scroll-to-active, toggle\r\n * visibility, auto-collapse, focused/expandable TOC items, and\r\n * hash-based navigation.\r\n */\r\n\r\nfunction getOffsetTop(e) {\r\n if (!e) return 0;\r\n return getOffsetTop(e.offsetParent) + e.offsetTop;\r\n}\r\n\r\nfunction scrollTocToActive() {\r\n let fileNameWHash = window.location.href.split(\"/\").pop();\r\n let fileName = fileNameWHash.split(\"#\")[0];\r\n\r\n let tocEntry = document.querySelector(\r\n '#ptx-toc a[href=\"' + fileName + '\"]'\r\n );\r\n if (!tocEntry) return;\r\n\r\n let tocEntryTop = 0;\r\n if (fileNameWHash.includes(\"#\")) {\r\n let tocEntryWHash = document.querySelector(\r\n '#ptx-toc a[href=\"' + fileNameWHash + '\"]'\r\n );\r\n if (tocEntryWHash) {\r\n tocEntry\r\n .closest(\"li\")\r\n .querySelectorAll(\"li\")\r\n .forEach((li) => {\r\n li.classList.remove(\"active\");\r\n });\r\n tocEntryWHash.closest(\"li\").classList.add(\"active\");\r\n tocEntryTop = getOffsetTop(tocEntryWHash);\r\n }\r\n }\r\n if (!tocEntryTop) {\r\n tocEntryTop = getOffsetTop(tocEntry);\r\n }\r\n\r\n tocEntry.closest(\"li\").classList.add(\"active\");\r\n let toc = document.querySelector(\"#ptx-toc\");\r\n let tocTop = getOffsetTop(toc);\r\n toc.scrollTop = tocEntryTop - tocTop - 0.4 * self.innerHeight;\r\n}\r\n\r\nfunction toggletoc() {\r\n const thesidebar = document.getElementById(\"ptx-sidebar\");\r\n if (\r\n thesidebar.classList.contains(\"hidden\") ||\r\n thesidebar.classList.contains(\"visible\")\r\n ) {\r\n thesidebar.classList.toggle(\"hidden\");\r\n thesidebar.classList.toggle(\"visible\");\r\n } else if (thesidebar.offsetParent === null) {\r\n thesidebar.classList.toggle(\"visible\");\r\n } else {\r\n thesidebar.classList.toggle(\"hidden\");\r\n }\r\n scrollTocToActive();\r\n}\r\n\r\nfunction samePageLink(a) {\r\n if (!(a instanceof HTMLAnchorElement)) return false;\r\n try {\r\n const linkUrl = new URL(a.href, document.baseURI);\r\n const currentUrl = new URL(window.location.href);\r\n const sameDocument =\r\n linkUrl.origin === currentUrl.origin &&\r\n linkUrl.pathname === currentUrl.pathname &&\r\n linkUrl.search === currentUrl.search;\r\n return sameDocument && !!linkUrl.hash;\r\n } catch (e) {\r\n return false;\r\n }\r\n}\r\n\r\nfunction getTOCItemType(item) {\r\n for (let className of item.classList) {\r\n if (\r\n className !== \"toc-item\" &&\r\n className.length > 3 &&\r\n className.slice(0, 4) === \"toc-\"\r\n )\r\n return className.slice(4);\r\n }\r\n return \"\";\r\n}\r\n\r\nfunction getTOCItemDepth(item) {\r\n let depth = 0;\r\n let curParent = item.closest(\".toc-item-list\");\r\n while (curParent !== null) {\r\n depth++;\r\n curParent = curParent.parentElement.closest(\".toc-item-list\");\r\n }\r\n return depth;\r\n}\r\n\r\nfunction toggleTOCItem(expander) {\r\n let listItem = expander.closest(\".toc-item\");\r\n listItem.classList.toggle(\"expanded\");\r\n let expanded = listItem.classList.contains(\"expanded\");\r\n let itemType = getTOCItemType(listItem);\r\n\r\n if (expanded) {\r\n expander.title = \"Close\" + (itemType !== \"\" ? \" \" + itemType : \"\");\r\n } else {\r\n expander.title = \"Expand\" + (itemType !== \"\" ? \" \" + itemType : \"\");\r\n }\r\n\r\n for (const childUL of listItem.querySelectorAll(\r\n \":scope > ul.toc-item-list\"\r\n )) {\r\n for (const childItem of childUL.querySelectorAll(\r\n \":scope > li.toc-item\"\r\n )) {\r\n if (expanded) {\r\n childItem.classList.add(\"visible\");\r\n childItem.classList.remove(\"hidden\");\r\n } else {\r\n childItem.classList.remove(\"visible\");\r\n childItem.classList.add(\"hidden\");\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport function initToc() {\r\n const thetocbutton = document.getElementsByClassName(\"toc-toggle\")[0];\r\n if (thetocbutton) {\r\n thetocbutton.addEventListener(\"click\", (e) => {\r\n toggletoc();\r\n e.stopPropagation();\r\n });\r\n }\r\n\r\n // Auto-collapse TOC when clicking outside\r\n if (\r\n getComputedStyle(document.documentElement).getPropertyValue(\r\n \"--auto-collapse-toc\"\r\n ) == \"yes\"\r\n ) {\r\n const sidebar = document.getElementById(\"ptx-sidebar\");\r\n\r\n window.addEventListener(\"click\", function (event) {\r\n if (sidebar.classList.contains(\"visible\")) {\r\n if (!event.composedPath().includes(sidebar)) {\r\n toggletoc();\r\n }\r\n }\r\n });\r\n\r\n sidebar.addEventListener(\"click\", function (event) {\r\n if (samePageLink(event.target.closest(\"a\"))) {\r\n toggletoc();\r\n }\r\n });\r\n\r\n window.addEventListener(\"pageshow\", (e) => {\r\n if (e.persisted) {\r\n sidebar.classList.remove(\"visible\");\r\n sidebar.classList.add(\"hidden\");\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport function initFocusedToc() {\r\n if (document.querySelector(\".ptx-toc.focused\") === null) return;\r\n\r\n let maxDepth = 1000;\r\n for (let className of document.querySelector(\".ptx-toc\").classList)\r\n if (className.length > 5 && className.slice(0, 5) === \"depth\")\r\n maxDepth = Number(className.slice(5));\r\n\r\n let preexpandedLevels = 1;\r\n let tocDataSet = document.querySelector(\".ptx-toc\").dataset;\r\n if (typeof tocDataSet.preexpandedLevels !== \"undefined\")\r\n preexpandedLevels = Number(tocDataSet.preexpandedLevels);\r\n\r\n let tocItems = document.querySelectorAll(\r\n \".ptx-toc ul.structural > .toc-item\"\r\n );\r\n for (const tocItem of tocItems) {\r\n let hasChildren =\r\n tocItem.querySelector(\"ul.structural\") !== null;\r\n let depth = getTOCItemDepth(tocItem);\r\n\r\n if (hasChildren && depth < maxDepth) {\r\n let expander = document.createElement(\"button\");\r\n expander.classList.add(\"toc-expander\");\r\n expander.classList.add(\"toc-chevron-surround\");\r\n expander.title = \"toc-expander\";\r\n expander.innerHTML =\r\n '';\r\n tocItem.querySelector(\".toc-title-box\").append(expander);\r\n expander.addEventListener(\"click\", () => {\r\n toggleTOCItem(expander);\r\n });\r\n\r\n let isActive =\r\n tocItem.classList.contains(\"contains-active\") ||\r\n tocItem.classList.contains(\"active\");\r\n let preExpanded = isActive || depth < preexpandedLevels;\r\n let itemType = getTOCItemType(tocItem);\r\n if (preExpanded) {\r\n toggleTOCItem(expander);\r\n } else {\r\n expander.title =\r\n \"Expand\" + (itemType !== \"\" ? \" \" + itemType : \"\");\r\n }\r\n }\r\n }\r\n\r\n // Expand parents of hash-linked TOC item\r\n if (window.location.hash) {\r\n let hash = window.location.hash;\r\n let hashLink = document.querySelector(\r\n `.ptx-toc a[href$=\"${hash}\"]`\r\n );\r\n if (hashLink) {\r\n let parentTocItem = hashLink.closest(\".toc-item\");\r\n while (\r\n parentTocItem &&\r\n !parentTocItem.classList.contains(\"contains-active\")\r\n ) {\r\n parentTocItem.classList.add(\"contains-active\");\r\n let expander =\r\n parentTocItem.querySelector(\".toc-expander\");\r\n if (expander) {\r\n if (!parentTocItem.classList.contains(\"expanded\")) {\r\n toggleTOCItem(expander);\r\n }\r\n }\r\n parentTocItem =\r\n parentTocItem.parentElement.closest(\".toc-item\");\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport function initScrollToc() {\r\n scrollTocToActive();\r\n window.onhashchange = scrollTocToActive;\r\n}\r\n", "/**\r\n * Knowl behavior (from knowl.js).\r\n *\r\n * Manages xref knowls and born-hidden knowls: click-to-reveal with\r\n * slide animation, lazy content fetching, and MathJax re-typesetting.\r\n */\r\n\r\n// Used to animate both types of knowls\r\nclass SlideRevealer {\r\n static STATE = Object.freeze({\r\n INACTIVE: 0,\r\n CLOSING: 1,\r\n EXPANDING: 2,\r\n });\r\n\r\n constructor(triggerElement, contentElement, animatedElement) {\r\n this.triggerElement = triggerElement;\r\n this.contentElement = contentElement;\r\n this.animatedElement = animatedElement;\r\n\r\n this.animation = null;\r\n this.animationState = SlideRevealer.STATE.INACTIVE;\r\n\r\n this.triggerElement.addEventListener(\"click\", (e) => this.onClick(e));\r\n }\r\n\r\n onClick(e) {\r\n if (e) e.preventDefault();\r\n this.animatedElement.style.overflow = \"hidden\";\r\n\r\n if (\r\n this.animationState === SlideRevealer.STATE.CLOSING ||\r\n !this.animatedElement.hasAttribute(\"open\")\r\n ) {\r\n this.animatedElement.setAttribute(\"open\", \"\");\r\n this.triggerElement.setAttribute(\"open\", \"\");\r\n this.contentElement.style.display = \"\";\r\n MathJax.typesetPromise().then(() =>\r\n window.requestAnimationFrame(() => this.toggle(true))\r\n );\r\n } else if (\r\n this.animationState === SlideRevealer.STATE.EXPANDING ||\r\n this.animatedElement.hasAttribute(\"open\")\r\n ) {\r\n this.toggle(false);\r\n }\r\n }\r\n\r\n toggle(expanding) {\r\n let closedHeight = 0;\r\n if (this.animatedElement.contains(this.triggerElement))\r\n closedHeight = this.triggerElement.offsetHeight;\r\n const fullHeight = closedHeight + this.contentElement.offsetHeight;\r\n\r\n const startHeight = `${expanding ? closedHeight : fullHeight}px`;\r\n const endHeight = `${expanding ? fullHeight : closedHeight}px`;\r\n\r\n const padding =\r\n this.animatedElement.offsetHeight -\r\n this.animatedElement.clientHeight;\r\n const startPad = `${expanding ? 0 : padding}px`;\r\n const endPad = `${expanding ? padding : 0}px`;\r\n\r\n if (this.animation) this.animation.cancel();\r\n\r\n const animDuration = Math.max(\r\n Math.min(\r\n (Math.abs(closedHeight - fullHeight) / 400) * 1000,\r\n 750\r\n ),\r\n 250\r\n );\r\n\r\n this.animationState = expanding\r\n ? SlideRevealer.STATE.EXPANDING\r\n : SlideRevealer.STATE.CLOSING;\r\n this.animation = this.animatedElement.animate(\r\n {\r\n height: [startHeight, endHeight],\r\n paddingTop: [startPad, endPad],\r\n paddingBottom: [startPad, endPad],\r\n },\r\n { duration: animDuration, easing: \"ease\" }\r\n );\r\n\r\n this.animation.onfinish = () => {\r\n this.onAnimationFinish(expanding);\r\n };\r\n this.animation.oncancel = () => {\r\n this.animationState = SlideRevealer.STATE.INACTIVE;\r\n };\r\n }\r\n\r\n onAnimationFinish(isOpen) {\r\n this.animation = null;\r\n this.animationState = SlideRevealer.STATE.INACTIVE;\r\n\r\n if (!isOpen) {\r\n this.animatedElement.removeAttribute(\"open\");\r\n this.triggerElement.removeAttribute(\"open\");\r\n }\r\n\r\n this.animatedElement.style.overflow = \"\";\r\n if (!isOpen) this.contentElement.style.display = \"none\";\r\n\r\n if (isOpen) {\r\n let hasCallback =\r\n this.contentElement.querySelectorAll(\r\n \"[data-knowl-callback]\"\r\n );\r\n hasCallback.forEach((el) => {\r\n window[el.getAttribute(\"data-knowl-callback\")](el, open);\r\n });\r\n }\r\n }\r\n}\r\n\r\nclass LinkKnowl {\r\n static xrefCount = 0;\r\n\r\n static initializeXrefKnowl(knowlLinkElement) {\r\n if (\r\n knowlLinkElement.getAttribute(\"data-knowl-uid\") === null\r\n ) {\r\n return new LinkKnowl(knowlLinkElement);\r\n }\r\n }\r\n\r\n constructor(knowlLinkElement) {\r\n this.linkElement = knowlLinkElement;\r\n this.outputElement = null;\r\n this.uid = LinkKnowl.xrefCount++;\r\n knowlLinkElement.setAttribute(\"data-knowl-uid\", this.uid);\r\n knowlLinkElement.setAttribute(\"role\", \"button\");\r\n knowlLinkElement.setAttribute(\r\n \"data-base-title\",\r\n knowlLinkElement.getAttribute(\"title\") ||\r\n this.linkElement.textContent\r\n );\r\n knowlLinkElement.classList.add(\"knowl__link\");\r\n this.updateLabels(false);\r\n knowlLinkElement.addEventListener(\r\n \"click\",\r\n this.handleLinkClick.bind(this)\r\n );\r\n }\r\n\r\n updateLabels(isVisible) {\r\n const verb = isVisible\r\n ? this.linkElement.getAttribute(\"data-close-label\") || \"Close\"\r\n : this.linkElement.getAttribute(\"data-reveal-label\") ||\r\n \"Reveal\";\r\n const targetDescript =\r\n this.linkElement.getAttribute(\"data-base-title\");\r\n const helpText = verb + \" \" + targetDescript;\r\n this.linkElement.setAttribute(\"aria-label\", helpText);\r\n this.linkElement.setAttribute(\"title\", helpText);\r\n }\r\n\r\n toggle() {\r\n this.linkElement.classList.toggle(\"active\");\r\n const isActive = this.linkElement.classList.contains(\"active\");\r\n this.updateLabels(isActive);\r\n\r\n if (isActive) {\r\n const h = this.outputElement.getBoundingClientRect().height;\r\n if (h > window.innerHeight) {\r\n this.outputElement.scrollIntoView(true);\r\n } else {\r\n if (\r\n this.outputElement.getBoundingClientRect().bottom >\r\n window.innerHeight\r\n )\r\n this.outputElement.scrollIntoView(false);\r\n }\r\n }\r\n }\r\n\r\n findOutputLocation() {\r\n const invalidParents =\r\n \"table, mjx-container, div.tabular-box, .runestone > .parsons\";\r\n let el = this.linkElement.parentElement;\r\n let problemAncestor = el.closest(invalidParents);\r\n while (problemAncestor && problemAncestor !== el) {\r\n el = problemAncestor;\r\n problemAncestor = el.closest(invalidParents);\r\n }\r\n return el;\r\n }\r\n\r\n createOutputElement() {\r\n const outputId = \"knowl-uid-\" + this.uid;\r\n const outputContentsId = \"knowl-output-\" + this.uid;\r\n const linkTarget =\r\n this.linkElement.getAttribute(\"data-knowl\");\r\n\r\n const placeholderText =\r\n ``;\r\n\r\n const temp = document.createElement(\"template\");\r\n temp.innerHTML = placeholderText;\r\n this.outputElement = temp.content.children[0];\r\n\r\n const insertLoc = this.findOutputLocation(this.linkElement);\r\n insertLoc.after(this.outputElement);\r\n }\r\n\r\n async getContent() {\r\n const contentURL =\r\n this.linkElement.getAttribute(\"data-knowl\");\r\n const knowlContent = await fetch(contentURL)\r\n .then((response) => response.text())\r\n .then((data) => {\r\n let knowlDoc = new DOMParser().parseFromString(\r\n data,\r\n \"text/html\"\r\n );\r\n let tempContainer = knowlDoc.body;\r\n let scripts = knowlDoc.querySelectorAll(\"head script\");\r\n tempContainer.append(...scripts);\r\n return tempContainer;\r\n })\r\n .catch((error) => {\r\n const destination =\r\n this.linkElement.getAttribute(\"href\");\r\n const text = this.linkElement.textContent;\r\n const err_message =\r\n `
` +\r\n `
Error fetching content. (${error})
` +\r\n `` +\r\n `
If you are viewing this book from your local filesystem, this is expected behavior. To view the book with all features, you must serve the book from a web server. See the PreTeXt FAQ for more information.
` +\r\n `
`;\r\n return err_message;\r\n });\r\n return knowlContent;\r\n }\r\n\r\n handleLinkClick(event) {\r\n event.preventDefault();\r\n\r\n if (this.outputElement !== null) {\r\n this.toggle();\r\n } else {\r\n this.createOutputElement();\r\n\r\n const slideHandler = new SlideRevealer(\r\n this.linkElement,\r\n this.outputElement,\r\n this.outputElement\r\n );\r\n this.linkElement.addEventListener(\"click\", slideHandler);\r\n\r\n let loadingTimeout = setTimeout(() => {\r\n loadingTimeout = null;\r\n slideHandler.onClick();\r\n this.toggle();\r\n }, 500);\r\n\r\n const content = this.getContent();\r\n\r\n content\r\n .then((tempContainer) => {\r\n if (loadingTimeout !== null) {\r\n clearTimeout(loadingTimeout);\r\n }\r\n setTimeout(() => {\r\n slideHandler.onClick();\r\n this.toggle();\r\n }, 100);\r\n\r\n const runestoneElements =\r\n tempContainer.querySelectorAll(\r\n \".ptx-runestone-container\"\r\n );\r\n [...runestoneElements].forEach((e) => {\r\n const rsId =\r\n e.querySelector(\"[data-component]\")?.id;\r\n const onPage = document.getElementById(rsId);\r\n if (onPage) {\r\n e.innerHTML = `
The interactive that belongs here is already on the page and cannot appear multiple times. Scroll to interactive.`;\r\n } else {\r\n window.runestoneComponents.renderOneComponent(\r\n e\r\n );\r\n }\r\n });\r\n\r\n const children = [...tempContainer.children];\r\n this.outputElement.innerHTML = \"\";\r\n this.outputElement.append(...children);\r\n\r\n addKnowls(this.outputElement);\r\n Prism.highlightAllUnder(this.outputElement);\r\n\r\n [\r\n ...this.outputElement.getElementsByTagName(\r\n \"script\"\r\n ),\r\n ].forEach((s) => {\r\n if (\r\n s.getAttribute(\"type\") === null ||\r\n s.getAttribute(\"type\") ===\r\n \"text/javascript\"\r\n ) {\r\n eval(s.innerHTML);\r\n }\r\n });\r\n })\r\n .catch((data) => {\r\n console.log(\r\n \"Error fetching knowl content: \" + data\r\n );\r\n });\r\n }\r\n }\r\n}\r\n\r\nexport function addKnowls(target) {\r\n const xrefs = target.querySelectorAll(\"[data-knowl]\");\r\n for (const xref of xrefs) {\r\n LinkKnowl.initializeXrefKnowl(xref);\r\n }\r\n\r\n const bornHiddens = target.querySelectorAll(\".born-hidden-knowl\");\r\n for (const bhk of bornHiddens) {\r\n const summary = bhk.querySelector(\":scope > summary\");\r\n if (!summary) continue;\r\n const contents = bhk.querySelector(\":scope > summary + *\");\r\n new SlideRevealer(summary, contents, bhk);\r\n }\r\n}\r\n\r\nexport function initKnowls() {\r\n addKnowls(document);\r\n}\r\n", "/**\r\n * LTI iframe resizer (from lti_iframe_resizer.js).\r\n *\r\n * Handles SPLICE resize messages from embedded iframes (e.g. MyOpenMath),\r\n * adjusting iframe dimensions based on postMessage events.\r\n *\r\n * @see https://cssplice.org/\r\n */\r\n\r\nexport function sendResizeRequest(el) {\r\n el.contentWindow.postMessage(\"requestResize\", \"*\");\r\n}\r\n\r\nexport function initLtiIframeResizer() {\r\n window.addEventListener(\"message\", function (event) {\r\n let edata = event.data;\r\n\r\n // MoM sends event.data as a string instead of JSON\r\n if (\r\n typeof event.data == \"string\" &&\r\n event.data.match(/lti\\.frameResize/)\r\n ) {\r\n edata = JSON.parse(event.data);\r\n }\r\n\r\n if (edata.subject === \"lti.frameResize\") {\r\n if (\"frame_id\" in edata) {\r\n const el = document.getElementById(edata[\"frame_id\"]);\r\n if (el) {\r\n el.style.height = edata.height + \"px\";\r\n }\r\n if (\r\n edata.wrapheight &&\r\n document.getElementById(edata[\"frame_id\"] + \"wrap\")\r\n ) {\r\n document.getElementById(\r\n edata[\"frame_id\"] + \"wrap\"\r\n ).style.height = edata.wrapheight + \"px\";\r\n }\r\n } else if (\"iframe_resize_id\" in edata) {\r\n const el = document.getElementById(\r\n edata[\"iframe_resize_id\"]\r\n );\r\n if (el) {\r\n el.style.height = edata.height + \"px\";\r\n }\r\n } else {\r\n const iFrames =\r\n document.getElementsByTagName(\"iframe\");\r\n for (const iFrame of iFrames) {\r\n if (iFrame.contentWindow === event.source) {\r\n if (edata.height) {\r\n iFrame.height = edata.height;\r\n iFrame.style.height = edata.height + \"px\";\r\n }\r\n if (edata.width) {\r\n iFrame.width = edata.width;\r\n iFrame.style.width = edata.width + \"px\";\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n });\r\n}\r\n", "/**\r\n * Permalink copy-to-clipboard functionality.\r\n *\r\n * Copies permalink URLs to the clipboard using the Clipboard API,\r\n * with a brief visual confirmation message.\r\n */\r\n\r\nasync function copyPermalink(linkNode) {\r\n if (!navigator.clipboard) {\r\n console.log(\"Error: Clipboard API not available\");\r\n return;\r\n }\r\n const elem = linkNode.parentElement;\r\n if (!linkNode) {\r\n console.log(\"Error: Something went wrong finding permalink URL\");\r\n return;\r\n }\r\n const url = linkNode.href;\r\n const description = elem.getAttribute(\"data-description\");\r\n const link = `${description}`;\r\n const msgLink = `${description}`;\r\n const textFallback = description + \" \\r\\n\" + url;\r\n let copySuccess = true;\r\n\r\n try {\r\n // NOTE: this method will only work in Firefox if the user has\r\n // dom.events.asyncClipboard.clipboardItem\r\n // set to true in their about:config.\r\n await navigator.clipboard.write([\r\n new ClipboardItem({\r\n \"text/html\": new Blob([link], { type: \"text/html\" }),\r\n \"text/plain\": new Blob([textFallback], { type: \"text/plain\" }),\r\n }),\r\n ]);\r\n } catch (err) {\r\n console.log(\r\n \"Permalink-to-clipboard using ClipboardItem failed, falling back to clipboard.writeText\",\r\n err\r\n );\r\n copySuccess = false;\r\n }\r\n\r\n if (!copySuccess) {\r\n try {\r\n await navigator.clipboard.writeText(textFallback);\r\n } catch (err) {\r\n console.log(\r\n \"Permalink-to-clipboard using clipboard.writeText failed\",\r\n err\r\n );\r\n console.error(\"Failed to copy link to clipboard!\");\r\n return;\r\n }\r\n }\r\n\r\n console.log(`copied '${url}' to clipboard`);\r\n const copiedMsg = document.createElement(\"p\");\r\n copiedMsg.setAttribute(\"role\", \"alert\");\r\n copiedMsg.className = \"permalink-alert\";\r\n copiedMsg.innerHTML = \"Link to \" + msgLink + \" copied to clipboard\";\r\n elem.parentElement.insertBefore(copiedMsg, elem);\r\n await new Promise((resolve) => setTimeout(resolve, 1500));\r\n copiedMsg.remove();\r\n}\r\n\r\nexport function initPermalinks() {\r\n const permalinks = document.querySelectorAll(\".autopermalink > a\");\r\n permalinks.forEach((link) => {\r\n link.addEventListener(\"click\", function (event) {\r\n event.preventDefault();\r\n copyPermalink(link);\r\n });\r\n });\r\n}\r\n", "/**\r\n * Image magnification (click-to-zoom).\r\n *\r\n * Clicking an eligible image creates a full-width popup; clicking the\r\n * popup dismisses it. Uses event delegation on the document body.\r\n */\r\n\r\n/**\r\n * Walk up from `el` through ancestors, collecting those that match `selector`.\r\n * Returns the *last* (outermost) match \u2014 equivalent to jQuery's\r\n * `.parents(selector).last()`.\r\n */\r\nfunction outermostMatchingAncestor(el, selector) {\r\n let match = null;\r\n let current = el.parentElement;\r\n while (current) {\r\n if (current.matches(selector)) {\r\n match = current;\r\n }\r\n current = current.parentElement;\r\n }\r\n return match;\r\n}\r\n\r\nexport function initImageMagnify() {\r\n const imgSelector =\r\n \".image-box > img:not(.draw_on_me):not(.mag_popup), \" +\r\n \".sbspanel > img:not(.draw_on_me):not(.mag_popup), \" +\r\n \"figure > img:not(.draw_on_me):not(.mag_popup), \" +\r\n \"figure > div > img:not(.draw_on_me):not(.mag_popup)\";\r\n\r\n // Click an image to magnify\r\n document.body.addEventListener(\"click\", function (event) {\r\n const img = event.target.closest(imgSelector);\r\n if (!img) return;\r\n\r\n const container = document.createElement(\"div\");\r\n container.setAttribute(\"style\", \"background:#fff;\");\r\n container.setAttribute(\"class\", \"mag_popup_container\");\r\n container.innerHTML =\r\n '';\r\n\r\n let placement = outermostMatchingAncestor(\r\n img,\r\n \".image-box, .sbsrow, figure, li, .cols2 article:nth-of-type(2n)\"\r\n );\r\n\r\n // For .cols2, even articles go inside the previous odd one\r\n if (placement && placement.tagName === \"ARTICLE\") {\r\n const prev = placement.previousElementSibling;\r\n if (prev) {\r\n placement = prev.firstElementChild || prev;\r\n }\r\n }\r\n\r\n if (placement) {\r\n placement.parentNode.insertBefore(container, placement);\r\n }\r\n });\r\n\r\n // Click the big image to dismiss it\r\n document.body.addEventListener(\"click\", function (event) {\r\n if (event.target.classList.contains(\"mag_popup\")) {\r\n event.target.parentNode.remove();\r\n }\r\n });\r\n}\r\n", "/**\r\n * Scrollbar width detection utility.\r\n *\r\n * \u26A0\uFE0F DEPRECATED: Only used by the GeoGebra calculator integration.\r\n * Consider replacing with a CSS-based approach in the future.\r\n *\r\n * @see https://stackoverflow.com/questions/13382516/getting-scroll-bar-width-using-javascript\r\n */\r\n\r\nexport function getScrollbarWidth() {\r\n const outer = document.createElement(\"div\");\r\n outer.style.visibility = \"hidden\";\r\n outer.style.width = \"100px\";\r\n outer.style.msOverflowStyle = \"scrollbar\"; // needed for WinJS apps\r\n\r\n document.body.appendChild(outer);\r\n\r\n const widthNoScroll = outer.offsetWidth;\r\n outer.style.overflow = \"scroll\";\r\n\r\n const inner = document.createElement(\"div\");\r\n inner.style.width = \"100%\";\r\n outer.appendChild(inner);\r\n\r\n const widthWithScroll = inner.offsetWidth;\r\n outer.parentNode.removeChild(outer);\r\n\r\n return widthNoScroll - widthWithScroll;\r\n}\r\n", "/**\r\n * GeoGebra calculator integration.\r\n *\r\n * Manages the floating GeoGebra calculator overlay: toggling visibility,\r\n * preventing body scroll while hovering the canvas, and injecting the\r\n * GeoGebra applet script on first open.\r\n */\r\n\r\nimport { getScrollbarWidth } from \"./deprecated/scrollbar-width.js\";\r\n\r\nfunction calculatorOnload() {\r\n const toggle = document.getElementById(\"calculator-toggle\");\r\n if (toggle) toggle.focus();\r\n const inputField = document.querySelector(\r\n \"input.gwt-SuggestBox.TextField\"\r\n );\r\n if (inputField) inputField.focus();\r\n}\r\n\r\nexport function initGeoGebra() {\r\n const scrollWidth = getScrollbarWidth();\r\n const calcOffsetR = 5;\r\n const calcOffsetB = 5;\r\n\r\n // Prevent body scroll when hovering the GeoGebra canvas\r\n document.body.addEventListener(\"mouseover\", function (event) {\r\n if (!event.target.closest(\"#geogebra-calculator canvas\")) return;\r\n document.body.style.overflow = \"hidden\";\r\n document.documentElement.style.marginRight = \"15px\";\r\n const container = document.getElementById(\"calculator-container\");\r\n if (container) {\r\n container.style.right = calcOffsetR + scrollWidth + \"px\";\r\n container.style.bottom = calcOffsetB + scrollWidth + \"px\";\r\n }\r\n });\r\n\r\n document.body.addEventListener(\"mouseout\", function (event) {\r\n if (!event.target.closest(\"#geogebra-calculator canvas\")) return;\r\n document.body.style.overflow = \"scroll\";\r\n document.documentElement.style.marginRight = \"0\";\r\n const container = document.getElementById(\"calculator-container\");\r\n if (container) {\r\n container.style.right = calcOffsetR + \"px\";\r\n container.style.bottom = calcOffsetB + \"px\";\r\n }\r\n });\r\n\r\n // Toggle calculator visibility\r\n document.body.addEventListener(\"click\", function (event) {\r\n const toggle = event.target.closest(\"#calculator-toggle\");\r\n if (!toggle) return;\r\n\r\n const container = document.getElementById(\"calculator-container\");\r\n if (!container) return;\r\n\r\n if (container.style.display === \"none\" || !container.style.display) {\r\n container.style.display = \"block\";\r\n toggle.classList.add(\"open\");\r\n toggle.setAttribute(\"title\", \"Hide calculator\");\r\n toggle.setAttribute(\"aria-expanded\", \"true\");\r\n\r\n const existingScript = document.getElementById(\"create_ggb_calc\");\r\n if (!existingScript) {\r\n const ggbScript = document.createElement(\"script\");\r\n ggbScript.id = \"create_ggb_calc\";\r\n ggbScript.innerHTML = \"ggbApp.inject('geogebra-calculator')\";\r\n document.body.appendChild(ggbScript);\r\n } else {\r\n calculatorOnload();\r\n }\r\n } else {\r\n container.style.display = \"none\";\r\n toggle.classList.remove(\"open\");\r\n toggle.setAttribute(\"title\", \"Show calculator\");\r\n toggle.setAttribute(\"aria-expanded\", \"false\");\r\n }\r\n });\r\n}\r\n", "/**\r\n * Keyboard navigation handlers.\r\n *\r\n * - ENTER in a `.workspace` triggers MathJax typesetting.\r\n * - ESC navigates back through Sage cell focus, then up the knowl stack,\r\n * or does nothing if no interactive context is active.\r\n * - Hash-based anchor navigation: opens knowls linked via URL hash.\r\n */\r\n\r\nlet justHitEscape = false;\r\n\r\nfunction processWorkspace() {\r\n if (typeof MathJax !== \"undefined\" && MathJax.typesetPromise) {\r\n MathJax.typesetPromise();\r\n }\r\n}\r\n\r\nexport function initKeyboardNav() {\r\n document.onkeyup = function (event) {\r\n const e = event || window.event;\r\n switch (e.keyCode) {\r\n case 13: // ENTER\r\n justHitEscape = false;\r\n if (\r\n document.activeElement.classList.contains(\"workspace\")\r\n ) {\r\n processWorkspace();\r\n }\r\n break; // Fixed: was missing, caused fallthrough to ESC handler\r\n\r\n case 27: // ESC\r\n {\r\n const parentSageCell =\r\n document.activeElement.closest(\".sagecell_editor\");\r\n if (parentSageCell && !justHitEscape) {\r\n justHitEscape = true;\r\n setTimeout(function () {\r\n justHitEscape = false;\r\n }, 1000);\r\n }\r\n // knowl_focus_stack is defined in knowl.js and may not exist\r\n // in all contexts \u2014 guard against ReferenceError\r\n else if (\r\n typeof knowl_focus_stack !== \"undefined\" &&\r\n knowl_focus_stack.length > 0\r\n ) {\r\n const mostRecentlyOpened = knowl_focus_stack.pop();\r\n if (typeof knowl_focus_stack_uid !== \"undefined\") {\r\n knowl_focus_stack_uid.pop();\r\n }\r\n mostRecentlyOpened.focus();\r\n } else {\r\n break;\r\n }\r\n break;\r\n }\r\n }\r\n };\r\n}\r\n\r\nexport function initAnchorKnowl() {\r\n if (!window.location.hash.length) return;\r\n\r\n const id = window.location.hash.substring(1);\r\n const anchor = document.getElementById(id);\r\n if (!anchor) return;\r\n\r\n if (anchor.tagName === \"ARTICLE\") {\r\n const containedKnowl = anchor.querySelector(\"a[data-knowl]\");\r\n if (containedKnowl && containedKnowl.parentElement === anchor) {\r\n containedKnowl.click();\r\n }\r\n } else if (anchor.hasAttribute(\"data-knowl\")) {\r\n anchor.click();\r\n } else {\r\n // If it is a hidden knowl, find the knowl and open it\r\n const hiddenContent = anchor.closest(\".hidden-content\");\r\n if (hiddenContent) {\r\n const refId = hiddenContent.id;\r\n const knowl = document.querySelector(\r\n '[data-refid=\"' + refId + '\"]'\r\n );\r\n if (knowl) knowl.click();\r\n }\r\n }\r\n}\r\n", "/**\r\n * Print-preview page geometry helpers.\r\n *\r\n * Utilities for converting CSS units to pixels, computing element heights,\r\n * and injecting dynamic @page / CSS-variable rules.\r\n */\r\n\r\nexport function toPixels(value) {\r\n if (typeof value === \"number\") return value;\r\n if (typeof value !== \"string\") return 0;\r\n value = value.trim();\r\n if (value.endsWith(\"px\")) {\r\n return parseFloat(value);\r\n } else if (value.endsWith(\"in\")) {\r\n return Math.floor(parseFloat(value) * 96);\r\n } else if (value.endsWith(\"cm\")) {\r\n return Math.floor(parseFloat(value) * 37.8);\r\n } else if (value.endsWith(\"mm\")) {\r\n return Math.floor(parseFloat(value) * 3.78);\r\n } else if (value.endsWith(\"pt\")) {\r\n return Math.floor(parseFloat(value) * (96 / 72));\r\n } else {\r\n return parseFloat(value) || 0;\r\n }\r\n}\r\n\r\nexport function getElementTotalHeight(elem) {\r\n const style = getComputedStyle(elem);\r\n const marginTop = parseFloat(style.marginTop);\r\n const marginBottom = parseFloat(style.marginBottom);\r\n const height = elem.offsetHeight;\r\n return height + marginTop + marginBottom;\r\n}\r\n\r\nexport function getElemWorkspaceHeight(elem) {\r\n if (elem.classList.contains(\"sidebyside\")) {\r\n const sbspanels = elem.querySelectorAll(\".sbspanel\");\r\n let max = 0;\r\n sbspanels.forEach((panel) => {\r\n const workspaces = panel.querySelectorAll(\".workspace\");\r\n let totalHeight = 0;\r\n workspaces.forEach((workspace) => {\r\n const workspaceHeight = workspace.offsetHeight;\r\n if (workspaceHeight) {\r\n totalHeight += workspaceHeight;\r\n }\r\n });\r\n if (totalHeight > max) {\r\n max = totalHeight;\r\n }\r\n });\r\n return max;\r\n }\r\n\r\n let columns = 1;\r\n if (elem.classList.contains(\"exercisegroup\")) {\r\n for (let i = 2; i <= 6; i++) {\r\n if (elem.querySelector(`.cols${i}`)) {\r\n columns = i;\r\n break;\r\n }\r\n }\r\n }\r\n const workspaces = elem.querySelectorAll(\".workspace\");\r\n let totalHeight = 0;\r\n workspaces.forEach((ws) => {\r\n const workspaceHeight = ws.offsetHeight;\r\n if (workspaceHeight) {\r\n totalHeight += workspaceHeight;\r\n }\r\n });\r\n return totalHeight / columns;\r\n}\r\n\r\nexport function setPageGeometryCSS({ paperSize, margins }) {\r\n const existingStyle = document.getElementById(\"page-geometry-css\");\r\n if (existingStyle) {\r\n existingStyle.remove();\r\n }\r\n const wsWidth = paperSize === \"letter\" ? \"816px\" : \"794px\";\r\n const wsHeight = paperSize === \"letter\" ? \"1056px\" : \"1123px\";\r\n\r\n const style = document.createElement(\"style\");\r\n style.id = \"page-geometry-css\";\r\n style.textContent = `\r\n :root {\r\n --ws-width: ${wsWidth};\r\n --ws-height: ${wsHeight};\r\n --ws-top-margin: ${margins.top}px;\r\n --ws-right-margin: ${margins.right}px;\r\n --ws-bottom-margin: ${margins.bottom}px;\r\n --ws-left-margin: ${margins.left}px;\r\n }\r\n @page {\r\n margin: var(--ws-top-margin, ${margins.top}px) var(--ws-right-margin, ${margins.right}px) var(--ws-bottom-margin, ${margins.bottom}px) var(--ws-left-margin, ${margins.left}px);\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n}\r\n", "/**\r\n * Print-preview workspace height management.\r\n *\r\n * Handles setting initial workspace heights from data attributes,\r\n * adjusting heights to fit pages, highlighting workspace areas,\r\n * and MathJax re-typesetting on workspace edits.\r\n */\r\n\r\nimport { getElementTotalHeight, getElemWorkspaceHeight } from \"./geometry.js\";\r\n\r\nexport function setInitialWorkspaceHeights() {\r\n const workspaces = document.querySelectorAll(\".workspace\");\r\n workspaces.forEach((ws) => {\r\n ws.style.height = ws.getAttribute(\"data-space\") || \"0px\";\r\n ws.setAttribute(\"contenteditable\", \"true\");\r\n });\r\n}\r\n\r\nexport function adjustWorkspaceToFitPage({ paperSize, margins }) {\r\n // Toggle off workspace highlight if it is on\r\n const highlightCheckbox = document.getElementById(\r\n \"highlight-workspace-checkbox\"\r\n );\r\n const wasHighlighted = highlightCheckbox && highlightCheckbox.checked;\r\n if (wasHighlighted) {\r\n toggleWorkspaceHighlight(false);\r\n }\r\n\r\n let paperWidth, paperHeight;\r\n if (paperSize === \"a4\" || document.body.classList.contains(\"a4\")) {\r\n paperWidth = 794;\r\n paperHeight = 1122.5;\r\n } else {\r\n paperWidth = 816;\r\n paperHeight = 1056;\r\n }\r\n const paperContentHeight = paperHeight - (margins.top + margins.bottom);\r\n\r\n setInitialWorkspaceHeights();\r\n\r\n const pages = document.querySelectorAll(\".onepage\");\r\n pages.forEach((page) => {\r\n page.style.width = paperWidth + \"px\";\r\n const rows = page.children;\r\n let totalContentHeight = 0;\r\n let totalWorkspaceHeight = 0;\r\n for (const row of rows) {\r\n totalContentHeight += getElementTotalHeight(row);\r\n totalWorkspaceHeight += getElemWorkspaceHeight(row);\r\n }\r\n if (totalWorkspaceHeight === 0) {\r\n page.style.width = \"\";\r\n return;\r\n }\r\n const extraHeight = paperContentHeight - totalContentHeight;\r\n const workspaceAdjustmentFactor =\r\n (totalWorkspaceHeight + extraHeight) / totalWorkspaceHeight;\r\n const pageWorkspaces = page.querySelectorAll(\".workspace\");\r\n pageWorkspaces.forEach((ws) => {\r\n const originalHeight = ws.offsetHeight;\r\n const newHeight = originalHeight * workspaceAdjustmentFactor;\r\n ws.style.height = newHeight + \"px\";\r\n });\r\n page.style.width = \"\";\r\n });\r\n\r\n if (wasHighlighted) {\r\n toggleWorkspaceHighlight(true);\r\n }\r\n}\r\n\r\nexport function toggleWorkspaceHighlight(isChecked) {\r\n if (isChecked) {\r\n document.body.classList.add(\"highlight-workspace\");\r\n if (!document.querySelector(\".workspace-container\")) {\r\n document.querySelectorAll(\".workspace\").forEach((workspace) => {\r\n const container = document.createElement(\"div\");\r\n container.classList.add(\"workspace-container\");\r\n container.style.height =\r\n window.getComputedStyle(workspace).height;\r\n const original = document.createElement(\"div\");\r\n original.classList.add(\"original-workspace\");\r\n const originalHeight =\r\n workspace.getAttribute(\"data-space\") || \"0px\";\r\n original.setAttribute(\r\n \"title\",\r\n \"Author-specified workspace height (\" +\r\n originalHeight +\r\n \")\"\r\n );\r\n original.style.height = originalHeight;\r\n container.appendChild(original);\r\n if (original.offsetHeight > workspace.offsetHeight) {\r\n original.classList.add(\"warning\");\r\n }\r\n workspace.parentNode.insertBefore(container, workspace);\r\n container.appendChild(workspace);\r\n });\r\n }\r\n } else {\r\n document.body.classList.remove(\"highlight-workspace\");\r\n document\r\n .querySelectorAll(\".workspace-container\")\r\n .forEach((container) => {\r\n const workspace = container.querySelector(\".workspace\");\r\n container.parentNode.insertBefore(workspace, container);\r\n container.remove();\r\n });\r\n }\r\n}\r\n\r\nexport function processWorkspace() {\r\n if (typeof MathJax !== \"undefined\" && MathJax.typesetPromise) {\r\n MathJax.typesetPromise();\r\n }\r\n}\r\n", "/**\r\n * Dynamic-programming page-break algorithm.\r\n *\r\n * Given a list of content blocks with heights and workspace heights,\r\n * finds page-break positions that minimize leftover whitespace variance\r\n * across pages.\r\n */\r\n\r\nexport function findPageBreaks(rows, pageHeight) {\r\n let pageBreaks = [];\r\n let minCost = Array(rows.length + 1).fill(Infinity);\r\n minCost[rows.length] = 0;\r\n let nextPageBreak = Array(rows.length).fill(-1);\r\n\r\n for (let i = rows.length - 1; i >= 0; i--) {\r\n let cumulativeHeight = 0;\r\n for (let j = i; j < rows.length; j++) {\r\n cumulativeHeight += rows[j].height;\r\n if (cumulativeHeight > pageHeight) {\r\n if (j === i) {\r\n // Single row exceeds page height \u2014 give it its own page\r\n minCost[i] = 0;\r\n nextPageBreak[i] = i + 1;\r\n }\r\n break;\r\n }\r\n\r\n const cost =\r\n (pageHeight - cumulativeHeight) ** 2 + minCost[j + 1];\r\n if (cost < minCost[i]) {\r\n minCost[i] = cost;\r\n nextPageBreak[i] = j + 1;\r\n }\r\n }\r\n }\r\n\r\n // Backtrack: row 0 is always a title sharing the first page with row 1\r\n let nextPage = 1;\r\n while (nextPage < rows.length) {\r\n pageBreaks.push(nextPageBreak[nextPage]);\r\n nextPage = nextPageBreak[nextPage];\r\n }\r\n return pageBreaks;\r\n}\r\n", "/**\r\n * Print-preview page creation and adjustment.\r\n *\r\n * Handles flattening paragraph sections, waiting for images,\r\n * adjusting pre-existing pages, and algorithmically creating\r\n * new page divisions for printout content.\r\n */\r\n\r\nimport {\r\n getElementTotalHeight,\r\n getElemWorkspaceHeight,\r\n} from \"./geometry.js\";\r\nimport { setInitialWorkspaceHeights } from \"./workspace.js\";\r\nimport { findPageBreaks } from \"./page-breaks.js\";\r\n\r\nexport function flattenParagraphsSections(printout) {\r\n const paragraphsSections = printout.querySelectorAll(\r\n \"section.paragraphs\"\r\n );\r\n paragraphsSections.forEach((section) => {\r\n const parent = section.parentNode;\r\n while (section.firstChild) {\r\n parent.insertBefore(section.firstChild, section);\r\n }\r\n parent.removeChild(section);\r\n });\r\n}\r\n\r\nexport function waitForImages(container, timeoutMs = 5000) {\r\n const images = container.querySelectorAll(\"img\");\r\n const promises = [];\r\n for (const img of images) {\r\n if (!img.complete) {\r\n promises.push(\r\n new Promise((resolve) => {\r\n img.addEventListener(\"load\", resolve, { once: true });\r\n img.addEventListener(\"error\", resolve, { once: true });\r\n })\r\n );\r\n }\r\n }\r\n if (promises.length === 0) return Promise.resolve();\r\n return Promise.race([\r\n Promise.all(promises),\r\n new Promise((resolve) => setTimeout(resolve, timeoutMs)),\r\n ]);\r\n}\r\n\r\nexport function adjustPrintoutPages() {\r\n const printout = document.querySelector(\r\n \"section.worksheet, section.handout\"\r\n );\r\n if (!printout) return;\r\n\r\n const pages = printout.querySelectorAll(\".onepage\");\r\n if (pages.length === 0) return;\r\n\r\n const firstPage = pages[0];\r\n const lastPage = pages[pages.length - 1];\r\n\r\n // Move all children before the first page into the first page\r\n const pageFirstChild = firstPage.firstChild;\r\n let currentChild = printout.firstChild;\r\n while (currentChild && currentChild !== firstPage) {\r\n const nextChild = currentChild.nextSibling;\r\n firstPage.insertBefore(currentChild, pageFirstChild);\r\n currentChild = nextChild;\r\n }\r\n\r\n // Move all children after the last page into the last page\r\n let nextChild = lastPage.nextSibling;\r\n while (nextChild) {\r\n const tempChild = nextChild;\r\n nextChild = nextChild.nextSibling;\r\n lastPage.appendChild(tempChild);\r\n }\r\n}\r\n\r\nexport function createPrintoutPages(margins) {\r\n const conservativeContentHeight = 1056 - (margins.top + margins.bottom);\r\n const conservativeContentWidth = 794 - (margins.left + margins.right);\r\n\r\n const printout = document.querySelector(\r\n \"section.worksheet, section.handout\"\r\n );\r\n if (!printout) return;\r\n\r\n printout.style.width =\r\n (conservativeContentWidth + margins.left + margins.right).toString() +\r\n \"px\";\r\n setInitialWorkspaceHeights(printout);\r\n\r\n // Build list of blocks, handling sidebyside and tasks\r\n let rows = [];\r\n for (const child of printout.children) {\r\n if (child.classList.contains(\"sidebyside\")) {\r\n rows.push(child);\r\n } else if (child.querySelector(\".task\")) {\r\n rows.push(child);\r\n const tasks = child.querySelectorAll(\".task, .conclusion\");\r\n\r\n for (let i = 0; i < tasks.length; i++) {\r\n let parent = tasks[i].parentElement;\r\n let grandparent = parent.parentElement;\r\n if (grandparent.classList.contains(\"task\")) {\r\n tasks[i].classList.add(\"subsubtask\");\r\n } else if (parent.classList.contains(\"task\")) {\r\n tasks[i].classList.add(\"subtask\");\r\n }\r\n }\r\n for (let i = tasks.length - 1; i > 0; i--) {\r\n printout.insertBefore(tasks[i], child.nextSibling);\r\n }\r\n } else {\r\n rows.push(child);\r\n }\r\n }\r\n\r\n // Build block list with height info\r\n let blockList = [];\r\n for (const row of rows) {\r\n let blockHeight = getElementTotalHeight(row);\r\n if (blockHeight === 0) continue;\r\n\r\n let totalWorkspaceHeight = 0;\r\n if (row.querySelector(\".workspace\")) {\r\n totalWorkspaceHeight = getElemWorkspaceHeight(row);\r\n }\r\n blockList.push({\r\n elem: row,\r\n height: blockHeight,\r\n workspaceHeight: totalWorkspaceHeight,\r\n });\r\n }\r\n\r\n const pageBreaks = findPageBreaks(blockList, conservativeContentHeight);\r\n\r\n // Create page divs\r\n for (let i = 0; i < pageBreaks.length; i++) {\r\n const pageDiv = document.createElement(\"section\");\r\n pageDiv.classList.add(\"onepage\");\r\n if (i === 0) pageDiv.classList.add(\"firstpage\");\r\n if (i === pageBreaks.length - 1) pageDiv.classList.add(\"lastpage\");\r\n\r\n const start = pageBreaks[i - 1] || 0;\r\n const end = pageBreaks[i];\r\n for (let j = start; j < end; j++) {\r\n pageDiv.appendChild(blockList[j].elem);\r\n }\r\n printout.appendChild(pageDiv);\r\n }\r\n\r\n // Remove content not in a page\r\n for (const child of Array.from(printout.children)) {\r\n if (!child.classList.contains(\"onepage\")) {\r\n printout.removeChild(child);\r\n }\r\n }\r\n}\r\n", "/**\r\n * Print-preview header and footer management.\r\n *\r\n * Adds editable header/footer divs to each page, populates them from\r\n * localStorage or data attributes, and persists edits back to localStorage.\r\n */\r\n\r\nexport function addHeadersAndFootersToPrintout() {\r\n const printout = document.querySelector(\r\n \"section.worksheet, section.handout\"\r\n );\r\n if (!printout) return;\r\n\r\n const pages = printout.querySelectorAll(\".onepage\");\r\n pages.forEach((page, index) => {\r\n const isFirstPage = index === 0;\r\n\r\n const headerDiv = document.createElement(\"div\");\r\n headerDiv.classList.add(\r\n isFirstPage ? \"first-page-header\" : \"running-header\",\r\n \"hidden\"\r\n );\r\n headerDiv.innerHTML = `
`;\r\n page.insertBefore(headerDiv, page.firstChild);\r\n\r\n const footerDiv = document.createElement(\"div\");\r\n footerDiv.classList.add(\r\n isFirstPage ? \"first-page-footer\" : \"running-footer\",\r\n \"hidden\"\r\n );\r\n footerDiv.innerHTML = `
`;\r\n page.appendChild(footerDiv);\r\n });\r\n\r\n // Populate from localStorage or data attributes\r\n const keys = [\r\n \"header-first-left\",\r\n \"header-first-center\",\r\n \"header-first-right\",\r\n \"footer-first-left\",\r\n \"footer-first-center\",\r\n \"footer-first-right\",\r\n \"header-running-left\",\r\n \"header-running-center\",\r\n \"header-running-right\",\r\n \"footer-running-left\",\r\n \"footer-running-center\",\r\n \"footer-running-right\",\r\n ];\r\n\r\n const content = {};\r\n keys.forEach((key) => {\r\n content[key] =\r\n localStorage.getItem(key) ||\r\n printout.getAttribute(`data-${key}`) ||\r\n \"\";\r\n });\r\n\r\n // First page\r\n const firstHeader = document.querySelector(\".first-page-header\");\r\n if (firstHeader) {\r\n firstHeader.querySelector(\".header-left\").innerHTML =\r\n content[\"header-first-left\"];\r\n firstHeader.querySelector(\".header-center\").innerHTML =\r\n content[\"header-first-center\"];\r\n firstHeader.querySelector(\".header-right\").innerHTML =\r\n content[\"header-first-right\"];\r\n }\r\n const firstFooter = document.querySelector(\".first-page-footer\");\r\n if (firstFooter) {\r\n firstFooter.querySelector(\".footer-left\").innerHTML =\r\n content[\"footer-first-left\"];\r\n firstFooter.querySelector(\".footer-center\").innerHTML =\r\n content[\"footer-first-center\"];\r\n firstFooter.querySelector(\".footer-right\").innerHTML =\r\n content[\"footer-first-right\"];\r\n }\r\n\r\n // Running headers and footers\r\n document.querySelectorAll(\".running-header\").forEach((headerDiv) => {\r\n headerDiv.querySelector(\".header-left\").innerHTML =\r\n content[\"header-running-left\"];\r\n headerDiv.querySelector(\".header-center\").innerHTML =\r\n content[\"header-running-center\"];\r\n headerDiv.querySelector(\".header-right\").innerHTML =\r\n content[\"header-running-right\"];\r\n });\r\n document.querySelectorAll(\".running-footer\").forEach((footerDiv) => {\r\n footerDiv.querySelector(\".footer-left\").innerHTML =\r\n content[\"footer-running-left\"];\r\n footerDiv.querySelector(\".footer-center\").innerHTML =\r\n content[\"footer-running-center\"];\r\n footerDiv.querySelector(\".footer-right\").innerHTML =\r\n content[\"footer-running-right\"];\r\n });\r\n\r\n // Persist edits to localStorage\r\n const selectorMap = {\r\n \"header-first-left\": \".first-page-header .header-left\",\r\n \"header-first-center\": \".first-page-header .header-center\",\r\n \"header-first-right\": \".first-page-header .header-right\",\r\n \"footer-first-left\": \".first-page-footer .footer-left\",\r\n \"footer-first-center\": \".first-page-footer .footer-center\",\r\n \"footer-first-right\": \".first-page-footer .footer-right\",\r\n \"header-running-left\": \".running-header .header-left\",\r\n \"header-running-center\": \".running-header .header-center\",\r\n \"header-running-right\": \".running-header .header-right\",\r\n \"footer-running-left\": \".running-footer .footer-left\",\r\n \"footer-running-center\": \".running-footer .footer-center\",\r\n \"footer-running-right\": \".running-footer .footer-right\",\r\n };\r\n keys.forEach((key) => {\r\n const elements = document.querySelectorAll(selectorMap[key]);\r\n elements.forEach((elem) => {\r\n elem.addEventListener(\"input\", () => {\r\n localStorage.setItem(key, elem.innerHTML);\r\n });\r\n });\r\n });\r\n}\r\n", "/**\r\n * Paper size detection.\r\n *\r\n * Determines paper size (letter vs a4) from localStorage, or falls back\r\n * to geographic detection via ipapi.co.\r\n */\r\n\r\nexport function getPaperSize() {\r\n let paperSize = localStorage.getItem(\"papersize\");\r\n if (paperSize) return paperSize;\r\n\r\n // Try to set papersize based on user's geographic region\r\n try {\r\n fetch(\"https://ipapi.co/json/\")\r\n .then((response) => response.json())\r\n .then((data) => {\r\n const continent =\r\n data && data.continent_code ? data.continent_code : \"\";\r\n paperSize =\r\n continent === \"NA\" || continent === \"SA\"\r\n ? \"letter\"\r\n : \"a4\";\r\n const radio = document.querySelector(\r\n `input[name=\"papersize\"][value=\"${paperSize}\"]`\r\n );\r\n if (radio) {\r\n radio.checked = true;\r\n localStorage.setItem(\"papersize\", paperSize);\r\n }\r\n document.body.classList.remove(\"a4\", \"letter\");\r\n document.body.classList.add(paperSize);\r\n })\r\n .catch((err) => {\r\n throw err;\r\n });\r\n } catch (e) {\r\n const radio = document.querySelector(\r\n 'input[name=\"papersize\"][value=\"letter\"]'\r\n );\r\n if (radio) radio.checked = true;\r\n }\r\n return paperSize || \"letter\";\r\n}\r\n", "/**\r\n * Printout section loading (print preview).\r\n *\r\n * Swaps the current page content with the target printable section\r\n * and switches to the print-worksheet stylesheet.\r\n */\r\n\r\nexport async function loadPrintout(printableSectionID) {\r\n const themeStylesheetLink = document.querySelector(\r\n 'link[rel=\"stylesheet\"][href*=\"theme\"]'\r\n );\r\n const themeStylesheetHref = themeStylesheetLink\r\n ? themeStylesheetLink.getAttribute(\"href\")\r\n : null;\r\n\r\n if (themeStylesheetHref) {\r\n const printStylesheetHref = themeStylesheetHref.replace(\r\n /theme.*\\.css/,\r\n \"print-worksheet.css\"\r\n );\r\n themeStylesheetLink.setAttribute(\"href\", printStylesheetHref);\r\n await new Promise((resolve) => {\r\n themeStylesheetLink.addEventListener(\"load\", resolve, {\r\n once: true,\r\n });\r\n });\r\n }\r\n\r\n const printableSection = document.getElementById(printableSectionID);\r\n if (!printableSection) {\r\n console.error(\"No section found with ID:\", printableSectionID);\r\n return;\r\n }\r\n\r\n const ptxContent = document.querySelector(\".ptx-content\");\r\n const existingSections = ptxContent.querySelectorAll(\":scope > section\");\r\n existingSections.forEach((sec) => ptxContent.removeChild(sec));\r\n ptxContent.appendChild(printableSection);\r\n}\r\n", "/**\r\n * Solution rewriting for print preview.\r\n *\r\n * Converts
/ solution elements into plain
s\r\n * with a heading, so they render properly in print layout.\r\n */\r\n\r\nexport function rewriteSolutions() {\r\n const bornHiddenKnowls = document.querySelectorAll(\r\n \".worksheet details, .handout details\"\r\n );\r\n bornHiddenKnowls.forEach(function (detail) {\r\n const summary = detail.querySelector(\"summary\");\r\n const content = detail.innerHTML.replace(summary.outerHTML, \"\");\r\n const div = document.createElement(\"div\");\r\n div.classList = detail.classList;\r\n if (summary) {\r\n const title = document.createElement(\"h5\");\r\n title.innerHTML = summary.innerHTML;\r\n div.appendChild(title);\r\n }\r\n const body = document.createElement(\"div\");\r\n body.innerHTML = content;\r\n div.appendChild(body);\r\n detail.parentNode.replaceChild(div, detail);\r\n });\r\n}\r\n", "/**\r\n * Print-preview initialization and controls.\r\n *\r\n * Orchestrates the print-preview workflow: loading the printout section,\r\n * setting up paper size controls, managing solution visibility, creating\r\n * or adjusting pages, and wiring up header/footer toggles.\r\n */\r\n\r\nimport { toPixels, setPageGeometryCSS } from \"./geometry.js\";\r\nimport {\r\n adjustWorkspaceToFitPage,\r\n toggleWorkspaceHighlight,\r\n} from \"./workspace.js\";\r\nimport {\r\n flattenParagraphsSections,\r\n waitForImages,\r\n adjustPrintoutPages,\r\n createPrintoutPages,\r\n} from \"./pages.js\";\r\nimport { addHeadersAndFootersToPrintout } from \"./headers-footers.js\";\r\nimport { getPaperSize } from \"./paper-size.js\";\r\nimport { loadPrintout } from \"./section-swap.js\";\r\nimport { rewriteSolutions } from \"./solutions.js\";\r\n\r\nexport async function initPrintPreview() {\r\n const urlParams = new URLSearchParams(window.location.search);\r\n if (!urlParams.has(\"printpreview\")) return;\r\n\r\n const printableSectionID = urlParams.get(\"printpreview\");\r\n await loadPrintout(printableSectionID);\r\n\r\n // Parse margins\r\n const marginList = document\r\n .querySelector(\"section.worksheet, section.handout\")\r\n .getAttribute(\"data-margins\")\r\n .split(\" \");\r\n const margins = {\r\n top: toPixels(marginList[0] || \"0.75in\"),\r\n right: toPixels(marginList[1] || \"0.75in\"),\r\n bottom: toPixels(marginList[2] || \"0.75in\"),\r\n left: toPixels(marginList[3] || \"0.75in\"),\r\n };\r\n\r\n rewriteSolutions();\r\n\r\n // Paper size setup\r\n let paperSize = getPaperSize();\r\n if (paperSize) {\r\n const radio = document.querySelector(\r\n `input[name=\"papersize\"][value=\"${paperSize}\"]`\r\n );\r\n if (radio) radio.checked = true;\r\n document.body.classList.remove(\"a4\", \"letter\");\r\n document.body.classList.add(paperSize);\r\n setPageGeometryCSS({ paperSize, margins });\r\n }\r\n\r\n // Paper size radio change handlers\r\n const papersizeRadios = document.querySelectorAll(\r\n 'input[name=\"papersize\"]'\r\n );\r\n papersizeRadios.forEach((radio) => {\r\n radio.addEventListener(\"change\", function () {\r\n if (this.checked) {\r\n document.body.classList.remove(\"a4\", \"letter\");\r\n document.body.classList.add(this.value);\r\n localStorage.setItem(\"papersize\", this.value);\r\n setPageGeometryCSS({ paperSize: this.value, margins });\r\n adjustWorkspaceToFitPage({\r\n paperSize: this.value,\r\n margins,\r\n });\r\n }\r\n });\r\n });\r\n\r\n // Solution visibility checkboxes\r\n for (const solutionType of [\"hint\", \"answer\", \"solution\"]) {\r\n const checkbox = document.getElementById(\r\n `hide-${solutionType}-checkbox`\r\n );\r\n if (!checkbox) continue;\r\n\r\n const storageKey = `hide-${solutionType}`;\r\n if (\r\n (solutionType === \"answer\" || solutionType === \"solution\") &&\r\n !localStorage.getItem(storageKey)\r\n ) {\r\n checkbox.checked = true;\r\n localStorage.setItem(storageKey, \"true\");\r\n }\r\n\r\n checkbox.checked = localStorage.getItem(storageKey) === \"true\";\r\n document.querySelectorAll(`div.${solutionType}`).forEach((elem) => {\r\n if (checkbox.checked) {\r\n elem.classList.add(\"hidden\");\r\n } else {\r\n elem.classList.remove(\"hidden\");\r\n }\r\n });\r\n\r\n checkbox.addEventListener(\"change\", function () {\r\n localStorage.setItem(storageKey, this.checked);\r\n document\r\n .querySelectorAll(`div.${solutionType}`)\r\n .forEach((elem) => {\r\n if (checkbox.checked) {\r\n elem.classList.add(\"hidden\");\r\n } else {\r\n elem.classList.remove(\"hidden\");\r\n }\r\n adjustWorkspaceToFitPage({ paperSize, margins });\r\n });\r\n });\r\n }\r\n\r\n // Build pages\r\n const printoutSection = document.querySelector(\r\n \"section.worksheet, section.handout\"\r\n );\r\n if (printoutSection) {\r\n flattenParagraphsSections(printoutSection);\r\n await waitForImages(printoutSection);\r\n }\r\n\r\n if (document.querySelector(\".onepage\")) {\r\n adjustPrintoutPages();\r\n } else {\r\n createPrintoutPages(margins);\r\n }\r\n\r\n addHeadersAndFootersToPrintout();\r\n\r\n // Header/footer toggle checkboxes\r\n for (const hf of [\r\n \"first-page-header\",\r\n \"running-header\",\r\n \"first-page-footer\",\r\n \"running-footer\",\r\n ]) {\r\n const checkbox = document.getElementById(`print-${hf}-checkbox`);\r\n if (!checkbox) continue;\r\n\r\n checkbox.checked =\r\n localStorage.getItem(`print-${hf}`) === \"true\";\r\n document.querySelectorAll(`.${hf}`).forEach((elem) => {\r\n if (checkbox.checked) {\r\n elem.classList.remove(\"hidden\");\r\n } else {\r\n elem.classList.add(\"hidden\");\r\n }\r\n });\r\n\r\n checkbox.addEventListener(\"change\", function () {\r\n localStorage.setItem(`print-${hf}`, this.checked);\r\n document.querySelectorAll(`.${hf}`).forEach((elem) => {\r\n if (checkbox.checked) {\r\n elem.classList.remove(\"hidden\");\r\n } else {\r\n elem.classList.add(\"hidden\");\r\n }\r\n adjustWorkspaceToFitPage({ paperSize, margins });\r\n });\r\n });\r\n }\r\n\r\n // Adjust workspace heights\r\n adjustWorkspaceToFitPage({ paperSize, margins });\r\n\r\n // Highlight workspace checkbox\r\n const highlightCheckbox = document.getElementById(\r\n \"highlight-workspace-checkbox\"\r\n );\r\n if (highlightCheckbox) {\r\n highlightCheckbox.checked =\r\n localStorage.getItem(\"highlightWorkspace\") === \"true\";\r\n highlightCheckbox.addEventListener(\"change\", function () {\r\n localStorage.setItem(\"highlightWorkspace\", this.checked);\r\n toggleWorkspaceHighlight(this.checked);\r\n });\r\n toggleWorkspaceHighlight(highlightCheckbox.checked);\r\n }\r\n}\r\n", "/**\r\n * Dark/light mode switching.\r\n *\r\n * Detects user preference via localStorage or `prefers-color-scheme`,\r\n * toggles the `dark-mode` class on `` and syncs to embedded iframes.\r\n */\r\n\r\nexport function isDarkMode() {\r\n if (document.documentElement.dataset.darkmode === \"disabled\") return false;\r\n\r\n const currentTheme = localStorage.getItem(\"theme\");\r\n if (currentTheme === \"dark\") return true;\r\n if (currentTheme === \"light\") return false;\r\n\r\n return (\r\n window.matchMedia &&\r\n window.matchMedia(\"(prefers-color-scheme: dark)\").matches\r\n );\r\n}\r\n\r\nexport function setDarkMode(isDark) {\r\n if (document.documentElement.dataset.darkmode === \"disabled\") return;\r\n\r\n const parentHtml = document.documentElement;\r\n const iframes = document.querySelectorAll(\r\n \"iframe[data-dark-mode-enabled]\"\r\n );\r\n\r\n if (isDark) {\r\n parentHtml.classList.add(\"dark-mode\");\r\n } else {\r\n parentHtml.classList.remove(\"dark-mode\");\r\n }\r\n\r\n // Sync each iframe's class with the parent\r\n for (const iframe of iframes) {\r\n try {\r\n const iframeHtml = iframe.contentWindow.document.documentElement;\r\n if (isDark) {\r\n iframeHtml.classList.add(\"dark-mode\");\r\n } else {\r\n iframeHtml.classList.remove(\"dark-mode\");\r\n }\r\n } catch (err) {\r\n console.warn(\"Dark mode sync to iframe failed:\", err);\r\n }\r\n }\r\n\r\n const modeButton = document.getElementById(\"light-dark-button\");\r\n if (modeButton) {\r\n modeButton.querySelector(\".icon\").innerText = isDark\r\n ? \"light_mode\"\r\n : \"dark_mode\";\r\n modeButton.querySelector(\".name\").innerText = isDark\r\n ? \"Light Mode\"\r\n : \"Dark Mode\";\r\n }\r\n}\r\n\r\nexport function initThemeToggle() {\r\n // Run immediately to avoid flicker\r\n setDarkMode(isDarkMode());\r\n\r\n // Wire up button after DOM is ready (called from entry point's DOMContentLoaded)\r\n const isDark = isDarkMode();\r\n setDarkMode(isDark);\r\n\r\n const modeButton = document.getElementById(\"light-dark-button\");\r\n if (modeButton) {\r\n modeButton.addEventListener(\"click\", function () {\r\n const wasDark = isDarkMode();\r\n setDarkMode(!wasDark);\r\n localStorage.setItem(\"theme\", wasDark ? \"light\" : \"dark\");\r\n });\r\n }\r\n}\r\n", "/**\r\n * Embed/share button and embed-mode display.\r\n *\r\n * Provides the \"embed in LMS\" button that copies an \";\r\n const embedTextbox = document.getElementById(\"embed-code-textbox\");\r\n if (embedTextbox) {\r\n embedTextbox.value = embedCode;\r\n }\r\n\r\n shareButton.addEventListener(\"click\", function () {\r\n sharePopup.classList.toggle(\"hidden\");\r\n });\r\n\r\n const copyButton = document.getElementById(\"copy-embed-button\");\r\n if (copyButton) {\r\n copyButton.addEventListener(\"click\", function () {\r\n const textbox = document.getElementById(\"embed-code-textbox\");\r\n if (textbox) {\r\n navigator.clipboard\r\n .writeText(embedCode)\r\n .then(() => {\r\n console.log(\"Embed code copied to clipboard!\");\r\n })\r\n .catch((err) => {\r\n console.error(\"Failed to copy embed code: \", err);\r\n });\r\n copyButton.querySelector(\".icon\").innerText =\r\n \"library_add_check\";\r\n setTimeout(function () {\r\n copyButton.querySelector(\".icon\").innerText =\r\n \"content_copy\";\r\n sharePopup.classList.add(\"hidden\");\r\n }, 450);\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport function initEmbedMode() {\r\n const urlParams = new URLSearchParams(window.location.search);\r\n if (!urlParams.has(\"embed\")) return;\r\n\r\n // Set dark mode based on value of param\r\n if (urlParams.get(\"embed\") === \"dark\") {\r\n setDarkMode(true);\r\n } else {\r\n setDarkMode(false);\r\n }\r\n\r\n const elemsToHide = [\r\n \"ptx-navbar\",\r\n \"ptx-masthead\",\r\n \"ptx-page-footer\",\r\n \"ptx-sidebar\",\r\n \"ptx-content-footer\",\r\n ];\r\n for (const id of elemsToHide) {\r\n const elem = document.getElementById(id);\r\n if (elem) {\r\n elem.classList.add(\"hidden\");\r\n }\r\n }\r\n}\r\n", "/**\r\n * Code block copy-to-clipboard button.\r\n *\r\n * Wraps `.clipboardable` elements with a container and injects a copy\r\n * button. Clicking the button copies the `
` content.\r\n */\r\n\r\nexport function initCodeCopyButtons() {\r\n    const elements = document.querySelectorAll(\".clipboardable\");\r\n    for (const el of elements) {\r\n        const div = document.createElement(\"div\");\r\n        div.classList.add(\"clipboardable\");\r\n        el.classList.remove(\"clipboardable\");\r\n        el.replaceWith(div);\r\n        div.insertAdjacentElement(\"afterbegin\", el);\r\n        div.insertAdjacentHTML(\r\n            \"beforeend\",\r\n            `\r\n    \r\n            `.trim()\r\n        );\r\n    }\r\n}\r\n\r\nexport function initCodeCopyHandler() {\r\n    document.addEventListener(\"click\", (ev) => {\r\n        const codeBox = ev.target.closest(\".clipboardable\");\r\n        if (!navigator.clipboard || !codeBox) return;\r\n        const button = ev.target.closest(\".code-copy\");\r\n        if (!button) return;\r\n        const preContent = codeBox.querySelector(\"pre\").textContent;\r\n        navigator.clipboard.writeText(preContent);\r\n        button.classList.toggle(\"copied\");\r\n        setTimeout(() => button.classList.toggle(\"copied\"), 1000);\r\n    });\r\n}\r\n", "/**\r\n * Auto-ID generation for paragraphs without IDs.\r\n *\r\n * \u26A0\uFE0F DEPRECATED / SUSPICIOUS: Generates IDs like \"base-id-part2\", \"base-id-part3\"\r\n * for 

elements that lack an id, based on the nearest preceding

that has one.\r\n * Produces heavy console.log output. It is unclear whether any downstream code\r\n * depends on the generated IDs.\r\n */\r\n\r\nexport function initAutoId() {\r\n const noIdParagraphs = document.querySelectorAll(\".main p:not([id])\");\r\n for (let n = noIdParagraphs.length - 1; n >= 0; --n) {\r\n const e = noIdParagraphs[n];\r\n if (e.hasAttribute(\"id\")) continue;\r\n if (e.classList.contains(\"watermark\")) continue;\r\n\r\n // Find all preceding sibling

elements\r\n const prevParagraphs = [];\r\n let sibling = e.previousElementSibling;\r\n while (sibling) {\r\n if (sibling.tagName === \"P\") {\r\n prevParagraphs.push(sibling);\r\n }\r\n sibling = sibling.previousElementSibling;\r\n }\r\n\r\n if (prevParagraphs.length === 0) continue;\r\n\r\n let partsFound = 1;\r\n const partsToId = [e];\r\n for (let i = 0; i < prevParagraphs.length; ++i) {\r\n const thisPrevious = prevParagraphs[i];\r\n if (!thisPrevious.hasAttribute(\"id\")) {\r\n partsToId.unshift(thisPrevious);\r\n } else {\r\n const baseId = thisPrevious.id;\r\n for (let j = 0; j < partsToId.length; ++j) {\r\n ++partsFound;\r\n const nextId = baseId + \"-part\" + partsFound.toString();\r\n partsToId[j].setAttribute(\"id\", nextId);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n", "/**\r\n * Video magnification (resize YouTube iframes to full browser width).\r\n *\r\n * \u26A0\uFE0F DEAD CODE: The selector `body iframeXXXX` intentionally matches no\r\n * elements. This module is preserved for reference but has no effect.\r\n */\r\n\r\nexport function initVideoMagnify() {\r\n const allIframes = document.querySelectorAll(\"body iframeXXXX\");\r\n for (let i = 0; i < allIframes.length; i++) {\r\n const thisItem = allIframes[i];\r\n const thisItemSrc = thisItem.src;\r\n if (!thisItemSrc.includes(\"youtube\")) continue;\r\n\r\n const thisItemId = thisItem.id;\r\n const thisItemWidth = thisItem.width;\r\n const thisItemHeight = thisItem.height;\r\n if (thisItemHeight < 150) continue;\r\n\r\n const emptyDiv = document.createElement(\"div\");\r\n const videomagContainer = document.createElement(\"div\");\r\n const parentTag = thisItem.parentElement.tagName;\r\n if (parentTag === \"FIGURE\") {\r\n videomagContainer.setAttribute(\"class\", \"videobig\");\r\n } else {\r\n videomagContainer.setAttribute(\"class\", \"videobig nofigure\");\r\n }\r\n videomagContainer.setAttribute(\"video-id\", thisItemId);\r\n videomagContainer.setAttribute(\"data-width\", thisItemWidth);\r\n videomagContainer.setAttribute(\"data-height\", thisItemHeight);\r\n videomagContainer.innerHTML = \"fit width\";\r\n\r\n thisItem.insertAdjacentElement(\"beforebegin\", emptyDiv);\r\n thisItem.insertAdjacentElement(\"beforebegin\", videomagContainer);\r\n thisItem.insertAdjacentElement(\"beforebegin\", emptyDiv);\r\n }\r\n\r\n // Toggle handlers\r\n document.body.addEventListener(\"click\", function (event) {\r\n const bigBtn = event.target.closest(\".videobig\");\r\n if (bigBtn) {\r\n const videoId = bigBtn.getAttribute(\"video-id\");\r\n const video = document.getElementById(videoId);\r\n const originalWidth = parseInt(bigBtn.getAttribute(\"data-width\"));\r\n const originalHeight = parseInt(bigBtn.getAttribute(\"data-height\"));\r\n const browserWidth = window.innerWidth;\r\n const widthRatio = browserWidth / originalWidth;\r\n\r\n video.setAttribute(\"width\", widthRatio * originalWidth);\r\n video.setAttribute(\"height\", widthRatio * originalHeight);\r\n video.setAttribute(\r\n \"style\",\r\n \"position:relative; left:-260px; z-index:1000\"\r\n );\r\n bigBtn.setAttribute(\"class\", \"videosmall\");\r\n bigBtn.innerHTML = \"make small\";\r\n return;\r\n }\r\n\r\n const smallBtn = event.target.closest(\".videosmall\");\r\n if (smallBtn) {\r\n const videoId = smallBtn.getAttribute(\"video-id\");\r\n const video = document.getElementById(videoId);\r\n const originalWidth = smallBtn.getAttribute(\"data-width\");\r\n const originalHeight = smallBtn.getAttribute(\"data-height\");\r\n\r\n video.removeAttribute(\"style\");\r\n video.setAttribute(\"width\", originalWidth);\r\n video.setAttribute(\"height\", originalHeight);\r\n smallBtn.setAttribute(\"class\", \"videobig\");\r\n smallBtn.innerHTML = \"fit width\";\r\n }\r\n });\r\n}\r\n", "/**\r\n * PreTeXt Core \u2014 main entry point.\r\n *\r\n * Bundles all core PreTeXt JavaScript into a single IIFE script.\r\n * This replaces the old pattern of loading jquery.min.js + pretext.js +\r\n * pretext_add_on.js + knowl.js + lti_iframe_resizer.js as separate scripts.\r\n */\r\n\r\n// --- Core modules (from pretext.js, knowl.js, lti_iframe_resizer.js) ---\r\nimport { initToc, initFocusedToc, initScrollToc } from \"./toc.js\";\r\nimport { initKnowls } from \"./knowl.js\";\r\nimport { initLtiIframeResizer } from \"./lti-iframe-resizer.js\";\r\n\r\n// --- Modules extracted from pretext_add_on.js ---\r\nimport { initPermalinks } from \"./permalink.js\";\r\nimport { initImageMagnify } from \"./image-magnify.js\";\r\nimport { initGeoGebra } from \"./geogebra.js\";\r\nimport { initKeyboardNav, initAnchorKnowl } from \"./keyboard-nav.js\";\r\nimport { initPrintPreview } from \"./print-preview/index.js\";\r\nimport { isDarkMode, setDarkMode, initThemeToggle } from \"./theme.js\";\r\nimport { initShareButton, initEmbedMode } from \"./embed.js\";\r\nimport { initCodeCopyButtons, initCodeCopyHandler } from \"./code-copy.js\";\r\n\r\n// --- Deprecated modules (included but flagged for future removal) ---\r\nimport { initAutoId } from \"./deprecated/auto-id.js\";\r\nimport { initVideoMagnify } from \"./deprecated/video-magnify.js\";\r\n\r\n// Run dark mode immediately to avoid flash of wrong theme\r\nsetDarkMode(isDarkMode());\r\n\r\n// Expose theme functions globally for inline scripts (e.g., mermaid init in XSL)\r\nwindow.isDarkMode = isDarkMode;\r\nwindow.setDarkMode = setDarkMode;\r\n\r\n// --- DOMContentLoaded handlers ---\r\nwindow.addEventListener(\"DOMContentLoaded\", function () {\r\n // TOC and sidebar\r\n initToc();\r\n initFocusedToc();\r\n initScrollToc();\r\n\r\n // Permalinks\r\n initPermalinks();\r\n\r\n // Theme toggle button\r\n initThemeToggle();\r\n\r\n // Embed/share button and embed mode\r\n initShareButton();\r\n initEmbedMode();\r\n\r\n // Code copy buttons\r\n initCodeCopyButtons();\r\n\r\n // Print preview (conditionally activates based on URL params)\r\n initPrintPreview();\r\n});\r\n\r\n// --- Load handlers (need full page including images/styles) ---\r\nwindow.addEventListener(\"load\", function () {\r\n // Knowls\r\n initKnowls();\r\n\r\n // LTI iframe resizer\r\n initLtiIframeResizer();\r\n\r\n // Image magnification\r\n initImageMagnify();\r\n\r\n // GeoGebra calculator\r\n initGeoGebra();\r\n\r\n // Keyboard navigation (ESC/ENTER)\r\n initKeyboardNav();\r\n\r\n // Anchor-based knowl opening\r\n initAnchorKnowl();\r\n\r\n // Deprecated: auto-ID generation\r\n initAutoId();\r\n\r\n // Deprecated: video magnification (dead code \u2014 selector matches nothing)\r\n initVideoMagnify();\r\n});\r\n\r\n// Code copy click handler (uses event delegation, safe to register early)\r\ninitCodeCopyHandler();\r\n"], + "mappings": "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", + "names": ["event", "tempContainer", "event", "event", "event", "event", "event", "workspaces", "totalHeight", "nextChild", "content", "content", "event"] +} diff --git a/js/dist/pretext-search.js b/js/dist/pretext-search.js new file mode 100644 index 000000000..4ec2b4ba6 --- /dev/null +++ b/js/dist/pretext-search.js @@ -0,0 +1,263 @@ +(() => { + // ../../js/src/search.js + function findEntry(resultId, db) { + for (const page of db) { + if (page.id === resultId) return page; + } + return resultId; + } + function augmentResults(result, docs) { + for (let res of result) { + let info = findEntry(res.ref, docs); + res.number = info.number; + res.type = info.type; + res.title = info.title; + res.url = info.url; + res.level = info.level; + res.snum = info.snum; + res.score = parseFloat(res.score); + const LEVEL_WEIGHTS = [3, 2, 1.5]; + if (res.level < 2) res.score *= LEVEL_WEIGHTS[res.level]; + res.body = ""; + const REVEAL_WINDOW = 30; + let titleMarked = false; + for (const hit in res.matchData.metadata) { + if (res.matchData.metadata[hit].title) { + if (!titleMarked) { + if (!res.matchData.metadata[hit].title.position) + continue; + let positionData = res.matchData.metadata[hit].title.position[0]; + const startClipInd = positionData[0]; + const endClipInd = positionData[0] + positionData[1]; + res.title = res.title.substring(0, endClipInd) + "" + res.title.substring(endClipInd); + res.title = res.title.substring(0, startClipInd) + '' + res.title.substring(startClipInd); + titleMarked = true; + } + } else if (res.matchData.metadata[hit].body) { + if (!res.matchData.metadata[hit].body.position) + continue; + const bodyContent = info.body; + let positionData = res.matchData.metadata[hit].body.position[0]; + const startInd = positionData[0] - REVEAL_WINDOW; + const endInd = positionData[0] + positionData[1] + REVEAL_WINDOW; + const startClipInd = positionData[0]; + const endClipInd = positionData[0] + positionData[1]; + let resultSnippet = (startInd > 0 ? "..." : "") + bodyContent.substring(startInd, startClipInd); + resultSnippet += '' + bodyContent.substring(startClipInd, endClipInd) + ""; + resultSnippet += bodyContent.substring(endClipInd, endInd) + (endInd < bodyContent.length ? "..." : "") + "
"; + res.body += resultSnippet; + } + } + } + } + function rearrangedArray(arry) { + let newarry = []; + let ct = 1; + while (arry.length > 0 && ct < 500) { + ++ct; + const locofmax = maxLocation(arry); + let segmentstart = locofmax; + let segmentlength = 1; + while (arry[segmentstart].level == "2") { + --segmentstart; + } + while (segmentstart + segmentlength < arry.length && arry[segmentstart + segmentlength].level == "2") { + ++segmentlength; + } + newarry.push(...arry.splice(segmentstart, segmentlength)); + } + return newarry; + } + function maxLocation(arry) { + let maxloc = 0; + let maxvalsofar = -1; + for (let index = 0; index < arry.length; ++index) { + if (arry[index].score > maxvalsofar) { + maxloc = index; + maxvalsofar = arry[index].score; + } + } + return maxloc; + } + function comparePosition(a, b) { + if (a.snum < b.snum) return -1; + if (a.snum > b.snum) return 1; + return 0; + } + function addResultToPage(searchterms, result, docs, numUnshown, resultArea) { + if (document.getElementById("searchempty")) { + document.getElementById("searchempty").style.display = "none"; + } + let len = result.length; + if (len == 0) { + if (document.getElementById("searchempty")) { + document.getElementById("searchempty").style.display = "block"; + } else { + let noresults = document.createElement("div"); + noresults.classList.add("noresults"); + noresults.innerHTML = "No results were found."; + resultArea.appendChild(noresults); + } + document.getElementById("searchresultsplaceholder").style.display = null; + return; + } + let allScores = result.map(function(r) { + return r.score; + }); + allScores.sort((a, b) => a - b); + allScores.reverse(); + let high = allScores[Math.floor(len * 0.2)]; + let med = allScores[Math.floor(len * 0.4)]; + let low = allScores[Math.floor(len * 0.75)]; + if (typeof ptx_lunr_search_style !== "undefined" && ptx_lunr_search_style == "reference") { + result = rearrangedArray(result); + } + let indent = "1"; + let currIndent = indent; + let origResult = resultArea; + for (const res of result) { + let link = document.createElement("a"); + if (res.score >= high) { + link.classList.add("high_result"); + } else if (res.score >= med) { + link.classList.add("medium_result"); + } else if (res.score >= low) { + link.classList.add("low_result"); + } else { + link.classList.add("no_result"); + } + currIndent = res.level; + if (currIndent > indent) { + indent = currIndent; + let ilist = document.createElement("ul"); + ilist.classList.add("detailed_result"); + resultArea.appendChild(ilist); + resultArea = ilist; + } else if (currIndent < indent) { + resultArea = origResult; + indent = currIndent; + } + link.href = `${res.url}`; + link.innerHTML = `${res.type} ${res.number} ${res.title}`; + let clip = document.createElement("div"); + clip.classList.add("search-result-clip"); + clip.innerHTML = `${res.body}`; + let bullet = document.createElement("li"); + bullet.classList.add("search-result-bullet"); + bullet.appendChild(link); + bullet.appendChild(clip); + let p = document.createElement("text"); + p.classList.add("search-result-score"); + p.innerHTML = ` (${res.score.toFixed(2)})`; + bullet.appendChild(p); + resultArea.appendChild(bullet); + } + const resultsDiv = document.getElementById("searchresultsplaceholder"); + const backDiv = document.querySelector(".searchresultsbackground"); + resultArea.querySelectorAll("a").forEach((link) => { + link.addEventListener("click", (e) => { + backDiv.style.display = "none"; + resultsDiv.style.display = "none"; + }); + }); + document.getElementById("searchresultsplaceholder").style.display = null; + MathJax.typesetPromise(); + } + function doSearch(searchlocation = "A") { + let terms; + if (searchlocation == "A") { + terms = document.getElementById("ptxsearch").value; + } else { + terms = document.getElementById("ptxsearchB").value; + } + localStorage.setItem( + "last-search-terms", + JSON.stringify({ terms, time: Date.now() }) + ); + let resultArea = document.getElementById("searchresults"); + resultArea.innerHTML = ""; + let searchterms = terms; + if (searchlocation == "B") { + document.getElementById("ptxsearch").value = searchterms; + } + searchterms = searchterms.toLowerCase().trim(); + let pageResult = []; + if (searchterms != "") { + pageResult = ptx_lunr_idx.query((q) => { + for (let term of searchterms.split(" ")) { + q.term(term, { fields: ["title"], boost: 20 }); + q.term(term, { + wildcard: lunr.Query.wildcard.TRAILING, + fields: ["title"], + boost: 10 + }); + q.term(term, { fields: ["body"], boost: 5 }); + q.term(term, { + wildcard: lunr.Query.wildcard.TRAILING, + fields: ["body"] + }); + } + }); + } + let snum = 0; + for (let doc of ptx_lunr_docs) { + doc.snum = snum; + snum += 1; + } + const MAX_RESULTS = 100; + let numUnshown = pageResult.length > MAX_RESULTS ? pageResult.length - MAX_RESULTS : 0; + pageResult = pageResult.slice(0, MAX_RESULTS); + augmentResults(pageResult, ptx_lunr_docs); + pageResult.sort(comparePosition); + addResultToPage( + terms, + pageResult, + ptx_lunr_docs, + numUnshown, + resultArea + ); + MathJax.typeset(); + } + function initSearch() { + const resultsDiv = document.getElementById("searchresultsplaceholder"); + if (!resultsDiv) return; + const backDiv = document.createElement("div"); + backDiv.classList.add("searchresultsbackground"); + backDiv.style.display = "none"; + resultsDiv.parentNode.appendChild(backDiv); + const searchButton = document.getElementById("searchbutton"); + if (searchButton) { + searchButton.addEventListener("click", (e) => { + resultsDiv.style.display = null; + backDiv.style.display = null; + let searchInput2 = document.getElementById("ptxsearch"); + const lastSearch = localStorage.getItem("last-search-terms"); + if (lastSearch) { + searchInput2.value = JSON.parse(lastSearch).terms; + } + searchInput2.select(); + doSearch(); + }); + } + const searchInput = document.getElementById("ptxsearch"); + if (searchInput) { + searchInput.addEventListener("input", (e) => { + doSearch(); + }); + } + const closeButton = document.getElementById("closesearchresults"); + if (closeButton) { + closeButton.addEventListener("click", (e) => { + resultsDiv.style.display = "none"; + backDiv.style.display = "none"; + document.getElementById("searchbutton").focus(); + }); + } + } + + // ../../js/src/pretext-search-entry.js + window.addEventListener("load", function() { + initSearch(); + }); +})(); +//# sourceMappingURL=pretext-search.js.map diff --git a/js/dist/pretext-search.js.map b/js/dist/pretext-search.js.map new file mode 100644 index 000000000..be82ef627 --- /dev/null +++ b/js/dist/pretext-search.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["../src/search.js", "../src/pretext-search-entry.js"], + "sourcesContent": ["/**\r\n * Search functionality (from pretext_search.js).\r\n *\r\n * Provides the search UI: querying the lunr index, ranking results,\r\n * rendering result lists with highlighted snippets.\r\n *\r\n * Expects these globals from the generated lunr-pretext-search-index.js:\r\n * - ptx_lunr_idx\r\n * - ptx_lunr_docs\r\n * - ptx_lunr_search_style\r\n * Also expects: lunr (the lunr.js library), MathJax\r\n */\r\n\r\nfunction findEntry(resultId, db) {\r\n for (const page of db) {\r\n if (page.id === resultId) return page;\r\n }\r\n return resultId;\r\n}\r\n\r\nfunction augmentResults(result, docs) {\r\n for (let res of result) {\r\n let info = findEntry(res.ref, docs);\r\n res.number = info.number;\r\n res.type = info.type;\r\n res.title = info.title;\r\n res.url = info.url;\r\n res.level = info.level;\r\n res.snum = info.snum;\r\n res.score = parseFloat(res.score);\r\n\r\n const LEVEL_WEIGHTS = [3, 2, 1.5];\r\n if (res.level < 2) res.score *= LEVEL_WEIGHTS[res.level];\r\n\r\n res.body = \"\";\r\n const REVEAL_WINDOW = 30;\r\n let titleMarked = false;\r\n for (const hit in res.matchData.metadata) {\r\n if (res.matchData.metadata[hit].title) {\r\n if (!titleMarked) {\r\n if (!res.matchData.metadata[hit].title.position)\r\n continue;\r\n let positionData =\r\n res.matchData.metadata[hit].title.position[0];\r\n const startClipInd = positionData[0];\r\n const endClipInd = positionData[0] + positionData[1];\r\n res.title =\r\n res.title.substring(0, endClipInd) +\r\n \"
\" +\r\n res.title.substring(endClipInd);\r\n res.title =\r\n res.title.substring(0, startClipInd) +\r\n '' +\r\n res.title.substring(startClipInd);\r\n titleMarked = true;\r\n }\r\n } else if (res.matchData.metadata[hit].body) {\r\n if (!res.matchData.metadata[hit].body.position)\r\n continue;\r\n const bodyContent = info.body;\r\n let positionData =\r\n res.matchData.metadata[hit].body.position[0];\r\n const startInd = positionData[0] - REVEAL_WINDOW;\r\n const endInd =\r\n positionData[0] + positionData[1] + REVEAL_WINDOW;\r\n const startClipInd = positionData[0];\r\n const endClipInd = positionData[0] + positionData[1];\r\n let resultSnippet =\r\n (startInd > 0 ? \"...\" : \"\") +\r\n bodyContent.substring(startInd, startClipInd);\r\n resultSnippet +=\r\n '' +\r\n bodyContent.substring(startClipInd, endClipInd) +\r\n \"\";\r\n resultSnippet +=\r\n bodyContent.substring(endClipInd, endInd) +\r\n (endInd < bodyContent.length ? \"...\" : \"\") +\r\n \"
\";\r\n res.body += resultSnippet;\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction rearrangedArray(arry) {\r\n let newarry = [];\r\n let ct = 1;\r\n while (arry.length > 0 && ct < 500) {\r\n ++ct;\r\n const locofmax = maxLocation(arry);\r\n let segmentstart = locofmax;\r\n let segmentlength = 1;\r\n while (arry[segmentstart].level == \"2\") {\r\n --segmentstart;\r\n }\r\n while (\r\n segmentstart + segmentlength < arry.length &&\r\n arry[segmentstart + segmentlength].level == \"2\"\r\n ) {\r\n ++segmentlength;\r\n }\r\n newarry.push(...arry.splice(segmentstart, segmentlength));\r\n }\r\n return newarry;\r\n}\r\n\r\nfunction maxLocation(arry) {\r\n let maxloc = 0;\r\n let maxvalsofar = -1;\r\n for (let index = 0; index < arry.length; ++index) {\r\n if (arry[index].score > maxvalsofar) {\r\n maxloc = index;\r\n maxvalsofar = arry[index].score;\r\n }\r\n }\r\n return maxloc;\r\n}\r\n\r\nfunction comparePosition(a, b) {\r\n if (a.snum < b.snum) return -1;\r\n if (a.snum > b.snum) return 1;\r\n return 0;\r\n}\r\n\r\nfunction addResultToPage(searchterms, result, docs, numUnshown, resultArea) {\r\n if (document.getElementById(\"searchempty\")) {\r\n document.getElementById(\"searchempty\").style.display = \"none\";\r\n }\r\n let len = result.length;\r\n if (len == 0) {\r\n if (document.getElementById(\"searchempty\")) {\r\n document.getElementById(\"searchempty\").style.display = \"block\";\r\n } else {\r\n let noresults = document.createElement(\"div\");\r\n noresults.classList.add(\"noresults\");\r\n noresults.innerHTML = \"No results were found.\";\r\n resultArea.appendChild(noresults);\r\n }\r\n document.getElementById(\"searchresultsplaceholder\").style.display =\r\n null;\r\n return;\r\n }\r\n\r\n let allScores = result.map(function (r) {\r\n return r.score;\r\n });\r\n allScores.sort((a, b) => a - b);\r\n allScores.reverse();\r\n\r\n let high = allScores[Math.floor(len * 0.2)];\r\n let med = allScores[Math.floor(len * 0.4)];\r\n let low = allScores[Math.floor(len * 0.75)];\r\n\r\n if (\r\n typeof ptx_lunr_search_style !== \"undefined\" &&\r\n ptx_lunr_search_style == \"reference\"\r\n ) {\r\n result = rearrangedArray(result);\r\n }\r\n let indent = \"1\";\r\n let currIndent = indent;\r\n let origResult = resultArea;\r\n\r\n for (const res of result) {\r\n let link = document.createElement(\"a\");\r\n if (res.score >= high) {\r\n link.classList.add(\"high_result\");\r\n } else if (res.score >= med) {\r\n link.classList.add(\"medium_result\");\r\n } else if (res.score >= low) {\r\n link.classList.add(\"low_result\");\r\n } else {\r\n link.classList.add(\"no_result\");\r\n }\r\n currIndent = res.level;\r\n if (currIndent > indent) {\r\n indent = currIndent;\r\n let ilist = document.createElement(\"ul\");\r\n ilist.classList.add(\"detailed_result\");\r\n resultArea.appendChild(ilist);\r\n resultArea = ilist;\r\n } else if (currIndent < indent) {\r\n resultArea = origResult;\r\n indent = currIndent;\r\n }\r\n link.href = `${res.url}`;\r\n link.innerHTML = `${res.type} ${res.number} ${res.title}`;\r\n let clip = document.createElement(\"div\");\r\n clip.classList.add(\"search-result-clip\");\r\n clip.innerHTML = `${res.body}`;\r\n let bullet = document.createElement(\"li\");\r\n bullet.classList.add(\"search-result-bullet\");\r\n bullet.appendChild(link);\r\n bullet.appendChild(clip);\r\n let p = document.createElement(\"text\");\r\n p.classList.add(\"search-result-score\");\r\n p.innerHTML = ` (${res.score.toFixed(2)})`;\r\n bullet.appendChild(p);\r\n resultArea.appendChild(bullet);\r\n }\r\n\r\n const resultsDiv = document.getElementById(\"searchresultsplaceholder\");\r\n const backDiv = document.querySelector(\".searchresultsbackground\");\r\n resultArea.querySelectorAll(\"a\").forEach((link) => {\r\n link.addEventListener(\"click\", (e) => {\r\n backDiv.style.display = \"none\";\r\n resultsDiv.style.display = \"none\";\r\n });\r\n });\r\n document.getElementById(\"searchresultsplaceholder\").style.display = null;\r\n MathJax.typesetPromise();\r\n}\r\n\r\nfunction doSearch(searchlocation = \"A\") {\r\n let terms;\r\n if (searchlocation == \"A\") {\r\n terms = document.getElementById(\"ptxsearch\").value;\r\n } else {\r\n terms = document.getElementById(\"ptxsearchB\").value;\r\n }\r\n\r\n localStorage.setItem(\r\n \"last-search-terms\",\r\n JSON.stringify({ terms: terms, time: Date.now() })\r\n );\r\n\r\n let resultArea = document.getElementById(\"searchresults\");\r\n resultArea.innerHTML = \"\";\r\n\r\n let searchterms = terms;\r\n if (searchlocation == \"B\") {\r\n document.getElementById(\"ptxsearch\").value = searchterms;\r\n }\r\n\r\n searchterms = searchterms.toLowerCase().trim();\r\n let pageResult = [];\r\n if (searchterms != \"\") {\r\n pageResult = ptx_lunr_idx.query((q) => {\r\n for (let term of searchterms.split(\" \")) {\r\n q.term(term, { fields: [\"title\"], boost: 20 });\r\n q.term(term, {\r\n wildcard: lunr.Query.wildcard.TRAILING,\r\n fields: [\"title\"],\r\n boost: 10,\r\n });\r\n q.term(term, { fields: [\"body\"], boost: 5 });\r\n q.term(term, {\r\n wildcard: lunr.Query.wildcard.TRAILING,\r\n fields: [\"body\"],\r\n });\r\n }\r\n });\r\n }\r\n\r\n let snum = 0;\r\n for (let doc of ptx_lunr_docs) {\r\n doc.snum = snum;\r\n snum += 1;\r\n }\r\n\r\n const MAX_RESULTS = 100;\r\n let numUnshown =\r\n pageResult.length > MAX_RESULTS\r\n ? pageResult.length - MAX_RESULTS\r\n : 0;\r\n pageResult = pageResult.slice(0, MAX_RESULTS);\r\n\r\n augmentResults(pageResult, ptx_lunr_docs);\r\n pageResult.sort(comparePosition);\r\n addResultToPage(\r\n terms,\r\n pageResult,\r\n ptx_lunr_docs,\r\n numUnshown,\r\n resultArea\r\n );\r\n MathJax.typeset();\r\n}\r\n\r\nexport function initSearch() {\r\n const resultsDiv = document.getElementById(\"searchresultsplaceholder\");\r\n if (!resultsDiv) return;\r\n\r\n const backDiv = document.createElement(\"div\");\r\n backDiv.classList.add(\"searchresultsbackground\");\r\n backDiv.style.display = \"none\";\r\n resultsDiv.parentNode.appendChild(backDiv);\r\n\r\n const searchButton = document.getElementById(\"searchbutton\");\r\n if (searchButton) {\r\n searchButton.addEventListener(\"click\", (e) => {\r\n resultsDiv.style.display = null;\r\n backDiv.style.display = null;\r\n let searchInput = document.getElementById(\"ptxsearch\");\r\n const lastSearch = localStorage.getItem(\"last-search-terms\");\r\n if (lastSearch) {\r\n searchInput.value = JSON.parse(lastSearch).terms;\r\n }\r\n searchInput.select();\r\n doSearch();\r\n });\r\n }\r\n\r\n const searchInput = document.getElementById(\"ptxsearch\");\r\n if (searchInput) {\r\n searchInput.addEventListener(\"input\", (e) => {\r\n doSearch();\r\n });\r\n }\r\n\r\n const closeButton = document.getElementById(\"closesearchresults\");\r\n if (closeButton) {\r\n closeButton.addEventListener(\"click\", (e) => {\r\n resultsDiv.style.display = \"none\";\r\n backDiv.style.display = \"none\";\r\n document.getElementById(\"searchbutton\").focus();\r\n });\r\n }\r\n}\r\n", "/**\r\n * PreTeXt Search \u2014 search bundle entry point.\r\n *\r\n * Bundles the native search UI. Loaded only when the document\r\n * has native search enabled ($has-native-search).\r\n *\r\n * Expects these globals to be available (from lunr-pretext-search-index.js):\r\n * - ptx_lunr_idx\r\n * - ptx_lunr_docs\r\n * - ptx_lunr_search_style\r\n * And from the lunr.js library:\r\n * - lunr\r\n */\r\n\r\nimport { initSearch } from \"./search.js\";\r\n\r\nwindow.addEventListener(\"load\", function () {\r\n initSearch();\r\n});\r\n"], + "mappings": "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", + "names": ["searchInput"] +} diff --git a/js/jquery.min.js b/js/jquery.min.js index 4d9b3a258..7f37b5d99 100644 --- a/js/jquery.min.js +++ b/js/jquery.min.js @@ -1,2 +1,2 @@ -/*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,s=n.push,u=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,p=f.toString,d=p.call(Object),h={},g=function e(t){return"function"==typeof t&&"number"!=typeof t.nodeType},y=function e(t){return null!=t&&t===t.window},v={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement("script");if(o.text=e,n)for(i in v)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[c.call(e)]||"object":typeof e}var b="3.3.1",w=function(e,t){return new w.fn.init(e,t)},T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;w.fn=w.prototype={jquery:"3.3.1",constructor:w,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b="sizzle"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n+~]|"+M+")"+M+"*"),z=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),X=new RegExp(W),U=new RegExp("^"+R+"$"),V={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},G=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){p()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{L.apply(A=H.call(w.childNodes),w.childNodes),A[w.childNodes.length].nodeType}catch(e){L={apply:A.length?function(e,t){q.apply(e,H.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,s,l,c,f,h,v,m=t&&t.ownerDocument,T=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==T&&9!==T&&11!==T)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&p(t),t=t||d,g)){if(11!==T&&(f=J.exec(e)))if(o=f[1]){if(9===T){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&x(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return L.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!S[e+" "]&&(!y||!y.test(e))){if(1!==T)m=t,v=e;else if("object"!==t.nodeName.toLowerCase()){(c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=b),s=(h=a(e)).length;while(s--)h[s]="#"+c+" "+ve(h[s]);v=h.join(","),m=K.test(e)&&ge(t.parentNode)||t}if(v)try{return L.apply(r,m.querySelectorAll(v)),r}catch(e){}finally{c===b&&t.removeAttribute("id")}}}return u(e.replace(B,"$1"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function se(e){return e[b]=!0,e}function ue(e){var t=d.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function de(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return se(function(t){return t=+t,se(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},p=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==d&&9===a.nodeType&&a.documentElement?(d=a,h=d.documentElement,g=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(d.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Q.test(d.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=b,!d.getElementsByName||!d.getElementsByName(b).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},v=[],y=[],(n.qsa=Q.test(d.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+b+"-]").length||y.push("~="),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||y.push(".#.+[+~]")}),ue(function(e){e.innerHTML="";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),v.push("!=",W)}),y=y.length&&new RegExp(y.join("|")),v=v.length&&new RegExp(v.join("|")),t=Q.test(h.compareDocumentPosition),x=t||Q.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,"='$1']"),n.matchesSelector&&g&&!S[t+" "]&&(!v||!v.test(t))&&(!y||!y.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&N.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(D),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace($," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",y=t.parentNode,v=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(y){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?y.firstChild:y.lastChild],a&&m){x=(d=(l=(c=(f=(p=y)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&y.childNodes[d];while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===v:1===p.nodeType)&&++x&&(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p===t))break;return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,"$1"));return r[b]?se(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return U.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n){for(var r=0,i=t.length;r-1&&(o[l]=!(a[l]=f))}}else v=we(v===a?v.splice(h,v.length):v),i?i(null,a,v,u):L.apply(a,v)})}function Ce(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];u1&&xe(p),u>1&&ve(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(B,"$1"),n,u0,i=e.length>0,o=function(o,a,s,u,c){var f,h,y,v=0,m="0",x=o&&[],b=[],w=l,C=o||i&&r.find.TAG("*",c),E=T+=null==w?1:Math.random()||.1,k=C.length;for(c&&(l=a===d||a||c);m!==k&&null!=(f=C[m]);m++){if(i&&f){h=0,a||f.ownerDocument===d||(p(f),s=!g);while(y=e[h++])if(y(f,a||d,s)){u.push(f);break}c&&(T=E)}n&&((f=!y&&f)&&v--,o&&x.push(f))}if(v+=m,n&&m!==v){h=0;while(y=t[h++])y(x,b,a,s);if(o){if(v>0)while(m--)x[m]||b[m]||(b[m]=j.call(u));b=we(b)}L.apply(u,b),c&&!o&&b.length>0&&v+t.length>1&&oe.uniqueSort(u)}return c&&(T=E,l=w),x};return n?se(o):o}return s=oe.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Ce(t[n]))[b]?r.push(o):i.push(o);(o=S(e,Ee(i,r))).selector=e}return o},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p="function"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}o=V.needsContext.test(e)?0:u.length;while(o--){if(l=u[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ve(u)))return L.apply(n,i),n;break}}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split("").sort(D).join("")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),ue(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute("disabled")})||le(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var k=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},D=w.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var A=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return u.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&D.test(e)?w(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:L.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),A.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,q=w(r);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?u.call(w(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return k(e,"parentNode")},parentsUntil:function(e,t,n){return k(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return k(e,"nextSibling")},prevAll:function(e){return k(e,"previousSibling")},nextUntil:function(e,t,n){return k(e,"nextSibling",n)},prevUntil:function(e,t,n){return k(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return N(e,"iframe")?e.contentDocument:(N(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(O[e]||w.uniqueSort(i),H.test(e)&&i.reverse()),this.pushStack(i)}});var M=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(M)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1){n=a.shift();while(++s-1)o.splice(n,1),n<=s&&s--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function I(e){return e}function W(e){throw e}function $(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t=o&&(r!==W&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:I,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:I)),n[2][3].add(a(0,e,g(r)?r:W))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&($(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)$(i[n],s(n),a.reject);return a.promise()}});var B=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&B.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function _(){r.removeEventListener("DOMContentLoaded",_),e.removeEventListener("load",_),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",_),e.addEventListener("load",_));var z=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n)){i=!0;for(s in n)z(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;s1,null,!0)},removeData:function(e){return this.each(function(){K.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=J.get(e,t),n&&(!r||Array.isArray(n)?r=J.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return J.get(e,n)||J.access(e,n,{empty:w.Callbacks("once memory").add(function(){J.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?w.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ye(f.appendChild(o),"script"),l&&ve(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/\s*$/g;function Le(e,t){return N(e,"table")&&N(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function He(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(J.hasData(e)&&(o=J.access(e),a=J.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n1&&"string"==typeof y&&!h.checkClone&&je.test(y))return e.each(function(i){var o=e.eq(i);v&&(t[0]=y.call(this,i,o.html())),Re(o,t,n,r)});if(p&&(i=xe(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(u=(s=w.map(ye(i,"script"),He)).length;f")},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),u=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ye(s),r=0,i=(o=ye(e)).length;r0&&ve(a,!u&&ye(e,"script")),s},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[J.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[J.expando]=void 0}n[K.expando]&&(n[K.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return z(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ye(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return z(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ae.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function et(e,t,n){var r=$e(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(We.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=G(t),u=Xe.test(t),l=e.style;if(u||(t=Je(s)),a=w.cssHooks[t]||w.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=ue(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[s]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=G(t);return Xe.test(t)||(t=Je(s)),(a=w.cssHooks[t]||w.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Ve&&(i=Ve[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!ze.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):se(e,Ue,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=$e(e),a="border-box"===w.css(e,"boxSizing",!1,o),s=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),s&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Ke(e,n,s)}}}),w.cssHooks.marginLeft=_e(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Ke)}),w.fn.extend({css:function(e,t){return z(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=$e(e),i=t.length;a1)}});function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}w.Tween=tt,tt.prototype={constructor:tt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||w.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(w.cssNumber[n]?"":"px")},cur:function(){var e=tt.propHooks[this.prop];return e&&e.get?e.get(this):tt.propHooks._default.get(this)},run:function(e){var t,n=tt.propHooks[this.prop];return this.options.duration?this.pos=t=w.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tt.propHooks._default.set(this),this}},tt.prototype.init.prototype=tt.prototype,tt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=w.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){w.fx.step[e.prop]?w.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[w.cssProps[e.prop]]&&!w.cssHooks[e.prop]?e.elem[e.prop]=e.now:w.style(e.elem,e.prop,e.now+e.unit)}}},tt.propHooks.scrollTop=tt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},w.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},w.fx=tt.prototype.init,w.fx.step={};var nt,rt,it=/^(?:toggle|show|hide)$/,ot=/queueHooks$/;function at(){rt&&(!1===r.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(at):e.setTimeout(at,w.fx.interval),w.fx.tick())}function st(){return e.setTimeout(function(){nt=void 0}),nt=Date.now()}function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=oe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function lt(e,t,n){for(var r,i=(pt.tweeners[t]||[]).concat(pt.tweeners["*"]),o=0,a=i.length;o1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?dt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&N(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(M);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),dt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=ht[t]||w.find.attr;ht[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ht[a],ht[a]=i,i=null!=n(e,t,r)?a:null,ht[a]=o),i}});var gt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return z(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):gt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function vt(e){return(e.match(M)||[]).join(" ")}function mt(e){return e.getAttribute&&e.getAttribute("class")||""}function xt(e){return Array.isArray(e)?e:"string"==typeof e?e.match(M)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,mt(this)))});if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,mt(this)))});if(!arguments.length)return this.attr("class","");if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,mt(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=xt(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=mt(this))&&J.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":J.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+vt(mt(n))+" ").indexOf(t)>-1)return!0;return!1}});var bt=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(bt,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:vt(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var wt=/^(?:focusinfocus|focusoutblur)$/,Tt=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,s,u,l,c,p,d,h,v=[i||r],m=f.call(t,"type")?t.type:t,x=f.call(t,"namespace")?t.namespace.split("."):[];if(s=h=u=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!wt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(x=m.split(".")).shift(),x.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=x.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+x.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),d=w.event.special[m]||{},o||!d.trigger||!1!==d.trigger.apply(i,n))){if(!o&&!d.noBubble&&!y(i)){for(l=d.delegateType||m,wt.test(l+m)||(s=s.parentNode);s;s=s.parentNode)v.push(s),u=s;u===(i.ownerDocument||r)&&v.push(u.defaultView||u.parentWindow||e)}a=0;while((s=v[a++])&&!t.isPropagationStopped())h=s,t.type=a>1?l:d.bindType||m,(p=(J.get(s,"events")||{})[t.type]&&J.get(s,"handle"))&&p.apply(s,n),(p=c&&s[c])&&p.apply&&Y(s)&&(t.result=p.apply(s,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||d._default&&!1!==d._default.apply(v.pop(),n)||!Y(i)||c&&g(i[m])&&!y(i)&&((u=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,Tt),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,Tt),w.event.triggered=void 0,u&&(i[c]=u)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=J.access(r,t);i||r.addEventListener(e,n,!0),J.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=J.access(r,t)-1;i?J.access(r,t,i):(r.removeEventListener(e,n,!0),J.remove(r,t))}}});var Ct=e.location,Et=Date.now(),kt=/\?/;w.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||w.error("Invalid XML: "+t),n};var St=/\[\]$/,Dt=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;function jt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||St.test(e)?r(e,i):jt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==x(t))r(e,t);else for(i in t)jt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)jt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(Dt,"\r\n")}}):{name:t.name,value:n.replace(Dt,"\r\n")}}).get()}});var qt=/%20/g,Lt=/#.*$/,Ht=/([?&])_=[^&]*/,Ot=/^(.*?):[ \t]*([^\r\n]*)$/gm,Pt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Mt=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Bt=r.createElement("a");Bt.href=Ct.href;function Ft(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(M)||[];if(g(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function _t(e,t,n,r){var i={},o=e===Wt;function a(s){var u;return i[s]=!0,w.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function zt(e,t){var n,r,i=w.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&w.extend(!0,e,r),e}function Xt(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}function Ut(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}w.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Pt.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":w.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,w.ajaxSettings),t):zt(w.ajaxSettings,e)},ajaxPrefilter:Ft(It),ajaxTransport:Ft(Wt),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,p,d,h=w.ajaxSetup({},n),g=h.context||h,y=h.context&&(g.nodeType||g.jquery)?w(g):w.event,v=w.Deferred(),m=w.Callbacks("once memory"),x=h.statusCode||{},b={},T={},C="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s){s={};while(t=Ot.exec(a))s[t[1].toLowerCase()]=t[2]}t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return i&&i.abort(t),k(0,t),this}};if(v.promise(E),h.url=((t||h.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),h.type=n.method||n.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(M)||[""],null==h.crossDomain){l=r.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Bt.protocol+"//"+Bt.host!=l.protocol+"//"+l.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=w.param(h.data,h.traditional)),_t(It,h,n,E),c)return E;(f=w.event&&h.global)&&0==w.active++&&w.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Mt.test(h.type),o=h.url.replace(Lt,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qt,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(kt.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Ht,"$1"),d=(kt.test(o)?"&":"?")+"_="+Et+++d),h.url=o+d),h.ifModified&&(w.lastModified[o]&&E.setRequestHeader("If-Modified-Since",w.lastModified[o]),w.etag[o]&&E.setRequestHeader("If-None-Match",w.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||n.contentType)&&E.setRequestHeader("Content-Type",h.contentType),E.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+$t+"; q=0.01":""):h.accepts["*"]);for(p in h.headers)E.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(g,E,h)||c))return E.abort();if(C="abort",m.add(h.complete),E.done(h.success),E.fail(h.error),i=_t(Wt,h,n,E)){if(E.readyState=1,f&&y.trigger("ajaxSend",[E,h]),c)return E;h.async&&h.timeout>0&&(u=e.setTimeout(function(){E.abort("timeout")},h.timeout));try{c=!1,i.send(b,k)}catch(e){if(c)throw e;k(-1,e)}}else k(-1,"No Transport");function k(t,n,r,s){var l,p,d,b,T,C=n;c||(c=!0,u&&e.clearTimeout(u),i=void 0,a=s||"",E.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(b=Xt(h,E,r)),b=Ut(h,b,E,l),l?(h.ifModified&&((T=E.getResponseHeader("Last-Modified"))&&(w.lastModified[o]=T),(T=E.getResponseHeader("etag"))&&(w.etag[o]=T)),204===t||"HEAD"===h.type?C="nocontent":304===t?C="notmodified":(C=b.state,p=b.data,l=!(d=b.error))):(d=C,!t&&C||(C="error",t<0&&(t=0))),E.status=t,E.statusText=(n||C)+"",l?v.resolveWith(g,[p,C,E]):v.rejectWith(g,[E,C,d]),E.statusCode(x),x=void 0,f&&y.trigger(l?"ajaxSuccess":"ajaxError",[E,h,l?p:d]),m.fireWith(g,[E,C]),f&&(y.trigger("ajaxComplete",[E,h]),--w.active||w.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return w.get(e,t,n,"json")},getScript:function(e,t){return w.get(e,void 0,t,"script")}}),w.each(["get","post"],function(e,t){w[t]=function(e,n,r,i){return g(n)&&(i=i||r,r=n,n=void 0),w.ajax(w.extend({url:e,type:t,dataType:i,data:n,success:r},w.isPlainObject(e)&&e))}}),w._evalUrl=function(e){return w.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},w.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Vt={0:200,1223:204},Gt=w.ajaxSettings.xhr();h.cors=!!Gt&&"withCredentials"in Gt,h.ajax=Gt=!!Gt,w.ajaxTransport(function(t){var n,r;if(h.cors||Gt&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(a in i)s.setRequestHeader(a,i[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Vt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=s.ontimeout=n("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),w.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),w.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return w.globalEval(e),e}}}),w.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),w.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(i,o){t=w(" @@ -12470,7 +12470,7 @@ along with MathBook XML. If not, see . true); - + @@ -13755,7 +13755,7 @@ TODO: - - knowl.js code controls Sage Cells within knowls - - + diff --git a/xsl/pretext-runestone.xsl b/xsl/pretext-runestone.xsl index 16338fb37..cbc94563b 100644 --- a/xsl/pretext-runestone.xsl +++ b/xsl/pretext-runestone.xsl @@ -223,6 +223,10 @@ along with PreTeXt. If not, see . *** Runestone Services *** + + + +