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 = []
 ...