import { useMemo, useState } from "react"; import type { RegexFlavourId } from "../regex/model/flavour"; import { ECMASCRIPT_REFERENCE, PCRE2_REFERENCE, } from "../regex/reference/token-reference"; export function QuickReference({ onUsePattern, onClose, flavour = "ecmascript", }: { readonly onUsePattern: (syntax: string) => void; readonly onClose?: () => void; readonly flavour?: RegexFlavourId; }) { const [query, setQuery] = useState(""); const reference = flavour === "pcre2" ? PCRE2_REFERENCE : ECMASCRIPT_REFERENCE; const entries = useMemo(() => { const normalizeSearchText = (value: string) => value .toLocaleLowerCase() .replaceAll(/[^\p{L}\p{N}]+/gu, " ") .trim(); const needle = normalizeSearchText(query); return needle ? reference.filter((entry) => normalizeSearchText( [ entry.construct, entry.syntax, entry.explanation, entry.example, entry.flags.join(" "), entry.source, ].join(" "), ).includes(needle), ) : reference; }, [query, reference]); return (

Original {flavour === "pcre2" ? "PCRE2" : "ECMAScript"} reference

Quick reference

{entries.length} of {reference.length} constructs {onClose ? ( ) : null}
{entries.length > 0 ? ( ) : (

No reference constructs match “{query.trim()}”.

)}
); }