{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-bp2019/src/components/widgets/lively-bibtex.js"],"names":["Parser","Morph","ContextMenu","LivelyBibtex","initialize","setAttribute","windowTitle","addEventListener","evt","onContextMenu","onClick","onDrop","onCopy","onCut","onPaste","updateView","selectedEntries","Array","from","querySelectorAll","shiftKey","stopPropagation","preventDefault","menu","forEach","ea","remove","openIn","document","body","isEditing","data","map","textContent","join","clipboardData","setData","scroll","scrollTop","getData","entries","parseEntries","classList","entryElement","appendBibtexEntry","add","currentEntry","insertBefore","lively","sleep","source","toJSON","e","notify","getAttribute","dataTransfer","value","beforeEntry","findEntryInPath","composedPath","newEntry","src","url","path","find","tagName","toUpperCase","entry","select","focusWithoutScroll","get","keepSelection","appendChild","innerHTML","fetch","then","res","text","json","livelySource","livelyExample","style","overflow"],"mappings":"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","file":"lively-bibtex.js","sourcesContent":["import Parser from 'src/external/bibtexParse.js';\nimport Morph from 'src/components/widgets/lively-morph.js';\nimport ContextMenu from 'src/client/contextmenu.js'\n\n/*MD\n# Lively Bibtex\n\n![](lively-bibtex.png){style=\"width:350px\"}\n\nMD*/\n\n\nexport default class LivelyBibtex extends Morph {\n  async initialize() {\n    \n    this.setAttribute(\"tabindex\", 0) // just ensure focusabiltity\n    this.windowTitle = \"LivelyBibtex\";\n    this.addEventListener('contextmenu', evt => this.onContextMenu(evt), false);  \n    this.addEventListener(\"click\", evt => this.onClick(evt))\n    this.addEventListener(\"drop\", this.onDrop);\n    this.addEventListener(\"copy\", (evt) => this.onCopy(evt))\n    this.addEventListener(\"cut\", (evt) => this.onCut(evt))\n    this.addEventListener(\"paste\", (evt) => this.onPaste(evt))\n    this.updateView()\n  }\n  \n  selectedEntries() {\n    return Array.from(this.querySelectorAll(\"lively-bibtex-entry.selected\"))\n  }\n  \n  onContextMenu(evt) {\n    if (!evt.shiftKey) {\n      evt.stopPropagation();\n      evt.preventDefault();\n      var menu = new ContextMenu(this, [\n            [\"remove\", () => {\n                this.selectedEntries().forEach(ea => {\n                  ea.remove()\n                })   \n            }]\n        ]);\n      menu.openIn(document.body, evt, this);\n      return \n    }\n  }\n  \n  onCopy(evt) {\n    if (this.isEditing()) return;\n    var data = this.selectedEntries().map(ea => ea.textContent).join(\"\")\n    evt.clipboardData.setData('text/plain', data);   \n    evt.stopPropagation()\n    evt.preventDefault()\n  }\n  \n  onCut(evt) {\n    if (this.isEditing()) return;\n    this.onCopy(evt)\n    this.selectedEntries().forEach(ea => ea.remove())\n  }\n\n  async onPaste(evt) {\n    if (this.isEditing()) return;\n    var scroll = this.scrollTop\n    var data = evt.clipboardData.getData('text');\n    var entries = this.parseEntries(data)\n    this.selectedEntries().forEach(ea => ea.classList.remove(\"selected\"))\n\n    if (entries) {\n     for (var ea of entries) {\n      var entryElement = await this.appendBibtexEntry(ea)\n      entryElement.classList.add(\"selected\")\n      if (this.currentEntry) this.insertBefore(entryElement, this.currentEntry)\n     } \n    }\n    await lively.sleep(0)\n    this.scrollTop = scroll\n  }\n\n  parseEntries(source) {\n    try {\n      return Parser.toJSON(source);  \n    } catch(e) {\n      lively.notify(\"Bibtex could not parse: \" + source) \n    }\n  }\n  \n  isEditing() {\n    return this.currentEntry && (this.currentEntry.getAttribute(\"mode\") == \"edit\")\n  }\n  \n  async onDrop(evt) {\n    evt.preventDefault();\n    evt.stopPropagation();\n\n    var source = evt.dataTransfer.getData(\"text\");\n    var value = this.parseEntries(source)\n    if (value) {\n      value = value[0]\n      var beforeEntry = this.findEntryInPath(evt.composedPath())\n      var newEntry = await this.appendBibtexEntry(value)\n      if (beforeEntry) this.insertBefore(newEntry, beforeEntry)\n    }\n    \n  }\n  \n  get src() {\n    return this.getAttribute(\"src\")\n  }\n\n  set src(url) {\n    this.setAttribute(\"src\", url)\n    this.updateView()\n  }\n  \n  findEntryInPath(path) {\n    return path.find(ea => ea.tagName == \"lively-bibtex-entry\".toUpperCase())\n  }\n  \n  onClick(evt) {\n    if (this.isEditing()) return;\n    // var oldScroll\n    var entry = this.findEntryInPath(evt.composedPath())\n    if (!entry) return;\n    this.select(entry, evt.shiftKey)\n    \n    if (entry.getAttribute(\"mode\") != \"edit\") {\n      lively.focusWithoutScroll(this.get(\"#copyHack\"))\n    }\n  }\n  \n  select(entry, keepSelection) {\n    if (this.currentEntry && !keepSelection) {\n      this.currentEntry.classList.remove(\"selected\") \n    }\n    if (this.currentEntry === entry) {\n      this.currentEntry = null      \n    } else {\n      entry.classList.add(\"selected\")\n      this.currentEntry = entry\n    }    \n  }\n  \n  async appendBibtexEntry(value) {\n    var entry = await (<lively-bibtex-entry></lively-bibtex-entry>)\n    entry.value = value\n    this.appendChild(entry)\n    return entry\n  }\n  \n  async updateView() { \n    if (!this.src) return;\n    this.innerHTML = \"\"\n    try {\n      var source = await fetch(this.src).then(res => res.text());\n      var json= Parser.toJSON(source);    \n    } catch(e) {\n      this.innerHTML = \"\" + e\n    }\n    for(var ea of json) {\n      await this.appendBibtexEntry(ea)\n    }\n  }\n  \n  livelySource() {\n    return Array.from(this.querySelectorAll(\"lively-bibtex-entry\")).map(ea => ea.textContent).join(\"\")\n  }\n\n  async livelyExample() {\n    // this customizes a default instance to a pretty example\n    // this is used by the \n    this.src = \"https://lively-kernel.org/lively4/overleaf-cop18-promises/references.bib\"\n    this.style.overflow = \"scroll\"\n  }\n  \n  \n}"]}