/*jslint browser: true, regexp: true, unparam: true, indent: 2*/
/*global jQuery: false, mw: false*/
/*
+ Default option
+ Size Query
+ Last User Query
+ Last edit time Query
**********************************************************************************
Options: put this variable to your /common.js. each item sets to 0 doesn't show! *
*
var pageInfoConf = { *
'disambigQuery': true, *
'firstUserQuery': true, *
'lastUserQuery': true, *
'firstTimeQuery': true, *
'lastTimeQuery': true, *
'redirectQuery': true, *
'sizeQuery': true, *
'redQuery': true, *
'wikidataLink': true, *
'wikidataWikiCount': true, *
'wikidataP31': true *
}; *
*
**********************************************************************************
*/
(function ($) {
'use strict';
function addInfoToNode(node, info, color) {
$(node).after('<span class="infoAddedcontent">[<span style="color: ' + color + ';">' + info + '</span>]</span>');
}
var conf = {
'disambigQuery': true,
'firstUserQuery': true,
'lastUserQuery': true,
'firstTimeQuery': true,
'lastTimeQuery': true,
'redirectQuery': true,
'sizeQuery': true,
'redQuery': true,
'wikidataLink': true,
'wikidataWikiCount': true,
'wikidataP31': true
};
$.extend(conf, window.pageInfoConf);
function getSelectedTextLinks() {
// borrowed from: http://stackoverflow.com/questions/4220478 :)
var selection,
selectionAncestor,
range,
allWithinRangeParent,
allSelected,
i,
el;
// if `window.getSelection` is not defined (on IE) return nothing.
if (window.getSelection === undefined) {
return [];
}
selection = window.getSelection();
// if nothing is selected, return empty array
if (selection.isCollapsed) {
return [];
}
range = selection.getRangeAt(0);
selectionAncestor = range.commonAncestorContainer;
if (selectionAncestor.getElementsByTagName === undefined) { // if it is not a formal HTML selection
return [];
}
allWithinRangeParent = selectionAncestor.getElementsByTagName('a');
allSelected = [];
for (i = 0; allWithinRangeParent[i] !== undefined; i += 1) {
el = allWithinRangeParent[i];
// The second parameter says to include the element
// even if it's not fully selected
if (selection.containsNode(el, true)) {
allSelected.push(el);
}
}
return allSelected;
}
function getArticleLinks() {
var allSelected = getSelectedTextLinks();
if (allSelected.length === 0) {
return $('#bodyContent a');
}
return allSelected;
}
function parseUrl(url) {
if (url === undefined) {
return undefined;
}
var match = url.match(/\/wiki\/([^#]*)/);
if (match === null) {
match = url.match(/\/w\/index\.php\?title=([^&#]*).*redlink=1/);
}
if (match !== null) {
return decodeURI(match[1]); // returns () matched text
}
return undefined;
}
function getLinkTitle(link) {
return parseUrl(link.href);
}
function firstUserAndTime(data) {
var res;
$.each(data.query.pages, function (key, value) { // for retrieving first object index
if (value.revisions !== undefined) {
res = [value.revisions[0].user, value.revisions[0].timestamp];
}
});
return res;
}
function lastUserAndTime(data) {
var res;
$.each(data.query.pages, function (key, value) { // for retrieving first object index
if (value.revisions !== undefined) {
res = [value.revisions[0].user, value.revisions[0].timestamp];
}
});
return res;
}
function pageSize(data) {
var res;
$.each(data.query.pages, function (key, value) { // for retrieving first object index
if (value !== undefined) {
res = value.length;
}
});
return res;
}
function detectHasTemplate(data) {
var hasTemplate = false;
$.each(data.query.pages, function (key, value) { // for retrieving first object index
hasTemplate = value.templates === undefined ? false : true;
});
return hasTemplate;
}
function infoAdder(infoType) {
var enableDisambigDetection = $('#enableDisambigDetection').is(':checked'),
enableFirstUserName = $('#enableFirstUserName').is(':checked'),
enableFirstUserTime = $('#enableFirstUserTime').is(':checked'),
enableLastUserName = $('#enableLastUserName').is(':checked'),
enableLastUserTime = $('#enableLastUserTime').is(':checked'),
enablePageSize = $('#enablePageSize').is(':checked'),
enableRedirectDetection = $('#enableRedirectDetection').is(':checked'),
enableRedLinkDetection = $('#enableRedLinkDetection').is(':checked'),
enableWikidataLink = $('#enableWikidataLink').is(':checked'),
enableWikidataWikiCount = $('#enableWikidataWikiCount').is(':checked'),
enableWikidataP31 = $('#enableWikidataP31').is(':checked'),
api = new mw.Api(),
links = getArticleLinks();
if (enableRedLinkDetection) {
$(links).filter('a.new').each(function (key, value) {
// value.innerHTML = value.innerHTML + ' @';
addInfoToNode(value, 'ناموجود', 'red');
});
}
$(links).each(function (key, value) {
var jValue = $(value),
href = jValue.attr('href'),
name;
if (href === undefined) {
return;
}
name = getLinkTitle(value);
if (name === undefined) {
return;
}
if (enableRedirectDetection && jValue.is('a.mw-redirect')) {
addInfoToNode(value, 'تغییر مسیر', 'green');
}
if (enableDisambigDetection) {
api.get({
action: 'query',
prop: 'templates',
titles: name,
tltemplates: 'الگو:ابهام\u200cزدایی'
}).done(function (data) {
if (detectHasTemplate(data)) {
addInfoToNode(value, 'ابهام\u200cزدایی', 'aqua');
}
});
}
if (enableFirstUserName || enableFirstUserTime) {
api.get({
action: 'query',
prop: 'revisions',
titles: name,
rvlimit: '1',
rvprop: 'user|timestamp',
rvdir: 'newer'
}).done(function (data) {
var fut = firstUserAndTime(data);
if (fut !== undefined) {
if (enableFirstUserName) {
addInfoToNode(value, 'کاربر:' + fut[0], 'gray');
}
if (enableFirstUserTime) {
addInfoToNode(value, 'در ' + new Date(fut[1]).toDateString(), 'orange');
}
}
});
}
if (enablePageSize) {
api.get({
action: 'query',
prop: 'info',
titles: name
}).done(function (data) {
var size = pageSize(data),
num;
if (size !== undefined) {
num = size / 1000;
if (num < 4) {
addInfoToNode(value, 'کیلوبایت ~ ' + num, '#D715C1');
} else if (10 > num && num > 4) {
addInfoToNode(value, 'کیلوبایت ~ ' + num, '#039839');
} else if (30 > num && num > 10) {
addInfoToNode(value, 'کیلوبایت ~ ' + num, 'red');
} else if (num > 30) {
addInfoToNode(value, 'کیلوبایت ~ ' + num, '#FF6B00');
}
}
});
}
if (enableLastUserName || enableLastUserTime) {
api.get({
action: 'query',
prop: 'revisions',
titles: name,
rvlimit: '1',
rvprop: 'user|timestamp',
rvdir: 'older'
}).done(function (data) {
var Lut = lastUserAndTime(data);
if (Lut !== undefined) {
if (enableLastUserName) {
addInfoToNode(value, 'کاربر:' + Lut[0], 'gray');
}
if (enableLastUserTime) {
addInfoToNode(value, 'در ' + new Date(Lut[1]).toDateString(), 'orange');
}
}
});
}
if (enableWikidataLink || enableWikidataWikiCount || enableWikidataP31) {
$.ajax({
url: '//www.wikidata.org/w/api.php',
data: {
action: 'wbgetentities',
sites: value.href.replace(/^.*\/\/([^\.]*)\.(wiki)pedia\.org.*$/, "$1$2"),
prop: 'revisions',
titles: name,
format: 'json'
},
success: function (data) {
var itemId = Object.keys(data.entities)[0];
if (itemId === '-1') { return; }
if (enableWikidataLink) {
addInfoToNode(value, 'ویکیداده: <a href="//www.wikidata.org/wiki/' + itemId + '">' + itemId + '</a>', 'black');
}
if (enableWikidataWikiCount) {
addInfoToNode(value, 'تعداد میانویکی: ' + Object.keys(data.entities[itemId].sitelinks).length, 'yellowgreen');
}
if (enableWikidataP31 &&
data.entities[itemId].claims !== undefined &&
data.entities[itemId].claims.P31 !== undefined) {
$.ajax({
url: '//www.wikidata.org/w/api.php',
dataType: 'jsonp',
data: {
action: 'wbgetentities',
ids: data.entities[itemId].claims.P31.map(function (x) {
return 'Q' + x.mainsnak.datavalue.value['numeric-id'];
}).join('|'),
format: 'json'
}, success: function (data) {
if (Object.keys(data.entities) === undefined) { return; }
addInfoToNode(value, 'یک ...: ' +
Object.keys(data.entities).map(function (x) {
var labels = data.entities[x].labels;
if (labels.fa === undefined) { return labels.en.value; }
return labels.fa.value;
}).join(', '),
'green'
);
}
});
}
},
dataType: 'jsonp'
});
}
});
}
$(function () {
$('#articlesLinksInfo').remove();
// HTML Builder
var hb = [];
hb.push('<span style="font-size: 40%; margin: 0 2em; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none;" id="articlesLinksInfo" class="noprint">');
hb.push('<a id="allInfo-button" href="#">اطلاعات پیوندها</a>');
if (conf.disambigQuery) {
hb.push(' <input type="checkbox" name="enableDisambigDetection" id="enableDisambigDetection"><label for="enableDisambigDetection">ابهام\u200cزدایی؟</label>');
}
if (conf.firstUserQuery) {
hb.push(' <input type="checkbox" name="enableFirstUserName" id="enableFirstUserName"><label for="enableFirstUserName">اولین ویرایشگر؟</label>');
}
if (conf.lastUserQuery) {
hb.push(' <input type="checkbox" name="enableLastUserName" id="enableLastUserName"><label for="enableLastUserName">آخرین ویرایشگر؟</label>');
}
if (conf.firstTimeQuery) {
hb.push(' <input type="checkbox" name="enableFirstUserTime" id="enableFirstUserTime"><label for="enableFirstUserTime">تاریخ ایجاد؟</label>');
}
if (conf.lastTimeQuery) {
hb.push(' <input type="checkbox" name="enableLastUserTime" id="enableLastUserTime"><label for="enableLastUserTime">تاریخ آخرین ویرایش؟</label>');
}
if (conf.redirectQuery) {
hb.push(' <input type="checkbox" name="enableRedirectDetection" id="enableRedirectDetection"><label for="enableRedirectDetection">تغییر مسیر؟</label>');
}
if (conf.sizeQuery) {
hb.push(' <input type="checkbox" name="enablePageSize" id="enablePageSize"><label for="enablePageSize">حجم؟</label>');
}
if (conf.redQuery) {
hb.push(' <input type="checkbox" name="enableRedLinkDetection" id="enableRedLinkDetection"><label for="enableRedLinkDetection">ناموجود؟</label>');
}
if (conf.wikidataLink) {
hb.push(' <input type="checkbox" name="enableWikidataLink" id="enableWikidataLink"><label for="enableWikidataLink">ویکیداده؟</label>');
}
if (conf.wikidataWikiCount) {
hb.push(' <input type="checkbox" name="enableWikidataWikiCount" id="enableWikidataWikiCount"><label for="enableWikidataWikiCount">تعداد میانویکی؟</label>');
}
if (conf.wikidataP31) {
hb.push(' <input type="checkbox" name="enableWikidataP31" id="enableWikidataP31"><label for="enableWikidataP31">ویکیداده یک ...؟</label>');
}
hb.push('</span>');
$('h1:first').append(hb.join(''));
$('#allInfo-button').click(function (event) {
event.preventDefault();
infoAdder('all');
});
});
}(jQuery));