<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ar">
	<id>https://www.copticpedia.org/index.php?action=history&amp;feed=atom&amp;title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A%3AGadget-Numeral_converter.js</id>
	<title>ميدياويكي:Gadget-Numeral converter.js - تاريخ المراجعة</title>
	<link rel="self" type="application/atom+xml" href="https://www.copticpedia.org/index.php?action=history&amp;feed=atom&amp;title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A%3AGadget-Numeral_converter.js"/>
	<link rel="alternate" type="text/html" href="https://www.copticpedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Gadget-Numeral_converter.js&amp;action=history"/>
	<updated>2026-04-11T06:48:56Z</updated>
	<subtitle>تاريخ التعديل لهذه الصفحة في الويكي</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://www.copticpedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Gadget-Numeral_converter.js&amp;diff=8508&amp;oldid=prev</id>
		<title>Gerges: مراجعة واحدة</title>
		<link rel="alternate" type="text/html" href="https://www.copticpedia.org/index.php?title=%D9%85%D9%8A%D8%AF%D9%8A%D8%A7%D9%88%D9%8A%D9%83%D9%8A:Gadget-Numeral_converter.js&amp;diff=8508&amp;oldid=prev"/>
		<updated>2021-03-19T00:48:10Z</updated>

		<summary type="html">&lt;p&gt;مراجعة واحدة&lt;/p&gt;
