User:Alexis Jazz/Citoid.js

/*************

Generates a citation template from a url using the citoid server

Author User:Salix alba

Date: 15 July 2021

Version: 0.05

Heavily borrowed from

User:Mvolz/veCiteFromURL.js

Interface element taken from

TemplateDataEditor

http://fr.wikipedia.org/w/index.php?title=Utilisateur:Ltrlg/scripts/TemplateDataEditor.js

https://citoid.wikimedia.org/api?action=query&format=mediawiki&search=http%3A%2F%2Fwww%2Etheguardian%2Ecom%2Feducation%2F2016%2Fapr%2F12%2Fgrammar-schools-nicky-morgan-kent-parent-11-plus&basefields=true

Slightly customized.

  • /

function Citoid($) {

////// Customization for local wikis

var lang = mw.config.get('wgUserLanguage');

var messages = {

"en": {

"toolbox-label": 'Citoid',

"toolbox-tooltip": 'Generate reference from a URL',

"title": 'Citoid reference ',

"close": 'Close',

"monthnames": ['January','February','March','April','May','June','July','August','September','October','November','December']

},

};

if(messages[lang]==null) lang='en';

var url;

function formatCS1Date(isodate) {

console.log(isodate);

var style = $( "input:radio[name=datestyle]:checked" ).val();

var day="",month="",year="",daynum="",monthnum="";

// Input format 2014-08-31T09:28EDT

var re1 = /(\d\d\d\d)-(\d\d)-(\d\d).*/;

var test1 = isodate.match(re1);

// Or sometimes September 29, 2014

var re2 = /([A-Z][a-z]+) (\d+), (\d\d\d\d).*/;

var test2 = isodate.match(re2);

var re3 = /(\d\d\d\d)-(\d\d)/;

var test3 = isodate.match(re3);

if(test1 !== null) {

// Input format 2014-08-31T09:28EDT

day = parseInt(test1[3],10);

daynum= test1[3];

month = parseInt(test1[2],10)-1;

monthnum = test1[2];

year = test1[1];

}

else if(test2 !== null) {

// September 29, 2014

day = parseInt(test2[2],10);

var monthtxt = test2[1];

year = test2[3];

if(day<10) daynum = "0" + day; else daynum = day;

var index = messages['en'].monthnames.indexOf(monthtxt)+1;

if(index<10) monthnum = "0" + index; else monthnum = index;

month = index-1;

}

else if(test3 !== null) {

month = parseInt(test3[2],10)-1;

monthnum = test3[2];

year = test3[1];

if(style == "MDY")

return ""+messages[lang].monthnames[month]+", "+year;

else if(style == "YMD")

return ""+year+"-"+monthnum;

else

return ""+messages[lang].monthnames[month]+" "+year;

}

//console.log(day,month,year,daynum,monthnum);

//console.log(messages[lang].monthnames);

//console.log(messages[lang].monthnames[month]);

if(style == "MDY")

return ""+messages[lang].monthnames[month]+" "+day+", "+year;

else if(style == "YMD")

return ""+year+"-"+monthnum+"-"+daynum;

else

return ""+day+" "+messages[lang].monthnames[month]+" "+year;

}

/* Returns a javascript object given search results */

