مدیاویکی:Gadget-LinksInfo.js
پرش به ناوبری
پرش به جستجو
نکته: پس از ذخیره کردن ممکن است برای دیدن تغییرات نیاز باشد که حافظهٔ نهانی مرورگر خود را پاک کنید.
- فایرفاکس / سافاری: کلید Shift را نگه دارید و روی دکمهٔ Reload کلیک کنید، یا کلیدهای Ctrl-F5 یا Ctrl-R را با هم فشار دهید (در رایانههای اپل مکینتاش کلیدهای ⌘-R)
- گوگل کروم: کلیدهای Ctrl+Shift+R را با هم فشار دهید (در رایانههای اپل مکینتاش کلیدهای ⌘-Shift-R)
- اینترنت اکسپلورر: کلید Ctrl را نگهدارید و روی دکمهٔ Refresh کلیک کنید، یا کلیدهای Ctrl-F5 را با هم فشار دهید
- اپرا: بروید به Menu → Settings (Opera → Preferences on a Mac) and then to Privacy & security → Clear browsing data → Cached images and files.
/*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));