{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-eventsourcing/src/client/protocols/academic.js"],"names":["Scheme","PolymorphicIdentifier","focalStorage","Author","Paper","MicrosoftAcademicEntities","_","academicSubscriptionKeyId","AcademicScheme","scheme","resolve","setSubscriptionKey","key","setItem","getSubscriptionKey","getItem","lively","prompt","response","content","contentType","Response","headers","status","notfound","academicKnowledgeAttributes","map","ea","join","rawQueryInterpret","textQuery","count","interpretation","fetch","encodeURI","then","r","json","interpretations","rules","error","value","queryExpr","output","rawQueryExpr","attributes","result","rawQueryHist","entityQuery","queryString","queryType","raw","entities","query","startsWith","code","JSON","stringify","replace","histogramCode","inspectCode","length","shortPaperCSS","entity","paper","ensure","toShortHTML","toHTML","GET","options","url","RegExp","argsString","decodeURI","args","split","forEach","pair","typeRegex","m","match","Headers","schemas","path","e","undefined","get","papers","push","toBibtex","OPTIONS","register"],"mappings":";;;;;;;AAASA,Y,oBAAAA,M;AACFC,2B;;AACAC,kB;;AAECC,Y,0BAAAA,M;AAAQC,W,0BAAAA,K;AAAOC,+B,0BAAAA,yB;;AAGhBC,O;;;;;;;;;;;AAPEN,iD;;;;;;;;;;;;;AACFC,gE;;;;;;;;;;;;;AACAC,uD;;;;;;;;;;;;;AAEgBG,oE;;;;;;;;;;;;;AAAPD,gD;;;;;;;;;;;;;AAARD,iD;;;;;;;;;;;;;AAGDG,4C;;;;;;;;AACP;;;;AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkEA,YAAMC,4BAA4B,wBAAlC;;;;;;;;AAAMA,oE;;;;;;;AAMS,YAAMC,cAAN,SAA6BR,MAA7B,CAAoC;;AAEjD,YAAIS,MAAJ,GAAa;AACX,iBAAO,UAAP;AACD;;AAEDC,kBAAU;AACR,iBAAO,IAAP;AACD;;AAED,qBAAaC,kBAAb,CAAgCC,GAAhC,EAAqC;AACjC,iBAAOV,aAAaW,OAAb,CAAqBN,yBAArB,EAAgDK,GAAhD,CAAP;AACH;;AAED,qBAAaE,kBAAb,GAAkC;AAChC,cAAIF,MAAM,MAAMV,aAAaa,OAAb,CAAqBR,yBAArB,CAAhB;AACA,cAAI,CAACK,GAAL,EAAU;AACRA,kBAAM,MAAMI,OAAOC,MAAP,CAAe,oHAAf,EAAoI,EAApI,CAAZ;AACA,kBAAM,KAAKN,kBAAL,CAAwBC,GAAxB,CAAN;AACD;AACD,iBAAOA,GAAP;AACD;;AAEDM,iBAASC,OAAT,EAAkBC,cAAc,WAAhC,EAA6C;AAC3C,iBAAO,IAAIC,QAAJ,CAAaF,OAAb,EAAsB;AAC3BG,qBAAS;AACP,8BAAgBF;AADT,aADkB;AAI3BG,oBAAQ;AAJmB,WAAtB,CAAP;AAMD;;AAEDC,iBAASL,OAAT,EAAkBC,cAAc,WAAhC,EAA6C;AAC3C,iBAAO,IAAIC,QAAJ,CAAaF,OAAb,EAAsB;AAC3BG,qBAAS;AACP,8BAAgBF;AADT,aADkB;AAI3BG,oBAAQ;AAJmB,WAAtB,CAAP;AAMD;;AAEDE,sCAA8B;AAC5B,iBAAO,CACH,CAAC,IAAD,EAAO,MAAP,CADG,EAEH,CAAC,SAAD,EAAW,uBAAX,CAFG,EAGH,CAAC,QAAD,EAAU,yBAAV,CAHG,EAIH,CAAC,SAAD,EAAW,WAAX,CAJG,EAKH,CAAC,QAAD,EAAU,wBAAV,CALG,EAMH,CAAC,SAAD,EAAW,sBAAX,CANG,EAOH,CAAC,SAAD,EAAW,2BAAX,CAPG,EAQH,CAAC,MAAD,EAAQ,iCAAR,CARG,EASH,CAAC,IAAD,EAAM,kEAAN,CATG,EAUH,CAAC,IAAD,EAAM,8FAAN,CAVG,EAWH,CAAC,IAAD,EAAM,mBAAN,CAXG,EAYH,CAAC,OAAD,EAAS,sBAAT,CAZG,EAaH,CAAC,MAAD,EAAQ,wBAAR,CAbG,EAcH,CAAC,IAAD,EAAM,gBAAN,CAdG,EAeH,CAAC,QAAD,EAAU,yPAAV,CAfG,EAgBH,CAAC,GAAD,EAAK,qCAAL,CAhBG,EAiBH,CAAC,IAAD,EAAM,sBAAN,CAjBG,EAkBH,CAAC,KAAD,EAAO,oMAAP,CAlBG;AAmBH;AACA,WAAC,KAAD,EAAO,0BAAP,CApBG,EAqBH,CAAC,OAAD,EAAS,8BAAT,CArBG,EAsBH,CAAC,OAAD,EAAS,mBAAT,CAtBG,EAuBH,CAAC,MAAD,EAAQ,gCAAR,CAvBG,EAwBH,CAAC,OAAD,EAAS,oPAAT,CAxBG,EAyBH,CAAC,GAAD,EAAK,mBAAL,CAzBG,EA0BH,CAAC,IAAD,EAAM,mBAAN,CA1BG,EA2BH,CAAC,IAAD,EAAM,UAAN,CA3BG,EA4BH,CAAC,OAAD,EAAS,YAAT,CA5BG,EA6BH,CAAC,MAAD,EAAQ,cAAR,CA7BG,EA8BH,CAAC,IAAD,EAAM,oCAAN,CA9BG,EA+BH,CAAC,IAAD,EAAM,mCAAN,CA/BG,EAgCH,CAAC,IAAD,EAAM,WAAN,CAhCG,EAiCH,CAAC,IAAD,EAAM,uJAAN,CAjCG,EAkCH,CAAC,KAAD,EAAO,8BAAP,CAlCG,EAmCH,CAAC,GAAD,EAAK,uDAAL,CAnCG,EAoCH,CAAC,IAAD,EAAM,kBAAN,CApCG,EAqCH,CAAC,GAAD,EAAK,oBAAL,CArCG,EAsCH,CAAC,KAAD,EAAO,8CAAP,CAtCG,EAuCH,CAAC,KAAD,EAAO,+CAAP,CAvCG,EAwCH,CAAC,GAAD,EAAK,mCAAL,CAxCG,EAyCH,CAAC,GAAD,EAAK,gBAAL,CAzCG,EA0CHC,GA1CG,CA0CCC,MAAMA,GAAG,CAAH,CA1CP,EA0CcC,IA1Cd,CA0CmB,GA1CnB,CAAP;AA2CD;;AAED,cAAMC,iBAAN,CAAwBC,SAAxB,EAAmCC,KAAnC,EAA0C;AACtC,cAAIC,iBAAiB,MAAMC,MACxB,yEAAD,GACMC,UAAUJ,SAAV,CADN,GAEO,aAFP,GAGO,qBAAoB,MAAMtB,eAAeM,kBAAf,EAAoC,EAJ5C,EAI+CqB,IAJ/C,CAIoDC,KAAKA,EAAEC,IAAF,EAJzD,CAA3B;AAKA,cAAI,CAACL,eAAeM,eAAf,CAA+B,CAA/B,CAAD,IAAsC,CAACN,eAAeM,eAAf,CAA+B,CAA/B,EAAkCC,KAAlC,CAAwC,CAAxC,CAA3C,EAAuF;AACrF,mBAAO,EAACC,OAAO,oBAAR,EAA8BC,OAAOT,cAArC,EAAP;AACD;;AAED,cAAIU,YAAYV,eAAeM,eAAf,CAA+B,CAA/B,EAAkCC,KAAlC,CAAwC,CAAxC,EAA2CI,MAA3C,CAAkDF,KAAlE;AACA,iBAAO,KAAKG,YAAL,CAAkBF,SAAlB,EAA6BX,KAA7B,CAAP;AACH;;AAED,cAAMa,YAAN,CAAmBF,SAAnB,EAA8BX,QAAM,EAApC,EAAwCc,UAAxC,EAAoD;AAClD,cAAIA,aAAcA,cAAc,KAAKpB,2BAAL,EAAhC;AACA,cAAIqB,SAAS,MAAMb,MAAO,8EAAD,GACfC,UAAUQ,SAAV,CADe,GAEd,UAASX,KAAM,EAFD,GAGd,eAAcc,UAAW,EAHX,GAIf,qBAAoB,MAAMrC,eAAeM,kBAAf,EAAoC,EAJrD,EAIwDqB,IAJxD,CAI6DC,KAAKA,EAAEC,IAAF,EAJlE,CAAnB;AAKE,iBAAOS,MAAP;AACH;;AAED,cAAMC,YAAN,CAAmBL,SAAnB,EAA8BG,aAAW,CAAC,GAAD,CAAzC,EAAgDd,QAAM,EAAtD,EAA0D;AACxD,cAAIe,SAAS,MAAMb,MAAO,mFAAD,GACfC,UAAUQ,SAAV,CADe,GAEd,UAASX,KAAM,EAFD,GAGd,eAAcc,UAAW,EAHX,GAIf,qBAAoB,MAAMrC,eAAeM,kBAAf,EAAoC,EAJrD,EAIwDqB,IAJxD,CAI6DC,KAAKA,EAAEC,IAAF,EAJlE,CAAnB;AAKE,iBAAOS,MAAP;AACH;;AAED,cAAME,WAAN,CAAkBC,WAAlB,EAA+BC,SAA/B,EAA0CnB,KAA1C,EAAiDc,UAAjD,EAA6D;AAC3D,cAAIM,GAAJ;AACA,cAAID,aAAW,MAAf,EAAuB;AACrBC,kBAAO,MAAM,KAAKP,YAAL,CAAkBK,WAAlB,EAA+BlB,KAA/B,EAAsCc,UAAtC,CAAb;AACD,WAFD,MAEO;AACLM,kBAAO,MAAM,KAAKtB,iBAAL,CAAuBoB,WAAvB,EAAoClB,KAApC,CAAb;AACD;AACD,cAAIoB,IAAIC,QAAR,EAAmB;AACjB,mBAAQD,IAAIC,QAAZ;AACD,WAFD,MAEO;AACL,mBAAO;AACLZ,qBAAO,yBADF;AAELC,qBAAOU;AAFF,aAAP;AAID;AACF;;AAED,cAAMhC,OAAN,CAAciC,QAAd,EAAwB;AACtB,cAAIjC,UAAW,EAAf;AACA,cAAIiC,SAASZ,KAAb,EAAoB,OAAQ,uBAAsBY,SAASZ,KAAM,SAA7C;;AAIpB,cAAI,KAAKa,KAAL,CAAWC,UAAX,CAAsB,OAAtB,CAAJ,EAAoC;AAClC,gBAAIC,OAAQ;;mBAECC,KAAKC,SAAL,CAAe,KAAKJ,KAApB,CAA2B;qBACzB,KAAKtB,KAAM;;;SAH1B;AAOAZ,uBAAY,oBAAmBoC,KAAKG,OAAL,CAAa,IAAb,EAAkB,QAAlB,CAA4B,sBAA3D;;AAEA,gBAAIC,gBAAiB;;mBAERH,KAAKC,SAAL,CAAe,KAAKJ,KAAL,CAAWK,OAAX,CAAmB,SAAnB,EAA6B,EAA7B,CAAf,CAAiD;qBAC/C,KAAK3B,KAAM;SAH1B;AAKAZ,uBAAY,oBAAmBwC,cAAcD,OAAd,CAAsB,IAAtB,EAA2B,QAA3B,CAAqC,sBAApE;;AAEA,gBAAIE,cAAe;gCACO,KAAKP,KAAM,UAAS,KAAKtB,KAAM;;;;;OADzD;AAOAZ,uBAAY,oBAAmByC,YAAYF,OAAZ,CAAoB,IAApB,EAAyB,QAAzB,CAAmC,oBAAlE;AACD;;AAGD,cAAIN,SAASS,MAAT,GAAkB,CAAtB,EAAyB;AACvB1C,uBAAY,UAASf,MAAM0D,aAAN,EAAsB,YAA3C;AACA,iBAAI,IAAIC,MAAR,IAAkBX,QAAlB,EAA4B;AAC1B,kBAAIY,QAAQ,MAAM5D,MAAM6D,MAAN,CAAaF,MAAb,CAAlB;AACA5C,yBAAW,MAAM6C,MAAME,WAAN,EAAjB;AACD;AACF,WAND,MAMO,IAAId,SAASS,MAAT,IAAmB,CAAvB,EAA0B;AAC/B,gBAAIG,QAAQ,MAAM5D,MAAM6D,MAAN,CAAab,SAAS,CAAT,CAAb,CAAlB;AACAjC,uBAAW,OAAM6C,MAAMG,MAAN,EAAN,IAAuB,IAAlC;AACD,WAHM,MAGA;AACLhD,uBAAW,+BAA+B,IAA1C;AACD;AACD,iBAAOA,OAAP;AACD;;AAED,cAAMiD,GAAN,CAAUC,OAAV,EAAmB;AACjB,cAAIhB,QAAQ,KAAKiB,GAAL,CAASZ,OAAT,CAAiB,IAAIa,MAAJ,CAAW,KAAK9D,MAAL,GAAc,QAAzB,CAAjB,EAAqD,EAArD,CAAZ;AACA,cAAI4C,MAAMQ,MAAN,GAAe,CAAnB,EAAsB,OAAO,KAAK3C,QAAL,CAAe,6BAAf,CAAP;;AAGtB,cAAIsD,aAAanB,MAAMK,OAAN,CAAc,MAAd,EAAqB,EAArB,CAAjB;AACAL,kBAAQA,MAAMK,OAAN,CAAc,MAAd,EAAqB,EAArB,CAAyB;;AAAzB,WAAR,CAEA,KAAKL,KAAL,GAAaoB,UAAUpB,KAAV,CAAb;;AAEA;AACA,cAAIqB,OAAO,EAAX;AACAF,qBAAWG,KAAX,CAAiB,MAAjB,EAAyBC,OAAzB,CAAiCjD,MAAM;AACrC,gBAAIkD,OAAOlD,GAAGgD,KAAH,CAAS,GAAT,CAAX;AACAD,iBAAKG,KAAK,CAAL,CAAL,IAAgBA,KAAK,CAAL,CAAhB;AACD,WAHD;AAIA,eAAK9C,KAAL,GAAa2C,KAAK,OAAL,KAAiB,EAA9B;;AAEA,cAAI7B,aAAa6B,KAAK,MAAL,CAAjB,CAlBiB,CAkBc;;AAE/B;AACA;AACA,cAAII,YAAY,YAAhB;AACA,cAAIC,IAAI1B,MAAM2B,KAAN,CAAYF,SAAZ,CAAR;AACAzB,kBAAQoB,UAAUpB,KAAV,CAAR;AACA,cAAI0B,CAAJ,EAAO;AACL,gBAAI7B,YAAY6B,EAAE,CAAF,CAAhB;AACA1B,oBAAQA,MAAMK,OAAN,CAAcoB,SAAd,EAAwB,EAAxB,CAAR;AACD;;AAGDT,oBAAUA,WAAW,EAArB;AACA,cAAI/C,UAAU,IAAI2D,OAAJ,CAAYZ,QAAQ/C,OAApB,CAAd,CAhCiB,CAgC2B;;AAE5C,cAAI4B,aAAW,MAAf,EAAuB;AACrB,gBAAIgC,UAAU,MAAM7E,0BAA0B6E,OAA1B,EAApB;AACA,gBAAIpC,SAASoC,OAAb;AACA,gBAAIC,OAAO9B,MAAMsB,KAAN,CAAY,GAAZ,CAAX;AACA,iBAAI,IAAI/D,GAAR,IAAeuE,IAAf,EAAqB;AACnB,kBAAI;AACF,oBAAIvE,GAAJ,EAAS;AACPkC,2BAASA,OAAOlC,GAAP,CAAT;AACD;AACF,eAJD,CAIE,OAAMwE,CAAN,EAAS;AACT,qBAAKlE,QAAL,CAAc,oBAAoBmC,KAApB,GAA4B,aAA1C;AACD;AACF;;AAGD,mBAAO,KAAKnC,QAAL,CAAcsC,KAAKC,SAAL,CAAeX,MAAf,EAAuBuC,SAAvB,EAAkC,CAAlC,CAAd,EAAoD,kBAApD,CAAP;AACD;;AAED,cAAInC,aAAW,KAAf,EAAsB;AACpB,gBAAIC,MAAM,MAAM,KAAKP,YAAL,CAAkBS,KAAlB,EAAyB,KAAKtB,KAA9B,EAAqCc,UAArC,CAAhB;AACA,mBAAO,KAAK3B,QAAL,CAAcsC,KAAKC,SAAL,CAAeN,GAAf,EAAoBkC,SAApB,EAA+B,CAA/B,CAAd,EAAiD,kBAAjD,CAAP;AACD;;AAED,cAAInC,aAAW,MAAf,EAAuB;AACrB,gBAAI5B,QAAQgE,GAAR,CAAY,cAAZ,KAA+B,kBAAnC,EAAuD;AACrD,kBAAInC,MAAO,MAAM,KAAKJ,YAAL,CAAkBM,KAAlB,EAAyBR,UAAzB,EAAqC,KAAKd,KAA1C,CAAjB;AACA,qBAAO,KAAKb,QAAL,CAAcsC,KAAKC,SAAL,CAAeN,GAAf,EAAoBkC,SAApB,EAA+B,CAA/B,CAAd,EAAiD,kBAAjD,CAAP;AACD,aAHD,MAGO;AACL,qBAAO,KAAKnE,QAAL,CAAe;;;;;;;;iBAQbsC,KAAKC,SAAL,CAAegB,UAAUpB,KAAV,CAAf,CAAiC;iBACjCR,UAAW;;;;;;;;;;;CATb,CAAP;AAwBD;AACF;;AAED,cAAIO,WAAW,MAAM,KAAKJ,WAAL,CAAiBK,KAAjB,EAAwBH,SAAxB,EAAmCwB,KAAK3C,KAAxC,EAA+Cc,UAA/C,CAArB;AACA,cAAIwB,WAAWA,QAAQ/C,OAAvB,EAAgC;AAC9B,gBAAIA,QAAQgE,GAAR,CAAY,cAAZ,KAA+B,kBAAnC,EAAuD;AACrD,qBAAO,KAAKpE,QAAL,CAAcsC,KAAKC,SAAL,CAAeL,QAAf,CAAd,EAAwC,kBAAxC,CAAP;AACD;;AAED,gBAAI9B,QAAQgE,GAAR,CAAY,cAAZ,KAA+B,oBAAnC,EAAyD;AACvD,kBAAIC,SAAS,EAAb;AACA,mBAAI,IAAI5D,EAAR,IAAcyB,QAAd,EAAwB;AACtBmC,uBAAOC,IAAP,EAAY,MAAMpF,MAAM6D,MAAN,CAAatC,EAAb,CAAlB;AACD;AACD,qBAAO,KAAKT,QAAL,CAAcqE,OAAO7D,GAAP,CAAWC,MAAMA,GAAG8D,QAAH,EAAjB,EAAgC7D,IAAhC,CAAqC,IAArC,CAAd,EAA0D,oBAA1D,CAAP;AACD;AACF;AACD;AACA,cAAIT,UAAU,MAAM,KAAKA,OAAL,CAAaiC,QAAb,CAApB;AACA,iBAAO,KAAKlC,QAAL,CAAcC,OAAd,CAAP;AACD;;AAED,cAAMuE,OAAN,CAAcrB,OAAd,EAAuB;AACrB,cAAIlD,UAAUqC,KAAKC,SAAL,CAAe,EAAf,EAAmB4B,SAAnB,EAA8B,CAA9B,CAAd;AACA,iBAAO,IAAIhE,QAAJ,CAAaF,OAAb,EAAsB;AAC3BG,qBAAS;AACP,8BAAgB;AADT,aADkB;AAI3BC,oBAAQ;AAJmB,WAAtB,CAAP;AAMD;;AA9SgD;;yBAA9Bf,c;;;;;;;;6BAAAA,+C;;;;;;;;AAkTrBP,4BAAsB0F,QAAtB,CAA+BnF,cAA/B;;AAEA;AACA","file":"academic.js","sourcesContent":["import { Scheme } from \"src/client/poid.js\";\nimport PolymorphicIdentifier from \"src/client/poid.js\";\nimport focalStorage from \"src/external/focalStorage.js\";\n\nimport {Author, Paper, MicrosoftAcademicEntities} from \"src/client/literature.js\"\n\n\nimport _ from 'src/external/lodash/lodash.js';\n/*MD \n# Microsoft Academic Search \nMD*/\n\n/*MD \n<style>* {background-color:lightgray}</style>\n\n### Documentation\n\n<https://docs.microsoft.com/en-us/academic-services/project-academic-knowledge/reference-paper-entity-attributes>\n\n### Microsoft Academic Raw Query:\n\n```javascript{.example}\n  fetch(\"https://academic.microsoft.com/api/search\", {\n        method: \"POST\",\n        headers: {\n          \"content-type\": \"application/json; charset=utf-8\"\n        },\n        body: JSON.stringify({\n          query: \"\", \n          queryExpression: \"Composite(AA.AuN='jens lincke')\", \n          filters: [], \n          orderBy: 0, \n          skip: 0,\n          sortAscending: true, \n          take: 10})\n        }).then(r => r.json())\n```\n\n\n### And with our Scheme\n\n```javascript\nfetch(\"academic://Jens Lincke 2009\", {\n  method: \"GET\",\n  headers: {\n    \"content-type\": \"application/json\"\n  }\n}).then(r => r.json())\n```\n\nWe also support different content type, e.g. the default is HTML\n\n```javascript\nfetch(\"academic://Jens Lincke 2009\", {\n  method: \"GET\",\n  headers: {\n    \"content-type\": \"text/html\"\n  }\n}).then(r => r.text())\n```\n\nor bibtex\n\n```javascript\nfetch(\"academic://Jens Lincke 2009\", {\n  method: \"GET\",\n  headers: {\n    \"content-type\": \"application/bibtex\"\n  }\n}).then(r => r.text()).then(s => {\n  return s\n} )\n```\n\n\nMD*/\n\n\nconst academicSubscriptionKeyId = \"microsoft-academic-key\";\n\n\n\n\n\nexport default class AcademicScheme extends Scheme {\n\n  get scheme() {\n    return \"academic\";\n  }\n\n  resolve() {\n    return true;\n  }\n\n  static async setSubscriptionKey(key) {\n      return focalStorage.setItem(academicSubscriptionKeyId, key);\n  }\n  \n  static async getSubscriptionKey() {\n    var key = await focalStorage.getItem(academicSubscriptionKeyId);\n    if (!key) {\n      key = await lively.prompt(`Enter your <a href=\"https://msr-apis.portal.azure-api.net/developer\" target=\"_\">Project Academic Knowledge</a> key`, \"\");\n      await this.setSubscriptionKey(key);\n    }\n    return key\n  }\n\n  response(content, contentType = \"text/html\") {\n    return new Response(content, {\n      headers: {\n        \"content-type\": contentType\n      },\n      status: 200\n    });\n  }\n\n  notfound(content, contentType = \"text/html\") {\n    return new Response(content, {\n      headers: {\n        \"content-type\": contentType\n      },\n      status: 303\n    });\n  }\n\n  academicKnowledgeAttributes() {\n    return [\n        [\"Ty\", \"Type\"],\n        [\"AA.AfId\",\"Author affiliation ID\"],\n        [\"AA.AfN\",\"Author affiliation name\"],\n        [\"AA.AuId\",\"Author ID\"],\n        [\"AA.AuN\",\"Normalized author name\"],\n        [\"AA.DAuN\",\"Original author name\"],\n        [\"AA.DAfN\",\"Original affiliation name\"],\n        [\"AA.S\",\"Numeric position in author list\"],\n        [\"AW\",\"Unique, normalized words in abstract, excluding common/stopwords\"],\n        [\"BT\",\"BibTex document type ('a':Journal article, 'b':Book, 'c':Book chapter, 'p':Conference paper)\"],\n        [\"BV\",\"BibTex venue name\"],\n        [\"C.CId\",\"Conference series ID\"],\n        [\"C.CN\",\"Conference series name\"],\n        [\"CC\",\"Citation count\"],\n        [\"CitCon\",\"Citation contexts</br></br>List of referenced paper ID's and the corresponding context in the paper (e.g. [{123:[\\\"brown foxes are known for jumping as referenced in paper 123\\\", \\\"the lazy dogs are a historical misnomer as shown in paper 123\\\"]})\"],\n        [\"D\",\"Date published in YYYY-MM-DD format\"],\n        [\"DN\",\"Original paper title\"],\n        [\"DOI\",\"Digital Object Identifier</br></br>IMPORTANT: The DOI is normalized to uppercase letters, so if querying the field via evaluate/histogram ensure that the DOI value is using all uppercase letters\"],\n        //[\"E\",\"Extended metadata</br></br>IMPORTANT: This attribute has been deprecated and is only supported for legacy applications. Requesting this attribute individually (i.e. attributes=Id,Ti,E) will result in all extended metadata attributes being returned in a serialized JSON string</br></br>All attributes contained in the extended metadata are now available as a top-level attribute and can be requested as such (i.e. attributes=Id,Ti,DOI,IA)\"],\n        [\"ECC\",\"Estimated citation count\"],\n        [\"F.DFN\",\"Original field of study name\"],\n        [\"F.FId\",\"Field of study ID\"],\n        [\"F.FN\",\"Normalized field of study name\"],\n        [\"FamId\",\"If paper is published in multiple venues (e.g. pre-print and conference) with different paper IDs, this ID represents the main/primary paper ID of the family. The field can be used to find all papers in the family group, i.e. FamId=<paper_id>\"],\n        [\"I\",\"Publication issue\"],\n        [\"IA\",\"Inverted abstract\"],\n        [\"Id\",\"Paper ID\"],\n        [\"J.JId\",\"Journal ID\"],\n        [\"J.JN\",\"Journal name\"],\n        [\"FP\",\"First page of paper in publication\"],\n        [\"LP\",\"Last page of paper in publication\"],\n        [\"PB\",\"Publisher\"],\n        [\"Pt\",\"Publication type (0:Unknown, 1:Journal article, 2:Patent, 3:Conference paper, 4:Book chapter, 5:Book, 6:Book reference entry, 7:Dataset, 8:Repository\"],\n        [\"RId\",\"List of referenced paper IDs\"],\n        [\"S\",\"List of source URLs of the paper, sorted by relevance\"],\n        [\"Ti\",\"Normalized title\"],\n        [\"V\",\"Publication volume\"],\n        [\"VFN\",\"Full name of the Journal or Conference venue\"],\n        [\"VSN\",\"Short name of the Journal or Conference venue\"],\n        [\"W\",\"Unique, normalized words in title\"],\n        [\"Y\",\"Year published\"]\n      ].map(ea => ea[0]).join(\",\")\n  }\n  \n  async rawQueryInterpret(textQuery, count) {\n      var interpretation = await fetch(\n        `https://api.labs.cognitive.microsoft.com/academic/v1.0/interpret?query=`\n            + encodeURI(textQuery)\n            + `&complete=1`\n            + `&subscription-key=${await AcademicScheme.getSubscriptionKey()}`).then(r => r.json())\n      if (!interpretation.interpretations[0] || !interpretation.interpretations[0].rules[0]) {\n        return {error: \"no interpretations\", value: interpretation}\n      }\n      \n      var queryExpr = interpretation.interpretations[0].rules[0].output.value\n      return this.rawQueryExpr(queryExpr, count)\n  }\n  \n  async rawQueryExpr(queryExpr, count=10, attributes) {\n    var attributes =  attributes || this.academicKnowledgeAttributes()    \n    var result = await fetch(`cached:https://api.labs.cognitive.microsoft.com/academic/v1.0/evaluate?expr=`\n            + encodeURI(queryExpr)\n            + `&count=${count}`\n            + `&attributes=${attributes}`\n            +`&subscription-key=${await AcademicScheme.getSubscriptionKey()}`).then(r => r.json())\n      return result\n  }\n  \n  async rawQueryHist(queryExpr, attributes=[\"Y\"], count=10) {\n    var result = await fetch(`cached:https://api.labs.cognitive.microsoft.com/academic/v1.0/calchistogram?expr=`\n            + encodeURI(queryExpr)\n            + `&count=${count}`\n            + `&attributes=${attributes}`\n            +`&subscription-key=${await AcademicScheme.getSubscriptionKey()}`).then(r => r.json())\n      return result\n  }\n\n  async entityQuery(queryString, queryType, count, attributes) {\n    let raw;\n    if (queryType==\"expr\") {\n      raw = (await this.rawQueryExpr(queryString, count, attributes))\n    } else {\n      raw = (await this.rawQueryInterpret(queryString, count))\n    }\n    if (raw.entities)  {\n      return  raw.entities\n    } else {\n      return { \n        error: \"could not find entities\", \n        value: raw\n      }\n    }\n  }\n\n  async content(entities) {\n    var content = ``;\n    if (entities.error) return `<span class=\"error\">${entities.error}</span>`\n    \n\n\n    if (this.query.startsWith(\"expr:\")) {\n      var code = `lively.openMarkdown(lively4url + \"/demos/visualizations/academic.md\", \n        \"Academic Visualizaton\", {\n          query: ${JSON.stringify(this.query)},\n          \"count\": ${this.count},\n          \"min_cc_in\": 2,\n          \"min_refs_out\": 10,\n      })`\n      content += `<button onclick=\"${code.replace(/\"/g,\"&quot;\")}\">visualize</button>`\n      \n      var histogramCode = `lively.openMarkdown(lively4url + \"/demos/visualizations/academic-histogram.md\", \n        \"Academic Histogram\", {\n          query: ${JSON.stringify(this.query.replace(/^expr\\:/,\"\"))},\n          \"count\": ${this.count},\n      })`\n      content += `<button onclick=\"${histogramCode.replace(/\"/g,\"&quot;\")}\">histogram</button>`\n      \n      var inspectCode = `\n        let url = \"academic://${this.query}?count=${this.count}\"\n        lively.notify(\"inspect: \" + url);\n        lively.files.loadJSON(url).then(json => {\n           lively.openInspector(json)\n        })  \n      `\n      content += `<button onclick=\"${inspectCode.replace(/\"/g,\"&quot;\")}\">inspect</button>`\n    }\n    \n    \n    if (entities.length > 1) {\n      content += `<style>${Paper.shortPaperCSS()}</style>\\n`\n      for(var entity of entities) {\n        let paper = await Paper.ensure(entity)\n        content += await paper.toShortHTML();\n      }      \n    } else if (entities.length == 1) {\n      let paper = await Paper.ensure(entities[0])\n      content += await paper.toHTML() + \"\\n\";\n    } else {\n      content += \"<h1>No entities found</h1>\" + \"\\n\";\n    }\n    return content;\n  }\n\n  async GET(options) {\n    var query = this.url.replace(new RegExp(this.scheme + \"\\:\\/\\/\"), \"\");\n    if (query.length < 2) return this.response(`{\"error\": \"query to short\"}`);\n    \n    \n    var argsString = query.replace(/.*\\?/,\"\")\n    query = query.replace(/\\?.*/,\"\") // strip arguments\n   \n    this.query = decodeURI(query);\n    \n    // adhoc url paremeter decoding...\n    var args = {}\n    argsString.split(/[?&]/).forEach(ea => {\n      var pair = ea.split(\"=\")\n      args[pair[0]] = pair[1]\n    })\n    this.count = args[\"count\"] || 10\n    \n    var attributes = args[\"attr\"]; // optional\n   \n    // example: \n    //  \"expr:Id=3\" -> expr is query type\n    var typeRegex = /^([a-z]*):/\n    var m = query.match(typeRegex)\n    query = decodeURI(query);\n    if (m) {\n      var queryType = m[1]\n      query = query.replace(typeRegex,\"\")\n    }\n    \n    \n    options = options || {}\n    var headers = new Headers(options.headers); // #Refactor we should unify options before\n    \n    if (queryType==\"meta\") {\n      var schemas = await MicrosoftAcademicEntities.schemas()\n      var result = schemas\n      var path = query.split(\"/\")\n      for(let key of path) {\n        try {\n          if (key) {\n            result = result[key]\n          }\n        } catch(e) {\n          this.response(\"could not find \" + query + \" in schemas\");\n        }\n      }\n      \n      \n      return this.response(JSON.stringify(result, undefined, 2), \"application/json\");\n    }\n    \n    if (queryType==\"raw\") {\n      let raw = await this.rawQueryExpr(query, this.count, attributes)\n      return this.response(JSON.stringify(raw, undefined, 2), \"application/json\");      \n    }\n    \n    if (queryType==\"hist\") {\n      if (headers.get(\"content-type\") == \"application/json\") {\n        let raw = (await this.rawQueryHist(query, attributes, this.count))\n        return this.response(JSON.stringify(raw, undefined, 2), \"application/json\");\n      } else {\n        return this.response(`\n<html>\n<lively-script><script>\n  (async () => {\n      var url = lively4url + \"/demos/visualizations/academic-histogram.md\"\n      var comp = await (<lively-markdown style=\"width:100%; height:100%\"></lively-markdown>);\n      var src = await fetch(url).then(r => r.text());\n      comp.parameters = {\n        query: ${JSON.stringify(decodeURI(query))},\n        attr: \"${attributes}\",\n        \"count\": 100,\n      };\n      comp.setContent(src);\n      comp.parentElement.setAttribute(\"title\", \"Academic Histogram\");\n      return comp;\n    })()\n</script><lively-script>        \n        \n\n</html>\n`)        \n  \n      \n      \n      }\n    } \n    \n    let entities = await this.entityQuery(query, queryType, args.count, attributes);\n    if (options && options.headers) {\n      if (headers.get(\"content-type\") == \"application/json\") {\n        return this.response(JSON.stringify(entities), \"application/json\");\n      }\n      \n      if (headers.get(\"content-type\") == \"application/bibtex\") {\n        var papers = []\n        for(let ea of entities) {\n          papers.push(await Paper.ensure(ea))\n        }        \n        return this.response(papers.map(ea => ea.toBibtex()).join(\"\\n\"), \"application/bibtex\");\n      } \n    }\n    // default is HTML\n    var content = await this.content(entities);\n    return this.response(content);\n  }\n\n  async OPTIONS(options) {\n    var content = JSON.stringify({}, undefined, 2);\n    return new Response(content, {\n      headers: {\n        \"content-type\": \"application/json\"\n      },\n      status: 200\n    });\n  }\n\n}\n\nPolymorphicIdentifier.register(AcademicScheme);\n\n// import Tracing from \"src/client/tracing.js\"\n// Tracing.traceClass(Paper)\n"]}