{"version":3,"file":"XMarkdown.mjs","sources":["../../../../src/shapes/canvasx/XMarkdown.ts"],"sourcesContent":["import { classRegistry } from '../../ClassRegistry';\nimport { XTextbase } from '../canvasx/XTextbase';\nimport html2canvas from 'html2canvas';\nimport { FabricImage } from '../../shapes/Image';\nimport hljs from 'highlight.js'; // https://highlightjs.org\n\n//@ts-ignore\nimport markdownit from 'markdown-it';\n//@ts-ignore\nimport javascript from 'highlight.js/lib/languages/javascript';\nimport { WidgetMarkdownInterface, EntityKeys } from './type/widget.entity.markdown';\nimport { WidgetType } from './type/widget.type';\n\nhljs.registerLanguage('javascript', javascript);\n\n\n\nclass XMarkdown extends XTextbase implements WidgetMarkdownInterface {\n  public markdownText: string;\n  isEditing: boolean = false;\n  private renderedImage: FabricImage | null = null;\n  private md: any;\n\n  static type: WidgetType = 'XMarkdown';\n  static objType: WidgetType = 'XMarkdown';\n  constructor(text: string, options: WidgetMarkdownInterface) {\n\n    super(text, options);\n    this.markdownText = options?.markdownText || text;\n    this.objType = 'XMarkdown';\n    // full options list (defaults)\n    this.md = markdownit({\n      // Enable HTML tags in source\n      html: true,\n\n      // Use '/' to close single tags (<br />).\n      // This is only for full CommonMark compatibility.\n      xhtmlOut: false,\n\n      // Convert '\\n' in paragraphs into <br>\n      breaks: false,\n\n      // CSS language prefix for fenced blocks. Can be\n      // useful for external highlighters.\n      langPrefix: 'language-',\n\n      // Autoconvert URL-like text to links\n      linkify: false,\n\n      // Enable some language-neutral replacement + quotes beautification\n      // For the full list of replacements, see https://github.com/markdown-it/markdown-it/blob/master/lib/rules_core/replacements.mjs\n      typographer: true,\n\n      // Double + single quotes replacement pairs, when typographer enabled,\n      // and smartquotes on. Could be either a String or an Array.\n      //\n      // For example, you can use '«»„“' for Russian, '„“‚‘' for German,\n      // and ['«\\xA0', '\\xA0»', '‹\\xA0', '\\xA0›'] for French (including nbsp).\n      quotes: '“”‘’',\n\n      // Highlighter function. Should return escaped HTML,\n      // or '' if the source string is not changed and should be escaped externally.\n      // If result starts with <pre... internal wrapper is skipped.\n      highlight: function (str: string, lang: string) {\n        if (lang && hljs.getLanguage(lang)) {\n          try {\n            return hljs.highlight(str, { language: lang }).value;\n          } catch (__) { }\n        }\n\n        return ''; // use external default escaping\n      },\n    });\n    Object.assign(this, options);\n\n    this.on('editing:entered', this.onEditingEntered.bind(this));\n    this.on('editing:exited', this.onEditingExited.bind(this));\n    this.on('scaling', this.onScaling.bind(this));\n    this.on('resizing', this.onScaled.bind(this));\n    this.renderMarkdown();\n  }\n\n\n\n  private onEditingEntered() {\n    this.isEditing = true;\n    this.text = this.markdownText;\n    this.dirty = true;\n    this.canvas?.renderAll();\n  }\n\n  private onEditingExited() {\n    this.isEditing = false;\n    this.markdownText = this.text;\n    this.renderMarkdown();\n  }\n\n  private onScaling() {\n    this.renderMarkdown();\n    // Optional: You can add any logic needed during scaling\n  }\n\n  private onScaled() {\n    this.renderMarkdown();\n  }\n\n  async renderMarkdown() {\n    if (this.isEditing) return;\n\n    const html = this.md.render(this.markdownText);\n    this.parseHtmlToImage(html).then((img) => {\n      this.renderedImage = img;\n      this.dirty = true;\n      this.canvas?.renderAll();\n    });\n  }\n\n\n  getObject() {\n    const entityKeys: string[] = EntityKeys;\n    const result: Record<string, any> = {};\n\n    entityKeys.forEach((key) => {\n      if (key in this) {\n        result[key] = (this as any)[key];\n      }\n    });\n\n    return result;\n  }\n\n  private parseHtmlToImage(html: string): Promise<FabricImage> {\n    return new Promise((resolve) => {\n      const blob = new Blob([html], { type: 'text/html' });\n      const url = URL.createObjectURL(blob);\n\n      const iframe = document.createElement('iframe');\n      iframe.style.width = `${this.width}px`;\n      iframe.style.height = `${this.height}px`;\n      iframe.style.visibility = 'hidden';\n      iframe.style.position = 'absolute';\n      iframe.style.left = '-9999px';\n      document.body.appendChild(iframe);\n\n      iframe.onload = async () => {\n        if (iframe.contentDocument) {\n          const style = iframe.contentDocument.createElement('style');\n          style.textContent = `\n            body { \n              font-family: Arial, sans-serif; \n              font-size: 14px; \n              line-height: 1.6; \n              color: #333; \n              padding: 20px; \n              margin: 0;\n              width: ${this.width}px;\n              height: ${this.height}px;\n            }\n            h1, h2, h3, h4, h5, h6 { margin-top: 0; }\n            ul, ol { padding-left: 20px; }\n          /* Code block styling */\ncode {\n  background-color: #f5f5f5; /* Slightly lighter background for better contrast */\n  padding: 3px 5px; /* More padding for better spacing */\n  border-radius: 5px; /* Smoother border radius */\n  font-family: 'Courier New', Courier, monospace; /* Monospace font for code */\n}\n\npre {\n  background-color: #f5f5f5; /* Matching background color with inline code */\n  padding: 12px; /* Slightly more padding for comfort */\n  border-radius: 5px; /* Smoother border radius */\n  overflow-x: auto; /* Ensure horizontal scroll for long code lines */\n  font-family: 'Courier New', Courier, monospace; /* Monospace font for code */\n}\n\npre code {\n  display: block;\n}\n\n/* Table styling */\ntable {\n  border-collapse: collapse;\n \n  margin-bottom: 1em; /* Add some margin below tables */\n  font-family: Arial, sans-serif; /* Better font for readability */\n}\n\ntable, th, td {\n  border: 1px solid #ddd; /* Lighter border color for a cleaner look */\n}\n\nth, td {\n  padding: 10px; /* More padding for better spacing */\n  text-align: left;\n}\n\nth {\n  background-color: #f2f2f2; /* Slight background color for headers */\n  font-weight: bold; /* Bold headers */\n}\n\ntd {\n  background-color: #fff; /* Ensure a white background for table cells */\n}\n\n/* Additional table row hover effect */\ntr:hover {\n  background-color: #f1f1f1; /* Highlight row on hover */\n}\n          `;\n          iframe.contentDocument.head.appendChild(style);\n        }\n\n        iframe.contentDocument!.body.innerHTML = html;\n\n        await new Promise((resolve) => setTimeout(resolve, 100)); // Small delay to ensure styles are applied\n\n        const canvas = await html2canvas(\n          iframe.contentDocument?.body as HTMLElement\n        );\n        const img = await FabricImage.fromURL(canvas.toDataURL());\n        img.set({\n          left: this.left,\n          top: this.top,\n          width: this.width,\n          height: this.height,\n          scaleX: 1,\n          scaleY: 1,\n        });\n        resolve(img);\n\n        document.body.removeChild(iframe);\n        URL.revokeObjectURL(url);\n      };\n\n      iframe.src = url;\n    });\n  }\n\n  setMarkdown(newMarkdownText: string) {\n    this.markdownText = newMarkdownText;\n    if (this.isEditing) {\n      this.text = this.markdownText;\n      this.dirty = true;\n    } else {\n      this.renderMarkdown();\n    }\n    this.canvas?.renderAll();\n  }\n\n  _render(ctx: CanvasRenderingContext2D) {\n    if (this.isEditing) {\n      super._render(ctx);\n    } else if (this.renderedImage) {\n      this.renderedImage._render(ctx);\n    }\n  }\n}\n\nexport { XMarkdown };\n\nclassRegistry.setClass(XMarkdown);\n"],"names":["hljs","registerLanguage","javascript","XMarkdown","XTextbase","constructor","text","options","_defineProperty","markdownText","objType","md","markdownit","html","xhtmlOut","breaks","langPrefix","linkify","typographer","quotes","highlight","str","lang","getLanguage","language","value","__","Object","assign","on","onEditingEntered","bind","onEditingExited","onScaling","onScaled","renderMarkdown","_this$canvas","isEditing","dirty","canvas","renderAll","render","parseHtmlToImage","then","img","_this$canvas2","renderedImage","getObject","entityKeys","EntityKeys","result","forEach","key","Promise","resolve","blob","Blob","type","url","URL","createObjectURL","iframe","document","createElement","style","width","concat","height","visibility","position","left","body","appendChild","onload","_iframe$contentDocume","contentDocument","textContent","head","innerHTML","setTimeout","html2canvas","FabricImage","fromURL","toDataURL","set","top","scaleX","scaleY","removeChild","revokeObjectURL","src","setMarkdown","newMarkdownText","_this$canvas3","_render","ctx","classRegistry","setClass"],"mappings":"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"}