{"version":3,"sources":["https://lively-kernel.org/lively4/swd21-event-sourcing/src/components/widgets/lively-markdown.js"],"names":["Markdown","Morph","components","MarkdownIt","MarkdownItHashtag","MarkdownItTasks","MarkdownItAttrs","MarkdownItSourcemap","persistence","Strings","Upndown","pt","FileIndex","LivelyMarkdown","initialize","evaluated","Promise","resolve","resolveEvaluated","windowTitle","registerButtons","parameters","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","allScripts","queryAll","allPromises","map","all","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","current","db","files","each","file","url","startsWith","m","sleep","style","overflow","id","opacity","transition","notify","window","open","setContent","textContent","text","loadFile","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    \n    // all scripts are evaluated\n    this.evaluated = new Promise(resolve => {\n      this.resolveEvaluated = resolve\n    })\n    this.windowTitle = \"LivelyMarkdown\";\n    this.registerButtons();\n    this.parameters = {}\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    // for using markdown content as tools\n    var allScripts = lively.queryAll(root, \"lively-script\")\n    var allPromises = allScripts.map(ea => ea.evaluated)\n    await Promise.all(allPromises)\n    // lively.notify(\"[markdown] scripts evaluated: \" + allScripts.length + \"promises: \" + allPromises)\n    this.resolveEvaluated()\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      var text = await lively.files.loadFile(src)\n      return 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}"]}