{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-tom/src/client/bibliography.js"],"names":["Parser","FileIndex","latexconv","Strings","Bibliography","splitAuthors","authorString","split","map","ea","m","match","replace","cleanTitle","titleString","generateCitationKey","entry","entryTags","undefined","tags","author","year","title","convertLaTeXToUnicode","e","console","warn","firstAuthor","lastName","last","fixUmlauts","cleanLastName","normalizedLastName","i","toUpperCase","toLowerCase","join","threeSignificantInitialsFromTitle","filter","length","includes","slice","filenameToKey","filename","a","authors","titleAndRest","urlToKey","url","toString","searchCitationKey","key","result","current","db","files","each","file","push","searchFilename","searchString","patchBibtexEntryInSource","source","entries","toJSON","replaced","replacedEntries","citationKey","Error","toBibtex","patchBibtexEntryInURL","lively","loadFile","newsource","saveFile"],"mappings":"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","file":"bibliography.js","sourcesContent":["/*MD # Bibliography \n\nMETA: #ExamplesInCode #BabylonianProgramming #Lightweight\n\n<edit://test/bibliography-test.js>\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\nimport Parser from 'src/external/bibtexParse.js'\nimport FileIndex from 'src/client/fileindex.js'\nimport latexconv from \"src/external/latex-to-unicode-converter.js\";\nimport Strings from \"src/client/strings.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} </div> // <i>({time} ms)</i>\n</script>\n  MD*/\n  \n  static cleanTitle(titleString=\"\") {\n     return titleString\n       .replace(/'s /g,\"s \")\n       .replace(/[{}\\[\\]]/g,\"\").replace(/[—‘’“”'`,.;:\"] ?/g,\" \")\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 tags = entry.entryTags\n    if (!tags.author ||  !tags.year || !tags.title) return undefined\n    try {\n      var author = latexconv.convertLaTeXToUnicode(tags.author)\n    } catch(e) {\n      debugger\n      console.warn(\"[bibliography] could not convertLaTeXToUnicode: \" + author)\n      author = tags.author.replace(/[^A-Za-z  ,]/g, \"\") // just remove everything else.... \n     }\n\n    var firstAuthor = author.split(/ and /g)[0]\n    if (firstAuthor.match(\",\")) {\n      var lastName = firstAuthor.replace(/,.*/,\"\")\n    } else {\n      lastName = firstAuthor.replace(/ *$/,\"\").split(\" \").last\n    }\n    // TO SIMPLE\n    // lastName = lastName.replace(/[^A-Za-z]/g, \"\")\n    // keep üäöß etc...\n    \n    // but convert them\n    lastName = Strings.fixUmlauts(lastName)\n    var cleanLastName = lastName.replace(/[ \\-']/g,\"\")\n    var normalizedLastName = cleanLastName.split(\"\").map((ea,i) => i == 0 ? ea.toUpperCase() : ea.toLowerCase()).join(\"\")\n\n    var year  =  tags.year\n  \n    return normalizedLastName + year + this.threeSignificantInitialsFromTitle(tags.title)\n  }\n  \n  static threeSignificantInitialsFromTitle(title) {\n    return this.cleanTitle(title)\n      .replace(/-based /g,\"based \")\n      .replace(/-the-/g,\"the\") // on-the-fly -> onthefly\n      .split(/[ -\\/_]/g)\n      .map(ea => ea.toLowerCase())\n      .filter(ea => ea.length > 0)\n      .filter(ea => ![\"a\",\"am\",\"an\",\"as\",\"at\",\"be\",\"by\",\"in\",\"is\",\"it\",\"of\",\"on\", \"to\", \"the\", \"and\", \"from\", \"out\", \"for\", \"but\"].includes(ea))\n      .filter(ea => ![\"so\", \"als\", \"der\", \"die\", \"das\", \"und\", \"oder\", \"aber\", \"für\"].includes(ea))\n      .filter(ea => !ea.match(/^[0-9]/))\n      .filter(ea => !ea.match(/^[\\(\\)\\[\\]\\/\\\\]/))\n      .slice(0,3)\n      .map(ea => ea[0])\n      .join(\"\")\n      .toUpperCase()\n  } \n  \n  /*MD\n<style>* {background-color:lightgray}</style>\n```javascript\n[Bibliography.filenameToKey(\"AuthorSecondauthor_1981_TitleInCammelCase_BOOK.pdf\"),\nBibliography.filenameToKey(\"00_Winograd_1996_Introduction.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    filename = filename.replace(/\\.[a-z]{3}$/,\"\") // strip ending\n    filename = filename.replace(/^[0-9][0-9]*[A-Z]?_/,\"\") // strip index number\n    \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\n      .replace(/(?<=[a-z])(?=[A-Z0-9])/g, \" \")\n      .replace(/(?<=[0-9])(?=[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  static patchBibtexEntryInSource(source, key, entry) {\n    var entries = Parser.toJSON(source)\n    var replaced = false\n    var replacedEntries = entries.map(ea => {\n      if (ea.citationKey == key) {\n        replaced = true\n        return entry\n      }\n      return ea\n    })\n    if (!replaced) throw new Error(\"Could not find \" + key + \" to patch it!\")\n    return Parser.toBibtex(replacedEntries, false)\n  }\n\n  static async patchBibtexEntryInURL(url, key, entry) {\n    var source = await lively.files.loadFile(url)\n    var newsource = this.patchBibtexEntryInSource(source, key, entry) \n    return lively.files.saveFile(url, newsource)\n  }\n}\n"]}