{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-mpm-debugging/src/client/bibliography.js"],"names":["FileIndex","Bibliography","splitAuthors","authorString","split","map","ea","m","match","replace","cleanTitle","titleString","generateCitationKey","entry","entryTags","undefined","firstAuthor","author","last","i","toUpperCase","toLowerCase","join","year","threeSignificantInitialsFromTitle","title","filter","length","includes","slice","filenameToKey","filename","a","authors","titleAndRest","urlToKey","url","toString","searchCitationKey","key","result","current","db","files","each","file","push","searchFilename","searchString"],"mappings":"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","file":"bibliography.js","sourcesContent":["/*MD # Bibliography \n\nMETA: #ExamplesInCode #BabylonianProgramming #Lightweight\n\nMD*/\n\n/*MD ## Example\n\n<lively-bibtex-entry>\n@inproceedings{berger2016efficiency,\n  title={Efficiency of projectional editing: A controlled experiment},\n  author={Berger, Thorsten and V{\\\"o}lter, Markus and Jensen, Hans Peter and Dangprasert, Taweesap and Siegmund, Janet},\n  booktitle={Proceedings of the 2016 24th ACM SIGSOFT International Symposium on Foundations of Software Engineering},\n  Keywords = {Foo, Bar},\n  pages={763--774},\n  year={2016},\n  organization={ACM}\n  }\n</lively-bibtex-entry>\n\n```javascript{.example}\n\n```\n\n<script>  \nimport Parser from 'src/external/bibtexParse.js';\nimport Bibliography from 'src/client/bibliography.js';\n  \nvar html = lively.query(this, \"lively-bibtex-entry\");\nvar source = html.textContent\nvar bib = Parser.toJSON(source, false)\nvar json = JSON.stringify(bib, undefined, 2)\nvar key =  Bibliography.generateCitationKey(bib[0])\n;(<dl>\n  <dt>Bibtex</dt><dd><pre>{source}</pre></dd>\n  <dt>Parser.toJSON</dt><dd><pre>{json}</pre></dd>\n  <dt>generateCitationKey</dt><dd><pre>{key}</pre></dd>\n</dl>)\n</script>  \n\nMD*/\n\n\n// import Parser from 'src/external/bibtexParse.js'\nimport FileIndex from 'src/client/fileindex.js'\n\n\nexport default class Bibliography {\n\n  \n      /*MD\n<style>* {background-color:lightgray}</style>\n```javascript\n[Bibliography.splitAuthors(\"Abi Bulbus and Deus, Curus \"),\nBibliography.splitAuthors(`Dan Ingalls and Marko R\\\\\"{o}der`)]\n```\n\n<script>\n  // #TODO refactor and hide tooling code\n  import Bibliography from 'src/client/bibliography.js';\n  var start = performance.now();\n  var result =   eval(this.parentElement.querySelector(\"code\").textContent);\n  var time = performance.now() - start;\n  <div>{result} <i>({time} ms)</i></div>\n</script>\n  MD*/\n\n  \n  \n  static splitAuthors(authorString=\"\") {\n     return authorString.split(\" and \").map(ea => {\n       var m = ea.match(/(.*),(.*)/)\n       if (m) {\n         return m[2] + \" \" + m[1] // take care of comma separated author\n       } else {\n         return ea\n       }\n     }).map(ea => ea.replace(/[{}]/g,\"\")\n            .replace(/\\\\\"a/g,\"ä\").replace(/\\\\\"A/g,\"Ä\") // take care of some umlauts\n            .replace(/\\\\\"o/g,\"ö\").replace(/\\\\\"O/g,\"Ö\")\n            .replace(/\\\\\"u/g,\"ü\").replace(/\\\\\"U/g,\"Ü\")\n            .replace(/^ */,\"\").replace(/ *$/,\"\").replace(/ +/g,\" \")) // unify whitespace...\n  }\n  \n  \n  \n    /*MD\n<style>* {background-color:lightgray}</style>\n```javascript\nBibliography.cleanTitle(\"{{This is my Title}}\")\n```\n\n<script>\n  // #TODO refactor and hide tooling code\n  import Bibliography from 'src/client/bibliography.js';\n  var start = performance.now();\n  var result =   eval(this.parentElement.querySelector(\"code\").textContent);\n  var time = performance.now() - start;\n  <div>{result} <i>({time} ms)</i></div>\n</script>\n  MD*/\n  \n  static cleanTitle(titleString=\"\") {\n     return titleString.replace(/[{}]/g,\"\")\n  }\n  \n  \n  // #TODO this method obviously will need a lot of tweaking...\n  static generateCitationKey(entry) {\n    if (!entry || !entry.entryTags) return undefined\n    var firstAuthor = entry.entryTags.author.split(\"and\")[0]\n    if (firstAuthor.match(\",\")) {\n      firstAuthor = firstAuthor.replace(/,.*/,\"\")\n    } else {\n      firstAuthor = firstAuthor.replace(/ *$/,\"\").split(\" \").last\n    }\n    firstAuthor = firstAuthor.replace(/ /g,\"\")\n    firstAuthor = firstAuthor.split(\"\").map((ea,i) => i == 0 ? ea.toUpperCase() : ea.toLowerCase()).join(\"\")\n\n    var year  =  entry.entryTags.year\n  \n    return firstAuthor + year + this.threeSignificantInitialsFromTitle(entry.entryTags.title)\n  }\n  \n  static threeSignificantInitialsFromTitle(title) {\n    return title.split(\" \")\n      .map(ea => ea.toLowerCase())\n      .filter(ea => ea.length >  2  && ![\"the\", \"and\", \"from\", \"out\", \"for\"].includes(ea))\n      .slice(0,3)\n      .map(ea => ea[0])\n      .join(\"\")\n      .toUpperCase()\n  } \n  \n  \n  /*MD\n<style>* {background-color:lightgray}</style>\n```javascript\nBibliography.filenameToKey(\"AuthorSecondauthor_1981_TitleInCammelCase_BOOK.pdf\")\n```\n\n<script>\n  // #TODO refactor and hide tooling code\n  import Bibliography from 'src/client/bibliography.js';\n  var start = performance.now();\n  var result =   eval(this.parentElement.querySelector(\"code\").textContent);\n  var time = performance.now() - start;\n  <div>{result} <i>({time} ms)</i></div>\n</script>\n  MD*/\n  \n  static filenameToKey(filename) {\n    var a = filename.split(\"_\")\n    if (a.length < 3) return\n    var authors = a[0]\n    var year = a[1]\n    var titleAndRest = a[2]\n    \n    var firstAuthor = authors.split(/(?=[A-Z])/)[0]\n    \n    \n    var title = titleAndRest.replace(/(?<=[a-z])(?=[A-Z])/g, \" \")\n    return firstAuthor + year + this.threeSignificantInitialsFromTitle(title)\n  }\n\n  static urlToKey(url) {\n    if (!url) return\n    var filename = url.toString().replace(/[#?].*]/,\"\").replace(/.*\\//,\"\")\n    return this.filenameToKey(filename)    \n  }\n\n  /*MD\n<style>* {background-color:lightgray}</style>\n```javascript\nBibliography.searchCitationKey(\"Fog2019MLL\")\n```\n<script>\n  import Bibliography from 'src/client/bibliography.js';\n  (async () => {\n    var start = performance.now()\n    var result = await eval(this.parentElement.querySelector(\"code\").textContent)\n    var time = performance.now() - start\n    return <div><ul>{...result.map(ea => <li>{ea.url}</li>)}</ul>in {time}ms</div>\n  })()   \n</script>\n  MD*/\n  // find all files that map to that key\n  static async searchCitationKey(key) {\n   \n    var result = []\n    await FileIndex.current().db.files.each(file => {\n      // if (file.url.match(/foobar/)) {\n      //     result.push(file)\n      // }\n      \n      if (file.url && this.urlToKey(file.url) == key) {\n          result.push(file)\n      }\n    })\n    return result\n  }\n  \n  /*MD\n<style>* {background-color:lightgray}</style>  \n```javascript\nBibliography.searchFilename(\"foobar\")\n```\n<script>\n  import Bibliography from 'src/client/bibliography.js';\n  (async () => {\n    return <ul>{...(await eval(this.parentElement.querySelector(\"code\").textContent))\n          .map(ea => <li>{ea.url}</li>)}</ul>\n  })()   \n</script>\nMD*/  \n  \n  static async searchFilename(searchString) {\n    var result = []\n    await FileIndex.current().db.files.each(file => {\n      if (file.url.match(searchString)) {\n           result.push(file)\n\n      }\n    }) \n    return result\n  }\n  \n}\n"]}