Reference file to QuickStatements
HTML
<title>Generate QuickStatements from references</title>
<form action="javascript:void(0);">
<fieldset>
<legend>Your article</legend>
<input id="form-article" name="article">
<label for="form-article">DOI or Wikidata ID</label>
</fieldset>
<fieldset>
<legend>References</legend>
<input type="file" id="form-refs" name="refs">
<label for="form-refs">BibTeX or Bib.TXT file</label>
</fieldset>
<button>Go!</button>
</form>
<div id="output"></div>
CSS
label[for="form-refs"] {
cursor: pointer;
}
input[type="file"] {
border: initial;
height: initial;
width: initial;
margin: initial;
padding: initial;
overflow: initial;
position: initial;
clip: initial;
-webkit-clip-path: initial;
clip-path: initial;
}
JavaScript 1.7
const Cite = require('citation-js')
const wdk = require(320)
function readFile(file) {
const reader = new FileReader()
return new Promise((resolve, reject) => {
reader.onload = event => resolve(event.target.result)
reader.onerror = event => reject(event.target.error)
reader.readAsText(file)
})
}
async function getData(event) {
const formData = new FormData(event.target)
const source = formData.get('article')
const file = formData.get('refs')
const input = await readFile(file)
const type = Cite.parse.input.type(input)
if (type === 'invalid') {
throw new Error('Invalid input file type')
}
const allRefs = Cite.parse.input.chain(input)
const refs = allRefs.map(entry => entry.DOI).filter(Boolean)
if (allRefs.length !== refs.length) {
console.debug('Items w/o DOI: %o', allRefs.filter(entry => !refs.find(doi => doi === entry.DOI)))
}
console.debug('Source: %s', source)
console.debug('DOIs: %o', refs)
if (refs.length === 0) {
throw new Error('No DOIs extracted (might be due to a parsing error, see console)')
}
return {
source,
refs
}
}
function buildQuery(dois) {
const parts = dois.map((doi, index) => {
const id = '?' + index
const statement = `${id} wdt:P356 "${doi}" .`
return {
id,
statement
}
})
return `SELECT ${parts.map(part => part.id).join(' ')} WHERE {
${parts.map(part => part.statement).join('\n')}
}`
}
async function getIds(event) {
const ids = []
const data = await getData(event)
const dois = data.refs
if (Cite.parse.input.type(data.source) === 'string/doi') {
dois.unshift(data.source)
} else {
ids.push(data.source)
}
const query = buildQuery(dois)
const url = wdk.sparqlQuery(query)
const response = await fetch(url)
const results = await response.json()
const result = results.results.bindings[0]
if (!result) {
throw new Error('Not all DOIs available in Wikidata')
}
const newIds = []
...