{"version":3,"sources":["https://lively-kernel.org/lively4/swd21-particles/src/components/widgets/lively-bibtex-entry.js"],"names":["Morph","Parser","latexconv","Strings","getTempKeyFor","LivelyBibtexEntry","initialize","windowTitle","value","toJSON","textContent","e","console","warn","registerButtons","updateView","onDragStart","evt","dataTransfer","setData","lively","ensureID","ctrlKey","key","innerHTML","disableEditing","newvalue","editor","notify","mode","getAttribute","setAttribute","enableEditing","_value","parseAuthors","bibtexAuthors","split","map","ea","reverse","join","obj","toBibtex","livelyMigrate","other","onCancel","pane","get","getAuthors","convertLaTeXToUnicode","author","showEditor","appendChild","entryTags","followURLonClick","authorText","titleText","title","misc","microsoftid","url","openBrowser","fields","entry","year","addEventListener","generateFilename","authors","fixUmlauts","_","last","words","replace","toLowerCase","filter","toUpperCaseFirst","citationKey","string","Author","Year","Title","setFromBibtex","livelyInspect","contentNode","inspector","display","livelyExample"],"mappings":"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","file":"lively-bibtex-entry.js","sourcesContent":["\n/*MD \n# Bibtex Entry\n![](lively-bibtex-entry.png){height=50}\n\nMD*/\n\nimport Morph from 'src/components/widgets/lively-morph.js';\nimport Parser from 'src/external/bibtexParse.js';\nimport latexconv from \"src/external/latex-to-unicode-converter.js\";\nimport Strings from 'src/client/strings.js';\nimport { getTempKeyFor } from 'utils';\n\nexport default class LivelyBibtexEntry extends Morph {\n  async initialize() {\n    this.windowTitle = \"LivelyBibtexEntry\";\n    try {\n      this.value = Parser.toJSON(this.textContent)[0];\n    } catch(e) {\n      console.warn(\"[lively-bibtex-entry] initialize failed, could not parse \", this.textContent)\n    }\n    this.registerButtons()\n    this.updateView()\n  }\n\n  async onDragStart(evt) { \n    evt.dataTransfer.setData(\"application/lively4id\", lively.ensureID(this));\n    \n    if (evt.ctrlKey) {\n      evt.dataTransfer.setData(\"text/plain\", `[@${this.key}]`);\n    } else {\n      evt.dataTransfer.setData(\"text/plain\", this.innerHTML);\n    }\n  }\n\n  \n  disableEditing() {\n    var newvalue;\n    try {\n      newvalue = Parser.toJSON(this.editor.value);\n    } catch (e) {\n      lively.notify(\"could not parse bibtex entry: \" + e);\n    }\n    if (newvalue && newvalue[0]) {\n      this.value = newvalue[0];\n      this.mode = \"view\";\n    }\n    this.updateView()\n  }\n  \n  get mode() {\n    return this.getAttribute(\"mode\");\n  }\n\n  set mode(mode) {\n    // mode: default, edit, readonly\n    this.setAttribute(\"mode\", mode);\n  }\n\n  \n  enableEditing() {\n    this.setAttribute(\"mode\", \"edit\");\n    this.updateView()\n  }\n\n  get value() {\n    return this._value;\n  }\n\n  parseAuthors(bibtexAuthors) {\n    return bibtexAuthors.split(/ and /).map(ea => ea.split(/, /).reverse().join(\" \"));\n  }\n\n  set value(obj) {\n    if (obj) {\n      this.textContent = Parser.toBibtex([obj], false);\n    } else {\n      this.textContent = \"\";\n    }\n    this._value = obj;\n    this.updateView();\n  }\n\n  toBibtex() {\n    return this.textContent\n  }\n  \n  livelyMigrate(other) {\n    this.value = other.value;\n  }\n  \n  onCancel() {\n    this.disableEditing()\n  }\n  \n  get pane() {\n    return this.get(\"#pane\")\n  }\n  \n  getAuthors() {\n    return this.parseAuthors(latexconv.convertLaTeXToUnicode(this.author))\n  }\n  \n  async showEditor() {\n    this.editor = await (<lively-code-mirror id=\"editor\" mode=\"plain\"></lively-code-mirror>)\n    this.editor.value = this.textContent\n    \n    if (this.mode != \"edit\") return // we have changed in the background...\n    this.pane.innerHTML = \"\"\n    this.pane.appendChild(this.editor)\n  }\n    \n  updateView() {\n    if (this.mode == \"edit\") return this.showEditor()\n    if (!this.value || !this.value.entryTags) return;\n    \n    var key = <span id=\"key\">{this.key}</span>\n    this.followURLonClick(key, \"bib://\" + this.key)\n    \n    this.pane.innerHTML = \"\"\n    \n    try {\n      var authorText = this.getAuthors().join(\", \");\n    } catch (e) {\n      authorText = this.author;\n    }\n    try {\n      var titleText = latexconv.convertLaTeXToUnicode(this.title);\n    } catch (e) {\n      titleText = this.title;\n    }\n    \n    var misc = <span id=\"misc\"></span>\n    if (this.value.entryTags.microsoftid) {\n      let url = \"academic://expr:Id=\" + this.value.entryTags.microsoftid\n      misc.appendChild(<span class=\"academic\"\n            click={() => lively.openBrowser(url)}>[academic]</span>)\n    } \n    if (this.value.entryTags.fields) {\n      misc.appendChild(<span class=\"fields\">{this.value.entryTags.fields}</span>)\n    } \n    var entry = <div id=\"entry\">\n      <div id=\"draghandle\" draggable=\"true\"></div>\n      [{key}] <span id=\"author\">{authorText}</span>. <span id=\"year\">{this.year}</span>.\n      <span id=\"title\">{titleText}.</span>\n      {misc}\n      <span id=\"edit\" title=\"edit entry\" click={() => this.enableEditing()}><i class=\"fa fa-pencil\" aria-hidden=\"true\"></i></span>\n      \n    </div>\n    entry.addEventListener(\"dragstart\", evt => this.onDragStart(evt));\n    this.pane.appendChild(entry)\n  }\n\n  generateFilename() {\n    try {\n      var authors = Strings.fixUmlauts(this.parseAuthors(latexconv.convertLaTeXToUnicode(this.author))\n        .map(ea => _.last(ea.split(\" \"))).join(\"\"))\n      \n      var words = latexconv.convertLaTeXToUnicode(this.title)\n                    .replace(/-on /g, \"on \") // e.g. hands-on \n                    .split(/[ _-]/g)\n                    .map(ea => ea.replace(/[:,\\-_'\"\\`\\$\\%{}()\\[\\]\\\\\\/.]/g, \"\"))\n                    .map(ea => ea.toLowerCase())\n                    .filter(ea => (ea != \"a\"))\n                    .map(ea => Strings.toUpperCaseFirst(ea))\n      var title = words.join(\"\")\n      return authors + `_${this.year}_${title}`;\n    } catch (e) {\n      return \"\";\n    }\n  }\n\n  // #TODO refactor those accessors\n  get key() {\n    return this.value.citationKey;\n  }\n\n  set key(string) {\n    this.value.citationKey = string;\n  }\n\n  get author() {\n    return this.value.entryTags && (this.value.entryTags.Author || this.value.entryTags.author);\n  }\n\n  set author(string) {\n    if (this.value.entryTags.Author) {\n      this.value.entryTags.Author = string;\n    } else {\n      this.value.entryTags.author = string;\n    }\n  }\n\n  get year() {\n    return this.value.entryTags.Year || this.value.entryTags.year;\n  }\n\n  set year(string) {\n    if (this.value.entryTags.Year) {\n      this.value.entryTags.Year = string;\n    } else {\n      this.value.entryTags.year = string;\n    }\n  }\n\n  get title() {\n    return this.value.entryTags.Title || this.value.entryTags.title;\n  }\n\n  set title(string) {\n    if (this.value.entryTags.Title) {\n      this.value.entryTags.Title = string;\n    } else {\n      this.value.entryTags.title = string;\n    }\n  }\n\n  setFromBibtex(string) {\n    this.value = Parser.toJSON(string)[0];\n  }\n\n  livelyInspect(contentNode, inspector) {\n    if (this.value) {\n      contentNode.appendChild(inspector.display(this.value, false, \"#value\", this));\n    }\n  }\n\n  async livelyExample() {\n    this.setFromBibtex(`@Article{Ingalls1997BFS,\n  author        = {Ingalls, Dan and Kaehler, Ted and Maloney, John and Wallace, Scott and Kay, Alan},\n  title         = {{Back to the Future: The Story of Squeak, a Practical Smalltalk Written in Itself}},\n  journal       = {ACM SIGPLAN Notices},\n  year          = {1997},\n  volume        = {32},\n  number        = {10},\n  pages         = {318--326},\n  date-added    = {2014-09-22 19:20:23 +0000},\n  date-modified = {2014-09-22 19:20:23 +0000},\n  doi           = {http://doi.acm.org/10.1145/263700.263754},\n  file          = {IngallsKaehlerMaloneyWallace_1997_BackToTheFutureTheStoryOfSqueakAPracticalSmalltalkWrittenInItself.pdf:IngallsKaehlerMaloneyWallace_1997_BackToTheFutureTheStoryOfSqueakAPracticalSmalltalkWrittenInItself.pdf:PDF},\n  keywords      = {VirtualMachines, ProgrammingEnvironment, ProgrammingLanguage, Smalltalk},\n  owner         = {Jens},\n  publisher     = {ACM Press New York, NY, USA},\n  rating        = {5},\n  read          = {Yes},\n  timestamp     = {2017.08.09},\n}`);\n  }\n}"]}