diff --git a/src/prism/z-shell-languages.ts b/src/prism/z-shell-languages.ts index 6925ac99..2737492b 100644 --- a/src/prism/z-shell-languages.ts +++ b/src/prism/z-shell-languages.ts @@ -3,11 +3,88 @@ import type * as PrismNamespace from "prismjs"; export function registerZShellLanguages(Prism: typeof PrismNamespace): void { Prism.languages.zsh = Prism.languages.extend("bash", {}); + const zshBuiltins = [ + "autoload", + "bindkey", + "builtin", + "compctl", + "compdump", + "compinit", + "compdef", + "compfiles", + "compgroups", + "compquote", + "comptags", + "comptry", + "compvalues", + "declare", + "dirs", + "disable", + "disown", + "emulate", + "enable", + "fc", + "float", + "functions", + "getcap", + "getln", + "getopts", + "history", + "integer", + "jobs", + "let", + "limit", + "local", + "log", + "noglob", + "popd", + "print", + "printf", + "pushd", + "pushln", + "pwd", + "read", + "readonly", + "sched", + "set", + "setcap", + "setopt", + "shift", + "source", + "stat", + "suspend", + "ttyctl", + "type", + "typeset", + "ulimit", + "umask", + "unalias", + "unfunction", + "unhash", + "unlimit", + "unset", + "unsetopt", + "vared", + "wait", + "whence", + "where", + "which", + "zcompile", + "zformat", + "zle", + "zmodload", + "zparseopts", + "zpty", + "zregexparse", + "zsocket", + "zstyle", + "ztcp", + ]; + // ZSH-specific builtins — inserted before 'function' so they take priority Prism.languages.insertBefore("zsh", "function", { "zsh-builtin": { - pattern: - /(?^|[\s;|&])(?:autoload|bindkey|builtin|compctl|compdump|compinit|compdef|compfiles|compgroups|compquote|comptags|comptry|compvalues|declare|dirs|disable|disown|emulate|enable|fc|float|functions|getcap|getln|getopts|history|integer|jobs|let|limit|local|log|noglob|popd|print|printf|pushd|pushln|pwd|read|readonly|sched|set|setcap|setopt|shift|source|stat|suspend|ttyctl|type|typeset|ulimit|umask|unalias|unfunction|unhash|unlimit|unset|unsetopt|vared|wait|whence|where|which|zcompile|zformat|zle|zmodload|zparseopts|zpty|zregexparse|zsocket|zstyle|ztcp)(?=\s|;|$)/, + pattern: new RegExp(String.raw`(?^|[\s;|&])(?:${zshBuiltins.join("|")})(?=[\s;|&]|$)`), lookbehind: true, alias: "builtin", }, diff --git a/src/theme/SearchBar.tsx b/src/theme/SearchBar.tsx index 28cd4b57..22a4693f 100644 --- a/src/theme/SearchBar.tsx +++ b/src/theme/SearchBar.tsx @@ -3,10 +3,47 @@ import SearchBar from "@theme-original/SearchBar"; export default function SearchBarWrapper(props: React.ComponentProps): React.JSX.Element { useEffect(() => { - const keysSpan = document.querySelector(".DocSearch-Button-Keys"); - if (keysSpan && !keysSpan.getAttribute("aria-hidden")) { - keysSpan.setAttribute("aria-hidden", "true"); + const setAriaHidden = (keysSpan: Element): void => { + if (!keysSpan.getAttribute("aria-hidden")) { + keysSpan.setAttribute("aria-hidden", "true"); + } + }; + + const initialKeysSpan = document.querySelector(".DocSearch-Button-Keys"); + if (initialKeysSpan) { + setAriaHidden(initialKeysSpan); + return; + } + + const observerTarget = document.querySelector(".navbar"); + if (!observerTarget) { + return; } + + const observer = new MutationObserver((mutations) => { + for (const mutation of mutations) { + for (const node of mutation.addedNodes) { + if (!(node instanceof Element)) { + continue; + } + + const foundKeysSpan = node.matches(".DocSearch-Button-Keys") + ? node + : node.querySelector(".DocSearch-Button-Keys"); + if (foundKeysSpan) { + setAriaHidden(foundKeysSpan); + observer.disconnect(); + return; + } + } + } + }); + + observer.observe(observerTarget, {childList: true, subtree: true}); + + return (): void => { + observer.disconnect(); + }; }, []); return ; diff --git a/src/theme/prism-include-languages.ts b/src/theme/prism-include-languages.ts index 190412e3..8d7d2e2f 100644 --- a/src/theme/prism-include-languages.ts +++ b/src/theme/prism-include-languages.ts @@ -3,7 +3,10 @@ import prismIncludeLanguagesOriginal from "@theme-original/prism-include-languag import {registerZShellLanguages} from "../prism/z-shell-languages"; import type * as PrismNamespace from "prismjs"; +type PrismIncludeLanguagesFn = (p: typeof PrismNamespace) => void; +const prismIncludeLanguagesOriginalTyped: PrismIncludeLanguagesFn = prismIncludeLanguagesOriginal; + export default function prismIncludeLanguages(PrismObject: typeof PrismNamespace): void { - (prismIncludeLanguagesOriginal as (p: typeof PrismNamespace) => void)(PrismObject); + prismIncludeLanguagesOriginalTyped(PrismObject); registerZShellLanguages(PrismObject); }