prism-code-editor
Version:
Lightweight, extensible code editor component for the web using Prism
111 lines (110 loc) • 3.17 kB
JavaScript
import { l as languages, a as tokenize, w as withoutTokenizer, T as Token } from "./index-DF54SWhA.js";
import { i as insertBefore, c as clone } from "./language-BqHrf6z-.js";
import { r as re } from "./shared-Sq5P6lf6.js";
var space = "\\s|//.*(?!.)|/\\*(?:[^*]|\\*(?!/))*\\*/";
var braces = "\\{(?:[^{}]|\\{(?:[^{}]|\\{(?:[^{}]|\\{[^}]*\\})*\\})*\\})*\\}";
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;
};
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": grammar["comment"],
"attr-equals": /=/,
"attr-name": {
pattern: /\S+/,
inside: {
"namespace": /^[^:]+:/
}
}
}
}
});
grammar[tokenize] = tokenizer;
return grammar;
};
export {
addJsxTag as a,
braces as b,
space as s
};
//# sourceMappingURL=jsx-shared-zvCB3My3.js.map