{"version":3,"file":"markup.cjs","sources":["../../../components/editor/markup.ts"],"sourcesContent":["import { Fragment, type Node as PMNode, Slice } from 'prosemirror-model';\nimport {\n  type EditorMention,\n  isTriggerCharacter,\n  type MentionAttrs,\n  serializeMention\n} from './mention';\nimport {\n  editorSchema,\n  hardBreakType,\n  mentionType,\n  paragraphType\n} from './schema';\n\nexport interface EditorDocDetails {\n  /** Round-trippable markup — `\"check @[DataTable](component:data-table)\"`. */\n  markup: string;\n  /** Plain text with each label inlined behind its trigger. */\n  text: string;\n  /** Document order; duplicates preserved. */\n  mentions: EditorMention[];\n  /** No mentions, and text that trims to `\"\"`. */\n  empty: boolean;\n}\n\ninterface MentionMatch {\n  attrs: MentionAttrs;\n  /** Index just past the closing `)`. */\n  next: number;\n}\n\n/**\n * Reads `X[label](type:id)` at `start`, where `X` is the trigger. Returns null\n * for anything malformed so the caller can keep the characters as literal text.\n */\nfunction readMention(source: string, start: number): MentionMatch | null {\n  const trigger = source[start];\n  if (!isTriggerCharacter(trigger) || source[start + 1] !== '[') return null;\n\n  let index = start + 2;\n  let label = '';\n  while (index < source.length) {\n    const char = source[index];\n    if (char === '\\\\' && index + 1 < source.length) {\n      label += source[index + 1];\n      index += 2;\n      continue;\n    }\n    if (char === ']') break;\n    if (char === '\\n') return null;\n    label += char;\n    index += 1;\n  }\n  if (source[index] !== ']' || source[index + 1] !== '(') return null;\n  index += 2;\n\n  let type = '';\n  let id = '';\n  let separated = false;\n  while (index < source.length) {\n    const char = source[index];\n    if (char === '\\\\' && index + 1 < source.length) {\n      if (separated) id += source[index + 1];\n      else type += source[index + 1];\n      index += 2;\n      continue;\n    }\n    if (char === ')') break;\n    if (char === '\\n') return null;\n    if (char === ':' && !separated) {\n      separated = true;\n      index += 1;\n      continue;\n    }\n    if (separated) id += char;\n    else type += char;\n    index += 1;\n  }\n  if (source[index] !== ')') return null;\n  if (!separated || !label || !type || !id) return null;\n\n  return { attrs: { id, label, type, trigger }, next: index + 1 };\n}\n\n/** Inline content for a plain string — newlines become hard breaks. */\nexport function inlineFragmentFromText(text: string): Fragment {\n  const nodes: PMNode[] = [];\n  const lines = text.split('\\n');\n  lines.forEach((line, index) => {\n    if (index > 0) nodes.push(hardBreakType.create());\n    if (line) nodes.push(editorSchema.text(line));\n  });\n  return Fragment.fromArray(nodes);\n}\n\n/**\n * Parses the markup dialect into a document. Called only for `value` /\n * `defaultValue` — never for typed or pasted input, so ordinary prose that\n * happens to contain `@[…](…)` stays literal while it is being written.\n */\nexport function docFromMarkup(markup: string): PMNode {\n  const nodes: PMNode[] = [];\n  let literal = '';\n  let index = 0;\n\n  const flush = () => {\n    if (!literal) return;\n    nodes.push(editorSchema.text(literal));\n    literal = '';\n  };\n\n  while (index < markup.length) {\n    const char = markup[index];\n\n    if (char === '\\n') {\n      flush();\n      nodes.push(hardBreakType.create());\n      index += 1;\n      continue;\n    }\n\n    if (markup[index + 1] === '[' && isTriggerCharacter(char)) {\n      const match = readMention(markup, index);\n      if (match) {\n        flush();\n        nodes.push(mentionType.create(match.attrs));\n        index = match.next;\n        continue;\n      }\n    }\n\n    literal += char;\n    index += 1;\n  }\n  flush();\n\n  return editorSchema.topNodeType.create(\n    null,\n    paragraphType.create(null, Fragment.fromArray(nodes))\n  );\n}\n\n/** A document holding a plain string, with no markup interpretation at all. */\nexport function docFromText(text: string): PMNode {\n  return editorSchema.topNodeType.create(\n    null,\n    paragraphType.create(null, inlineFragmentFromText(text))\n  );\n}\n\n/** Everything the host needs from a document, in one walk. */\nexport function deriveDocDetails(doc: PMNode): EditorDocDetails {\n  let markup = '';\n  let text = '';\n  const mentions: EditorMention[] = [];\n\n  doc.descendants(node => {\n    if (node.type === mentionType) {\n      const attrs = node.attrs as MentionAttrs;\n      const label = `${attrs.trigger}${attrs.label}`;\n      mentions.push({\n        ...attrs,\n        start: text.length,\n        end: text.length + label.length\n      });\n      markup += serializeMention(attrs);\n      text += label;\n      return false;\n    }\n    if (node.type === hardBreakType) {\n      markup += '\\n';\n      text += '\\n';\n      return false;\n    }\n    if (node.isText) {\n      markup += node.text ?? '';\n      text += node.text ?? '';\n      return false;\n    }\n    return true;\n  });\n\n  return {\n    markup,\n    text,\n    mentions,\n    empty: mentions.length === 0 && text.trim() === ''\n  };\n}\n\n/** The `text/plain` clipboard flavour for a copied range. */\nexport function textFromFragment(fragment: Fragment): string {\n  let text = '';\n  const walk = (content: Fragment) => {\n    content.forEach(node => {\n      if (node.type === mentionType) {\n        const attrs = node.attrs as MentionAttrs;\n        text += `${attrs.trigger}${attrs.label}`;\n        return;\n      }\n      if (node.type === hardBreakType) {\n        text += '\\n';\n        return;\n      }\n      if (node.isText) {\n        text += node.text ?? '';\n        return;\n      }\n      if (node.isBlock && text) text += '\\n';\n      walk(node.content);\n    });\n  };\n  walk(fragment);\n  return text;\n}\n\nexport function serializeMarkup(doc: PMNode): string {\n  return deriveDocDetails(doc).markup;\n}\n\nexport function serializeText(doc: PMNode): string {\n  return deriveDocDetails(doc).text;\n}\n\n/**\n * The length of the derived text, without building it. Read on every\n * transaction by the `maxLength` filter, which only ever wanted the number.\n */\nexport function textLength(doc: PMNode): number {\n  let length = 0;\n  doc.descendants(node => {\n    if (node.type === mentionType) {\n      const attrs = node.attrs as MentionAttrs;\n      length += attrs.trigger.length + attrs.label.length;\n      return false;\n    }\n    if (node.type === hardBreakType) {\n      length += 1;\n      return false;\n    }\n    if (node.isText) {\n      length += node.text?.length ?? 0;\n      return false;\n    }\n    return true;\n  });\n  return length;\n}\n\n/**\n * The emptiness predicate, without building the markup and the mention list\n * `deriveDocDetails` would. Read by the placeholder decoration on every state\n * change, so it walks only as far as the first piece of content.\n *\n * Equivalent to `deriveDocDetails(doc).empty`: the concatenated text trims to\n * `\"\"` exactly when every text node does, and a hard break contributes only a\n * newline.\n */\nexport function isDocEmpty(doc: PMNode): boolean {\n  let empty = true;\n  doc.descendants(node => {\n    if (!empty) return false;\n    if (node.type === mentionType) {\n      empty = false;\n      return false;\n    }\n    if (node.type === hardBreakType) return false;\n    if (node.isText) {\n      if ((node.text ?? '').trim() !== '') empty = false;\n      return false;\n    }\n    return true;\n  });\n  return empty;\n}\n\n/**\n * Collapses a pasted slice to the inline content this schema allows: block\n * boundaries become hard breaks, mentions survive with their ids, everything\n * else arrives as text because the schema has nowhere else to put it.\n */\nexport function flattenToInlineSlice(slice: Slice): Slice {\n  const nodes: PMNode[] = [];\n\n  const walk = (fragment: Fragment) => {\n    fragment.forEach(child => {\n      if (child.isInline) {\n        nodes.push(child.mark([]));\n        return;\n      }\n      if (nodes.length) nodes.push(hardBreakType.create());\n      walk(child.content);\n    });\n  };\n  walk(slice.content);\n\n  return new Slice(Fragment.fromArray(nodes), 0, 0);\n}\n"],"names":["isTriggerCharacter","hardBreakType","editorSchema","Fragment","mentionType","paragraphType","serializeMention","Slice"],"mappings":"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"}