میڈیا وکی: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);
	});
}());