&lt;p&gt;&lt;b&gt;صفحة جديدة&lt;/b&gt;&lt;/p&gt;&lt;div&gt;//[[pnb:میڈیا وکی:Gadget-Numeral converter.js]]&lt;br /&gt;
(function (mw, $) {&lt;br /&gt;
	&amp;quot;use strict&amp;quot;;&lt;br /&gt;
	// Private cache &amp;amp; utilities&lt;br /&gt;
	var el, w, num,&lt;br /&gt;
		/**&lt;br /&gt;
		 * @var {RegExp} Matcher for characters that can be mapped.&lt;br /&gt;
		 * @example matchers.urdu[0] matches urdu numeral for 0&lt;br /&gt;
		 *  can be mapped with e.g. maps.arabic[0].&lt;br /&gt;
		 */&lt;br /&gt;
		matchers = {},&lt;br /&gt;
		msgs = {&lt;br /&gt;
			'option-default': {&lt;br /&gt;
				en: 'الأصل'&lt;br /&gt;
			},&lt;br /&gt;
			'option-gharb': {&lt;br /&gt;
				en: '123'&lt;br /&gt;
			},&lt;br /&gt;
			'option-sharq': {&lt;br /&gt;
				en: '۱۲۳'&lt;br /&gt;
			},&lt;br /&gt;
			'label-url': {&lt;br /&gt;
				en: '//www.mediawiki.org/wiki/MediaWiki_talk:Gadget-Numerakri.js'&lt;br /&gt;
			},&lt;br /&gt;
			'label-text': {&lt;br /&gt;
				en: 'شكل الأعداد: '&lt;br /&gt;
			},&lt;br /&gt;
			'label-tooltip': {&lt;br /&gt;
				en: '١٢٣&amp;lt;-&amp;gt;123'&lt;br /&gt;
&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		maps = {&lt;br /&gt;
			// 0 to 9&lt;br /&gt;
			sharq: [ '٠','١','٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩','٪'],&lt;br /&gt;
			gharb:     [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9','%' ]&lt;br /&gt;
		},&lt;br /&gt;
		compatCookie = {&lt;br /&gt;
			'-1': 'default',&lt;br /&gt;
			'0' : 'gharb',&lt;br /&gt;
			'3': 'sharq'&lt;br /&gt;
		},&lt;br /&gt;
		// For consistency recreate these objects locally in older browsers so that&lt;br /&gt;
		// we can use the same constants in fallback code as well.&lt;br /&gt;
		NodeFilter = window.NodeFilter || {&lt;br /&gt;
			FILTER_ACCEPT: 1,&lt;br /&gt;
			FILTER_REJECT: 2,&lt;br /&gt;
			FILTER_SKIP: 3&lt;br /&gt;
		},&lt;br /&gt;
		Node = window.Node || {&lt;br /&gt;
			TEXT_NODE: 3&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
	// Fallback for document.createTreeWalker for older browsers (IE6-8)&lt;br /&gt;
	function walkTheDomFallback(node, filter, apply) {&lt;br /&gt;
		var val = filter(node);&lt;br /&gt;
		switch (val) {&lt;br /&gt;
		case NodeFilter.FILTER_ACCEPT:&lt;br /&gt;
			apply(node);&lt;br /&gt;
			node = node.firstChild;&lt;br /&gt;
			break;&lt;br /&gt;
		case NodeFilter.FILTER_REJECT:&lt;br /&gt;
			node = node.nextSibling;&lt;br /&gt;
			break;&lt;br /&gt;
		case NodeFilter.FILTER_SKIP:&lt;br /&gt;
			node = node.firstChild;&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
		while (node) {&lt;br /&gt;
			walkTheDomFallback(node, apply);&lt;br /&gt;
			node = node.nextSibling;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function walkTheDom(filter, apply) {&lt;br /&gt;
		if (document.createTreeWalker) {&lt;br /&gt;
			w = document.createTreeWalker(document.body, NodeFilter.SHOW_ALL, filter, false);&lt;br /&gt;
			while (el = w.nextNode()) {&lt;br /&gt;
				apply(el);&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			walkTheDomFallback(document.body, filter, apply);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function msg(key) {&lt;br /&gt;
		return msgs[key][mw.config.get('wgUserLanguage')] || msgs[key].en;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function getMatchers(target) {&lt;br /&gt;
		var rChars;&lt;br /&gt;
		if (!matchers[target]) {&lt;br /&gt;
			rChars = { 0: [], 1: [], 2: [], 3: [], 4: [], 5: [], 6: [], 7: [], 8: [], 9: [], 10: [] };&lt;br /&gt;
			$.each(maps, function (type, map) {&lt;br /&gt;
				if (type !== target) {&lt;br /&gt;
					for (var i = 0; i &amp;lt;= 10; i++) {&lt;br /&gt;
						rChars[i].push(map[i]);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			});&lt;br /&gt;
			rChars = $.map(rChars, function (chars) {&lt;br /&gt;
				return new RegExp('(' + $.map(chars, mw.RegExp.escape).join('|') + ')', 'g');&lt;br /&gt;
			});&lt;br /&gt;
			matchers[target] = rChars;&lt;br /&gt;
		}&lt;br /&gt;
		return matchers[target];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * @singleton&lt;br /&gt;
	 */&lt;br /&gt;
	num = window.Numerakri = {&lt;br /&gt;
		matchers: matchers,&lt;br /&gt;
&lt;br /&gt;
		/**&lt;br /&gt;
		 * @property {string} One of 'default', 'arabic' or 'shahmukhi'.&lt;br /&gt;
		 *  default leaves the page unchanged (default).&lt;br /&gt;
		 */&lt;br /&gt;
		type: 'default',&lt;br /&gt;
&lt;br /&gt;
		/**&lt;br /&gt;
		 * @property {jQuery|null} The HTML interface. May or may not be&lt;br /&gt;
		 * attached to the document yet.&lt;br /&gt;
		 */&lt;br /&gt;
		$int: null,&lt;br /&gt;
&lt;br /&gt;
		/**&lt;br /&gt;
		 * @param {HTMLElement|TextNode} el&lt;br /&gt;
		 */&lt;br /&gt;
		filterNode: function (el) {&lt;br /&gt;
			var n = el.nodeName &amp;amp;&amp;amp; el.nodeName.toLowerCase();&lt;br /&gt;
			if (n === 'input' || n === 'textarea' || $(el).hasClass('mw-numerakri-skip')) {&lt;br /&gt;
				return NodeFilter.FILTER_REJECT;&lt;br /&gt;
			}&lt;br /&gt;
			if (el.nodeType === Node.TEXT_NODE) {&lt;br /&gt;
				return NodeFilter.FILTER_ACCEPT;&lt;br /&gt;
			}&lt;br /&gt;
			return NodeFilter.FILTER_SKIP;&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		/**&lt;br /&gt;
		 * @method&lt;br /&gt;
		 * @param {TextNode} el&lt;br /&gt;
		 */&lt;br /&gt;
		handleTextNode: function (el) {&lt;br /&gt;
			var live = el.nodeValue,&lt;br /&gt;
				fix = live,&lt;br /&gt;
				matchers = getMatchers(num.type),&lt;br /&gt;
				i = 0;&lt;br /&gt;
			for (; i &amp;lt;= 10; i++) {&lt;br /&gt;
				fix = fix.replace(matchers[i], maps[num.type][i]);&lt;br /&gt;
			}&lt;br /&gt;
			if (live !== fix) {&lt;br /&gt;
				el.nodeValue = fix;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		isValidType: function (type) {&lt;br /&gt;
			return type === 'default' || !!maps[type];&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		/**&lt;br /&gt;
		 * Register an additional type.&lt;br /&gt;
		 *&lt;br /&gt;
		 * @example&lt;br /&gt;
		 *  num.addType('arabic', { map: [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ] });&lt;br /&gt;
		 * @param {string} type ID&lt;br /&gt;
		 * @param {Object} data Contents:&lt;br /&gt;
		 * - {Object} map&lt;br /&gt;
		 * - {string|Object} msg [optional] Label for this type or translations of labels,&lt;br /&gt;
		 *   keyed by language code. Defaults to ucFirst transformation of ID.&lt;br /&gt;
		 */&lt;br /&gt;
		addType: function (type, data) {&lt;br /&gt;
			if (type &amp;amp;&amp;amp; data &amp;amp;&amp;amp; $.isArray(data.map)) {&lt;br /&gt;
				// Map&lt;br /&gt;
				maps[type] = data.map;&lt;br /&gt;
&lt;br /&gt;
				// Messages&lt;br /&gt;
				if (data.msg) {&lt;br /&gt;
					if ($.isPlainObject(data.msg)) {&lt;br /&gt;
						if (!data.msg.en) {&lt;br /&gt;
							data.msg.en = $.ucFirst(type);&lt;br /&gt;
						}&lt;br /&gt;
					} else {&lt;br /&gt;
						data.msg = { en: String(data.msg) };&lt;br /&gt;
					}&lt;br /&gt;
				} else {&lt;br /&gt;
					data.msg = { en: $.ucFirst(type) };&lt;br /&gt;
				}&lt;br /&gt;
				msgs['option-' + type] = data.msg;&lt;br /&gt;
&lt;br /&gt;
				if (this.$select) {&lt;br /&gt;
					this.$select.append(&lt;br /&gt;
						$('&amp;lt;option&amp;gt;').val(type)&lt;br /&gt;
							.text(msg('option-' + type))&lt;br /&gt;
							.prop('selected', this.getStoredType() === type)&lt;br /&gt;
					);&lt;br /&gt;
				}&lt;br /&gt;
				return true;&lt;br /&gt;
			}&lt;br /&gt;
			return false;&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		/**&lt;br /&gt;
		 * @method&lt;br /&gt;
		 * @param {string} type One of 'arabic' or 'devanagari'.&lt;br /&gt;
		 * @throws Error&lt;br /&gt;
		 */&lt;br /&gt;
		setType: function (type) {&lt;br /&gt;
			if (!this.isValidType(type)) {&lt;br /&gt;
				mw.log('Unknown Numerakri type: ' + type);&lt;br /&gt;
				return false;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			this.type = type;&lt;br /&gt;
&lt;br /&gt;
			// Remember for 365 days&lt;br /&gt;
			$.cookie('mw-numerakri-type', type, { expires: 365, path: '/' });&lt;br /&gt;
&lt;br /&gt;
			this.convertPage();&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		/**&lt;br /&gt;
		 * @return {string|undefined}&lt;br /&gt;
		 */&lt;br /&gt;
		getStoredType: function () {&lt;br /&gt;
			// From cookie&lt;br /&gt;
			var stored = $.cookie('mw-numerakri-type');&lt;br /&gt;
&lt;br /&gt;
			// From cookie (old version)&lt;br /&gt;
			if (!stored) {&lt;br /&gt;
				stored = compatCookie[$.cookie('numconvert')];&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			return stored;&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		/**&lt;br /&gt;
		 * Do the conversion.&lt;br /&gt;
		 * @method&lt;br /&gt;
		 */&lt;br /&gt;
		convertPage: function () {&lt;br /&gt;
			if (this.type === 'default') {&lt;br /&gt;
				// Type 'default' means &amp;quot;don't change the page&amp;quot;.&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			switch (this.type) {&lt;br /&gt;
			case 'gharb':&lt;br /&gt;
				$('ol:lang(ar) li, ol.references, li.references').css('list-style-type', 'decimal');&lt;br /&gt;
				break;&lt;br /&gt;
			case 'sharq':&lt;br /&gt;
				$('ol:lang(ar) li, ol.references, li.references').css('list-style-type', 'arabic-indic');&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			walkTheDom(this.filterNode, this.handleTextNode);&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		setupInterface: function () {&lt;br /&gt;
			var $select, stored;&lt;br /&gt;
			$select = $('&amp;lt;select&amp;gt;').addClass('mw-numerakri-skip').append(&lt;br /&gt;
				$('&amp;lt;option&amp;gt;').val('default').text(msg('option-default')),&lt;br /&gt;
				// $.map returns an array&lt;br /&gt;
				$.map(maps, function (map, type) {&lt;br /&gt;
					return $('&amp;lt;option&amp;gt;').val(type).text(msg('option-' + type));&lt;br /&gt;
				})&lt;br /&gt;
			);&lt;br /&gt;
&lt;br /&gt;
			stored = num.getStoredType();&lt;br /&gt;
			if (stored) {&lt;br /&gt;
				// Set initial value from storage&lt;br /&gt;
				$select.val(stored);&lt;br /&gt;
				num.setType(stored);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			$select.change(function () {&lt;br /&gt;
				num.setType(this.value);&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
			if (num.$select) {&lt;br /&gt;
				num.$select.replaceWith($select);&lt;br /&gt;
			} else {&lt;br /&gt;
				num.$select = $select;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
&lt;br /&gt;
		attachInterface: function () {&lt;br /&gt;
			var potlet, $menu;&lt;br /&gt;
&lt;br /&gt;
			if (num.$select === null) {&lt;br /&gt;
				num.setupInterface();&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			$('#pt-numconvert').remove(); // Just in case&lt;br /&gt;
			potlet = mw.util.addPortletLink(&lt;br /&gt;
				'p-personal',&lt;br /&gt;
				msg('label-url'),&lt;br /&gt;
				msg('label-text'),&lt;br /&gt;
				'pt-numconvert',&lt;br /&gt;
				msg('label-tooltip'),&lt;br /&gt;
				null,&lt;br /&gt;
				mw.user.isAnon() ? '#pt-createaccount' : '#pt-userpage'&lt;br /&gt;
			);&lt;br /&gt;
&lt;br /&gt;
			$menu = $('&amp;lt;span&amp;gt;').addClass('mw-numerakri-menu').append(num.$select);&lt;br /&gt;
&lt;br /&gt;
			$(potlet).append($menu);&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	num.setupInterface();&lt;br /&gt;
&lt;br /&gt;
	mw.loader.using('mediawiki.user', function () {&lt;br /&gt;
		$(document).ready(num.attachInterface);&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
})(mediaWiki, jQuery);&lt;/div&gt;</summary>
		<author><name>Gerges</name></author>
	</entry>
</feed>