{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-portal/src/client/literature.js"],"names":["Dexie","BibtexParser","MarkdownIt","Bibliography","FileIndex","pt","toTitleCase","moment","specialInspect","target","contentNode","inspector","normal","renderObjectdProperties","name","Object","keys","getOwnPropertyDescriptors","__proto__","desc","getOwnPropertyDescriptor","get","appendChild","display","e","Author","constructor","value","id","authorId","livelyInspect","Scholar","fields","Paper","ensure","raw","existing","Literature","getPaperEntry","scholarid","p","paperId","Error","setById","byId","_byId","paper","Map","set","addPaper","getScholarPaper","paperQuery","json","fetchPaper","getId","idOrQuery","resp","fetch","method","headers","status","optionalEntity","entry","allBibtexEntries","current","db","bibliography","toArray","importBibtexId","undefined","source","toBibtex","importBibtexSource","lively","notify","importURL","map","ea","url","find","match","libcontent","files","loadFile","saveFile","openBrowser","authors","authorNames","year","title","replace","doi","externalIds","DOI","bibtexType","BT","booktitle","venue","key","toBibtexEntry","citationKey","keywords","fieldsOfStudy","hasPublicationInfo","findBibtexFileEntries","entries","filter","entryTags","author","join","entryType","references","microsoftreferences","referencedBy","microsoftreferencedby","generateCitationKey","abstract","allReferencesRequery","length","scholarQueryToPapers","query","response","loadJSON","console","warn","result","entity","data","push","papersToBibtex","papers","shortPaperCSS","toShortHTML","toHTML","generateFilename","bibentry","filename","toImportURL","baseURL","importBaseURL","importBaseURLDirName","file","ensureCache","isLoadingCache","cachedPapers","cachedPapersById","Promise","resolve","start","Date","now","log","papersById","invalidateCache","ensurePaperEntry","deleteEmptyAuthorPapers","forEach","delete","put","updateCache","patchPaper","obj","assign","getPaperEntries","all","includes","version","stores","upgrade"],"mappings":"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","file":"literature.js","sourcesContent":["import Dexie from \"src/external/dexie3.js\"\nimport BibtexParser from 'src/external/bibtexParse.js';\nimport MarkdownIt from \"src/external/markdown-it.js\";\nimport Bibliography from \"src/client/bibliography.js\"\nimport FileIndex from \"src/client/fileindex.js\";\nimport {pt} from \"src/client/graphics.js\"\nimport toTitleCase from \"src/external/title-case.js\"\nimport moment from \"src/external/moment.js\"\n \n\nfunction specialInspect(target, contentNode, inspector, normal) {\n    inspector.renderObjectdProperties(contentNode, target)\n    \n\n    for(var name of Object.keys(Object.getOwnPropertyDescriptors(target.__proto__))) {\n      var desc = Object.getOwnPropertyDescriptor(target.__proto__, name)\n      if (desc.get) {\n        try {\n          contentNode.appendChild(inspector.display(target[name], false, name, target))\n        } catch(e) {\n          // ignore e\n        }\n      }\n    }    \n  }\n\n\nexport class Author {\n \n  constructor(value) {\n    this.value = value\n  }\n\n  get name() {\n   return this.value.name // \"Original author name\"\n  }\n  \n  get id() {\n    return this.value.authorId \n  }\n  \n  livelyInspect(contentNode, inspector, normal) {\n    specialInspect(this, contentNode, inspector, normal)\n  }\n}\n\nexport class Scholar {\n  \n  static fields() {\n   return \"externalIds,url,title,abstract,venue,year,referenceCount,citationCount,influentialCitationCount,isOpenAccess,fieldsOfStudy,s2FieldsOfStudy,authors\"\n  }\n}\n\n\nexport class Paper {\n  \n  static async ensure(raw) {\n    var existing = await Literature.getPaperEntry(raw.scholarid)\n    if (!existing) {\n      var p = new Paper(raw)\n      if(!raw.paperId) {\n        throw new Error(\"paperId is missing (scholarid)\")\n      }\n\n      Paper.setById(raw.paperId, p)      \n    } else {\n      p = new Paper(existing.value)\n    }    \n    return p\n  }\n  \n  static byId(id) {\n    if (!this._byId) return\n    var paper = this._byId.get(id)\n    return paper     \n  }\n\n  static setById(id, paper) {\n    if (!this._byId) this._byId = new Map()\n    this._byId.set(id, paper)\n    Literature.addPaper(paper)\n  }\n  \n  static async getScholarPaper(paperQuery) {\n    var json = await this.fetchPaper(paperQuery)\n    if (json  && json.paperId) {\n      return this.getId(json.paperId, json)\n    }\n  }\n  \n  static async fetchPaper(idOrQuery) {\n    // download it individually\n    var resp = await fetch(\"scholar://data/paper/\" + idOrQuery + \"?fields=\"+ Scholar.fields(), {\n        method: \"GET\", \n        headers: {\n          \"content-type\": \"application/json\"}})\n    if (resp.status != 200) {\n      return // should we note it down that we did not found it?\n    }\n    return resp.json()\n  }\n  \n  static async getId(id, optionalEntity) {\n    var paper = this.byId(id)\n    if (paper) return paper\n    if (optionalEntity) {\n      paper = await Paper.ensure(optionalEntity)    \n    } else {\n      var entry = await Literature.getPaperEntry(id)\n      if (entry) {\n        paper = new Paper(entry.value)\n      } else {\n        var json = await this.fetchPaper(id)\n        paper = await Paper.ensure(json)    \n      }\n    }\n    return paper\n  }\n\n  static async allBibtexEntries() {\n    return FileIndex.current().db.bibliography.toArray()\n  }\n  \n  static async importBibtexId(id) {\n    if (id === undefined) {\n      throw new Error(\"importBibtexId missing id\")\n    }\n    var paper = await Paper.getId(id)\n    if (paper) {\n      var source = paper.toBibtex()\n      \n      await this.importBibtexSource(source)\n    } else {\n      lively.notify(`ERROR no paper with id '${this.scholarid}' found`)\n    }\n  }\n    \n  static async importBibtexSource(source) {\n    var importURL = (await this.allBibtexEntries())\n          .map(ea => ea.url)\n          .find(ea => ea && ea.match(/_incoming\\.bib$/))\n    if (!importURL) {\n      lively.notify(\"no _incoming.bib found\")\n    } else {\n      var libcontent = await lively.files.loadFile(importURL)\n\n      await lively.files.saveFile(importURL, libcontent + \"\\n\" + source )\n      lively.notify(\"PATER imported\", \"\", undefined, () => lively.openBrowser(importURL))\n    }\n  }\n  \n  \n  constructor(value) {\n    if (!value) throw new Error(\"value is missing\")\n    this.value = value\n  }\n  \n  get authors() {\n    return (this.value.authors || []).map(ea => new Author(ea)) \n  }\n\n  get authorNames() {\n    return (this.value.authors || [])\n  }\n\n  \n  get year() {\n    return this.value.year \n  }\n\n  get title() {\n    return (this.value.title || \"\")// \"Original paper title\"\n      .replace(/[\"{}]/g,\"\")  // some cleanup\n  }\n\n  get doi() {\n    return this.value.externalIds.DOI \n  }\n  \n  get scholarid() {\n    return this.value.paperId \n  }\n  \n  get bibtexType() {\n    return ({\n      'a': \"article\", \n      'b': \"book\", \n      'c': \"incollection\", \n      'p': \"inproceedings\"})[this.value.BT] || \"misc\"\n  }\n  \n  get booktitle() {\n    return this.value.venue\n  }\n  \n  get key() {\n    return this.toBibtexEntry().citationKey \n  }\n  \n  get keywords() {\n    return (this.value.fieldsOfStudy || [])\n  }\n  \n  hasPublicationInfo() {\n    return false // TODO\n  }\n  \n  \n  async findBibtexFileEntries() {\n    var key = this.key\n    var entries = await Paper.allBibtexEntries()\n        \n    return entries.filter(ea => ea.key == key)    \n  }\n   \n  toBibtexEntry() {\n    var entry = {\n      entryTags: {\n        author: this.authors.map(author => author.name).join(\" and \"), \n        title: this.title,\n        year: this.year,\n        scholarid: this.scholarid,\n      },\n      entryType: this.bibtexType\n    }\n    if (this.booktitle) { entry.entryTags.booktitle = this.booktitle }\n    if (this.doi) { entry.entryTags.doi = this.doi }\n\n    if (this.references) {\n        entry.entryTags.microsoftreferences = this.references.map(ea => ea.scholarid).join(\",\")\n    }\n    if (this.referencedBy) {\n        entry.entryTags.microsoftreferencedby = this.referencedBy.map(ea => ea.scholarid).join(\",\")\n    }\n\n    entry.citationKey = Bibliography.generateCitationKey(entry)\n    return entry\n  }\n  \n  get abstract() {\n    return this.value.abstract\n  }\n\n  \n  allReferencesRequery(references) {\n    if (!references || references.length == 0) return \n    return `Or(${ references.map(ea => 'Id=' + ea).join(\",\")})`\n  } \n  \n  \n  async scholarQueryToPapers(query) {\n    if (!query) return []\n    try {\n      var response = await lively.files.loadJSON(\"scholar://data/paper/search?query=\" + query) // + \"&count=\" + 1000\n    } catch(e) {\n      console.warn(\"[scholar] Error scholarQueryToPapers \" + query + \"... BUT WE CONTINUE ANYWAY\")\n      return null\n    }\n    var result = []\n    for(var entity of response.data) {\n      result.push(await Paper.getId(entity.paperId))\n    }\n    return result\n  }\n\n//   async resolveMicrosoftIdsToPapers(references) {\n//     var papers = []\n//     var rest = []\n    \n//     // bulk queries are faster\n//     var entries = await Literature.getPaperEntries(references)\n//     for(var scholarid of references) {\n//       // look each up if in db\n//       var entry = entries.find(ea => ea && (ea.scholarid == scholarid))\n//       if (entry && entry.value) {\n//         papers.push(new Paper(entry.value))\n//       } else {\n//         rest.push(scholarid)\n//       }\n//     } \n//     // bulk load the rest\n//     if (rest.length > 0) {\n//       let list = await this.scholarQueryToPapers(this.allReferencesRequery(rest))\n//       if (list) papers = papers.concat(list)\n//     }\n//     return papers\n//   }\n  \n//   async resolveReferences() {\n    \n//     this.references = []\n//     if (!this.value.RId) return // nothing to do here    \n    \n//     this.references = await this.resolveMicrosoftIdsToPapers(this.value.RId)\n//     return this.references\n//   }\n  \n//   async findReferencedBy() {\n//     if (this.referencedBy || !this.scholarid) return;\n    \n//     var entry = await Literature.getPaperEntry(this.scholarid)\n//     if (entry && entry.referencedBy) {\n//       this.referencedBy = await this.resolveMicrosoftIdsToPapers(entry.referencedBy)\n//     } else {\n//       console.log(\"FETCH referencedBy \" + this.scholarid)\n      \n//       this.referencedBy = await this.scholarQueryToPapers(\"RId=\" + this.scholarid)  \n//       if (this.referencedBy) {\n//         await Literature.patchPaper(this.scholarid, {\n//           referencedBy: this.referencedBy.map(ea => ea.scholarid)})           \n//       }\n//     }\n//     return this.referencedBy\n//   }\n  \n  papersToBibtex(papers) {\n    return `<lively-bibtex>\n      ${\n        papers\n            .map(ea => `<lively-bibtex-entry>${ea.toBibtex()}</lively-bibtex-entry>`)\n            .join(\"\\n\")\n      }\n      </lively-bibtex>` \n  }\n  \n  static shortPaperCSS() {\n    return `\n      .paper {\n        padding: 5px;\n        padding-left: 30px;\n      }\n\n      .paper .key {\n        margin-left: -30px;      \n        font-size: 10pt;\n        font-weight: bold;\n      }\n\n      .paper .title {\n        font-style: italic;\n      }\n\n      .paper .title {\n        font-style: italic;\n      }\n\n\n      .paper a {\n        color: black;\n        text-decoration-line: none\n      }\n\n      .paper a:hover {\n        color: darkblue;\n        text-decoration: underline currentcolor; \n      }\n\n\n    `\n  }\n    \n  async toShortHTML() {\n     return `<literature-paper mode=\"short\" scholarid=\"${this.scholarid}\"></literature-paper>`\n  }\n\n  async toHTML() {\n    return `<literature-paper scholarid=\"${this.scholarid}\"></literature-paper>`\n  }\n  \n  async generateFilename() {\n    var entry = this.toBibtexEntry()\n    var bibentry = await (<lively-bibtex-entry></lively-bibtex-entry>)\n    bibentry.value = entry\n    var filename = bibentry.generateFilename(entry)\n    return filename + \".pdf\"\n  }\n  \n  async toImportURL() {\n    var filename = await this.generateFilename()\n    var baseURL = await Paper.importBaseURL()\n    if (!baseURL) {\n      throw new Error(\"[Paper] toImportURL error: could not find baseURL \" + Paper.importBaseURLDirName())\n    }\n    return baseURL + filename \n  }\n  \n  toBibtex() {\n    var entry = this.toBibtexEntry()\n    return BibtexParser.toBibtex([entry], false);\n  }\n   \n  livelyInspect(contentNode, inspector, normal) {\n    specialInspect(this, contentNode, inspector, normal)\n    contentNode.appendChild(inspector.display(this.toBibtex(), false, \"#bibtex\", this))\n  }\n  \n  static importBaseURLDirName() {\n    return \"_incoming\" // #TODO add to preferences....\n  }\n  \n  static async importBaseURL() {\n    // #TODO make this also more customizeable\n    var files =  await FileIndex.current().db.files.toArray()\n    var file = files.find(ea => ea.url.match(`/${this.importBaseURLDirName()}/`))\n    return file && file.url.replace(/[^/]*$/,\"\")\n  }\n  \n}\n\n\nexport default class Literature {\n  \n  \n  static async ensureCache() {\n    if (this.isLoadingCache) {\n      await this.isLoadingCache\n    }\n      \n    if (!this.cachedPapers || !this.cachedPapersById) {\n      this.isLoadingCache = new Promise(async resolve => {\n        try {\n          var start = Date.now()\n          this.cachedPapers = await this.db.papers.toArray()\n          console.log(\"[literature] ensureCache indexdb \" + (Date.now() - start))\n\n          this.cachedPapersById = new Map()\n          for(var ea of this.cachedPapers) {\n            this.cachedPapersById.set(ea.scholarid, ea)\n          }\n          console.log(\"[literature] ensureCache total \" + (Date.now() - start))          \n        } finally {\n          resolve()\n        }\n      })\n      await this.isLoadingCache\n      this.isLoadingCache = false\n    }\n  }\n  \n  static async papers() {\n    await this.ensureCache()    \n    return this.cachedPapers \n  }\n\n  static async papersById() {\n    await this.ensureCache()    \n    return this.cachedPapersById \n  }\n\n  \n  static invalidateCache() {\n    console.log(\"[literature] invalidate Cache\")\n    debugger\n    this.cachedPapers = null\n    this.cachedPapersById  = null\n    this.isLoadingCache = false\n  }\n  \n  static async ensurePaperEntry(paper) {\n    var raw = await this.db.papers.get(paper.scholarid) \n    if (!raw) {\n      raw = this.addPaper(paper)\n    }\n    return  raw\n  }\n  \n  static async deleteEmptyAuthorPapers() {    \n    var entries = await this.papers()\n    this.invalidateCache()\n    return entries\n      .filter(ea => !ea.authors)\n      .forEach(ea => Literature.db.papers.delete(ea.scholarid))\n  \n  }\n  \n  static async addPaper(paper) {\n    var raw = {\n        scholarid: paper.scholarid,\n        authors: paper.authorNames,\n        year: paper.year,\n        title: paper.title,\n        key: paper.key,\n        keywords: paper.keywords,\n        booktitle: paper.booktitle,\n        value: paper.value,\n        abstract: paper.abstract    \n    }\n    await this.db.papers.put(raw)\n\n    await this.updateCache(raw)\n    \n    return raw\n  }\n\n  static async updateCache(raw) {\n    await this.ensureCache()\n    \n    // manual cache update, because invalidating is very expensive\n    this.cachedPapers = this.cachedPapers.filter(ea => ea.scholarid == raw.scholarid)\n    this.cachedPapers.push(raw)\n    this.cachedPapersById.set(raw.scholarid, raw)\n  }\n  \n  static async patchPaper(id, obj) {\n    var raw = await this.ensurePaperEntry({scholarid: id})\n    raw = Object.assign(raw, obj)\n    await this.db.papers.put(raw) \n    await this.updateCache(raw)\n  }\n  \n  static async getPaperEntry(id) {\n    var map = await this.papersById()\n    var entry = map.get(id)\n    if (entry) return entry\n    // maybe something ch\n    // return this.db.papers.get({scholarid: id})  \n  }\n  \n  static async getPaperEntries(references) {\n    var all = await this.papers()\n    return all.filter(ea => references.includes(ea.scholarid))\n    \n    // (reasonably fast)\n    // return this.db.papers.bulkGet(references)\n    \n    // (SLOW)\n    // return (await this.db.papers.toArray())\n    //     .filter(ea => references.includes(ea.scholarid))  \n  }\n  \n  static get db() {\n    var db = new Dexie(\"scholar\");\n\n    db.version(1).stores({\n        papers: 'scholarid,authors,year,title,key,keywords,booktitle',      \n    }).upgrade(function () {\n    })\n    \n    \n    return db\n  }\n}\n\n\n\n\n\n\n\n\n\n\n// import Tracing from \"src/client/tracing.js\"\n// Tracing.traceObject(Literature)\n"]}