{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-livelyenergy/src/components/widgets/lively-markdown.js"],"names":["Markdown","Morph","components","MarkdownIt","MarkdownItHashtag","MarkdownItTasks","MarkdownItAttrs","MarkdownItSourcemap","persistence","Strings","Upndown","pt","FileIndex","LivelyMarkdown","initialize","windowTitle","registerButtons","updateView","then","getAttribute","startPresentation","_attrObserver","MutationObserver","mutations","forEach","mutation","type","attributeChangedCallback","attributeName","oldValue","target","observe","attributes","attr","oldVal","newVal","method","toUpperCaseFirst","onContenteditableChanged","value","get","setAttribute","renderMarkdown","root","content","md","html","xhtmlOut","breaks","langPrefix","linkify","typographer","highlight","str","lang","hljs","getLanguage","configure","tabReplace","__","utils","escapeHtml","use","renderer","rules","hashtag_open","tokens","idx","tagName","match","configPresentation","replace","htmlSource","render","original","args","tmpDiv","document","createElement","innerHTML","replaceImageTagsWithSpecificTags","dir","getDir","lively","fixLinks","path","followPath","beatifyInplaceHashtagNavigation","childNodes","ea","appendChild","querySelectorAll","disabled","addEventListener","evt","checked","removeAttribute","container","query","hidden","fillTemplateStyles","parseAndReplaceLatex","loadUnresolved","initLivelyObject","getContent","imgTag","noFileEnding","src","figure","name","update","parentElement","insertBefore","remove","importElement","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","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":["/*MD # Markdown \n\n[architecture](browse://doc/architecture/markdown.md)\n\nMD*/\n\n\nimport Markdown from \"src/client/markdown.js\"\n\nimport 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\"\n\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\"\nimport MarkdownItSourcemap from \"src/external/markdown-it-sourcemap.js\"\n\n// import MarkdownItContainer from \"src/external/markdown-it-container.js\"\n// see https://www.npmjs.com/package/markdown-it-container\n\nimport '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    \n    \n    this.updateView().then(() => {\n      if (this.getAttribute(\"mode\") == \"presentation\") {\n        this.startPresentation()\n      }\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  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 renderMarkdown(root, content) {\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    md.use(MarkdownItSourcemap)\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    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    // replace only scripts, that are actual scripts\n    htmlSource = htmlSource.replace(/<script(.*?)>((:?\\n|.)*?)<\\/script>/gm, (original, args, content) =>          \n          args.match(`type=`) ? original : `<lively-script${args}><script>${content}</script></lively-script>`)\n    \n    var tmpDiv = document.createElement(\"div\")\n    tmpDiv.innerHTML = htmlSource // so we still have some control over it\n    \n    await this.replaceImageTagsWithSpecificTags(tmpDiv)\n    \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    \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    var container = lively.query(this, \"lively-container\")\n    root.hidden = true\n    await lively.fillTemplateStyles(root, \"\", container && container.getDir())\n    root.hidden = false\n    \n    // custom lively modifications... second round of parsing content in the DOM\n    Markdown.parseAndReplaceLatex(root)\n    \n    await components.loadUnresolved(root, true, \"lively-markdown.js\", true);    \n    await persistence.initLivelyObject(root)\n  }\n  \n  async updateView() {\n    return this.renderMarkdown(this.get(\"#content\"), await this.getContent())\n  }\n\n  async replaceImageTagsWithSpecificTags(tmpDiv) {\n    \n    for(let imgTag of tmpDiv.querySelectorAll(\"img\")) {\n      var noFileEnding = !imgTag.src.match(/\\.[A-Za-z0-9]+$/) \n      if (noFileEnding || imgTag.src.match(/\\.drawio$/) ) {\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-drawio></lively-drawio>)\n        \n        for(let attr of imgTag.attributes) {\n          if (attr.name == \"src\") {\n            // use attributes to retain RAW data\n            let src = imgTag.getAttribute(\"src\")  + (noFileEnding ? \".drawio\" : \"\")\n            // console.log(\"REPLACE DRAWIO: \" + src)\n            figure.setAttribute(\"src\",  src)\n          } else {\n            figure.setAttribute(attr.name, attr.value)\n          }\n        }\n        figure.update() \n        imgTag.parentElement.insertBefore(figure, imgTag)\n        imgTag.remove()\n      } else if (noFileEnding || imgTag.src.match(/\\.html$/) ) {\n        // console.log(\"[lively-markdown] create lively-import\")\n        var importElement = await (<lively-import></lively-import>)\n        for(let attr of imgTag.attributes) {\n          if (attr.name == \"src\") {\n            let src = imgTag.getAttribute(\"src\")\n            importElement.setAttribute(\"src\",  src)\n          } else {\n            importElement.setAttribute(attr.name, attr.value)\n          }\n        }\n        imgTag.parentElement.insertBefore(importElement, imgTag)\n        imgTag.remove()\n      }\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![](https://lively-kernel.org/lively4/lively4-jens/demos/sample.drawio)\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  \n}"]}