{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-portal/src/client/bibliography.js"],"names":["Parser","FileIndex","latexconv","Strings","Bibliography","splitAuthors","authorString","authors","split","result","map","m","ea","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","titleAndRest","urlToKey","url","toString","searchCitationKey","key","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":["\"enable examples\"\n/*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\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 /*example:*//*example:*/splitAuthors/*{\"id\":\"92ad_8212_2876\",\"name\":{\"mode\":\"input\",\"value\":\"e1\"},\"color\":\"hsl(60, 30%, 70%)\",\"values\":{\"authorString\":{\"mode\":\"input\",\"value\":\"\\\"Abi Bulbus and Deus, Curus \\\"\"}},\"instanceId\":{\"mode\":\"input\",\"value\":\"\"},\"prescript\":\"\",\"postscript\":\"\"}*//*{\"id\":\"c7bc_6730_6783\",\"name\":{\"mode\":\"input\",\"value\":\"e2\"},\"color\":\"hsl(180, 30%, 70%)\",\"values\":{\"authorString\":{\"mode\":\"input\",\"value\":\"`Dan Ingalls and Marko R\\\\\\\\\\\"{o}der`\"}},\"instanceId\":{\"mode\":\"input\",\"value\":\"\"},\"prescript\":\"\",\"postscript\":\"\"}*/(authorString=\"\") {\n    var /*probe:*/authors/*{}*/ = authorString.split(\" and \") \n    var result = authors.map(/*slider:*/ea/*{}*/ => {\n       var m = ea.match(/(.*),(.*)/)\n       if (m) {\n         return /*probe:*/m[2]/*{}*/ + \" \" + m[1] // take care of comma separated author\n       } else {\n         /*probe:*/return/*{}*/ ea\n       }\n     }).map(/*slider:*/ea/*{}*/ => /*probe:*/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    /*probe:*/return/*{}*/ result\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(/[ -\\/_]|(?=[0-9]+)/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/* Context: {\"context\":{\"prescript\":\"\",\"postscript\":\"\"},\"customInstances\":[]} */"]}