{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-stable//src/client/markdown.js"],"names":["Strings","_","Markdown","parseAndReplaceTextNode","ea","eaChild","regex","func","s","textContent","m","RegExp","replace","exec","replacement","undefined","isString","Text","insertBefore","slice","index","rest","length","remove","lastIndex","parseAndReplace","element","all","concat","Array","from","querySelectorAll","childNodes","e","console","error","parseAndReplaceBibrefs","link","evt","preventDefault","stopPropagation","lively","openBrowser","parseAndReplaceLabels","contextElement","localName","id","anchor","parseAndReplaceMiscLatex","parseAndReplaceFigures","container","query","baseDir","getDir","parseAndReplaceListings","pre","url","description","fetch","then","r","status","text","parseAndReplaceFigureRefs","forEach","name","getAttribute","titleString","title","parentElement","appendChild","parseAndReplaceHeadings","allNodesBetween","startNode","endNode","nodes","node","push","nextSibling","parseAndReplaceFootenotes","count","footnotes","stack","footnote","content","last","pop","marker","document","createElement","region","footnotesDiv","map","extractReferences","source","matchAll","parseAndReplaceLatex","_parsedLatex"],"mappings":"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","file":"markdown.js","sourcesContent":["/*MD # Markdown  MD*/\n\n\n/*MD ## Ebedded Latex MD*/\n/*MD \n<style>* { background-color: lightgray }</style>\n\n### Example\n\n![TestFigure](../../media/drawio \"A figure created with drawio.\")\n\nAnd look also at Figure @fig:TestFigure\n\n```javascript\nvar a = \"hello\"\n```\nThis is a reference to a paper [@Rein2016LLP] and this is a footnote^[https://d3js.org/]. \n\n<script>\n// #TODO lively-script gets executed very often in this context!\nimport Markdown from \"src/client/markdown.js\"\nMarkdown.parseAndReplaceLatex(this.parentElement)    \n</script>\n\nMD*/\nimport Strings from \"src/client/strings.js\"\nimport _ from 'src/external/lodash/lodash.js' \n\nexport default class Markdown {\n\n  \n  \n  // #helper \n  static parseAndReplaceTextNode(ea, eaChild,  regex, func) {\n    var s = eaChild.textContent\n    var m;\n    regex = new RegExp(regex)\n    var replace = () => {\n      m  = regex.exec(s)\n      if (m) {\n        var replacement = func(m, ea)\n        if (replacement !== undefined) {\n          if (_.isString(replacement)) {\n            replacement = new Text(replacement)\n          }\n          \n          ea.insertBefore(new Text(s.slice(0, m.index )), eaChild)\n          ea.insertBefore(replacement, eaChild)\n          var rest = new Text(s.slice(m.index + m[0].length, s.length))\n          ea.insertBefore(rest, eaChild)\n          eaChild.remove()\n          this.parseAndReplaceTextNode(ea, rest,  regex, func) // go on with the rest...\n        } else {\n          if (regex.lastIndex) {\n            replace()  \n          }\n        }              \n      }\n    }\n    replace()\n  }\n  \n  \n  // #helper \n  static parseAndReplace(element, regex, func) {\n    var all = [element].concat(Array.from(element.querySelectorAll(\"*\")))\n    // lively.notify(\"parse \" + all.length + \" elements.\")\n    for(var ea of all) {\n      // if (ea.localName == \"code\" || ea.localName == \"pre\") return; \n      try {\n        // lively.showElement(ea)\n        if (!ea.childNodes) continue; \n          \n        for(var eaChild of ea.childNodes) {\n          if (eaChild instanceof Text) {\n            this.parseAndReplaceTextNode(ea, eaChild, regex, func)\n          }\n        }        \n      } catch(e) {\n        console.error(e)\n      }\n    }\n  }\n\n  static parseAndReplaceBibrefs(element) {\n    \n    this.parseAndReplace(element, /\\@([A-Za-z0-9_]+)/g, (m) => {\n      var link = <a click={evt => {\n        evt.preventDefault(); \n        evt.stopPropagation();\n        lively.openBrowser(\"bib://\" + m[1])\n      }} >{m[1]}</a> // href={\"bib://\" +m[1]}\n      return link \n    })\n  }\n  \n  static parseAndReplaceLabels(element) {\n    \n    this.parseAndReplace(element, /\\\\label({[^}]+})?/g, (m, contextElement) => {\n      if (contextElement.localName !== \"p\") return \n      \n      var id = \"undefined\" // the id is allreay \n      var anchor = <a click={evt => {\n      }} id={id}></a>\n      return anchor \n    })\n  }\n  static parseAndReplaceMiscLatex(element) {\n    this.parseAndReplace(element, /(\\\\[a-z]+({[^}]+})?(\\[[^\\]]+\\])?)/g, (m, contextElement) => {\n      if (contextElement.localName !== \"p\") return \"\"\n      \n      return <span class=\"stripped\" latex={m[1]}></span> \n    })\n  }\n \n   static parseAndReplaceFigures(element) {\n    var container = lively.query(element, \"lively-container\")\n    var baseDir = container ? container.getDir() : \"\"\n    this.parseAndReplace(element, /\\\\includegraphics\\[[^\\]]*\\]{([^}]+)\\}/g, (m) => <div><img src={baseDir + m[1]}></img></div>)\n    this.parseAndReplace(element, /\\\\caption\\[[^\\]]*\\]{([^}]+)\\}/g, (m) => <div>Figure: {m[1]}</div>)\n  }\n  \n  \n  static parseAndReplaceListings(element) {\n    var container = lively.query(element, \"lively-container\")\n    var baseDir = container ? container.getDir() : \"\"\n    this.parseAndReplace(element, /(?:^|\\n)\\/([^ ]+) \"([^\"]*)\"/g, (m) => { \n      var pre = <pre>LOADING...</pre>\n      var url = baseDir + m[1];\n      var description = m[2];\n      fetch(url).then(async r => {\n        \n        if (r.status == 200) {\n          pre.textContent = await r.text()\n        } else {\n          pre.textContent = \"Could not load \" + url\n        }\n      })\n      return <div>{pre}<p><b>Listing:</b> {description} </p></div> })\n  }\n \n  \n  static parseAndReplaceFigureRefs(element) {\n    element.querySelectorAll(\"lively-drawio\").forEach(ea => {\n      var name = ea.getAttribute(\"alt\")\n      if (name && name !== null) {\n        var titleString = ea.getAttribute(\"title\")\n        if (titleString == null) titleString = \"\" \n        var title = <div class=\"figuretitle\"><a id={ea.getAttribute(\"alt\")}></a><b>Figure {ea.getAttribute(\"alt\")}. </b>{titleString}</div>\n        ea.parentElement.appendChild(title)        \n      }\n    })\n    \n    // late parse and convert latex figure references\n    this.parseAndReplace(element, /@fig:([A-Za-z0-9]+)/g, (m) => <a href={\"#\" +m[1]}>{m[1]}</a>)\n    this.parseAndReplace(element, /\\\\(?:auto)?ref\\{([^}]+)\\}/g, (m) => <a href={\"#\" +m[1]}>{m[1]}</a>)\n  }\n  \n  \n  static parseAndReplaceHeadings(element) {\n    this.parseAndReplace(element, /\\\\paragraph\\{([^}]+)\\}/g, (m) => <b>{m[1]}</b>)\n  }\n                         \n  static allNodesBetween(startNode, endNode) {\n    var nodes = [] \n    var node = startNode\n    while(node && node != endNode) {\n      if (node !== startNode) nodes.push(node)\n      node = node.nextSibling\n    }\n   \n    return nodes\n  }\n    \n  static parseAndReplaceFootenotes(element) {\n    var count = 1\n    var footnotes = []\n    // #TODO what about markup in that markup?: ^[*Exposé* shows an overview ]\n    /*MD <browse://../Lively4DevelopmentExperience/content/Discussion.md> MD*/\n    \n    var stack = []\n    \n    // hacky hacky hack hack hack!\n    this.parseAndReplace(element, /((\\^\\[)|\\])/g, (m) => {\n      if (m[1] == \"^[\") {\n        var footnote = {index: count++, content: \"\", id() {  return \"footnote_\" + this.index} }\n        footnotes.push(footnote)\n        let link = <sup><a href={\"#\" + footnote.id()}>{footnote.index}</a></sup>\n        footnote.startNode = link\n        stack.push(footnote)\n        return link\n      } else {\n        let last = stack.pop()\n        if (last) {\n          var marker = document.createElement(\"b\")\n          marker.textContent = \"END\" + last.index\n          last.endNode = marker\n          return marker\n        }\n      }\n      \n    })\n      \n    footnotes.forEach(ea => {\n      if (ea.startNode && ea.endNode) {\n        var region = this.allNodesBetween(ea.startNode, ea.endNode)\n        ea.content = <span>{...region}</span> // will get removed...\n        ea.endNode.remove() // ged rid of the marker\n      }     \n      \n    })\n    \n    if (footnotes.length > 0) {\n      var footnotesDiv = <div><h3>Footnotes</h3><ol>{...footnotes.map(ea => <li><a id={ea.id()}></a>{ea.content}</li>)}</ol></div>\n      element.appendChild(footnotesDiv)\n    }\n\n  }\n  \n    \n      /*MD\n<style>* {background-color:lightgray}</style>\n```javascript\n// we have to \"quote\" the @ because we are still in markdown... and replacing those references\nMarkdown.extractReferences(`Hello @`+`Foo1981HHC World\\nggg @`+`Bar2019X`)\n```\n<script>\n  import Markdown from 'src/client/markdown.js';\n  <pre>Result:{eval(this.parentElement.querySelector(\"code\").textContent)}</pre>\n</script>\n  MD*/\n  \n  static extractReferences(source) {\n    return Strings.matchAll(/@([A-Za-z0-9_]+)/g, source).map(ea => ea[1])\n  }\n  \n  static parseAndReplaceLatex(element) {\n    // do it only once\n    if (element._parsedLatex) {\n      return\n    } else {\n      element._parsedLatex = true    \n    }\n\n    this.parseAndReplaceBibrefs(element)\n    this.parseAndReplaceFootenotes(element)\n    this.parseAndReplaceListings(element)\n    this.parseAndReplaceFigures(element)\n    this.parseAndReplaceFigureRefs(element)\n    this.parseAndReplaceLabels(element)\n    this.parseAndReplaceHeadings(element)\n    this.parseAndReplaceMiscLatex(element)\n  }\n  \n}\n\n\n\n\n"]}