diff options
| author | 2022-10-25 20:33:34 +0000 | |
|---|---|---|
| committer | 2022-10-25 20:33:34 +0000 | |
| commit | 046b81941837518810802061bbb8a7bf91ed5736 (patch) | |
| tree | e5ae76b968e3e4b14dc91cbc42f5bfead51f6bab /v7.2.1/_static/sphinx_highlight.js | |
| parent | Deploying to docs from @ python-discord/bot-core@ac156ecc63e0cd0ea54d58020efe... (diff) | |
Deploying to docs from @ python-discord/bot-core@c7a6ddd00eb371759d837aa75fa397c6d5771401 🚀
Diffstat (limited to 'v7.2.1/_static/sphinx_highlight.js')
| -rw-r--r-- | v7.2.1/_static/sphinx_highlight.js | 144 | 
1 files changed, 144 insertions, 0 deletions
| diff --git a/v7.2.1/_static/sphinx_highlight.js b/v7.2.1/_static/sphinx_highlight.js new file mode 100644 index 00000000..aae669d7 --- /dev/null +++ b/v7.2.1/_static/sphinx_highlight.js @@ -0,0 +1,144 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { +  if (node.nodeType === Node.TEXT_NODE) { +    const val = node.nodeValue; +    const parent = node.parentNode; +    const pos = val.toLowerCase().indexOf(text); +    if ( +      pos >= 0 && +      !parent.classList.contains(className) && +      !parent.classList.contains("nohighlight") +    ) { +      let span; + +      const closestNode = parent.closest("body, svg, foreignObject"); +      const isInSVG = closestNode && closestNode.matches("svg"); +      if (isInSVG) { +        span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); +      } else { +        span = document.createElement("span"); +        span.classList.add(className); +      } + +      span.appendChild(document.createTextNode(val.substr(pos, text.length))); +      parent.insertBefore( +        span, +        parent.insertBefore( +          document.createTextNode(val.substr(pos + text.length)), +          node.nextSibling +        ) +      ); +      node.nodeValue = val.substr(0, pos); + +      if (isInSVG) { +        const rect = document.createElementNS( +          "http://www.w3.org/2000/svg", +          "rect" +        ); +        const bbox = parent.getBBox(); +        rect.x.baseVal.value = bbox.x; +        rect.y.baseVal.value = bbox.y; +        rect.width.baseVal.value = bbox.width; +        rect.height.baseVal.value = bbox.height; +        rect.setAttribute("class", className); +        addItems.push({ parent: parent, target: rect }); +      } +    } +  } else if (node.matches && !node.matches("button, select, textarea")) { +    node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); +  } +}; +const _highlightText = (thisNode, text, className) => { +  let addItems = []; +  _highlight(thisNode, addItems, text, className); +  addItems.forEach((obj) => +    obj.parent.insertAdjacentElement("beforebegin", obj.target) +  ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + +  /** +   * highlight the search words provided in localstorage in the text +   */ +  highlightSearchWords: () => { +    if (!SPHINX_HIGHLIGHT_ENABLED) return;  // bail if no highlight + +    // get and clear terms from localstorage +    const url = new URL(window.location); +    const highlight = +        localStorage.getItem("sphinx_highlight_terms") +        || url.searchParams.get("highlight") +        || ""; +    localStorage.removeItem("sphinx_highlight_terms") +    url.searchParams.delete("highlight"); +    window.history.replaceState({}, "", url); + +    // get individual terms from highlight string +    const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); +    if (terms.length === 0) return; // nothing to do + +    // There should never be more than one element matching "div.body" +    const divBody = document.querySelectorAll("div.body"); +    const body = divBody.length ? divBody[0] : document.querySelector("body"); +    window.setTimeout(() => { +      terms.forEach((term) => _highlightText(body, term, "highlighted")); +    }, 10); + +    const searchBox = document.getElementById("searchbox"); +    if (searchBox === null) return; +    searchBox.appendChild( +      document +        .createRange() +        .createContextualFragment( +          '<p class="highlight-link">' + +            '<a href="javascript:SphinxHighlight.hideSearchWords()">' + +            _("Hide Search Matches") + +            "</a></p>" +        ) +    ); +  }, + +  /** +   * helper function to hide the search marks again +   */ +  hideSearchWords: () => { +    document +      .querySelectorAll("#searchbox .highlight-link") +      .forEach((el) => el.remove()); +    document +      .querySelectorAll("span.highlighted") +      .forEach((el) => el.classList.remove("highlighted")); +    localStorage.removeItem("sphinx_highlight_terms") +  }, + +  initEscapeListener: () => { +    // only install a listener if it is really needed +    if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + +    document.addEventListener("keydown", (event) => { +      // bail for input elements +      if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; +      // bail with special keys +      if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; +      if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { +        SphinxHighlight.hideSearchWords(); +        event.preventDefault(); +      } +    }); +  }, +}; + +_ready(SphinxHighlight.highlightSearchWords); +_ready(SphinxHighlight.initEscapeListener); | 
