{"version":3,"file":"markdown.cjs","sources":["../src/markdown.ts"],"sourcesContent":["import { NanointlPlugin } from './makeIntl';\nimport { AstNode, PostParser } from './parse';\nimport {\n  Decrement,\n  ICUVariablesMapFromTemplate,\n  Increment,\n  LinkedSleeveNexusLimit,\n  SerializationResult,\n  UnwrapLinkedSleeve,\n} from './typings';\n\ntype MarkdownEmphasisNode = {\n  type: 'external';\n  name: 'md-token';\n  variableName: 'emphasis';\n  data: {\n    children: MarkdownAstNode[];\n  };\n};\ntype MarkdownStrongNode = {\n  type: 'external';\n  name: 'md-token';\n  variableName: 'strong';\n  data: {\n    children: MarkdownAstNode[];\n  };\n};\ntype MarkdownCodeNode = {\n  type: 'external';\n  name: 'md-token';\n  variableName: 'code';\n  data: {\n    children: MarkdownAstNode[];\n  };\n};\ntype MarkdownLinkNode = {\n  type: 'external';\n  name: 'md-token';\n  variableName: 'link';\n  data: {\n    url: string;\n    children: MarkdownAstNode[];\n  };\n};\ntype MarkdownNode = MarkdownEmphasisNode | MarkdownStrongNode | MarkdownCodeNode | MarkdownLinkNode;\nexport type MarkdownAstNode = string | MarkdownNode;\nexport type MarkdownParsingStore = {\n  parentAstChain: MarkdownAstNode[][];\n  parentsChain: MarkdownNode[];\n  nesting: MarkdownNode['variableName'][];\n  ast: (MarkdownAstNode | AstNode)[];\n};\n\nconst symbolToInlineToken = {\n  _: 'emphasis',\n  '*': 'strong',\n  '`': 'code',\n} as const;\nconst inlineTokenSymbolsDuplicatesAllowed: { [symbol: string]: true } = {\n  _: true,\n  '*': true,\n} as const;\n\nexport const makeMarkdownParsingExternalStore = (): MarkdownParsingStore => ({\n  parentAstChain: [],\n  parentsChain: [],\n  nesting: [],\n  ast: [],\n});\n\nexport const markdownChunkParser = (message: string, externalStore?: MarkdownParsingStore): MarkdownAstNode[] | undefined => {\n  const store: MarkdownParsingStore = externalStore ?? makeMarkdownParsingExternalStore();\n  const codeCollecting = false;\n  let linkUrlCollecting = false;\n  let currentAstPart: MarkdownAstNode | null = null;\n\n  const pushCurrentPartToAst = () => {\n    if (currentAstPart) {\n      if (typeof currentAstPart === 'string' && typeof store.ast[store.ast.length - 1] === 'string') {\n        store.ast[store.ast.length - 1] += currentAstPart;\n      } else {\n        store.ast.push(currentAstPart);\n      }\n    }\n  };\n\n  for (let i = 0; i < message.length; i++) {\n    const char = message[i];\n    const nextChar = message[i + 1];\n\n    if (currentAstPart === null) {\n      currentAstPart = '';\n    }\n\n    if (linkUrlCollecting) {\n      if ((currentAstPart as MarkdownLinkNode).data.url === '' && char === '(') continue;\n      if (char === ')') {\n        linkUrlCollecting = false;\n        currentAstPart = null;\n        continue;\n      } else {\n        (currentAstPart as MarkdownLinkNode).data.url += char;\n        continue;\n      }\n    }\n    if (typeof currentAstPart !== 'string') {\n      continue;\n    }\n\n    if (codeCollecting) currentAstPart += char;\n\n    let inlineToken = false;\n    for (const symbol in symbolToInlineToken) {\n      if (char === symbol) {\n        if (nextChar === symbol) {\n          if (inlineTokenSymbolsDuplicatesAllowed[symbol]) {\n            inlineToken = true;\n            continue;\n          } else break;\n        }\n        const token = symbolToInlineToken[symbol as keyof typeof symbolToInlineToken];\n        const parent = store.parentsChain[store.parentsChain.length - 1];\n        if (parent?.variableName === token) {\n          pushCurrentPartToAst();\n          store.parentsChain.pop();\n          if (store.parentAstChain.length > 0) store.ast = store.parentAstChain.pop()!;\n          currentAstPart = null;\n        } else {\n          pushCurrentPartToAst();\n          currentAstPart = { type: 'external', name: 'md-token', variableName: token, data: { children: [] } } as MarkdownNode;\n          pushCurrentPartToAst();\n          store.parentsChain.push(currentAstPart);\n          store.parentAstChain.push(store.ast as MarkdownAstNode[]);\n          store.ast = currentAstPart.data.children as MarkdownAstNode[];\n          currentAstPart = null;\n        }\n        inlineToken = true;\n      }\n    }\n    if (char === '[') {\n      pushCurrentPartToAst();\n      currentAstPart = { type: 'external', name: 'md-token', variableName: 'link', data: { url: '', children: [] } };\n      pushCurrentPartToAst();\n      store.parentsChain.push(currentAstPart);\n      store.parentAstChain.push(store.ast as MarkdownAstNode[]);\n      store.ast = currentAstPart.data.children as MarkdownAstNode[];\n      currentAstPart = null;\n      continue;\n    }\n    if (inlineToken) continue;\n\n    if (char === ']' && store.parentsChain[store.parentsChain.length - 1]?.variableName === 'link') {\n      if (nextChar !== '(' || message[i + 2] === ')') {\n        const node = store.parentsChain[store.parentsChain.length - 1];\n        store.parentAstChain[store.parentAstChain.length - 1].pop();\n        store.ast = store.parentAstChain[store.parentAstChain.length - 1];\n        const children = ['[', ...node.data.children, currentAstPart, ']'];\n        for (const child of children) {\n          currentAstPart = child;\n          pushCurrentPartToAst();\n        }\n        currentAstPart = null;\n        continue;\n      }\n      pushCurrentPartToAst();\n      currentAstPart = store.parentsChain.pop()!;\n      store.ast = store.parentAstChain.pop()!;\n      linkUrlCollecting = true;\n      continue;\n    }\n    if (char === '\\n' && nextChar === '\\n') continue;\n\n    currentAstPart += char;\n  }\n\n  pushCurrentPartToAst();\n\n  if (!externalStore) return (store.parentAstChain[0] ?? store.ast) as any;\n};\n\nexport const postParse = (icuAst: (AstNode | MarkdownAstNode)[]) => {\n  const store = makeMarkdownParsingExternalStore();\n\n  for (const node of icuAst) {\n    if (typeof node === 'string') {\n      markdownChunkParser(node, store);\n    } else if ('data' in node && node.data?.children) {\n      store.ast.push({ ...node, data: { ...node.data, children: postParse(node.data.children) } });\n    } else if (node.type === 'select') {\n      const options: typeof node.options = {};\n      for (const option in node.options) {\n        options[option] = postParse(node.options[option]) as AstNode[];\n      }\n      store.ast.push({ ...node, options });\n    } else if (node.type === 'plural') {\n      const options: typeof node.options = { exacts: {} };\n      for (const option in node.options) {\n        if (option === 'exacts') {\n          for (const exact in node.options.exacts) {\n            options.exacts![exact] = postParse(node.options.exacts[exact]) as AstNode[];\n          }\n        } else {\n          options[option as Exclude<keyof typeof node.options, 'exacts'>] = postParse(\n            node.options[option as keyof typeof node.options] as AstNode[],\n          ) as AstNode[];\n        }\n      }\n      store.ast.push({ ...node, options });\n    } else {\n      store.ast.push(node);\n    }\n  }\n\n  return store.ast;\n};\n\nexport const markdownPlugin: NanointlPlugin<any> = {\n  name: 'markdown-plugin',\n  init(options) {\n    options.addSerializer('md-token', ({ children, ...otherProps }, value, _intl, serializeNested) =>\n      (value as any)?.({ children: serializeNested(children), ...otherProps }),\n    );\n    options.addPostParser(postParse as PostParser<AstNode[], AstNode[]>);\n  },\n};\n\ntype TraverseTokenContent<\n  Token extends string,\n  Template extends string,\n  Depth extends number = 0,\n  NexusLength extends number = 0,\n  Escaping extends boolean = false,\n> = NexusLength extends LinkedSleeveNexusLimit\n  ? { next: UnwrapLinkedSleeve<TraverseTokenContent<Token, Template, Depth, 0, Escaping>> }\n  : Template extends `${infer Char}${infer Rest}`\n  ? Escaping extends false\n    ? Char extends \"'\"\n      ? Rest extends `'${infer Rest}`\n        ? [\"'\", TraverseTokenContent<Token, Rest, Depth, Increment<NexusLength>, Escaping>]\n        : TraverseTokenContent<Token, Rest, Depth, Increment<NexusLength>, true>\n      : Template extends `${Token}${infer Rest}`\n      ? Depth extends 0\n        ? []\n        : [Token, TraverseTokenContent<Token, Rest, Decrement<Depth>, Increment<NexusLength>, Escaping>]\n      : [Char, TraverseTokenContent<Token, Rest, Depth, Increment<NexusLength>, Escaping>]\n    : Char extends \"'\"\n    ? TraverseTokenContent<Token, Rest, Depth, Increment<NexusLength>, false>\n    : [Char, TraverseTokenContent<Token, Rest, Depth, Increment<NexusLength>, Escaping>]\n  : [];\n\ntype ExtractTokenChildrenContent<\n  Token extends string,\n  Template extends string,\n  Result = UnwrapLinkedSleeve<TraverseTokenContent<Token, Template>>[0],\n> = Result extends string ? Result : '';\n\ntype ChildrenSerializationResults<\n  Template extends string,\n  Values extends {} = {},\n> = keyof ICUVariablesMapFromTemplate<Template> extends keyof Values\n  ? SerializationResult<Pick<Values, keyof ICUVariablesMapFromTemplate<Template>>>\n  : any;\n\ntype TokenParser<\n  TokenName extends string,\n  Token extends string,\n  TokenFallback extends string,\n  Template extends string,\n  Values extends {} = {},\n> = Template extends `${string}${Token}${infer After}`\n  ? After extends `${string}${Token}${string}`\n    ? {\n        vars: [\n          {\n            name: TokenName;\n            type: (props: { children: ChildrenSerializationResults<ExtractTokenChildrenContent<Token, After>, Values> }) => any;\n          },\n          ...TokenParser<TokenName, Token, TokenFallback, After, Values>['vars'],\n        ];\n      }\n    : TokenParser<TokenName, Token, TokenFallback, After, Values>\n  : Template extends `${string}${TokenFallback}${infer After}`\n  ? After extends `${string}${TokenFallback}${string}`\n    ? {\n        vars: [\n          {\n            name: TokenName;\n            type: (props: {\n              children: ChildrenSerializationResults<ExtractTokenChildrenContent<TokenFallback, After>, Values>;\n            }) => any;\n          },\n          ...TokenParser<TokenName, Token, TokenFallback, After, Values>['vars'],\n        ];\n      }\n    : TokenParser<TokenName, Token, TokenFallback, After, Values>\n  : { vars: [] };\n\ntype LinkTokenParser<\n  Template extends string,\n  Values extends {} = {},\n> = Template extends `${string}[${infer Content}](${infer Url})${infer After}`\n  ? {\n      vars: [\n        {\n          name: 'link';\n          type: (props: { url: Url; children: ChildrenSerializationResults<Content, Values> }) => any;\n        },\n        ...LinkTokenParser<After, Values>['vars'],\n      ];\n    }\n  : { vars: [] };\n\ntype MarkdownParser<Template extends string, Values extends {} = {}> = {\n  vars: [\n    ...TokenParser<'strong', '**', '*', Template, Values>['vars'],\n    ...TokenParser<'emphasis', '__', '_', Template, Values>['vars'],\n    ...TokenParser<'code', '`', never, Template, Values>['vars'],\n    ...LinkTokenParser<Template, Values>['vars'],\n  ];\n};\n\ndeclare global {\n  // @ts-ignore\n  interface NanointlOverallParsers<Template extends string, Values extends {} = {}> {\n    markdown: MarkdownParser<Template, Values>;\n  }\n}\n"],"names":["symbolToInlineToken","_","inlineTokenSymbolsDuplicatesAllowed","markdownChunkParser","message","externalStore","_store$parentAstChain","store","parentAstChain","parentsChain","nesting","ast","linkUrlCollecting","currentAstPart","pushCurrentPartToAst","length","push","i","_store$parentsChain","char","nextChar","data","url","inlineToken","symbol","token","parent","variableName","pop","type","name","children","node","postParse","icuAst","_step2","_iterator2","_createForOfIteratorHelperLoose","done","value","_node$data","_extends","options","option","_options","exacts","exact","markdownPlugin","init","addSerializer","_ref","_intl","serializeNested","otherProps","_objectWithoutPropertiesLoose","_excluded","addPostParser"],"mappings":"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"}