User:Gryllida/js/addSourcesUi-0.1.js
Note: After saving, you may have to bypass your browser's cache to see the changes. Mozilla / Firefox / Safari: hold down Shift while clicking Reload, or press Ctrl-Shift-R (Cmd-Shift-R on Apple Mac); IE: hold Ctrl while clicking Refresh, or press Ctrl-F5; Konqueror: simply click the Reload button, or press F5; Opera users may need to completely clear their cache in Tools→Preferences. — More skins
/*
Author : Svetlana Tkachenko svetlana@members.fsf.org
This file is a part of addSourcesUi.
Licence: GPLv3+
Description: adds a button to wikieditor, which fills in {{source}} from uri
Version: 0.1
Change log:
- Version 0.1 (2018-02-26) - initial release
See also <https://en.wikinews.org/wiki/User:Gryllida/Tasks> and
<https://www.mediawiki.org/wiki/Gadget_kitchen>.
*/
mw.loader.using(['mediawiki.api', 'jquery.ui'], function () {
"use strict";
var monthNames = [
"January", "February", "March",
"April", "May", "June", "July",
"August", "September", "October",
"November", "December"
];
var api = new mw.Api();
var getLocation = function(href) {
var l = document.createElement("a");
l.href = href;
return l;
};
var getDomain = function (url){
var l = getLocation(url);
return l.hostname;
};
var errors = {};
var articlesChecked=0;
var templatesChecked=0;
var templatesCheckedWithError=0;
var templatesTotal=0;
function _addCodeForSource(thissourceinfo2, context){
var str = '*{{source';
var params = Object.keys(thissourceinfo2);
$(params).each(function(i){
var paramName = params[i];
var paramValue = thissourceinfo2[paramName];
str = str + '\r\n|' + paramName + ' = ' + paramValue;
});
str = str + '\r\n' + '}}';
console.log('1 context = ' + context);
_addSourceToArticle(str, context);
}
// == Error reporting ==
function handleError(thissourceinfo2, data, sourceurl){
console.log('checking for errors');
var warnings = [];
var params = Object.keys(thissourceinfo2);
console.log(params);
$(params).each(function(i){
var paranName = params[i];
console.log(paranName);
var v2 = thissourceinfo2[paranName];
console.log(':'+v2+':');
if(v2 === ""){
warnings.push('I could not fetch "'+paranName+'" parameter. Please add it by hand.');
console.log('warning added');
}
});
return warnings;
}
function _addWarnings(warnings){
console.log('adding warnings');
var message = '';
$(warnings).each(function(i){
message = message + '; ' + warnings[i];
});
alert(message);
//button.prop('value','Get data');
}
// == Citoid metadata manipulation ==
function _getCitoidApiUrl(url){
var apiUrl = mw.config.get ('wgServer') ;
apiUrl = apiUrl + '/api/rest_v1/data/citation/mediawiki/';
apiUrl = apiUrl + encodeURIComponent(url);
return apiUrl;
}
function _getCitoidSourceInfo(sourceurl, context){
console.log('getting citoid information');
//button.prop('value','Checking...');
var warnings = [];
console.log(sourceurl);
if(!sourceurl) {
warnings.push('missing url');
_addWarnings(warnings);
} else {
_getPublicationData1(sourceurl).then(function(data) {
var thissourceinfo2 = _getPublicationData2(data, sourceurl);
warnings = handleError(thissourceinfo2, data, sourceurl);
console.log('0 context = ' + context);
_addCodeForSource(thissourceinfo2, context);
_addWarnings(warnings);
$('#wpTextbox1').focus();
}).catch(err => {
templatesCheckedWithError += 1;
});
}
}
function _getPublicationData1(url){
var apiUrl = _getCitoidApiUrl(url);
return $.get(apiUrl);
}
function _getPublicationData2(data, url){
// Get author
var authors = data[0].author;
var authorStrings = [];
$(authors).each(function( index ) {
authorStrings.push(this[0] + ' ' + this [1]);
});
var author = authorStrings.join (', ');
//console.log('author: '+ author);
// Get publisher, title
var publisher = data[0].publicationTitle || "";
var title = data[0].title;
// Get date (in the correct format)
var datestring = data[0].date; // 2020-12-31
var date="";
if(datestring){
var dateOrig = datestring.split('-'); // 2020-12-31
var dateYear = dateOrig[0];
var dateMonth = monthNames[dateOrig[1]-1];
var dateDay = parseInt(dateOrig[2],10);
date = dateMonth + ' ' + dateDay + ', ' + dateYear;
}
var sourceinfo = {
url: url,
title: title,
author: author,
pub: publisher,
date: date /// xxx add lang
};
return sourceinfo;
}
function _addSourceToArticle(srctext, context){
$.wikiEditor.modules.toolbar.fn.doAction(
$( '#wpTextbox1' ).data( 'wikiEditor-context' ),
{
type: 'replace',
options: {
peri: srctext,
ownline: true
}
},
$( '#wpTextbox1' )
);
}
function _getStarted(context){
console.log('Get started');
var sourceurl = prompt('Source URL: ');
console.log('-1 context = ' + context);
_getCitoidSourceInfo(sourceurl, context);
}
// == WikiEditor codes ==
var customizeToolbar = function () {
/* Your code goes here */
$( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
'section': 'main',
'group': 'insert',
'tools': {
'addsource': {
label: 'Add a source', // or use labelMsg for a localized label, see above
type: 'button',
icon: '//upload.wikimedia.org/wikipedia/commons/thumb/f/fd/Plus_icon.svg/22px-Plus_icon.svg.png',
action: {
type: 'callback',
execute: function(context){
console.log('-2 context = ' + context);
_getStarted(context);
}
}
}
}
} );
};
/* Check if view is in edit mode and that the required modules are available. Then, customize the toolbar … */
if ( $.inArray( mw.config.get( 'wgAction' ), [ 'edit', 'submit' ] ) !== -1 ) {
mw.loader.using( 'user.options' ).then( function () {
// This can be the string "0" if the user disabled the preference ([[phab:T54542#555387]])
if ( mw.user.options.get( 'usebetatoolbar' ) == 1 ) {
$.when(
mw.loader.using( 'ext.wikiEditor' ), $.ready
).then( customizeToolbar );
}
} );
}
// == WikiEditor codes end ==
});