UNPKG

tinyhighlight

Version:
108 lines (106 loc) 3.47 kB
// src/index.ts import jsTokens from "js-tokens"; var reservedWords = { keyword: [ "break", "case", "catch", "continue", "debugger", "default", "do", "else", "finally", "for", "function", "if", "return", "switch", "throw", "try", "var", "const", "while", "with", "new", "this", "super", "class", "extends", "export", "import", "null", "true", "false", "in", "instanceof", "typeof", "void", "delete" ], strict: [ "implements", "interface", "let", "package", "private", "protected", "public", "static", "yield" ] }, keywords = new Set(reservedWords.keyword), reservedWordsStrictSet = new Set(reservedWords.strict), sometimesKeywords = /* @__PURE__ */ new Set(["as", "async", "from", "get", "of", "set"]); function isReservedWord(word) { return word === "await" || word === "enum"; } function isStrictReservedWord(word) { return isReservedWord(word) || reservedWordsStrictSet.has(word); } function isKeyword(word) { return keywords.has(word); } var BRACKET = /^[()[\]{}]$/, getTokenType = function(token) { if (token.type === "IdentifierName") { if (isKeyword(token.value) || isStrictReservedWord(token.value) || sometimesKeywords.has(token.value)) return "Keyword"; if (token.value[0] && token.value[0] !== token.value[0].toLowerCase()) return "IdentifierCapitalized"; } return token.type === "Punctuator" && BRACKET.test(token.value) ? "Bracket" : token.type === "Invalid" && (token.value === "@" || token.value === "#") ? "Punctuator" : token.type; }; function getCallableType(token) { if (token.type === "IdentifierName") return "IdentifierCallable"; if (token.type === "PrivateIdentifier") return "PrivateIdentifierCallable"; throw new Error("Not a callable token"); } var colorize = (defs, type, value) => { let colorize2 = defs[type]; return colorize2 ? colorize2(value) : value; }, highlightTokens = (defs, text, jsx) => { let highlighted = "", lastPotentialCallable = null, stackedHighlight = ""; for (let token of jsTokens(text, { jsx })) { let type = getTokenType(token); if (type === "IdentifierName" || type === "PrivateIdentifier") { lastPotentialCallable && (highlighted += colorize(defs, getTokenType(lastPotentialCallable), lastPotentialCallable.value) + stackedHighlight, stackedHighlight = ""), lastPotentialCallable = token; continue; } if (lastPotentialCallable && (token.type === "WhiteSpace" || token.type === "LineTerminatorSequence" || token.type === "Punctuator" && (token.value === "?." || token.value === "!"))) { stackedHighlight += colorize(defs, type, token.value); continue; } if (stackedHighlight && !lastPotentialCallable && (highlighted += stackedHighlight, stackedHighlight = ""), lastPotentialCallable) { let type2 = token.type === "Punctuator" && token.value === "(" ? getCallableType(lastPotentialCallable) : getTokenType(lastPotentialCallable); highlighted += colorize(defs, type2, lastPotentialCallable.value) + stackedHighlight, stackedHighlight = "", lastPotentialCallable = null; } highlighted += colorize(defs, type, token.value); } return highlighted; }; function highlight(code, options = { jsx: !1, colors: {} }) { return code && highlightTokens(options.colors || {}, code, options.jsx); } export { highlight };