{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-drawio/src/components/widgets/lively-markdown.js"],"names":["Morph","components","MarkdownIt","MarkdownItHashtag","MarkdownItTasks","MarkdownItAttrs","highlight","persistence","Strings","Upndown","pt","FileIndex","LivelyMarkdown","initialize","windowTitle","registerButtons","updateView","getAttribute","startPresentation","_attrObserver","MutationObserver","mutations","forEach","mutation","type","attributeChangedCallback","attributeName","oldValue","target","observe","attributes","attr","oldVal","newVal","method","toUpperCaseFirst","onContenteditableChanged","value","get","setAttribute","md","html","xhtmlOut","breaks","langPrefix","linkify","typographer","str","lang","hljs","getLanguage","configure","tabReplace","__","utils","escapeHtml","use","renderer","rules","hashtag_open","tokens","idx","tagName","content","match","getContent","configPresentation","replace","htmlSource","render","tmpDiv","document","createElement","innerHTML","dir","getDir","lively","fixLinks","path","followPath","beatifyInplaceHashtagNavigation","replaceImageTagsWithSpecificTags","root","childNodes","ea","appendChild","querySelectorAll","disabled","addEventListener","evt","checked","removeAttribute","loadUnresolved","initLivelyObject","imgTag","src","figure","create","name","parentElement","insertBefore","remove","eaLink","searchContainerAnchor","searchContainer","setPosition","shadow","attachShadow","mode","lastEntered","lastLeft","Date","now","lively4url","result","searchString","href","Promise","all","current","db","files","each","file","url","startsWith","m","sleep","style","overflow","id","opacity","transition","notify","window","open","setContent","textContent","fetch","then","r","text","setDir","setSrc","htmlAsMarkdownSource","markdownConverter","tabindent","bullet","source","convert","keepHtml","getSrc","onPresentationButton","stopPresentation","comp","openIn","convertSiblings","start","livelyExample","livelyExample3","livelyExample2"],"mappings":"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","file":"lively-markdown.js","sourcesContent":["import Morph from 'src/components/widgets/lively-morph.js';\nimport components from \"src/client/morphic/component-loader.js\";\nimport MarkdownIt from \"src/external/markdown-it.js\"\nimport MarkdownItHashtag from \"src/external/markdown-it-hashtag.js\"\nimport MarkdownItTasks from \"src/external/markdown-it-tasks.js\"\nimport MarkdownItAttrs from \"src/external/markdown-it-attrs.js\"\n\n// import MarkdownItContainer from \"src/external/markdown-it-container.js\"\n// see https://www.npmjs.com/package/markdown-it-container\n\nimport highlight from 'src/external/highlight.js';\nimport persistence from 'src/client/persistence.js';\nimport Strings from 'src/client/strings.js';\nimport Upndown from 'src/external/upndown.js';\n\nimport {pt} from 'src/client/graphics.js';\n\n\nimport FileIndex from 'src/client/fileindex.js'\n\nexport default class LivelyMarkdown extends Morph {\n  async initialize() {\n    this.windowTitle = \"LivelyMarkdown\";\n    this.registerButtons();\n    await this.updateView();\n\n    if (this.getAttribute(\"mode\") == \"presentation\") {\n      this.startPresentation()\n    }\n    this._attrObserver = new MutationObserver((mutations) => {\n    mutations.forEach((mutation) => {  \n        if(mutation.type == \"attributes\") {\n          // console.log(\"observation\", mutation.attributeName,mutation.target.getAttribute(mutation.attributeName));\n          this.attributeChangedCallback(\n            mutation.attributeName,\n            mutation.oldValue,\n            mutation.target.getAttribute(mutation.attributeName))\n        }\n      });\n    });\n    this._attrObserver.observe(this, { attributes: true });\n    \n  }\n  attributeChangedCallback(attr, oldVal, newVal) {\n    var method = \"on\" + Strings.toUpperCaseFirst(attr) + \"Changed\"\n    if (this[method]) this[method](newVal, oldVal)\n  }\n  \n  onContenteditableChanged(value, oldVal) {\n    this.get(\"#content\").setAttribute(\"contenteditable\", value)\n  }\n  \n  async updateView() {\n    var md = new MarkdownIt({\n      html:         true,        // Enable HTML tags in source\n      xhtmlOut:     false,        // Use '/' to close single tags (<br />).\n                                  // This is only for full CommonMark compatibility.\n      breaks:       false,        // Convert '\\n' in paragraphs into <br>\n      langPrefix:   'language-',  // CSS language prefix for fenced blocks. Can be\n                                  // useful for external highlighters.\n      linkify:      false,        // Autoconvert URL-like text to links\n    \n      // Enable some language-neutral replacement + quotes beautification\n      typographer:  false,\n    \n      \n      // Highlighter function. Should return escaped HTML,\n      // or '' if the source string is not changed and should be escaped externaly.\n      // If result starts with <pre... internal wrapper is skipped.\n      highlight:  function (str, lang) {\n        if (lang && hljs.getLanguage(lang)) {\n          try {\n            hljs.configure({tabReplace: '  '})\n            return hljs.highlight(lang, str, true).value\n          } catch (__) {}\n        }\n\n        return '<pre class=\"hljs\"><code>' + md.utils.escapeHtml(str) + '</code></pre>';\n      }\n    });  \n    md.use(MarkdownItHashtag)\n    md.use(MarkdownItTasks)\n    md.use(MarkdownItAttrs)\n    \n    // md.use(MarkdownItContainer)\n    \n    md.renderer.rules.hashtag_open  = function(tokens, idx) {\n      var tagName = tokens[idx].content \n      if(tagName.match(/^[A-Za-z][A-Za-z0-9]+/))\n        // return `<a href=\"javascript:lively.openSearchWidget('#${tagName}')\" class=\"tag\">`;\n        return `<a href=\"search://#${tagName}\" class=\"tag\">`;\n      else\n        return `<a href=\"javascript:lively.openIssue('${tagName}')\" class=\"issue\">`;\n\n    }\n    var content = await this.getContent()\n    if (!content) return;\n    if (content.match(/markdown-config .*presentation=true/)) {\n      var configPresentation = true \n    }\n    \n    content = content\n      .replace(/<lively-script><script>/g,\"<script>\")\n      .replace(/<\\/script><\\/lively-script>/g,\"</script>\")\n      .replace(/<lively-script>/g,\"<script>\")\n      .replace(/<\\/lively-script>/g,\"</script>\")\n\n    // var enhancedMarkdown = lively.html.enhanceMarkdown(content);\n    // var htmlSource = md.render(enhancedMarkdown);\n    var htmlSource = md.render(content);\n    htmlSource = htmlSource\n      .replace(/<script>/g,\"<lively-script><script>\")\n      .replace(/<\\/script>/g,\"</script></lively-script>\")\n    \n    var tmpDiv = document.createElement(\"div\")\n    tmpDiv.innerHTML = htmlSource // so we still have some control over it\n    var dir = this.getDir()\n    if (dir) {\n      lively.html.fixLinks([tmpDiv], this.getDir(), path => this.followPath(path));\n    }\n    \n    this.beatifyInplaceHashtagNavigation(tmpDiv)\n    this.replaceImageTagsWithSpecificTags(tmpDiv)\n    \n    var root = this.get(\"#content\")\n    root.innerHTML = \"\";\n    tmpDiv.childNodes.forEach(ea => {\n      root.appendChild(ea)\n    })\n    \n    \n    root.querySelectorAll(\"input[type=checkbox]\").forEach(ea => {\n      ea.disabled = false;\n      ea.addEventListener(\"click\", evt => {\n        if ( ea.checked) {\n          ea.setAttribute(\"checked\", \"true\")\n        } else {\n          ea.removeAttribute(\"checked\")\n        }\n      })\n    })\n    \n    \n    if (configPresentation)\n      this.startPresentation()\n\n    // #TODO: fixme\n    //root.querySelectorAll(\"pre code\").forEach( block => {\n    //  highlight.highlightBlock(block);\n    //});\n    \n    await components.loadUnresolved(root, true, \"lively-markdown.js\", true);    \n    await persistence.initLivelyObject(root)\n  }\n\n  async replaceImageTagsWithSpecificTags(tmpDiv) {\n    \n    tmpDiv.querySelectorAll(\"img\").forEach(async (imgTag) => {\n      if (!imgTag.src.match(/\\.[A-Za-z0-9]+$/)) {\n        // we have to guess or look what img could have been meant\n        // (a) lets see if is a drawio figuure\n        // #TODO check if there is actually an pdf\n        var figure = await lively.create(\"lively-drawio\", tmpDiv)\n        \n        for(var attr of imgTag.attributes) {\n          if (attr.name == \"src\") {\n            figure.src = imgTag.src  + \".xml\"\n          } else {\n            figure.setAttribute(attr.name, attr.value)\n          }\n        }\n        imgTag.parentElement.insertBefore(figure, imgTag)\n        imgTag.remove()\n      }\n    })\n  }\n  \n  beatifyInplaceHashtagNavigation(tmpDiv) {\n    /* Beatify Inplace Hashtag Navigation #TODO #Refactor #MoveToBetterPlace */\n    tmpDiv.querySelectorAll(\"a.tag\").forEach(eaLink => {\n      // #Example for absolute CSS positioning #Hack: \n      // (1) the relative \"span\" itself is positioned through the dynamic layout without taking space itself\n      // (2) the absolute \"div\" element than has total freedom to posiiton itself relative to (1)\n      var searchContainerAnchor  = <span style=\"position:relative; width: 0; height: 0\"></span>\n      var searchContainer = <div style=\"width:500px; height:200px; overflow: auto; background-color:lightgray; z-index:1000\"></div>\n      lively.setPosition(searchContainer,pt(0,0)) // make absolute...\n      searchContainerAnchor.appendChild(searchContainer)\n      \n      var shadow = searchContainer.attachShadow({mode: 'open'});     \n      var lastEntered\n      var lastLeft\n      eaLink.addEventListener(\"mouseenter\", async () => {\n        lastEntered = Date.now()\n\n        var root = lively4url\n        var result = \"\"\n        var searchString = eaLink.href.replace(\"search://\",\"\")\n        await Promise.all([FileIndex.current().db.files.each(file => {\n          if (file.url.startsWith(root) && file.content) {\n            var m = file.content.match(searchString)\n            if (m) {\n               result += `<li><a href=\"${file.url}#${searchString.replace(/#/g,\"\")}\">${file.url.replace(lively4url,\"\")}</a></li>`\n            }\n          }\n        }), lively.sleep(100)])\n\n        if (lastLeft > lastEntered) return\n\n        // document.body.appendChild(searchContainer)\n        eaLink.appendChild(searchContainerAnchor)        \n        \n        // lively.setGlobalPosition(searchContainer, lively.getGlobalPosition(eaLink).addPt(pt(0,15)))\n        \n        // lively.setPosition(searchContainer, pt(0,0), \"relative\")\n        searchContainer.style.overflow = \"visible\"\n        \n        // #Continue here!!! getPosition does not work on non absolute objects...\n        // lively.setPosition(searchContainer, lively.getBounds(eaLink).topLeft().addPt(pt(0,15)))\n        searchContainer.innerHTML = \"search\"\n        // searchContainer.isMetaNode = true\n        searchContainer.id = \"lively-search-container\"\n        shadow.innerHTML = \"\"\n        \n        // ok, lets try some eye candy\n        searchContainer.style.opacity = 0\n        searchContainer.style.transition = \"opacity 0.5s ease-in-out\";\n        searchContainer.style.opacity = 0.8\n        \n        shadow.innerHTML = `<ol style=\"font-size:12pt\">${result}<ol>`\n        lively.html.fixLinks(shadow.childNodes, this.getDir(), path => this.followPath(path))\n      })\n      \n      eaLink.addEventListener(\"mouseleave\", async () => {\n        lastLeft = Date.now()\n        await lively.sleep(500)\n        if (lastEntered > lastLeft) return // we came back\n\n        searchContainer.style.transition = \"opacity 0.5s ease-in-out\";\n        searchContainer.style.opacity = 0\n        \n        await lively.sleep(1000)\n        searchContainerAnchor.remove()\n      })\n    })\n  }\n  \n  followPath(path) {\n    lively.notify(\"follow \" + path)\n    window.open(path)\n  }\n\n  async setContent(content) {\n    this.textContent = content\n    return this.updateView()\n  }\n  \n  async getContent() {\n    var src = this.getAttribute(\"src\")\n    if (src) {\n      return fetch(src).then(r => r.text())\n    }\n    return this.textContent\n  }\n  \n  setDir(dir) {\n    this.setAttribute(\"dir\", dir) \n  }\n  \n  getDir() {\n    return this.getAttribute(\"dir\")\n  }\n  \n  async setSrc(src) {\n    this.setAttribute(\"src\", src);\n    return this.updateView()\n  }\n  \n  async htmlAsMarkdownSource() {\n    var htmlSource = this.get(\"#content\").innerHTML\n    var markdownConverter = new Upndown()\n    markdownConverter.tabindent = \"  \"\n    markdownConverter.bullet = \"- \"\n    \n    var source = await markdownConverter.convert(htmlSource, {\n      keepHtml: true,\n    })\n    return source\n  }\n  \n  getSrc() {\n    return this.getAttribute(\"src\")\n  }\n\n  onPresentationButton() {\n    lively.notify(\"presentation: \" + this.getAttribute(\"mode\"))\n    if (this.getAttribute(\"mode\") == \"presentation\") {\n      this.stopPresentation()      \n    } else {\n      this.startPresentation()\n    }\n    \n  }\n  \n  async startPresentation() {\n    this.setAttribute(\"mode\", \"presentation\")\n    if (this.parentElement && this.parentElement.tagName == \"LIVELY-CONTAINER\") {\n      this.parentElement.setAttribute(\"mode\", \"presentation\")\n    }\n    if (this.get(\"lively-presentation\")) {\n      return this.get(\"lively-presentation\")\n    }\n    \n    var comp = document.createElement(\"lively-presentation\")\n    await lively.components.openIn(this.get(\"#content\"), comp)\n    comp.convertSiblings()\n    comp.start();\n\n    // if (this.get(\"#presentationButton\"))\n    //   this.get(\"#presentationButton\").remove()\n\n    return comp\n  }\n\n  async stopPresentation() {\n    this.setAttribute(\"mode\", \"\")\n    if (this.parentElement.tagName == \"LIVELY-CONTAINER\") {\n      this.parentElement.setAttribute(\"mode\", \"\")\n    }\n    this.updateView()\n    \n  }\n\n  \n  livelyExample() {\n    this.setDir(lively4url + \"/docs/\")\n    return this.setContent(`\n# a script\n\n<script>\nlively.notify(\"scripts still run\")\n</script>\n\n\\`\\`\\`javascript {.foo}\nfunction foo() {\n  var a = \"hello\"\n  return a + a\n}\n\\`\\`\\`\n\n## Foo {.blub style=\"background-color:yellow\"}\n\nThis is a #Hashtag and\n\nIt goes on an on!\n\n`)\n  }\n  \n  async livelyExample3() {\n    await this.setSrc(lively4url + \"/README.md\")\n    \n  }\n \n  livelyExample2() {\n    this.setDir(lively4url + \"/docs/\")\n    return this.setContent(`\n# Hello World\n\n- list item 1 [a link](\"markdown.md\")\n- list item 2\n\n`)\n  }\n\n \n  \n}"]}