{"version":3,"sources":["../src/markdown.ts"],"sourcesContent":["import { Editor, Text, Node, Element } from '@editablejs/models'\nimport { Content, Paragraph } from 'mdast'\nimport { Options, toMarkdown } from 'mdast-util-to-markdown'\nimport { HTMLSerializer } from './html'\n\nexport interface MarkdownSerializerOptions {}\n\nexport interface MarkdownSerializerWithOptions {}\n\nexport type MarkdownSerializerTransform = typeof MarkdownSerializer.transform\n\nexport type MarkdownSerializerWithTransform<T = MarkdownSerializerWithOptions> = (\n  next: MarkdownSerializerTransform,\n  serializer: typeof MarkdownSerializer,\n  options: T,\n) => MarkdownSerializerTransform\n\nexport interface EditorMarkdownSerializerWithTransform<T = MarkdownSerializerWithOptions> {\n  transform: MarkdownSerializerWithTransform<T>\n  options: T\n}\n\nexport interface MarkdownSerializerPlugin {\n  extensions?: Options | Options[]\n}\n\nconst MARKDOWN_SERIALIZER_TRANSFORMS: WeakMap<Editor, EditorMarkdownSerializerWithTransform[]> =\n  new WeakMap()\n\nconst MARKDOWN_SERIALIZER_PLUGINS: WeakMap<Editor, MarkdownSerializerPlugin[]> = new WeakMap()\n\nexport interface EditorMarkdownSerializerOptions extends MarkdownSerializerOptions {\n  editor: Editor\n}\n\nconst withEditorSerializerTransform: MarkdownSerializerWithTransform<\n  EditorMarkdownSerializerOptions\n> = (next, _, { editor }) => {\n  return (node, options = {}) => {\n    if (Element.isElement(node)) {\n      const { type = 'paragraph' } = node\n      if (type !== 'paragraph')\n        return [{ type: 'html', value: HTMLSerializer.transformWithEditor(editor, node) }]\n    }\n    return next(node, options)\n  }\n}\n\nexport const MarkdownSerializer = {\n  transform(node: Node, options: MarkdownSerializerOptions = {}): Content[] {\n    if (Text.isText(node)) return [{ type: 'text', value: node.text }]\n    const tChildren = () => node.children.map(child => this.transform(child, options)).flat()\n    if (Editor.isEditor(node)) return tChildren()\n    const { type = 'paragraph' } = node\n\n    switch (type) {\n      case 'paragraph':\n        return [{ type: 'paragraph', children: tChildren() as Paragraph['children'] }]\n      default:\n        return [{ type: 'html', value: HTMLSerializer.transform(node) }]\n    }\n  },\n\n  with<T = MarkdownSerializerOptions>(transform: MarkdownSerializerWithTransform<T>, options: T) {\n    const { transform: t } = this\n    this.transform = transform(t.bind(this), this, options)\n  },\n\n  withEditor<T = MarkdownSerializerOptions>(\n    editor: Editor,\n    transform: MarkdownSerializerWithTransform<T>,\n    options: T,\n  ) {\n    const fns = MARKDOWN_SERIALIZER_TRANSFORMS.get(editor) ?? []\n    if (fns.find(fn => fn.transform === transform)) return\n    fns.push({\n      transform: transform as MarkdownSerializerWithTransform,\n      options: options as MarkdownSerializerOptions,\n    })\n    MARKDOWN_SERIALIZER_TRANSFORMS.set(editor, fns)\n  },\n\n  transformWithEditor(editor: Editor, node: Node = editor) {\n    const MarkdownSerializerEditor = Object.assign({}, MarkdownSerializer)\n    const transforms = MARKDOWN_SERIALIZER_TRANSFORMS.get(editor) ?? []\n\n    MarkdownSerializerEditor.with(withEditorSerializerTransform, { editor })\n\n    for (const { transform, options } of transforms) {\n      MarkdownSerializerEditor.with(transform, options)\n    }\n\n    return MarkdownSerializerEditor.transform(node)\n  },\n\n  _plugins: [] as MarkdownSerializerPlugin[],\n\n  withPlugin(plugin: MarkdownSerializerPlugin) {\n    this._plugins.push(plugin)\n  },\n\n  withEditorPlugin(editor: Editor, plugin: MarkdownSerializerPlugin) {\n    const plugins = MARKDOWN_SERIALIZER_PLUGINS.get(editor) ?? []\n    if (plugins.find(p => p === plugin)) return\n    plugins.push(plugin)\n    MARKDOWN_SERIALIZER_PLUGINS.set(editor, plugins)\n  },\n\n  toMarkdown(value: Content[], plugins: MarkdownSerializerPlugin[] = []) {\n    const extensions: Options[] = []\n    for (const plugin of this._plugins.concat(plugins)) {\n      if (!plugin.extensions) continue\n      if (Array.isArray(plugin.extensions)) extensions.push(...plugin.extensions)\n      else extensions.push(plugin.extensions)\n    }\n    return toMarkdown(\n      {\n        type: 'root',\n        children: value,\n      },\n      {\n        extensions,\n      },\n    )\n  },\n\n  toMarkdownWithEditor(editor: Editor, value: Content[]) {\n    const plugins = MARKDOWN_SERIALIZER_PLUGINS.get(editor) ?? []\n    return this.toMarkdown(value, plugins)\n  },\n}\n"],"mappings":"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","names":[]}