1 | // ==UserScript==
|
---|
2 | // @name Bib Stinky
|
---|
3 | // @namespace http://bibstinky.sowemustthink.space/
|
---|
4 | // @version 0.1
|
---|
5 | // @description Helps identify when metadata stored by a publication provider or agregator might be a bit 'off'
|
---|
6 | // @author David Bainbridge
|
---|
7 | // @author Dave Nichols
|
---|
8 | // @author Mike Twidale
|
---|
9 | // @require https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js
|
---|
10 | // @match https://www.cs.waikato.ac.nz/*
|
---|
11 | // @match https://search.crossref.org/*
|
---|
12 | // @grant GM_xmlhttpRequest
|
---|
13 | // @connect bibstinky.sowemustthink.space
|
---|
14 | // @connect bib-stinky.so-we-must-think.space
|
---|
15 | // ==/UserScript==
|
---|
16 |
|
---|
17 | //alert("Testing, Testing!");
|
---|
18 |
|
---|
19 | (function() {
|
---|
20 | 'use strict';
|
---|
21 |
|
---|
22 | var $ = window.jQuery;
|
---|
23 |
|
---|
24 | function createCrossCheckDOICallack(doi)
|
---|
25 | {
|
---|
26 | return function(responseDetails) {
|
---|
27 | var returned_json_str = responseDetails.responseText;
|
---|
28 | //console.log(returned_json_str);
|
---|
29 | var doi_rec = JSON.parse(returned_json_str);
|
---|
30 |
|
---|
31 | var totalHits = doi_rec.totalHits;
|
---|
32 | if (doi_rec.totalHits == 0) {
|
---|
33 | // Remove it
|
---|
34 | var doi_id = "doistinky-" + doi.replaceAll("/","SLASH");
|
---|
35 | console.log("No match found in Core => remove DOI " + doi);
|
---|
36 | //console.log("Removing: id=" + doi_id);
|
---|
37 | $('#'+doi_id).remove();
|
---|
38 | }
|
---|
39 | else if (totalHits == 1) {
|
---|
40 | var result = doi_rec.results[0];
|
---|
41 | console.log("Match found in Core for DOI " + doi + " => Investigate Title = " + result.title);
|
---|
42 | }
|
---|
43 | else {
|
---|
44 | console.error("Error: API returned more than one DOI metadata record for doi: " + doi);
|
---|
45 | }
|
---|
46 | }
|
---|
47 | }
|
---|
48 |
|
---|
49 | function crossCheckDOIs(doi_list,doi_href_list)
|
---|
50 | {
|
---|
51 | console.log("Cross-checking #" + doi_list.length + " DOIs");
|
---|
52 |
|
---|
53 | for (var i=0; i<doi_list.length; i++) {
|
---|
54 | var doi = doi_list[i];
|
---|
55 | var encoded_doi = encodeURIComponent(doi);
|
---|
56 |
|
---|
57 | var crossCheckDOICallback = createCrossCheckDOICallack(doi);
|
---|
58 |
|
---|
59 | console.log("cross-checking doi: " + doi);
|
---|
60 | GM_xmlhttpRequest ( {
|
---|
61 | method: 'GET',
|
---|
62 | url: 'https://bibstinky.sowemustthink.space/api/get-doi?coreDOI='+encoded_doi,
|
---|
63 | onload: crossCheckDOICallback
|
---|
64 | });
|
---|
65 |
|
---|
66 | }
|
---|
67 | }
|
---|
68 |
|
---|
69 |
|
---|
70 | var doi_list = [];
|
---|
71 | var doi_href_list = [];
|
---|
72 |
|
---|
73 | var doi_pattern = /^http(?:s)?:\/\/doi.org\/(.*)$/i;
|
---|
74 |
|
---|
75 | $('a').each(function() {
|
---|
76 | var href=$(this).attr('href');
|
---|
77 | var doi_pattern_matches = doi_pattern.exec(href);
|
---|
78 | if (doi_pattern_matches != null) {
|
---|
79 | var doi_id = doi_pattern_matches[1];
|
---|
80 | doi_list.push(doi_id);
|
---|
81 | doi_href_list.push(href);
|
---|
82 | }
|
---|
83 | });
|
---|
84 |
|
---|
85 | // console.log(doi_list);
|
---|
86 |
|
---|
87 | var elmWrapperDiv = document.createElement('div');
|
---|
88 | elmWrapperDiv.id = "doiStinkyBar";
|
---|
89 |
|
---|
90 | $(document).ready(function() {
|
---|
91 | //console.log("Adding in <div> to display DOI Stinky bar at top:");
|
---|
92 | elmWrapperDiv.style.width = '100%';
|
---|
93 | //elmWrapperDiv.style.textAlign = 'center';
|
---|
94 | elmWrapperDiv.style.fontFamily = 'sans-serif';
|
---|
95 | elmWrapperDiv.style.backgroundColor = 'wheat';
|
---|
96 |
|
---|
97 | elmWrapperDiv.style.zIndex = '25';
|
---|
98 | elmWrapperDiv.style.position = 'fixed';
|
---|
99 |
|
---|
100 | document.body.insertBefore(elmWrapperDiv, document.body.firstChild);
|
---|
101 |
|
---|
102 | GM_xmlhttpRequest ( {
|
---|
103 | method: 'GET',
|
---|
104 | url: 'https://bibstinky.sowemustthink.space/doi-stinky-bar.html',
|
---|
105 | onload: function (responseDetails) {
|
---|
106 |
|
---|
107 | var returned_html_str = responseDetails.responseText;
|
---|
108 | var body_str = returned_html_str.substring(returned_html_str.indexOf("<body>")+6,returned_html_str.indexOf("</body>"))
|
---|
109 | //console.log("returned body = " + body_str.substring (0) + '...');
|
---|
110 |
|
---|
111 | var body = $.parseHTML(body_str);
|
---|
112 | $("#doiStinkyBar").append(body);
|
---|
113 |
|
---|
114 | if (doi_list.length > 0) {
|
---|
115 | if (doi_list.length == 1) {
|
---|
116 | $('#doiStinkyInfo').html("Cross-checking extracted DOI:");
|
---|
117 | }
|
---|
118 | else {
|
---|
119 | $('#doiStinkyInfo').html("Cross-checking extracted DOIs:");
|
---|
120 | }
|
---|
121 | var $doi_list_div = $('<div>');
|
---|
122 |
|
---|
123 | for (var i=0; i<doi_list.length; i++) {
|
---|
124 | var doi = doi_list[i];
|
---|
125 | var doi_id = doi.replaceAll("/","SLASH");
|
---|
126 | var $a_tag = $('<a>');
|
---|
127 | $a_tag.attr("id","doistinky-"+ doi_id);
|
---|
128 | $a_tag.attr("href","https://doi.org/"+doi);
|
---|
129 | $a_tag.append(doi);
|
---|
130 |
|
---|
131 | if (i>0) {
|
---|
132 | $doi_list_div.append(", ");
|
---|
133 | }
|
---|
134 | $doi_list_div.append($a_tag);
|
---|
135 |
|
---|
136 | }
|
---|
137 | $('#doiStinkyInfo').append($doi_list_div);
|
---|
138 |
|
---|
139 | crossCheckDOIs(doi_list,doi_href_list);
|
---|
140 |
|
---|
141 | }
|
---|
142 | else {
|
---|
143 | $('#doiStinkyInfo').append("No DOIs detected on the page");
|
---|
144 | }
|
---|
145 |
|
---|
146 | }
|
---|
147 | } );
|
---|
148 | });
|
---|
149 |
|
---|
150 | })();
|
---|