UNPKG

@grafana/ui

Version:
1 lines 12.6 kB
{"version":3,"file":"index.mjs","sources":["../../../../src/slate-plugins/slate-prism/index.ts"],"sourcesContent":["import Prism, { LanguageMap } from 'prismjs';\nimport { Block, Text, Decoration } from 'slate';\nimport { Plugin } from 'slate-react';\n\nimport TOKEN_MARK from './TOKEN_MARK';\nimport Options, { OptionsFormat } from './options';\n\nexport interface Token {\n content: string;\n offsets?: {\n start: number;\n end: number;\n };\n types: string[];\n aliases: string[];\n prev?: Token | null;\n next?: Token | null;\n}\n\n/**\n * A Slate plugin to highlight code syntax.\n */\nexport function SlatePrism(optsParam: OptionsFormat = {}, prismLanguages = Prism.languages as LanguageMap): Plugin {\n const opts: Options = new Options(optsParam);\n\n return {\n decorateNode: (node, editor, next) => {\n if (!opts.onlyIn(node)) {\n return next();\n }\n\n const block = Block.create(node as Block);\n const grammarName = opts.getSyntax(block);\n const grammar = prismLanguages[grammarName];\n\n if (!grammar) {\n // Grammar not loaded\n return [];\n }\n\n // Tokenize the whole block text\n const texts = block.getTexts();\n const blockText = texts.map((text) => text && text.getText()).join('\\n');\n const tokens = Prism.tokenize(blockText, grammar);\n const flattened = flattenTokens(tokens);\n\n const newData = editor.value.data.set('tokens', flattened);\n editor.setData(newData);\n return decorateNode(opts, tokens, block);\n },\n\n renderDecoration: (props, editor, next) =>\n opts.renderDecoration(\n {\n children: props.children,\n decoration: props.decoration,\n },\n editor,\n next\n ),\n };\n}\n\n/**\n * Returns the decoration for a node\n */\nfunction decorateNode(opts: Options, tokens: Array<string | Prism.Token>, block: Block) {\n const texts = block.getTexts();\n\n // The list of decorations to return\n const decorations: Decoration[] = [];\n let textStart = 0;\n let textEnd = 0;\n\n texts.forEach((text) => {\n textEnd = textStart + text!.getText().length;\n\n let offset = 0;\n function processToken(token: string | Prism.Token, accu?: string | number) {\n if (typeof token === 'string') {\n if (accu) {\n const decoration = createDecoration({\n text: text!,\n textStart,\n textEnd,\n start: offset,\n end: offset + token.length,\n className: `prism-token token ${accu}`,\n block,\n });\n\n if (decoration) {\n decorations.push(decoration);\n }\n }\n offset += token.length;\n } else {\n accu = `${accu} ${token.type}`;\n if (token.alias) {\n accu += ' ' + token.alias;\n }\n\n if (typeof token.content === 'string') {\n const decoration = createDecoration({\n text: text!,\n textStart,\n textEnd,\n start: offset,\n end: offset + token.content.length,\n className: `prism-token token ${accu}`,\n block,\n });\n\n if (decoration) {\n decorations.push(decoration);\n }\n\n offset += token.content.length;\n } else {\n // When using token.content instead of token.matchedStr, token can be deep\n for (let i = 0; i < token.content.length; i += 1) {\n // @ts-ignore\n processToken(token.content[i], accu);\n }\n }\n }\n }\n\n tokens.forEach(processToken);\n textStart = textEnd + 1; // account for added `\\n`\n });\n\n return decorations;\n}\n\n/**\n * Return a decoration range for the given text.\n */\nfunction createDecoration({\n text,\n textStart,\n textEnd,\n start,\n end,\n className,\n block,\n}: {\n text: Text; // The text being decorated\n textStart: number; // Its start position in the whole text\n textEnd: number; // Its end position in the whole text\n start: number; // The position in the whole text where the token starts\n end: number; // The position in the whole text where the token ends\n className: string; // The prism token classname\n block: Block;\n}): Decoration | null {\n if (start >= textEnd || end <= textStart) {\n // Ignore, the token is not in the text\n return null;\n }\n\n // Shrink to this text boundaries\n start = Math.max(start, textStart);\n end = Math.min(end, textEnd);\n\n // Now shift offsets to be relative to this text\n start -= textStart;\n end -= textStart;\n\n const myDec = block.createDecoration({\n object: 'decoration',\n anchor: {\n key: text.key,\n offset: start,\n object: 'point',\n },\n focus: {\n key: text.key,\n offset: end,\n object: 'point',\n },\n type: TOKEN_MARK,\n data: { className },\n });\n\n return myDec;\n}\n\nfunction flattenToken(token: string | Prism.Token | Array<string | Prism.Token>): Token[] {\n if (typeof token === 'string') {\n return [\n {\n content: token,\n types: [],\n aliases: [],\n },\n ];\n } else if (Array.isArray(token)) {\n return token.flatMap((t) => flattenToken(t));\n } else if (token instanceof Prism.Token) {\n return flattenToken(token.content).flatMap((t) => {\n let aliases: string[] = [];\n if (typeof token.alias === 'string') {\n aliases = [token.alias];\n } else {\n aliases = token.alias ?? [];\n }\n\n return {\n content: t.content,\n types: [token.type, ...t.types],\n aliases: [...aliases, ...t.aliases],\n };\n });\n }\n\n return [];\n}\n\nexport function flattenTokens(token: string | Prism.Token | Array<string | Prism.Token>) {\n const tokens = flattenToken(token);\n\n if (!tokens.length) {\n return [];\n }\n\n const firstToken = tokens[0];\n firstToken.prev = null;\n firstToken.next = tokens.length >= 2 ? tokens[1] : null;\n firstToken.offsets = {\n start: 0,\n end: firstToken.content.length,\n };\n\n for (let i = 1; i < tokens.length - 1; i++) {\n tokens[i].prev = tokens[i - 1];\n tokens[i].next = tokens[i + 1];\n\n tokens[i].offsets = {\n start: tokens[i - 1].offsets!.end,\n end: tokens[i - 1].offsets!.end + tokens[i].content.length,\n };\n }\n\n const lastToken = tokens[tokens.length - 1];\n lastToken.prev = tokens.length >= 2 ? tokens[tokens.length - 2] : null;\n lastToken.next = null;\n lastToken.offsets = {\n start: tokens.length >= 2 ? tokens[tokens.length - 2].offsets!.end : 0,\n end:\n tokens.length >= 2 ? tokens[tokens.length - 2].offsets!.end + lastToken.content.length : lastToken.content.length,\n };\n\n return tokens;\n}\n"],"names":[],"mappings":"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"}