UNPKG

prism-code-editor

Version:

Lightweight, extensible code editor component for the web using Prism

96 lines (95 loc) 2.97 kB
import { a as languages, c as tokenize, t as Token, u as withoutTokenizer } from "./core-8vQkh0Rd.js"; import { r as insertBefore, t as clone } from "./language-D-vtM55V.js"; import { n as clikeComment } from "./patterns-C0vJBvXO.js"; import { n as re } from "./shared-BPLAFNn7.js"; //#region src/prism/utils/jsx-shared.js var space = "\\s|//.*(?!.)|/\\*(?:[^*]|\\*(?!/))*\\*/"; var braces = "\\{(?:[^{}]|\\{(?:[^{}]|\\{(?:[^{}]|\\{[^}]*\\})*\\})*\\})*\\}"; /** * @param {string} code * @param {*} grammar */ var tokenizer = (code, grammar) => { var position = 0, tokens = withoutTokenizer(code, grammar); var i = 0, openedTags = [], l = 0; var token; var j = 0; var textStartPos; var content; var last; var addStoredText = () => { if (textStartPos) { content = code.slice(textStartPos, position); tokens[j++] = new Token("plain-text", content, content); textStartPos = 0; } }; for (; token = tokens[i]; i++, position += length) { var length = token.length; var isNeverText = token.type; var tag, start; if (isNeverText) { content = token.content; if (isNeverText == "tag") { start = content[0].length; tag = content[2] ? code.substr(position + start, content[1].length) : ""; if (start > 1) { if (l && last[0] == tag) last = openedTags[--l - 1]; } else if (content[content.length - 1].length < 2) openedTags[l++] = last = [tag, 0]; } else if (l && isNeverText == "punctuation") if (content == "{") last[1]++; else if (last[1] && content == "}") last[1]--; else isNeverText = "}()[]".includes(content); else isNeverText = false; } if (!isNeverText && l && !last[1]) { if (!textStartPos) textStartPos = position; } else { addStoredText(); tokens[j++] = token; } } addStoredText(); tokens.length = j; return tokens; }; /** * Adds JSX tags along with the custom tokenizer to the grammar * @param {any} grammar * @param {string} name */ var addJsxTag = (grammar, name) => { insertBefore(languages[name] = grammar = clone(grammar), "regex", { "tag": { pattern: re("</?(?:(?!\\d)[^\\s%=<>/]+(?:<0>(?:<0>*(?:[^\\s{=<>/*]+(?:<0>*=<0>*(?!\\s)(?:\"[^\"]*\"|'[^']*'|<1>)?|(?=[\\s/>]))|<1>))*)?<0>*/?)?>", [space, braces], "g"), inside: { "punctuation": /^<\/?|\/?>$/, "tag": { pattern: /^[^\s/<]+/, inside: { "namespace": /^[^:]+:/, "class-name": /^[A-Z]\w*(?:\.[A-Z]\w*)*$/ } }, "attr-value": { pattern: re("(=<0>*)(?:\"[^\"]*\"|'[^']*')", [space]), lookbehind: true, inside: { "punctuation": /^["']|["']$/g } }, "expression": { pattern: RegExp(braces, "g"), alias: "language-" + name, inside: grammar }, "comment": clikeComment, "attr-equals": /=/, "attr-name": { pattern: /\S+/, inside: { "namespace": /^[^:]+:/ } } } } }); grammar[tokenize] = tokenizer; return grammar; }; //#endregion export { braces as n, space as r, addJsxTag as t }; //# sourceMappingURL=jsx-shared-DIcqKxFi.js.map