function getPlainObject( url, searchResults ) {

var content, plainObject, d, templateHref, templateName,

citation = JSON.parse( JSON.stringify( searchResults ) )[0], //uses the first citation result for the time being

templateTypeMap = {

book: 'Cite book',

bookSection: 'Cite book',

journalArticle: 'Cite journal',

magazineArticle: 'Cite news',

newspaperArticle: 'Cite news',

thesis: 'Cite journal',

letter: 'Citation',

manuscript: 'Cite book',

interview: 'Citation',

film: 'Citation',

artwork: 'Citation',

webpage: 'Cite web',

report: 'Cite journal',

bill: 'Citation',

hearing: 'Citation',

patent: 'Citation',

statute: 'Citation',

email: 'Cite web',

map: 'Citation',

blogPost: 'Cite web',

instantMessage: 'Citation',

forumPost: 'Cite web',

audioRecording: 'Citation',

presentation: 'Cite journal',

videoRecording: 'Citation',

tvBroadcast: 'Citation',

radioBroadcast: 'Citation',

podcast: 'Citation',

computerProgram: 'Citation',

conferencePaper: 'Cite journal',

'document': 'Citation',

encyclopediaArticle: 'Cite journal',

dictionaryEntry: 'Cite journal'

},

//Parameter map for Template:Citation on en-wiki

//In the format citation-template-field:citoid-field

citationParams = {

'first1': 'author1-first',

'last1': 'author1-last',

'first2': 'author2-first',

'last2': 'author2-last',

'first3': 'author3-first',

'last3': 'author3-last',

'first4': 'author4-first',

'last4': 'author4-last',

// 'accessdate': 'accessDate',

'title': 'title',

'url': 'url',

'publisher': 'publisher',

//a large number of Zotero types have the field publicationTitle

//however, in setting journal to publicationTitle, the citation

//will be formatted as a journal article, which may not always be

//desirable.

'journal': 'publicationTitle',

// 'newspaper': 'publicationTitle',

'date': 'date',

'location': 'place',

'issn': 'ISSN',

'isbn': 'ISBN',

'pages': 'pages',

'volume': 'volume',

'series': 'series',

'issue': 'issue',

'via': 'libraryCatalog',

'pmid': 'PMID',

'pmc': 'PMCID',

'doi': 'DOI'

},

webParams = {

'first1': 'author1-first',

'last1': 'author1-last',

'first2': 'author2-first',

'last2': 'author2-last',

'first3': 'author3-first',

'last3': 'author3-last',

'first4': 'author4-first',

'last4': 'author4-last',

'access-date': 'accessDate',

'title': 'title',

'url': 'url',

'date': 'date',

'publisher': 'publisher',

'via': 'libraryCatalog',

'website': 'publicationTitle'

},

newsParams = {

'first1': 'author1-first',

'last1': 'author1-last',

'first2': 'author2-first',

'last2': 'author2-last',

'first3': 'author3-first',

'last3': 'author3-last',

'first4': 'author4-first',

'last4': 'author4-last',

'access-date': 'accessDate',

'title': 'title',

'url': 'url',

'publisher': 'publisher',

'newspaper': 'publicationTitle',

'date': 'date',

'location': 'place',

'issn': 'ISSN',

'isbn': 'ISBN',

'pages': 'pages',

'volume': 'volume',

'series': 'series',

'issue': 'issue',

'via': 'libraryCatalog',

'doi': 'DOI'

},

bookParams = {

'first1': 'author1-first',

'last1': 'author1-last',

'first2': 'author2-first',

'last2': 'author2-last',

'first3': 'author3-first',

'last3': 'author3-last',

'first4': 'author4-first',

'last4': 'author4-last',

// 'accessdate': 'accessDate',

'title': 'title',

'url': 'url',

'publisher': 'publisher',

'journal': 'publicationTitle',

'date': 'date',

'location': 'place',

'issn': 'ISSN',

'isbn': 'ISBN',

'pages': 'pages',

'volume': 'volume',

'series': 'series',

'issue': 'issue',

'via': 'libraryCatalog',

'doi': 'DOI'

},

journalParams = {

'first1': 'author1-first',

'last1': 'author1-last',

'first2': 'author2-first',

'last2': 'author2-last',

'first3': 'author3-first',

'last3': 'author3-last',

'first4': 'author4-first',

'last4': 'author4-last',

// 'accessdate': 'accessDate',

'title': 'title',

'url': 'url',

'publisher': 'publisher',

'journal': 'publicationTitle',

'date': 'date',

'location': 'place',

'issn': 'ISSN',

'isbn': 'ISBN',

'pages': 'pages',

'volume': 'volume',

'series': 'series',

'issue': 'issue',

'pmid': 'PMID',

'pmc': 'PMCID',

'doi': 'DOI'

},

//format 'template name':parameter obj name

templateParamMap = {

'Citation': citationParams,

'Cite web': webParams,

'Cite news': newsParams,

'Cite journal': journalParams,

'Cite book': bookParams

},

//This will contain the correct template with the fields filled out

paramObj = {};

templateName = templateTypeMap[citation.itemType];

templateHref = 'Template:' + templateName;

//hack for now- set citation url to supplied url if not given

if (!citation.url) {citation.url = url;}

//hack for PMC

if (citation.PMCID) {citation.url = null;}

//hack for websiteTitle

if (citation.websiteTitle) {citation.publicationTitle = citation.websiteTitle;}

$.each( templateParamMap[templateName], function ( key, value ) {

var objString = citation[value] !== undefined ? citation[value] : '';

paramObj[key] = { 'wt': objString };

} );

// Fix for author array

var authors = citation['author'];

if(authors) {

for(i=0;i

var j = i+1;

paramObj['first' + j] = { 'wt': authors[i][0] };

paramObj['last' + j] = { 'wt': authors[i][1] };

}

}

d = new Date();

//var months = ['January','February','March','April','May','June','July','August','September','October','November','December'];

//ds = d.getDate() + " " + months[d.getMonth()] + " " + d.getGetFullYear();

var d2 = paramObj.date.wt;

if(d2) {

paramObj.date.wt = formatCS1Date(d2);

}

// Greatly simplified return result

plainObject = { //before paren put get plain object

'templateName': templateName.toLowerCase(),

'href': templateHref,

'params': paramObj

};

return plainObject;

}

