{"version":3,"file":"index.cjs","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":["Prism","Options","Block"],"mappings":"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"}