User:CorporateM/vector.js
Appearance
Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. This code will be executed when previewing this page. |
The accompanying .css page for this skin can be added at User:CorporateM/vector.css. |
/*************
Generates a citation template from a url using the citoid server
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
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);
if(test1) {
// 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) {
// 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;
}
//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',
'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;}
//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 };
} );
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()) };
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 +"]");
var citoidService = "https://citoid.wmflabs.org/url";
$.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[0]);
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 = $('<button>')
.attr({ id: 'citoid-button', type:'button' })
.text("Generate Citation")
.click(callCitoid);
$body = $('<div>')
.attr('id', 'citoid-body')
.append("<p>URL: "+
"<input type='text' id='citoid-url' size='200' /></p>")
.append("<p>Date format: "+
"<input type='radio' name='datestyle' value='DMY' checked >1 September 2014</input> "+
"<input type='radio' name='datestyle' value='MDY'>September 1, 2014</input> "+
"<input type='radio' name='datestyle' value='YMD'>2014-09-01</input></p>")
.append($button)
.append("<p>Template code</p>")
.append("<textarea id='citoid-code'>");
$title = $('<h2>').text( messages[lang]['title'] );
$cont = $('<div>')
.attr('id', 'citoid-cont')
.append($('<div>')
.attr('id', 'citoid-dialog')
.append( $title )
.append($('<a>')
.attr({
id: 'citoid-close',
href: '#',
title: messages[lang]['close']
})
.click(function(){
close();
return false;
})
.append($('<img>')
.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();
//console.log(formatCS1Date("2014-09-29T07:08:59.468Z"));
//console.log(formatCS1Date("2014-10-01T07:08:59.468Z"));
//console.log(formatCS1Date("September 29, 2014"));
//console.log(formatCS1Date("October 1, 2014"));
}
////////// 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:Salix alba/Citoid.css&action=raw&ctype=text/css&smaxage=21600&maxage=86400',
'text/css' );
mw.loader.using('mediawiki.util', function(){
$(document).ready(Citoid);
});