//// build the code for the template

function buildTemplateCode(obj) {

var res = "{{" + obj.templateName;

$.each( obj.params, function ( key, value ) {

var wt = value.wt;

if(wt) {

//console.log(key,wt);

res = res + "|" + key + "=" + wt;

}

} );

res = res + "}}";

return res;

}

////// Called when toolbox button clicked

function callCitoid() {

url = $('#citoid-url').val();

//alert("Call citoid url [" + url +"]");

//curl 'http://citoid.wikimedia.org/api?action=query&format=mediawiki&search=https%3A%2F%2Fdeveloper%2Emozilla%2Eorg%2Fen-US%2Fdocs%2FWeb%2FAPI%2FXMLHttpRequest' -H 'Pragma: no-cache' -H 'Origin: http://en.wikipedia.org' -H 'Accept-Encoding: gzip, deflate, sdch' -H 'accept-language: en' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36' -H 'Accept: application/json, text/javascript, */*; q=0.01' -H 'Cache-Control: no-cache' -H 'Referer: http://en.wikipedia.org/wiki/Cross-origin_resource_sharing?veaction=edit' -H 'Connection: keep-alive' --compressed

/*

GET /api?action=query&format=mediawiki&search=https%3A%2F%2Fdeveloper%2Emozilla%2Eorg%2Fen-US%2Fdocs%2FWeb%2FAPI%2FXMLHttpRequest HTTP/1.1

https://citoid.wikimedia.org/api?action=query&format=mediawiki&search=http%3A%2F%2Fwww%2Etheguardian%2Ecom%2Feducation%2F2016%2Fapr%2F12%2Fgrammar-schools-nicky-morgan-kent-parent-11-plus&basefields=true

Host: citoid.wikimedia.org

Connection: keep-alive

Pragma: no-cache

Cache-Control: no-cache

  • /

//Accept: application/json, text/javascript, */*; q=0.01

/*Origin: http://en.wikipedia.org

accept-language: en

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36

Referer: http://en.wikipedia.org/wiki/Cross-origin_resource_sharing?veaction=edit

Accept-Encoding: gzip, deflate, sdch

curl 'https://citoid.wikimedia.org/api?action=query&format=mediawiki&search=http%3A%2F%2Fwww%2Etheguardian%2Ecom%2Feducation%2F2016%2Fapr%2F12%2Fgrammar-schools-nicky-morgan-kent-parent-11-plus&basefields=true'

-H 'pragma: no-cache' -H 'origin: https://en.wikipedia.org' -H 'accept-encoding: gzip, deflate, sdch'

-H 'accept-language: en'

-H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36'

-H 'accept: application/json, text/javascript, /*; q=0.01'

-H 'cache-control: no-cache' -H 'referer: https://en.wikipedia.org/' --compressed

[{"itemType":"newspaperArticle","notes":[],"tags":[{"tag":"Grammar schools","type":1},{"tag":"Secondary schools","type":1},{"tag":"Schools","type":1},{"tag":"Education","type":1},{"tag":"Nicky Morgan","type":1},{"tag":"Education policy","type":1},{"tag":"Politics","type":1}],"url":"http://www.theguardian.com/education/2016/apr/12/grammar-schools-nicky-morgan-kent-parent-11-plus","abstractNote":"With selective schools now able to apply to open ‘annexes’, a Kent parent has written an open letter to the education secretary","date":"2016-04-12","ISSN":["0261-3077"],"language":"en-GB","publicationTitle":"The Guardian","section":"Education","title":"Grammar schools and the opportunity gap: 10 questions for Nicky Morgan","libraryCatalog":"The Guardian","accessDate":"2016-04-12","shortTitle":"Grammar schools and the opportunity gap","author":"Joanne","Bartley"}]

https://citoid.wikimedia.org/api?action=query&format=mediawiki&search=http%3A%2F%2Fwww%2Etheguardian%2Ecom%2Feducation%2F2016%2Fapr%2F12%2Fgrammar-schools-nicky-morgan-kent-parent-11-plus&basefields=true

Post June 2017

https://en.wikipedia.org/api/rest_v1/data/citation/mediawiki/

https%3A%2F%2Fwww.theguardian.com%2Fmusic%2F2016%2Foct%2F20%2Fewan-mclennan-and-george-monbiot-breaking-the-spell-of-loneliness-review-fellside

?action=query&format=json

  • /

var citoidService = "https://en.wikipedia.org/api";

var prefix = 'https://en.wikipedia.org/api/rest_v1/data/citation/mediawiki/';

var mid = encodeURIComponent(url);

//var suffix = '&basefields=true';

var suffix = '?action=query&format=json';

var send = prefix+mid+suffix;

console.log(prefix+mid+suffix);

//gen 'https://citoid.wikimedia.org/api?action=query&format=mediawiki&search=http%3A%2F%2Fwww. theguardian. com%2Feducation%2F2016%2Fapr%2F12%2Fgrammar-schools-nicky-morgan-kent-parent-11-plusbasefields=true

//url: 'https://citoid.wikimedia.org/api?action=query&format=mediawiki&search=http%3A%2F%2Fwww%2Etheguardian%2Ecom%2Feducation%2F2016%2Fapr%2F12%2Fgrammar-schools-nicky-morgan-kent-parent-11-plus&basefields=true',

$.ajax( {

beforeSend: function (request) {

request.setRequestHeader('Content-Type', 'application/json');

},

url: send,

//url: 'https://citoid.wikimedia.org/api?action=query&format=mediawiki&search=http%3A%2F%2Fwww%2Etheguardian%2Ecom%2Feducation%2F2016%2Fapr%2F12%2Fgrammar-schools-nicky-morgan-kent-parent-11-plus&basefields=true',

type: 'GET',

//data: { action:"query", format:"mediawiki", search: url, basefields: "true" } ,

success: doneAjax,

error: function ( XMLHttpRequest, textStatus, errorThrown) {

console.log( 'Status: ' + textStatus + ' Error: ' + errorThrown );

console.log("Req");

console.log(XMLHttpRequest);

console.log("getAllResponseHeaders");

console.log(XMLHttpRequest.getAllResponseHeaders());

mw.notify( 'Status:' + textStatus + 'Error: ' + errorThrown );

},

} );

}

function doneAjax(result) {

//console.log(JSON.stringify(result, null, 4));

var plain = getPlainObject( url, result );

//console.log(result[0]);

//console.log(plain);

var res = buildTemplateCode(plain);

//console.log(res);

$('#citoid-code').text(res);

$('#citoid-full').text(JSON.stringify(result, null, 4));

//alert("doneAjax");

}

function openCitoidWindow() {

$cont.fadeIn('slow');

}

///// Close the dialog

function close() {

$cont.fadeOut('slow', function(){

});

}

////////// Building called after page loads

function buildHTML() {

$button = $('