User:AlanM1/scripts/Citoid.js

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

Generates a citation template from a url using the citoid server

Fix "}}" correctly -> "&#125;&#125;" instead of "&#125;" User:AlanM1 20141015d Narrow url and code fields, use local Citoid.css to increase length 2em User:AlanM1 20141015c Add option to put space before pipes User:AlanM1 20141015b Escape '|' and "}}" in results User:AlanM1 20141015a Add "query sent" message User:AlanM1 20141002d Minor fixes to dates by User:AlanM1 20141001a Copied from User:Salix alba/Citoid.js

Author User:Salix alba Date: 31 Aug 2014 Version: 0.01

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

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

function Citoid($) {

////// Customization for local wikis lang = mw.config.get('wgUserLanguage'); 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) { var style = $( "input:radio[name=datestyle]:checked" ).val; // Input format // 012345678901234567890123   	//"2014-09-28T20:03:10.298Z" //alert('formatCS1Date("'+isodate+'")');

if (style == "YMD") return isodate.substr(0, 10);

var monthIndex = parseInt(isodate.substr(5, 2), 10) - 1; var sday = parseInt(isodate.substr(8, 2), 10).toString; if (style == "MDY") return messages[lang].monthnames[monthIndex] + " " + sday + ", " + isodate.substr(0, 4); else	// DMY return sday + " " + messages[lang].monthnames[monthIndex] + " " + isodate.substr(0, 4); } /* 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', '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', //	'accessdate': 'accessDate', 'title': 'title', 'url': 'url', 'date': 'date', 'publisher': 'publisher', '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', //	'accessdate': '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', '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', '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', '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;} $.each( templateParamMap[templateName], function ( key, value ) {			var objString = citation[value] !== undefined ? citation[value] : '';			paramObj[key] = { 'wt': objString };		} ); 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; paramObj.accessdate = { 'wt': formatCS1Date(d.toISOString) }; //alert("paramObj.date.wt = '" + paramObj.date.wt + "'"); var d2 = new Date(paramObj.date.wt); if (d2) { var s2 = (d2.getYear + 1900).toString + "-" + ((d2.getMonth + 101).toString).substr(1, 2) + "-" + ((d2.getDate + 100).toString).substr(1, 2); paramObj.date.wt = formatCS1Date(s2); } 		// 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; var sep = $( "input:checkbox[name=spacepipe]:checked" ).val ? " |" : "|";

$.each( obj.params, function ( key, value ) {			// Replace pipes and double closing braces with HTML entities in wikicode 			var wt = value.wt.replace(/\|/g, "&#124;").replace(/}}/g, "&#125;&#125;");			if(wt) {				//console.log(key,wt);				res = res + sep + key + "=" + wt;			}		} ); res = res + "}}"; return res; }	////// Called when toolbox button clicked

function callCitoid { url = $('#citoid-url').val; //alert("Call citoid url [" + url +"]");

var citoidService = "https://citoid.wmflabs.org/url"; mw.notify("Sending query to Citoid server..."); $.ajax( {			beforeSend: function (request) {				request.setRequestHeader('Content-Type', 'application/json');			},			url: citoidService,			type: 'POST',			data: JSON.stringify( { url: url } ),			dataType: 'json',			success: doneAjax,			error: function ( XMLHttpRequest, textStatus, errorThrown) {				mw.notify( 'Status:' + textStatus +  'Error: ' + errorThrown );			},		} ); }	function doneAjax(result) { var plain = getPlainObject( url, result ); //console.log(result); //console.log(plain); var res = buildTemplateCode(plain); console.log(res); $('#citoid-code').text(res); //alert("doneAjax"); }

function openCitoidWindow { $cont.fadeIn('slow'); }

///// Close the dialog function close { $cont.fadeOut('slow', function{		}); }

////////// Building called after page loads function buildHTML { $button = $(' ') .attr({ id: 'citoid-button', type:'button' }) .text("Generate Citation") .click(callCitoid); $body = $(' ') .attr('id', 'citoid-body') .append(" URL: "+		   " ") .append(" Date format: "+		   "1 September 2014  "+		    "September 1, 2014  "+		    "2014-09-01 ") .append(" Space before pipe: "+		   " ") .append($button) .append(" Template code ") .append(""); $title = $(' ').text( messages[lang]['title'] ); $cont = $(' ') .attr('id', 'citoid-cont') .append($(' ')				.attr('id', 'citoid-dialog')				.append( $title )				.append($('') .attr({							id: 'citoid-close',							href: '#',							title: messages[lang]['close']						}) .click(function{							close;							return false;						}) .append($(' ')								.attr({ alt: messages[lang]['close'], src: '//upload.wikimedia.org/wikipedia/commons/thumb/8/8d/VisualEditor_-_Icon_-_Close.svg/24px-VisualEditor_-_Icon_-_Close.svg.png' })						)				)				.append($body)		) .hide;

$(document.body).append($cont); }

////// Adds a link in the toolbox function addPortletLink {

$(			mw.util.addPortletLink('p-tb', '#', messages['en']['toolbox-label'], 'citoid', messages['en']['toolbox-tooltip'] )		).click(function{			openCitoidWindow;			return false;		}) }

/////// Actions to do once page loads, function start { //alert("Citoid 0.01"); addPortletLink; buildHTML; }

////////// START ////////// start; }

/////// Wrapper code //if( true // $.inArray( mw.config.get('wgNamespaceNumber'), [ 2, 10 ] ) !== -1 // && $.inArray( mw.config.get('wgAction'), [ 'edit', 'submit' ] ) !== -1  */ ) {

mw.loader.load(  	  '//en.wikipedia.org/w/index.php?title=User:AlanM1/Citoid.css&action=raw&ctype=text/css&smaxage=21600&maxage=86400',	'text/css' ); mw.loader.using('mediawiki.util', function{	 $(document).ready(Citoid);        });