| const references = (function() { | |
| var minSimilarity = 0.8; | |
| var minReferenceLength = 20; | |
| var fields = ['author', 'title', 'booktitle', 'publisher', 'pages', 'year', 'doi', 'location', 'address', 'editors', 'series', 'journal', 'institution', 'volume', 'number']; | |
| var tokenEntryCache = {}; | |
| return { | |
| readReferences: function () { | |
| var referenceLists = bib.referenceLists; | |
| console.log(referenceLists); | |
| $.each(referenceLists, function (id, references) { | |
| $.each(references, function (i, reference) { | |
| if (reference.length > minReferenceLength) { | |
| var tokenizedReferences = tokenizeSearchString(reference); | |
| var max = 0; | |
| var maxId = ''; | |
| var candidateCount = 0; | |
| $.each(bib.entries, function (id2, entry) { | |
| if (id2 != id) { | |
| var similarity = computeSearchSimilarity(id2, entry, tokenizedReferences); | |
| if (similarity > minSimilarity) { | |
| candidateCount++; | |
| } | |
| if (similarity > max) { | |
| max = similarity; | |
| maxId = id2; | |
| } | |
| } | |
| }); | |
| if (max > minSimilarity && candidateCount == 1) { | |
| if (!bib.entries[id].references) { | |
| bib.entries[id].references = ''; | |
| } | |
| if (bib.entries[id].references.split(' ').indexOf(maxId) == -1) { | |
| bib.entries[id].references += ' ' + maxId; | |
| bib.entries[id].references = bib.entries[id].references.trim(); | |
| console.log(id + ': ' + maxId + ' ' + max + ' ' + reference); | |
| } | |
| } | |
| } | |
| }); | |
| }); | |
| }, | |
| updateReferences: function () { | |
| if (!citations) { | |
| return; | |
| } | |
| bib.references = {}; | |
| $.each(bib.entries, function (id, entry) { | |
| var referencesOutgoing = parseReferences(entry['references']); | |
| referencesOutgoing = (referencesOutgoing ? referencesOutgoing.filter(onlyUnique) : null); | |
| if (!bib.references[id]) { | |
| bib.references[id] = {}; | |
| } | |
| bib.references[id].referencesOutgoing = referencesOutgoing; | |
| if (referencesOutgoing) { | |
| $.each(referencesOutgoing, function (i, id2) { | |
| if (!bib.references[id2]) { | |
| bib.references[id2] = {}; | |
| } | |
| if (!bib.references[id2].referencesIncoming) { | |
| bib.references[id2].referencesIncoming = []; | |
| } | |
| bib.references[id2].referencesIncoming.push(id); | |
| }); | |
| } | |
| }); | |
| bib.filteredReferences = {}; | |
| $.each(bib.filteredEntries, function (id, entry) { | |
| bib.filteredReferences[id] = {}; | |
| if (bib.references[id].referencesOutgoing) { | |
| bib.filteredReferences[id].referencesOutgoing = []; | |
| $.each(bib.references[id].referencesOutgoing, function (i, id2) { | |
| var passedFilter = Object.keys(bib.filteredEntries).indexOf(id2) >= 0; | |
| if (passedFilter) { | |
| bib.filteredReferences[id].referencesOutgoing.push(id2); | |
| } | |
| }); | |
| } | |
| if (bib.references[id].referencesIncoming) { | |
| bib.filteredReferences[id].referencesIncoming = []; | |
| $.each(bib.references[id].referencesIncoming, function (i, id2) { | |
| var passedFilter = Object.keys(bib.filteredEntries).indexOf(id2) >= 0; | |
| if (passedFilter) { | |
| bib.filteredReferences[id].referencesIncoming.push(id2); | |
| } | |
| }); | |
| } | |
| }); | |
| } | |
| }; | |
| function computeSearchSimilarity(id, entry, tokens) { | |
| if (!tokenEntryCache[id]) { | |
| tokenEntryCache[id] = {}; | |
| } | |
| var matchCount = 0; | |
| $.each(tokens, function (i, token) { | |
| var containedInValues = false; | |
| if (tokenEntryCache[id][token] != undefined) { | |
| containedInValues = tokenEntryCache[id][token]; | |
| } else { | |
| $.each(fields, function (j, field) { | |
| if (entry[field]) { | |
| if (entry[field].toLowerCase().indexOf(token) >= 0) { | |
| containedInValues = true; | |
| } | |
| } | |
| }); | |
| containedInValues = id.toLowerCase().indexOf(token) >= 0 || containedInValues; | |
| tokenEntryCache[id][token] = containedInValues; | |
| } | |
| matchCount += containedInValues ? 1 : 0; | |
| }); | |
| return matchCount / tokens.length; | |
| } | |
| function tokenizeSearchString(text) { | |
| text = text.toLowerCase(); | |
| var re = /\W+/; | |
| var words = text.split(re); | |
| words = $.grep(words, function (word) { | |
| return word.length > 1 && !($.inArray(word, bib.stopwords) >= 0); | |
| }); | |
| return words; | |
| } | |
| function parseReferences(refString) { | |
| if (!refString) { | |
| return null; | |
| } | |
| return refString.split(' '); | |
| } | |
| function onlyUnique(value, index, self) { | |
| return self.indexOf(value) === index; | |
| } | |
| })(); |