میڈیا وکی:Gadget-Numeral converter.js
نوٹ: بچان مگروں توانوں اپنے براؤزر دے کاشے توں بار جانا پوے گا تبدیلیاں ویکھن لئی۔
- Firefox / Safari: Shift پھڑی رکھو ریلوڈ تے کلکنگ کردیاں ہویاںCtrl-F5 or Ctrl-R (Command-R میک تے)
- گوکل کروم: دباؤ Ctrl-Shift-R (Command-Shift-R میک تے)
Internet Explorer: hold Ctrl کلک کردیاں Refresh, یا دباؤ Ctrl-F5 Konqueror:کلک ریلوڈ یا F5 دباؤ۔ Opera: کاشے نوں صاف کرو آوزار → تانگاں
/**
* Convert numbers between numeral systems.
*
* Dependencies: mediawiki.cookie, mediawiki.util, mediawiki.user
* Source: https://www.mediawiki.org/wiki/MediaWiki:Gadget-Numerakri.js
* Revision: 2018-12-29
*
* @copyright 2012 Daniel Friesen
* @copyright 2012 Siddhartha Ghai
* @copyright 2012-2018 Timo Tijhof
* @license <https://opensource.org/licenses/MIT>
*/
/*jshint browser:true, unused:true, forin:false */
/*global $, mw */
(function () {
'use strict';
var msgs = {
'option-shahmukhi': {
en: 'Default',
ur: 'ڈیفالٹ',
pnb: '۱۲۳'
},
'option-arabic': {
en: '123',
pnb: '123',
pnb: '123'
},
'label-url': {
en: '//www.mediawiki.org/wiki/MediaWiki_talk:Gadget-Numerakri.js',
pnb: '//pnb.wikipedia.org/wiki/وکیپیڈیا:اعداد_تبدیلی',
pnb: '//pnb.wikipedia.org/wiki/وکیپیڈیا:گنتی تبدیلی'
},
'label-text': {
en: '',
pnb: 'تبدیلی اعداد',
pnb: ''
},
'label-tooltip': {
en: 'Convert between Arabic and Urdu numerals',
pnb: 'اردو اور عربی اعداد کی تبدیلی',
pnb: 'عدداں نوں شاہمکھی وچ دیکھو'
}
},
maps = {
arabic: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],
urdu: ['٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩'],
shahmukhi: [ '۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹']
},
availableMaps,
currentType = 'shahmukhi',
matchers = {},
walker,
styleTag;
function isValidType(type) {
return type === 'shahmukhi' || availableMaps.indexOf(type) !== -1;
}
/** @return {Object.<RegExp>} */
function getMatchers(targetType) {
var rChars;
if (!matchers[targetType]) {
rChars = { 0: [], 1: [], 2: [], 3: [], 4: [], 5: [], 6: [], 7: [], 8: [], 9: []};
$.each(maps, function (type, map) {
if (type !== targetType) {
for (var i = 0; i <= 9; i++) {
rChars[i].push(map[i]);
}
}
});
$.each(rChars, function (num, chars) {
rChars[num] = new RegExp('(' + chars.map(mw.util.escapeRegExp).join('|') + ')', 'g');
});
matchers[targetType] = rChars;
}
return matchers[targetType];
}
function msg(key) {
return msgs[key] ? ( msgs[key][mw.config.get('wgUserLanguage')] || msgs[key].en ) : false;
}
/**
* @param {HTMLElement|TextNode} node
* @param {string} target
* @return {boolean}
*/
function hasClass(node, target) {
// First check if the node is HTMLElement, then check the class
return !!node.className && (' ' + node.className + ' ').indexOf(' ' + target + ' ') !== -1;
}
/**
* @param {HTMLElement|TextNode} node
* @return {number} NodeFilter.FILTER_* constant
*/
function filterNode(node) {
if (node.nodeType === Node.TEXT_NODE) {
return NodeFilter.FILTER_ACCEPT;
}
var n = node.nodeName && node.nodeName.toLowerCase();
if (n === 'input' || n === 'textarea' || hasClass(node, 'mw-numerakri-skip')) {
// Skip this element and skip its children
return NodeFilter.FILTER_REJECT;
}
// Skip this element, but check its children
return NodeFilter.FILTER_SKIP;
}
/**
* @param {TextNode} node
*/
function handleTextNode(node) {
var original = node.nodeValue,
changed = original,
matchers = getMatchers(currentType),
i = 0;
for (; i <= 9; i++) {
changed = changed.replace(matchers[i], maps[currentType][i]);
}
if (original !== changed) {
node.nodeValue = changed;
}
}
// https://doc.wikimedia.org/mediawiki-core/master/js/#!/api/mw-method-requestIdleCallback
function idleWalker(deadline) {
var el;
if (!walker) {
return;
}
while (deadline.timeRemaining() > 0) {
el = walker.nextNode();
if (!el) {
// Reached the end
walker = null;
return;
}
handleTextNode(el);
}
// The user may interact with the page. We pause so the browser can process
// interaction. The text handler will continue after that.
if (walker) {
mw.requestIdleCallback(idleWalker);
}
}
/**
* Save a browser cookie for 30 days, or remove it.
* @param {string|null} value
*/
function saveType(value) {
mw.requestIdleCallback(function () {
mw.cookie.set('mw-numerakri-type', value, { expires: 30, path: '/' });
});
}
/**
* @return {string}
*/
function getStoredType() {
var value = mw.cookie.get('mw-numerakri-type');
if (value !== null && !isValidType(value)) {
// Remove bad cookie
saveType(null);
value = null;
}
return value || 'shahmukhi';
}
function startPageConversion() {
if (styleTag) {
// Undo style for a previously selected type
$(styleTag).remove();
styleTag = null;
}
if (currentType === 'arabic') {
// Don't change the page
return;
}
if (currentType === 'default') {
styleTag = mw.loader.addStyleTag('.mw-parser-output ol, ol.references, li.references { list-style-type: decimal; }');
} else if (currentType === 'urdu') {
styleTag = mw.loader.addStyleTag('.mw-parser-output ol, ol.references, li.references { list-style-type: urdu; }');
}
// If a walker is already active, replace it.
// If no walker is active yet, start it.
if (!walker) {
mw.requestIdleCallback(idleWalker);
}
walker = document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, filterNode, false);
}
/** @return {HTMLElement} */
function createSelector() {
var $select = $('<select>').addClass('mw-numerakri-skip').append(
$('<option>').val('shahmukhi').text(msg('option-shahmukhi'))
);
availableMaps.forEach(function (type) {
var label = msg('option-' + type);
if ( label ) {
$select.append($('<option>').val(type).text(label));
}
});
$select.val(currentType);
$select.on('change', function () {
currentType = this.value;
startPageConversion();
saveType(currentType);
});
return $select[0];
}
function init() {
var potlet, menu;
// Decide which types to show
if (mw.config.get('wgContentLanguage') === 'pnb') {
availableMaps = ['urdu', 'arabic'];
} else if (mw.config.get('wgContentLanguage') === 'pnb') {
availableMaps = ['shahmukhi', 'arabic'];
}
// Decide selected type
currentType = getStoredType();
startPageConversion();
potlet = mw.util.addPortletLink(
'p-personal',
msg('label-url'),
msg('label-text'),
'pt-numconvert',
msg('label-tooltip'),
null,
mw.user.isAnon() ? '#pt-createaccount' : '#pt-userpage'
);
menu = $('<div>').addClass('mw-numerakri-menu').append(createSelector())[0];
if(potlet) {
potlet.appendChild(menu);
}
}
$(function () {
mw.requestIdleCallback(init);
});
}());