{"version":3,"sources":["../src/html.ts"],"sourcesContent":["import { Editor, Descendant, Element, Text, DOMNode, isDOMText } from '@editablejs/models'\n\nexport interface HTMLDeserializerOptions {\n  element?: Omit<Element, 'children'>\n  text?: Omit<Text, 'text'>\n  matchNewline?: true | ((text: string) => boolean)\n}\n\nexport type HTMLDeserializerTransform = typeof HTMLDeserializer.transform\n\nexport type HTMLDeserializerWithTransform<T = HTMLDeserializerOptions> = (\n  next: HTMLDeserializerTransform,\n  deserializer: typeof HTMLDeserializer,\n  options: T,\n) => HTMLDeserializerTransform\n\nexport interface EditorHTMLDeserializerWithTransform<T = HTMLDeserializerOptions> {\n  transform: HTMLDeserializerWithTransform<T>\n  options: T\n}\n\nconst HTML_DESERIALIZER_TRANSFORMS: WeakMap<Editor, EditorHTMLDeserializerWithTransform[]> =\n  new WeakMap()\n\nexport const HTMLDeserializer = {\n  transform(node: DOMNode, options: HTMLDeserializerOptions = {}): Descendant[] {\n    const { element, text, matchNewline } = options\n    if (isDOMText(node)) {\n      const content = node.textContent ?? ''\n      if (\n        matchNewline &&\n        /^\\s{0,}(\\r\\n|\\n)+\\s{0,}$/.test(content) &&\n        (typeof matchNewline === 'boolean' || matchNewline(content))\n      ) {\n        return []\n      }\n      const dataArray = content.split(/\\r\\n|\\n/)\n      return dataArray.map(data => ({ ...text, text: data }))\n    }\n\n    const children = []\n    for (const child of node.childNodes) {\n      children.push(...this.transform(child, { text }))\n    }\n\n    switch (node.nodeName) {\n      case 'P':\n      case 'DIV':\n        if (children.length === 0) children.push({ text: '' })\n        return [{ ...element, type: 'paragraph', children }]\n      default:\n        return children\n    }\n  },\n\n  with<T = HTMLDeserializerOptions>(transform: HTMLDeserializerWithTransform<T>, options: T) {\n    const { transform: t } = this\n    this.transform = transform(t.bind(this), this, options)\n  },\n\n  withEditor<T = HTMLDeserializerOptions>(\n    editor: Editor,\n    transform: HTMLDeserializerWithTransform<T>,\n    options: T,\n  ) {\n    const fns = HTML_DESERIALIZER_TRANSFORMS.get(editor) ?? []\n    if (fns.find(fn => fn.transform === transform)) return\n    fns.push({\n      transform: transform as HTMLDeserializerWithTransform,\n      options: options as HTMLDeserializerOptions,\n    })\n    HTML_DESERIALIZER_TRANSFORMS.set(editor, fns)\n  },\n\n  transformWithEditor(editor: Editor, node: DOMNode, options: HTMLDeserializerOptions = {}) {\n    const HTMLDeserializerEditor = Object.assign({}, HTMLDeserializer)\n    const transforms = HTML_DESERIALIZER_TRANSFORMS.get(editor) ?? []\n\n    for (const { transform, options } of transforms) {\n      HTMLDeserializerEditor.with(transform, options)\n    }\n\n    return HTMLDeserializerEditor.transform(node, options)\n  },\n}\n"],"mappings":";AAAA,SAAqD,iBAAiB;AAqBtE,IAAM,+BACJ,oBAAI,QAAQ;AAEP,IAAM,mBAAmB;AAAA,EAC9B,UAAU,MAAe,UAAmC,CAAC,GAAiB;AAC5E,UAAM,EAAE,SAAS,MAAM,aAAa,IAAI;AACxC,QAAI,UAAU,IAAI,GAAG;AACnB,YAAM,UAAU,KAAK,eAAe;AACpC,UACE,gBACA,2BAA2B,KAAK,OAAO,MACtC,OAAO,iBAAiB,aAAa,aAAa,OAAO,IAC1D;AACA,eAAO,CAAC;AAAA,MACV;AACA,YAAM,YAAY,QAAQ,MAAM,SAAS;AACzC,aAAO,UAAU,IAAI,WAAS,EAAE,GAAG,MAAM,MAAM,KAAK,EAAE;AAAA,IACxD;AAEA,UAAM,WAAW,CAAC;AAClB,eAAW,SAAS,KAAK,YAAY;AACnC,eAAS,KAAK,GAAG,KAAK,UAAU,OAAO,EAAE,KAAK,CAAC,CAAC;AAAA,IAClD;AAEA,YAAQ,KAAK,UAAU;AAAA,MACrB,KAAK;AAAA,MACL,KAAK;AACH,YAAI,SAAS,WAAW;AAAG,mBAAS,KAAK,EAAE,MAAM,GAAG,CAAC;AACrD,eAAO,CAAC,EAAE,GAAG,SAAS,MAAM,aAAa,SAAS,CAAC;AAAA,MACrD;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEA,KAAkC,WAA6C,SAAY;AACzF,UAAM,EAAE,WAAW,EAAE,IAAI;AACzB,SAAK,YAAY,UAAU,EAAE,KAAK,IAAI,GAAG,MAAM,OAAO;AAAA,EACxD;AAAA,EAEA,WACE,QACA,WACA,SACA;AACA,UAAM,MAAM,6BAA6B,IAAI,MAAM,KAAK,CAAC;AACzD,QAAI,IAAI,KAAK,QAAM,GAAG,cAAc,SAAS;AAAG;AAChD,QAAI,KAAK;AAAA,MACP;AAAA,MACA;AAAA,IACF,CAAC;AACD,iCAA6B,IAAI,QAAQ,GAAG;AAAA,EAC9C;AAAA,EAEA,oBAAoB,QAAgB,MAAe,UAAmC,CAAC,GAAG;AACxF,UAAM,yBAAyB,OAAO,OAAO,CAAC,GAAG,gBAAgB;AACjE,UAAM,aAAa,6BAA6B,IAAI,MAAM,KAAK,CAAC;AAEhE,eAAW,EAAE,WAAW,SAAAA,SAAQ,KAAK,YAAY;AAC/C,6BAAuB,KAAK,WAAWA,QAAO;AAAA,IAChD;AAEA,WAAO,uBAAuB,UAAU,MAAM,OAAO;AAAA,EACvD;AACF;","names":["options"]}