{"version":3,"sources":["https://lively-kernel.org/lively4/swd21-particles/src/components/widgets/lively-bibtex.js"],"names":["Parser","Morph","ContextMenu","Paper","Bibliography","LivelyBibtex","initialize","setAttribute","windowTitle","addEventListener","evt","onContextMenu","onClick","onDrop","onCopy","onCut","onPaste","updateView","registerButtons","selectedEntries","Array","from","querySelectorAll","importEntries","entries","source","map","ea","textContent","join","importBibtexSource","shiftKey","length","composedPath","filter","localName","stopPropagation","preventDefault","menu","forEach","entry","value","key","generateCitationKey","citationKey","lively","warn","toBibtex","oldkey","openComponentInWindow","then","comp","searchAndReplace","setExtent","parentElement","pt","focus","remove","openIn","document","body","isEditing","window","getSelection","toString","data","clipboardData","setData","scroll","scrollTop","getData","parseEntries","classList","entryElement","appendBibtexEntry","add","currentEntry","insertBefore","sleep","toJSON","e","notify","getAttribute","dataTransfer","beforeEntry","findEntryInPath","newEntry","src","url","path","find","tagName","toUpperCase","select","focusWithoutScroll","get","keepSelection","appendChild","innerHTML","setBibtex","fetch","res","text","json","bibtex","onSaveButton","Error","files","saveFile","success","openBrowser","onEditButton","style","position","pos","getPosition","extent","getExtent","editor","win","setPosition","livelySource","livelyExample","lively4url","overflow"],"mappings":";;;;;;;;;;;;AAAOA,Y;;AACAC,W;;AACAC,iB;;AACCC,W,0BAAAA,K;;AACDC,kB;;;;;;;;;;;AAJAJ,iD;;;;;;;;;;;;;AACAC,gD;;;;;;;;;;;;;AACAC,sD;;;;;;;;;;;;;AACCC,gD;;;;;;;;;;;;;AACDC,uD;;;;;;;;;AAEP;;;;;;;AAQe,YAAMC,YAAN,SAA2BJ,KAA3B,CAAiC;AAC9C,cAAMK,UAAN,GAAmB;;AAEjB,eAAKC,YAAL,CAAkB,UAAlB,EAA8B,CAA9B,CAAiC;AAAjC,YACA,KAAKC,WAAL,GAAmB,cAAnB;AACA,eAAKC,gBAAL,CAAsB,aAAtB,EAAqCC,OAAO,KAAKC,aAAL,CAAmBD,GAAnB,CAA5C,EAAqE,KAArE;AACA,eAAKD,gBAAL,CAAsB,OAAtB,EAA+BC,OAAO,KAAKE,OAAL,CAAaF,GAAb,CAAtC;AACA,eAAKD,gBAAL,CAAsB,MAAtB,EAA8B,KAAKI,MAAnC;AACA,eAAKJ,gBAAL,CAAsB,MAAtB,EAA+BC,GAAD,IAAS,KAAKI,MAAL,CAAYJ,GAAZ,CAAvC;AACA,eAAKD,gBAAL,CAAsB,KAAtB,EAA8BC,GAAD,IAAS,KAAKK,KAAL,CAAWL,GAAX,CAAtC;AACA,eAAKD,gBAAL,CAAsB,OAAtB,EAAgCC,GAAD,IAAS,KAAKM,OAAL,CAAaN,GAAb,CAAxC;AACA,eAAKO,UAAL;AACA,eAAKC,eAAL;AACD;;AAEDC,0BAAkB;AAChB,iBAAOC,MAAMC,IAAN,CAAW,KAAKC,gBAAL,CAAsB,8BAAtB,CAAX,CAAP;AACD;;AAED,cAAMC,aAAN,CAAoBC,OAApB,EAA6B;;AAE3B,cAAIC,SAASD,QAAQE,GAAR,CAAYC,MAAMA,GAAGC,WAArB,EAAkCC,IAAlC,CAAuC,IAAvC,CAAb;;AAEA,iBAAO1B,MAAM2B,kBAAN,CAAyBL,MAAzB,CAAP;AACD;;AAGDd,sBAAcD,GAAd,EAAmB;AACjB,cAAI,CAACA,IAAIqB,QAAT,EAAmB;AACjB,gBAAIP,UAAU,KAAKL,eAAL,EAAd;AACA,gBAAIK,QAAQQ,MAAR,IAAkB,CAAtB,EAAyB;AACvBR,wBAAUd,IAAIuB,YAAJ,GAAmBC,MAAnB,CAA0BP,MAAMA,GAAGQ,SAAH,IAAgB,qBAAhD,CAAV;AACD;AACD,gBAAIX,QAAQQ,MAAR,IAAkB,CAAtB,EAAyB,OALR,CAKe;;AAEhCtB,gBAAI0B,eAAJ;AACA1B,gBAAI2B,cAAJ;AACA,gBAAIC,OAAO,IAAIpC,WAAJ,CAAgB,IAAhB,EAAsB,CAC/B,CAAC,cAAD,EAAiB,MAAM;AACrBsB,sBAAQe,OAAR,CAAgBZ,MAAM;AACpB,oBAAIa,QAAQb,GAAGc,KAAf;AACA,oBAAIC,MAAMtC,aAAauC,mBAAb,CAAiCH,KAAjC,CAAV;AACA,oBAAIE,GAAJ,EAAS;AACPF,wBAAMI,WAAN,GAAoBxC,aAAauC,mBAAb,CAAiCH,KAAjC,CAApB;AACAb,qBAAGc,KAAH,GAAWD,KAAX;AACD,iBAHD,MAGO;AACLK,yBAAOC,IAAP,CAAY,qCAAZ,EAAmDnB,GAAGoB,QAAH,EAAnD;AACD;AACF,eATD;AAUD,aAXD,CAD+B,EAa/B,CAAC,yCAAD,EAA4C,MAAM;AAChDvB,sBAAQe,OAAR,CAAgBZ,MAAM;AACpB,oBAAIa,QAAQb,GAAGc,KAAf;AACA,oBAAIO,SAASrB,GAAGc,KAAH,CAASG,WAAtB;AACA,oBAAIF,MAAMtC,aAAauC,mBAAb,CAAiCH,KAAjC,CAAV;AACA,oBAAIE,GAAJ,EAAS;AACPF,wBAAMI,WAAN,GAAoBxC,aAAauC,mBAAb,CAAiCH,KAAjC,CAApB;AACAb,qBAAGc,KAAH,GAAWD,KAAX;;AAEDK,yBAAOI,qBAAP,CAA6B,qBAA7B,EAAoDC,IAApD,CAAyDC,QAAQ;AAChEA,yBAAKC,gBAAL,CAAsBJ,MAAtB,EAA8BN,GAA9B;AACAG,2BAAOQ,SAAP,CAAiBF,KAAKG,aAAtB,EAAqCT,OAAOU,EAAP,CAAU,IAAV,EAAgB,GAAhB,CAArC;AACAJ,yBAAKK,KAAL;AACD,mBAJA;AAMA,iBAVD,MAUO;AACLX,yBAAOC,IAAP,CAAY,qCAAZ,EAAmDnB,GAAGoB,QAAH,EAAnD;AACD;AACF,eAjBD;AAkBD,aAnBD,CAb+B,EAiC/B,CAAC,QAAD,EAAW,MAAM;AACb,mBAAKxB,aAAL,CAAmBC,OAAnB;AACH,aAFD,CAjC+B,EAoC/B,CAAC,QAAD,EAAW,MAAM;AACbA,sBAAQe,OAAR,CAAgBZ,MAAM;AACpBA,mBAAG8B,MAAH;AACD,eAFD;AAGH,aAJD,CApC+B,CAAtB,CAAX;AA0CAnB,iBAAKoB,MAAL,CAAYC,SAASC,IAArB,EAA2BlD,GAA3B,EAAgC,IAAhC;AACA;AACD;AACF;;AAEDI,eAAOJ,GAAP,EAAY;AACV,cAAI,KAAKmD,SAAL,EAAJ,EAAsB;AACtB,cAAIC,OAAOC,YAAP,GAAsBC,QAAtB,GAAiChC,MAAjC,GAA0C,CAA9C,EAAiD;AACjD,cAAIiC,OAAO,KAAK9C,eAAL,GAAuBO,GAAvB,CAA2BC,MAAMA,GAAGC,WAApC,EAAiDC,IAAjD,CAAsD,EAAtD,CAAX;AACAnB,cAAIwD,aAAJ,CAAkBC,OAAlB,CAA0B,YAA1B,EAAwCF,IAAxC;AACAvD,cAAI0B,eAAJ;AACA1B,cAAI2B,cAAJ;AACD;;AAEDtB,cAAML,GAAN,EAAW;AACT,cAAI,KAAKmD,SAAL,EAAJ,EAAsB;AACtB,cAAIC,OAAOC,YAAP,GAAsBC,QAAtB,GAAiChC,MAAjC,GAA0C,CAA9C,EAAiD;AACjD,eAAKlB,MAAL,CAAYJ,GAAZ;AACA,eAAKS,eAAL,GAAuBoB,OAAvB,CAA+BZ,MAAMA,GAAG8B,MAAH,EAArC;AACD;;AAED,cAAMzC,OAAN,CAAcN,GAAd,EAAmB;AACjB,cAAI,KAAKmD,SAAL,EAAJ,EAAsB;AACtB,cAAIO,SAAS,KAAKC,SAAlB;AACA,cAAIJ,OAAOvD,IAAIwD,aAAJ,CAAkBI,OAAlB,CAA0B,MAA1B,CAAX;AACA,cAAI9C,UAAU,KAAK+C,YAAL,CAAkBN,IAAlB,CAAd;AACA,eAAK9C,eAAL,GAAuBoB,OAAvB,CAA+BZ,MAAMA,GAAG6C,SAAH,CAAaf,MAAb,CAAoB,UAApB,CAArC;;AAEA,cAAIjC,OAAJ,EAAa;AACZ,iBAAK,IAAIG,EAAT,IAAeH,OAAf,EAAwB;AACvB,kBAAIiD,eAAe,MAAM,KAAKC,iBAAL,CAAuB/C,EAAvB,CAAzB;AACA8C,2BAAaD,SAAb,CAAuBG,GAAvB,CAA2B,UAA3B;AACA,kBAAI,KAAKC,YAAT,EAAuB,KAAKC,YAAL,CAAkBJ,YAAlB,EAAgC,KAAKG,YAArC;AACvB;AACD;AACD,gBAAM/B,OAAOiC,KAAP,CAAa,CAAb,CAAN;AACA,eAAKT,SAAL,GAAiBD,MAAjB;AACD;;AAEDG,qBAAa9C,MAAb,EAAqB;AACnB,cAAI;AACF,mBAAOzB,OAAO+E,MAAP,CAActD,MAAd,CAAP;AACD,WAFD,CAEE,OAAMuD,CAAN,EAAS;AACTnC,mBAAOoC,MAAP,CAAc,6BAA6BxD,MAA3C;AACD;AACF;;AAEDoC,oBAAY;AACV,iBAAO,KAAKe,YAAL,IAAsB,KAAKA,YAAL,CAAkBM,YAAlB,CAA+B,MAA/B,KAA0C,MAAvE;AACD;;AAED,cAAMrE,MAAN,CAAaH,GAAb,EAAkB;AAChBA,cAAI2B,cAAJ;AACA3B,cAAI0B,eAAJ;;AAEA,cAAIX,SAASf,IAAIyE,YAAJ,CAAiBb,OAAjB,CAAyB,MAAzB,CAAb;AACA,cAAI7B,QAAQ,KAAK8B,YAAL,CAAkB9C,MAAlB,CAAZ;AACA,cAAIgB,KAAJ,EAAW;AACTA,oBAAQA,MAAM,CAAN,CAAR;AACA,gBAAI2C,cAAc,KAAKC,eAAL,CAAqB3E,IAAIuB,YAAJ,EAArB,CAAlB;AACA,gBAAIqD,WAAW,MAAM,KAAKZ,iBAAL,CAAuBjC,KAAvB,CAArB;AACA,gBAAI2C,WAAJ,EAAiB,KAAKP,YAAL,CAAkBS,QAAlB,EAA4BF,WAA5B;AAClB;AAEF;;AAED,YAAIG,GAAJ,GAAU;AACR,iBAAO,KAAKL,YAAL,CAAkB,KAAlB,CAAP;AACD;;AAED,YAAIK,GAAJ,CAAQC,GAAR,EAAa;AACX,eAAKjF,YAAL,CAAkB,KAAlB,EAAyBiF,GAAzB;AACA,eAAKvE,UAAL;AACD;;AAEDoE,wBAAgBI,IAAhB,EAAsB;AACpB,iBAAOA,KAAKC,IAAL,CAAU/D,MAAMA,GAAGgE,OAAH,IAAc,sBAAsBC,WAAtB,EAA9B,CAAP;AACD;;AAEDhF,gBAAQF,GAAR,EAAa;AACX;AACA,cAAIoD,OAAOC,YAAP,GAAsBC,QAAtB,GAAiChC,MAAjC,GAA0C,CAA9C,EAAiD;AACjD,cAAI,KAAK6B,SAAL,EAAJ,EAAsB;AACtB;AACA,cAAIrB,QAAQ,KAAK6C,eAAL,CAAqB3E,IAAIuB,YAAJ,EAArB,CAAZ;AACA,cAAI,CAACO,KAAL,EAAY;AACZ,eAAKqD,MAAL,CAAYrD,KAAZ,EAAmB9B,IAAIqB,QAAvB;;AAEA,cAAIS,MAAM0C,YAAN,CAAmB,MAAnB,KAA8B,MAAlC,EAA0C;AACxCrC,mBAAOiD,kBAAP,CAA0B,KAAKC,GAAL,CAAS,WAAT,CAA1B;AACD;AACF;;AAEDF,eAAOrD,KAAP,EAAcwD,aAAd,EAA6B;AAC3B,cAAI,KAAKpB,YAAL,IAAqB,CAACoB,aAA1B,EAAyC;AACvC,iBAAKpB,YAAL,CAAkBJ,SAAlB,CAA4Bf,MAA5B,CAAmC,UAAnC;AACD;AACD,cAAI,KAAKmB,YAAL,KAAsBpC,KAA1B,EAAiC;AAC/B,iBAAKoC,YAAL,GAAoB,IAApB;AACD,WAFD,MAEO;AACLpC,kBAAMgC,SAAN,CAAgBG,GAAhB,CAAoB,UAApB;AACA,iBAAKC,YAAL,GAAoBpC,KAApB;AACD;AACF;;AAED,cAAMkC,iBAAN,CAAwBjC,KAAxB,EAA+B;AAC7B,cAAID,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAZ;AACAA,gBAAMC,KAAN,GAAcA,KAAd;AACA,eAAKwD,WAAL,CAAiBzD,KAAjB;AACA,iBAAOA,KAAP;AACD;;AAED,cAAMvB,UAAN,GAAmB;AACjB,cAAI,CAAC,KAAKsE,GAAV,EAAe;AACb,gBAAI9D,SAAS,KAAKG,WAAlB;AACA,iBAAKsE,SAAL,GAAiB,EAAjB;AACA,mBAAO,KAAKC,SAAL,CAAe1E,MAAf,CAAP;AACD;AACD,eAAKyE,SAAL,GAAiB,EAAjB;AACAzE,mBAAS,MAAM2E,MAAM,KAAKb,GAAX,EAAgBrC,IAAhB,CAAqBmD,OAAOA,IAAIC,IAAJ,EAA5B,CAAf;AACA,iBAAO,KAAKH,SAAL,CAAe1E,MAAf,CAAP;AACD;;AAED,cAAM0E,SAAN,CAAgB1E,MAAhB,EAAwB;AACtB,cAAI;AACF,gBAAI8E,OAAMvG,OAAO+E,MAAP,CAActD,MAAd,CAAV;AACD,WAFD,CAEE,OAAMuD,CAAN,EAAS;AACT,iBAAKkB,SAAL,GAAiB,KAAKlB,CAAtB;AACD;AACD,eAAI,IAAIrD,EAAR,IAAc4E,IAAd,EAAoB;AAClB,kBAAM,KAAK7B,iBAAL,CAAuB/C,EAAvB,CAAN;AACD;AACF;;AAEDoB,mBAAW;AACT,cAAIyD,SAAS,EAAb;AACA,eAAI,IAAI7E,EAAR,IAAc,KAAKL,gBAAL,CAAsB,qBAAtB,CAAd,EAA4D;AAC1DkF,sBAAU7E,GAAGuE,SAAb;AACD;AACD,iBAAOM,MAAP;AACD;;AAED,cAAMC,YAAN,GAAqB;AACnB,cAAID,SAAS,KAAKzD,QAAL,EAAb;AACA,cAAI,CAAC,KAAKwC,GAAV,EAAe,MAAM,IAAImB,KAAJ,CAAU,0BAAV,CAAN;AACf7D,iBAAO8D,KAAP,CAAaC,QAAb,CAAsB,KAAKrB,GAA3B,EAAgCiB,MAAhC,EACGtD,IADH,CACQ,MAAML,OAAOgE,OAAP,CAAe,cAAf,EAA+B,KAAKtB,GAApC,EAAyC,CAAzC,EACgB,MAAM1C,OAAOiE,WAAP,CAAmB,KAAKvB,GAAxB,CADtB,CADd;AAGD;;AAED,cAAMwB,YAAN,CAAmBrG,GAAnB,EAAwB;;AAGtB,cAAI,KAAKsG,KAAL,CAAWC,QAAf,EAAyB;AACvB,gBAAIC,MAAMrE,OAAOsE,WAAP,CAAmB,IAAnB,CAAV;AACA,gBAAIC,SAASvE,OAAOwE,SAAP,CAAiB,IAAjB,CAAb;AACD;AACD,cAAIC,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAb;AACA,cAAI,KAAK/B,GAAT,EAAc;AACZ+B,mBAAO/G,YAAP,CAAoB,KAApB,EAA2B,KAAKgF,GAAhC;AACD,WAFD,MAEO;AACL+B,mBAAO1F,WAAP,GAAqB,KAAKA,WAA1B;AACD;AACD,cAAIlB,IAAIqB,QAAR,EAAkB;AAChB,gBAAIwF,MAAM,0EAAuBD,MAAvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAV;AACA3D,qBAASC,IAAT,CAAcqC,WAAd,CAA0BsB,GAA1B;AACAD,mBAAOrG,UAAP;AACA,iBAAKwC,MAAL;AACA,gBAAIyD,GAAJ,EAAS;AACPrE,qBAAO2E,WAAP,CAAmBD,GAAnB,EAAwBL;AACxB;AADA;AAED;AACF,WATD,MASO;AACN,iBAAK5D,aAAL,CAAmBuB,YAAnB,CAAgCyC,MAAhC,EAAwC,IAAxC;AACCA,mBAAOrG,UAAP;AACA,iBAAKwC,MAAL;AACA,gBAAIyD,GAAJ,EAAS;AACPrE,qBAAO2E,WAAP,CAAmBF,MAAnB,EAA2BJ,GAA3B;AACArE,qBAAOQ,SAAP,CAAiBiE,MAAjB,EAAyBF,MAAzB;AACD;AACF;AAGF;;AAEDK,uBAAe;AACb,iBAAOrG,MAAMC,IAAN,CAAW,KAAKC,gBAAL,CAAsB,qBAAtB,CAAX,EAAyDI,GAAzD,CAA6DC,MAAMA,GAAGC,WAAtE,EAAmFC,IAAnF,CAAwF,EAAxF,CAAP;AACD;;AAED,cAAM6F,aAAN,GAAsB;AACpB;AACA;AACA,eAAKnC,GAAL,GAAWoC,aAAa,mCAAxB;AACA,eAAKX,KAAL,CAAWY,QAAX,GAAsB,QAAtB;AACD;;AAjR6C;;yBAA3BvH,Y;;;;;;;;6BAAAA,6C","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'\nimport {Paper} from 'src/client/literature.js'\nimport Bibliography from \"src/client/bibliography.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    this.registerButtons()\n  }\n  \n  selectedEntries() {\n    return Array.from(this.querySelectorAll(\"lively-bibtex-entry.selected\"))\n  }\n  \n  async importEntries(entries) {\n    \n    var source = entries.map(ea => ea.textContent).join(\"\\n\")\n      \n    return Paper.importBibtexSource(source)\n  }\n  \n  \n  onContextMenu(evt) {\n    if (!evt.shiftKey) {\n      var entries = this.selectedEntries()\n      if (entries.length == 0) {\n        entries = evt.composedPath().filter(ea => ea.localName == \"lively-bibtex-entry\")\n      }\n      if (entries.length == 0) return // nothing selected or clicked on\n      \n      evt.stopPropagation();\n      evt.preventDefault();\n      var menu = new ContextMenu(this, [\n        [\"generate key\", () => {\n          entries.forEach(ea => {\n            var entry = ea.value\n            var key = Bibliography.generateCitationKey(entry)\n            if (key) {\n              entry.citationKey = Bibliography.generateCitationKey(entry)\n              ea.value = entry              \n            } else {\n              lively.warn(\"Bibtex: Could net gernerate key for\", ea.toBibtex())\n            }\n          })   \n        }],\n        [\"generate key and replace all occurences\", () => {\n          entries.forEach(ea => {\n            var entry = ea.value\n            var oldkey = ea.value.citationKey\n            var key = Bibliography.generateCitationKey(entry)\n            if (key) {\n              entry.citationKey = Bibliography.generateCitationKey(entry)\n              ea.value = entry\n              \n             lively.openComponentInWindow(\"lively-index-search\").then(comp => {\n              comp.searchAndReplace(oldkey, key)\n              lively.setExtent(comp.parentElement, lively.pt(1000, 700));\n              comp.focus();\n            });\n              \n            } else {\n              lively.warn(\"Bibtex: Could net gernerate key for\", ea.toBibtex())\n            }\n          })   \n        }], \n        [\"import\", () => {\n            this.importEntries(entries)\n        }],    \n        [\"remove\", () => {\n            entries.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    if (window.getSelection().toString().length > 0) 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    if (window.getSelection().toString().length > 0) 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    // don't interfere with selection\n    if (window.getSelection().toString().length > 0) return \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) {\n      var source = this.textContent \n      this.innerHTML = \"\"\n      return this.setBibtex(source)      \n    }\n    this.innerHTML = \"\"\n    source = await fetch(this.src).then(res => res.text());\n    return this.setBibtex(source)\n  }\n  \n  async setBibtex(source) {\n    try {\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  toBibtex() {\n    var bibtex = \"\"\n    for(var ea of this.querySelectorAll(\"lively-bibtex-entry\")) {\n      bibtex += ea.innerHTML\n    }\n    return bibtex\n  }\n  \n  async onSaveButton() {\n    var bibtex = this.toBibtex()\n    if (!this.src) throw new Error(\"BibtexEditor src missing\" )\n    lively.files.saveFile(this.src, bibtex)\n      .then(() => lively.success(\"saved bibtex\", this.src, 5, \n                                  () => lively.openBrowser(this.src)))\n  }\n\n  async onEditButton(evt) {\n    \n    \n    if (this.style.position) {\n      var pos = lively.getPosition(this)\n      var extent = lively.getExtent(this)  \n    }\n    var editor = await (<lively-bibtex-editor></lively-bibtex-editor>)\n    if (this.src) {\n      editor.setAttribute(\"src\", this.src)\n    } else {\n      editor.textContent = this.textContent\n    }\n    if (evt.shiftKey) {\n      var win = await (<lively-window>{editor}</lively-window>)\n      document.body.appendChild(win)\n      editor.updateView()\n      this.remove()\n      if (pos) {\n        lively.setPosition(win, pos)\n        // lively.setExtent(win, extent)\n      }\n    } else {\n     this.parentElement.insertBefore(editor, this)  \n      editor.updateView()\n      this.remove()\n      if (pos) {\n        lively.setPosition(editor, pos)\n        lively.setExtent(editor, extent)\n      }\n    }\n     \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 = lively4url + \"/demos/bibliography/_incoming.bib\"\n    this.style.overflow = \"scroll\"\n  }\n  \n  \n}"]}