import { parse as parseDate } from '@citation-js/date'; import { parse as parseName } from '@citation-js/name'; function nameProps(person) { const { firstname, lastname, firstName: given = firstname, lastName: family = lastname } = person; if (given && family) { return { given, family }; } else if (person.name) { return parseName(person.name); } } const identifiers = ['PMID', 'PMCID', 'DOI', 'ISBN']; const journalIdentifiers = ['ISSN']; function idProps(input, identifiers) { const output = {}; for (const prop in input) { const upperCaseProp = prop.toUpperCase(); if (identifiers.includes(upperCaseProp)) { output[upperCaseProp] = input[prop]; } } if (input.identifier) { for (let { id, type = '' } of input.identifier) { type = type.toUpperCase(); if (identifiers.includes(type)) { output[type] = id; } } } return output; } const typeMap = { article: 'article', book: 'book', booklet: 'book', proceedings: 'book', mastersthesis: 'thesis', inbook: 'chapter', incollection: 'chapter', conference: 'paper-conference', inproceedings: 'paper-conference', manual: 'report', misc: 'document', online: 'website', patent: 'patent', phdthesis: 'thesis', techreport: 'report', unpublished: 'manuscript' }; function quickscrapeSpecificProps() { return { type: 'article-journal' }; } function generalProps(input) { const output = { type: typeMap[input.type] || 'document', title: input.title }; if (input.author) { output.author = input.author.map(nameProps).filter(Boolean); } if (input.editor) { output.editor = input.editor.map(nameProps).filter(Boolean); } if (input.reviewer) { if (input.author) { output['reviewed-author'] = output.author; } output.author = input.reviewer.map(nameProps).filter(Boolean); } if (Array.isArray(input.keywords)) { output.keyword = input.keywords.join(); } else if (input.keywords) { output.keyword = input.keywords; } if (input.publisher) { output.publisher = input.publisher.name || input.publisher; } if (input.date && input.date.published) { output.issued = parseDate(input.date.published); } else if (input.year) { output.issued = { 'date-parts': [[+input.year]] }; } if (input.date && input.date.submitted) { output.submitted = parseDate(input.date.submitted); } if (input.journal) { const journal = input.journal; if (journal.name) { output['container-title'] = journal.name; } if (journal.volume) { output.volume = journal.volume; } if (journal.issue) { output.issue = journal.issue; } Object.assign(output, idProps(journal, journalIdentifiers)); if (journal.firstpage) { output['page-first'] = journal.firstpage; } if (journal.pages) { output.page = journal.pages.replace('--', '-'); } else if (journal.firstpage && journal.lastpage) { output.page = journal.firstpage + '-' + journal.lastpage; } } if (input.link && typeof input.link[0] === 'object') { output.URL = input.link[0].url; } Object.assign(output, idProps(input, identifiers)); if (input.cid) { output.id = input.cid; } else if (output.DOI) { output.id = output.DOI; } return output; } const parseContentMine = function (data) { return Object.assign(generalProps(data), quickscrapeSpecificProps(data)); }; const parseBibJson = function (data) { return generalProps(data); }; export { parseContentMine as quickscrapeRecord, parseBibJson as record };