<?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-urldecoder.js</id>
	<title>ميدياويكي:Gadget-urldecoder.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-urldecoder.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-urldecoder.js&amp;action=history"/>
	<updated>2026-04-10T17:39:20Z</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-urldecoder.js&amp;diff=8632&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-urldecoder.js&amp;diff=8632&amp;oldid=prev"/>
		<updated>2021-03-19T00:58:51Z</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;/**&lt;br /&gt;
 * [[ВП:Гаджеты/Упрощение ссылок]]&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
( function() {&lt;br /&gt;
	window.urlDecoderRun = function ( input ) { // main function&lt;br /&gt;
&lt;br /&gt;
		// 2nd-lvl WMF domains; old secure link: .../wikipedia/mediawiki,&lt;br /&gt;
		// .../wikipedia/foundation&lt;br /&gt;
		var wmDomain = {&lt;br /&gt;
			mediawiki: 'mw',&lt;br /&gt;
			wikidata: 'd',&lt;br /&gt;
			wikimediafoundation: 'foundation'&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		/*&lt;br /&gt;
		 * 2nd-lvl WMF domains with multiple languages; old secure link:&lt;br /&gt;
		 * wikinews/en&lt;br /&gt;
		 */&lt;br /&gt;
		var wmDomainM = {&lt;br /&gt;
			wikipedia: 'w',&lt;br /&gt;
			wikibooks: 'b',&lt;br /&gt;
			wikinews: 'n',&lt;br /&gt;
			wikiquote: 'q',&lt;br /&gt;
			wikisource: 's',&lt;br /&gt;
			wikiversity: 'v',&lt;br /&gt;
			wikivoyage: 'voy',&lt;br /&gt;
			wiktionary: 'wikt'&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		/*&lt;br /&gt;
		 * 3rd-lvl WMF domains on .wikimedia.org; for some reason old secure&lt;br /&gt;
		 * link is wikipedia&lt;br /&gt;
		 */&lt;br /&gt;
		var wmSubDomains = /^(meta|commons|incubator|species|strategy)$/;&lt;br /&gt;
&lt;br /&gt;
		var newText, isBeforeCursor, colonNS, selectionRange,&lt;br /&gt;
			// any chars except []&amp;lt;&amp;gt;&amp;quot; and \n and spaces&lt;br /&gt;
			httpRegExp = '(https?:\\/\\/[^\\]\\[\\n\\r&amp;lt;&amp;gt;&amp;quot; ]+)',&lt;br /&gt;
			localPrefix = WMPrefixes( unSecure( mw.config.get( 'wgServer' ).replace( /^\/\//, 'http://' ) + mw.config.get( 'wgScript' ) ) ),&lt;br /&gt;
			tbox = $( input || '#wpTextbox1' ).focus(),&lt;br /&gt;
			oldText = tbox.textSelection( 'getSelection' ),&lt;br /&gt;
			caretPos = tbox.textSelection( 'getCaretPosition', {&lt;br /&gt;
				startAndEnd: true&lt;br /&gt;
			} ),&lt;br /&gt;
			selectionStartPos = caretPos[0],&lt;br /&gt;
			selectionEndPos = caretPos[1];&lt;br /&gt;
		&lt;br /&gt;
		if ( oldText ) { // there was selection&lt;br /&gt;
&lt;br /&gt;
			var rx = RegExp( '(\\[{0,2})' + httpRegExp + '([^\\]\\[\\n\\r]*?\\]\\]?)?', 'ig' );&lt;br /&gt;
			newText = oldText.replace( rx, simplifyMatched );&lt;br /&gt;
&lt;br /&gt;
			if ( window.urlDecoderIntLinks ) {&lt;br /&gt;
				var ut = '(' + mw.config.get( 'wgFormattedNamespaces' )[3].replace( / /g, '_' ) + '|user_talk)'; // both&lt;br /&gt;
				/* localized and canonical 'user_talk' */&lt;br /&gt;
				ut = RegExp( '\\[\\[' + ut.toLowerCase() + ':[^#]+$', 'i' );&lt;br /&gt;
				newText = newText.replace( /\[\[[^\]\|\n]+/g, function( lnk ) {&lt;br /&gt;
					return ut.test( lnk ) ? lnk : decodeAnchor( lnk ); // skip&lt;br /&gt;
					// user_talk,&lt;br /&gt;
					// usually&lt;br /&gt;
					// found in&lt;br /&gt;
					// signatures&lt;br /&gt;
				} );&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if ( newText == oldText ) {&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
		} else { // process text before cursor&lt;br /&gt;
&lt;br /&gt;
			isBeforeCursor = true;&lt;br /&gt;
&lt;br /&gt;
			// move back enough characters&lt;br /&gt;
			var beginPos = selectionEndPos - 2000;&lt;br /&gt;
			if ( beginPos &amp;lt; 0 ) {&lt;br /&gt;
				beginPos = 0;&lt;br /&gt;
			}&lt;br /&gt;
			tbox.textSelection( 'setSelection', {&lt;br /&gt;
				start: beginPos,&lt;br /&gt;
				end: selectionEndPos&lt;br /&gt;
			} );&lt;br /&gt;
			oldText = tbox.textSelection( 'getSelection' );&lt;br /&gt;
			tbox.textSelection( 'setSelection', {&lt;br /&gt;
				start: selectionEndPos,&lt;br /&gt;
				end: selectionEndPos&lt;br /&gt;
			} );&lt;br /&gt;
&lt;br /&gt;
			// try to find http in oldText&lt;br /&gt;
			var rx = new RegExp( '(\\[{0,2})' + httpRegExp + '( +[^\\]\n]+)?\\]{0,2}$', 'i' ), ma = rx.exec( oldText ); // result:&lt;br /&gt;
			// (whole&lt;br /&gt;
			// string)'&lt;br /&gt;
			// '[',&lt;br /&gt;
			// 'http:...',&lt;br /&gt;
			// '&lt;br /&gt;
			// name]'&lt;br /&gt;
			if ( !ma ) {&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			oldText = ma[0];&lt;br /&gt;
			if ( ma[3] ) { // link with name: automatically add brackets&lt;br /&gt;
				newText = simplifyMatched( ma[0], '[', ma[2], ma[3] + ']' );&lt;br /&gt;
			} else { // just url: add closing bracket only if there is leading bracket&lt;br /&gt;
				newText = simplifyMatched( ma[0], ma[1], ma[2], ma[1] ? ']' : '' );&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if ( oldText == newText ) {&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			tbox.textSelection( 'setSelection', {&lt;br /&gt;
				start: selectionEndPos - oldText.length,&lt;br /&gt;
				end: selectionEndPos&lt;br /&gt;
			} );&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// replace text&lt;br /&gt;
		tbox.textSelection( 'encapsulateSelection', {&lt;br /&gt;
			replace: true,&lt;br /&gt;
			peri: newText&lt;br /&gt;
		} );&lt;br /&gt;
		&lt;br /&gt;
		// FIXME: restructure&lt;br /&gt;
		if ( selectionRange ) {&lt;br /&gt;
			tbox.textSelection( 'setSelection', {&lt;br /&gt;
				start: selectionEndPos - oldText.length + selectionRange[0],&lt;br /&gt;
				end: selectionEndPos - oldText.length + selectionRange[1]&lt;br /&gt;
			} );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// end of main code&lt;br /&gt;
		return;&lt;br /&gt;
&lt;br /&gt;
		// ---FUNCTIONS&lt;br /&gt;
&lt;br /&gt;
		function simplifyMatched( str, bracket, url, rest ) { // arguments:&lt;br /&gt;
			// (whole&lt;br /&gt;
			// string), '[',&lt;br /&gt;
			// url, ' name]'&lt;br /&gt;
			if ( !bracket ) {// no brackets, just url&lt;br /&gt;
				var trail = RegExp( '[' + ',;\\\\\.:!\\?' + // trailing&lt;br /&gt;
				// punctuation,&lt;br /&gt;
				// per Parser.php&lt;br /&gt;
				( /\(/.test( url ) ? '' : '\\)' ) + // also closing bracket&lt;br /&gt;
				// without&lt;br /&gt;
				// opening bracket&lt;br /&gt;
				']+$' + &amp;quot;|''+$&amp;quot; // or possible bold/italic at the end of url&lt;br /&gt;
				).exec( url );&lt;br /&gt;
				if ( trail ) {&lt;br /&gt;
					url = url.substring( 0, url.length - trail[0].length ); // move&lt;br /&gt;
					// these&lt;br /&gt;
					// out&lt;br /&gt;
					// of&lt;br /&gt;
					// url&lt;br /&gt;
				}&lt;br /&gt;
				return decodeUrl( url ) + str.substring( url.length );&lt;br /&gt;
&lt;br /&gt;
			} else if ( rest ) { // both brackets and possibly name&lt;br /&gt;
				return decodeUrl( url, rest.replace( /\]+$|^ +| +$/g, '' ) ); // trim&lt;br /&gt;
				// ending&lt;br /&gt;
				// brackets&lt;br /&gt;
				// and&lt;br /&gt;
				// spaces&lt;br /&gt;
				// in&lt;br /&gt;
				// 'name]'&lt;br /&gt;
			} else {&lt;br /&gt;
				return str; // probably broken wikicode in selected text&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		function decodeUrl( url, name ) { // url -&amp;gt; %-decoded -&amp;gt; [[link|name]]&lt;br /&gt;
			// (if&lt;br /&gt;
			// possible); name is optional&lt;br /&gt;
&lt;br /&gt;
			var decodingFailed; // need to skip some strange percent-encoded&lt;br /&gt;
			// URIs&lt;br /&gt;
			url = unSecure( url );&lt;br /&gt;
&lt;br /&gt;
			// percent-decoding&lt;br /&gt;
			if ( url.indexOf( '%' ) !== -1 ) {&lt;br /&gt;
				try {&lt;br /&gt;
					url = decodeURI( url );&lt;br /&gt;
					url = url.replace( /%(3B|2F|2C|3A)/g, decodeURIComponent ); // decode&lt;br /&gt;
					// ;/,:&lt;br /&gt;
					url = url.replace( /[ &amp;lt;&amp;gt;&amp;quot;\[\]\n\r]/g, encodeURIComponent ); // &amp;quot;&lt;br /&gt;
					/*&lt;br /&gt;
					 * some disallowed chars can screw template params&lt;br /&gt;
					 */&lt;br /&gt;
				} catch ( e ) {&lt;br /&gt;
					decodingFailed = true;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if ( isBeforeCursor ) { // user-defined conversion to eng keywords&lt;br /&gt;
				for ( var n in window.urlDecoderEngNames ) {&lt;br /&gt;
					url = url.replace( RegExp( '(title=|wiki\/)(' + window.urlDecoderEngNames[n] + ':)' ), '$1' + n + ':' );&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// try converting to internal link&lt;br /&gt;
			var linkOrArr, link, isIwTemplate;&lt;br /&gt;
			// trailing | or }} could mean a part of a template, skip to be safe&lt;br /&gt;
			if ( !decodingFailed &amp;amp;&amp;amp; !/(\}\}|\|)$/.test( url ) ) {&lt;br /&gt;
				// FIXME: restructure&lt;br /&gt;
				linkOrArr = toWikilink( url );&lt;br /&gt;
				if ( linkOrArr !== null &amp;amp;&amp;amp; typeof linkOrArr === 'object' ) {&lt;br /&gt;
					isIwTemplate = linkOrArr[0];&lt;br /&gt;
					link = linkOrArr[1];&lt;br /&gt;
				} else {&lt;br /&gt;
					link = linkOrArr;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if ( isIwTemplate ) {&lt;br /&gt;
				return link.replace( '||', '|' + ( name ? name : '' ) + '|' );&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// user-defined function&lt;br /&gt;
			if ( window.urlDecoderCustom ) {&lt;br /&gt;
				url = urlDecoderCustom( url );&lt;br /&gt;
				if ( !/^(https?:\/\/|\{\{)/.test( url ) ) {&lt;br /&gt;
					link = url; // was converted to internal link&lt;br /&gt;
					isIwTemplate = false;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// return internal link&lt;br /&gt;
			if ( link ) {&lt;br /&gt;
				link = link.replace( /%(3f|26|22)/ig, decodeURIComponent ); // decode ?&amp;amp;&amp;quot;&lt;br /&gt;
				if ( ( mw.config.get( 'wgNamespaceNumber' ) == 0 || mw.config.get( 'wgNamespaceNumber' ) == 14 ) &amp;amp;&amp;amp; isBeforeCursor ) {&lt;br /&gt;
					link = link.replace( /^:/, '' ); // probably user adding&lt;br /&gt;
					// interwiki&lt;br /&gt;
				}&lt;br /&gt;
				return '[[' + link + ( name ? '|' + name : '' ) + ']]';&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// or return external link&lt;br /&gt;
			if ( typeof name == 'string' ) {&lt;br /&gt;
				if ( isBeforeCursor ) {&lt;br /&gt;
					url = url.replace( /''/g, '%27%27' ); // techically ''&lt;br /&gt;
					// should&lt;br /&gt;
					// stop URL, but more&lt;br /&gt;
					// likely it's part of&lt;br /&gt;
					// it&lt;br /&gt;
				}&lt;br /&gt;
				return '[' + url + ( name ? ' ' + name : '' ) + ']'; // empty&lt;br /&gt;
				// name&lt;br /&gt;
			} else {&lt;br /&gt;
				return url;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		function toWikilink( url ) { // 'http://xx.wikipedia.org/wiki/YY' -&amp;gt;&lt;br /&gt;
			// xx:YY&lt;br /&gt;
&lt;br /&gt;
			// add bugzilla to user-defined prefixes&lt;br /&gt;
			var urlDecoderPrefixes = $.extend( window.urlDecoderPrefixes, {&lt;br /&gt;
				'https://bugzilla.wikimedia.org/show_bug.cgi?id=': 'mediazilla',&lt;br /&gt;
				'wikidata.org/wiki/': 'd',&lt;br /&gt;
				'phabricator.wikimedia.org/': 'phab'&lt;br /&gt;
			} );&lt;br /&gt;
&lt;br /&gt;
			// apply user-defined prefixes&lt;br /&gt;
			for ( var key in urlDecoderPrefixes ) {&lt;br /&gt;
				if ( url.toLowerCase().indexOf( key ) !== -1 ) {&lt;br /&gt;
					return urlDecoderPrefixes[key] + ':' + url.substring( url.indexOf( key ) + key.length );&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// check if we can convert to internal link with WM prefixes&lt;br /&gt;
			var ma = /^(https?:\/\/[^\/]+)\/wiki\/([^?]+)$/.exec( url ); // 1:'http://domain.org'&lt;br /&gt;
			// 2:part&lt;br /&gt;
			// after&lt;br /&gt;
			// /wiki/&lt;br /&gt;
			if ( !ma ) {&lt;br /&gt;
				return null;&lt;br /&gt;
			}&lt;br /&gt;
			var linkPrefix = WMPrefixes( ma[1] );&lt;br /&gt;
			if ( !linkPrefix ) {&lt;br /&gt;
				return null;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			var title = decodeAnchor( ma[2] );&lt;br /&gt;
			if ( mw.config.get( 'wgServerName' ) === 'ar.wikipedia.org' &amp;amp;&amp;amp;&lt;br /&gt;
				// namespaces: main, &amp;quot;Portal&amp;quot;, &amp;quot;Incubator&amp;quot;&lt;br /&gt;
				[ 0, 100, 102 ].indexOf( mw.config.get( 'wgNamespaceNumber' ) ) !== -1 &amp;amp;&amp;amp;&lt;br /&gt;
				linkPrefix[0] === 'w' &amp;amp;&amp;amp;&lt;br /&gt;
				linkPrefix[1] !== 'ar'&lt;br /&gt;
			) {&lt;br /&gt;
				title = title.replace( /%(3f|26|22)/ig, decodeURIComponent ); // decode ?&amp;amp;&amp;quot;&lt;br /&gt;
				selectionRange = [ 5, 5 + title.length ];&lt;br /&gt;
				return [ true, '{{iw|' + title + '||' + linkPrefix[1] + '|' + title + '}}' ];&lt;br /&gt;
			} else {&lt;br /&gt;
				// convert to internal&lt;br /&gt;
				var prefixes = '';&lt;br /&gt;
				if ( linkPrefix[0] &amp;amp;&amp;amp; ( linkPrefix[0] !== localPrefix[0] ) ) {&lt;br /&gt;
					prefixes = linkPrefix[0];&lt;br /&gt;
				}&lt;br /&gt;
				if ( linkPrefix[1] &amp;amp;&amp;amp; ( linkPrefix[1] !== localPrefix[1] ) ) {&lt;br /&gt;
					prefixes += ':' + linkPrefix[1];&lt;br /&gt;
				}&lt;br /&gt;
				if ( prefixes || isColonNeeded( title ) ) {&lt;br /&gt;
					prefixes += ':'; // colon after prefix or leading colon on&lt;br /&gt;
					// cat/file link&lt;br /&gt;
				}&lt;br /&gt;
				return prefixes + title;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		function decodeAnchor( link ) { // simplify internal link: replace %20&lt;br /&gt;
			// and _&lt;br /&gt;
			// then decode anchor&lt;br /&gt;
			link = link.replace( /(_|%20)/g, ' ' ).replace( /^ +| +$/g, '' );&lt;br /&gt;
			var parts = link.split( '#' );&lt;br /&gt;
			if ( parts.length !== 2 ) {&lt;br /&gt;
				return link; // no anchor&lt;br /&gt;
			}&lt;br /&gt;
			var anchor = parts[1], hidIdx = -1, hidden = [];&lt;br /&gt;
			// decode 4, 3 and 2-byte: http://en.wikipedia.org/wiki/UTF-8&lt;br /&gt;
			anchor = anchor.replace( /\.F[0-4]\.[89AB][\dA-F]\.[89AB][\dA-F]\.[89AB][\dA-F]/g, deChar );&lt;br /&gt;
			anchor = anchor.replace( /\.E[\dA-F]\.[89AB][\dA-F]\.[89AB][\dA-F]/g, deChar );&lt;br /&gt;
			anchor = anchor.replace( /\.[CD][\dA-F]\.[89AB][\dA-F]/g, deChar );&lt;br /&gt;
			anchor = anchor&lt;br /&gt;
					.replace(&lt;br /&gt;
							// hide IPs&lt;br /&gt;
							/(?:^|[^0-9A-F\.])(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/,&lt;br /&gt;
							function( s ) {&lt;br /&gt;
								hidden[++hidIdx] = s;&lt;br /&gt;
								return '\x01' + hidIdx + '\x02';&lt;br /&gt;
							} );&lt;br /&gt;
			// decode 1-byte chars: all symbols except -.:_ and []{} prohibited&lt;br /&gt;
			// in&lt;br /&gt;
			// links&lt;br /&gt;
			anchor = anchor.replace( /\.[2-7][0-9A-F]/g, function( hhh ) {&lt;br /&gt;
				var ch = deChar( hhh );&lt;br /&gt;
				if ( '!&amp;quot;#$%&amp;amp;\'()*+,/;&amp;lt;=&amp;gt;?@\\^`~'.indexOf( ch ) &amp;gt;= 0 ) {&lt;br /&gt;
					return ch;&lt;br /&gt;
				} else {&lt;br /&gt;
					return hhh;&lt;br /&gt;
				}&lt;br /&gt;
			} );&lt;br /&gt;
			// unhide IPs and return&lt;br /&gt;
			for ( var i = hidIdx; i &amp;gt;= 0; i-- ) {&lt;br /&gt;
				anchor = anchor.replace( '\x01' + i + '\x02', hidden[i] );&lt;br /&gt;
			}&lt;br /&gt;
			if ( anchor.indexOf( &amp;quot;''&amp;quot; ) !== -1 ) {&lt;br /&gt;
				return link; // cannot have double '' in link&lt;br /&gt;
			} else {&lt;br /&gt;
				return parts[0] + '#' + anchor;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			function deChar( ss ) {&lt;br /&gt;
				try {&lt;br /&gt;
					ss = decodeURIComponent( ss.replace( /\.([0-9A-F][0-9A-F])/g, '%$1' ) );&lt;br /&gt;
				} catch ( e ) {&lt;br /&gt;
				}&lt;br /&gt;
				return ss;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		function WMPrefixes( url ) { // http: //en.wikipedia.org/wiki/... -&amp;gt;&lt;br /&gt;
			// [&lt;br /&gt;
			// 'w', 'en']&lt;br /&gt;
			var dd = /^https?:\/\/([a-z\.]+)\.org/.exec( url.toLowerCase() );&lt;br /&gt;
			if ( !dd ) {&lt;br /&gt;
				return null;&lt;br /&gt;
			}&lt;br /&gt;
			dd = dd[1].split( '.' ); // domains, e.g. ['en','wikipedia']&lt;br /&gt;
			if ( dd.length &amp;gt; 2 ) {&lt;br /&gt;
				return null; // too many subdomains, possibly mobile site&lt;br /&gt;
				// XX.m.wikipedia.org/&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			var lang = '', proj = '', domain = dd.pop(), subdomain = dd.pop();&lt;br /&gt;
			if ( subdomain == 'www' ) {&lt;br /&gt;
				subdomain = '';&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if ( domain == 'wikimedia' ) { // *.wikimedia.org&lt;br /&gt;
				if ( !subdomain ) {&lt;br /&gt;
					proj = 'foundation';&lt;br /&gt;
				} else if ( wmSubDomains.test( subdomain ) ) {&lt;br /&gt;
					proj = subdomain;&lt;br /&gt;
				} else {&lt;br /&gt;
					return null;&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
			} else if ( ( proj = wmDomain[domain] ) &amp;amp;&amp;amp; !subdomain ) { // mediawiki.org&lt;br /&gt;
				// &amp;amp;&lt;br /&gt;
				// wikimediafoundation.org&lt;br /&gt;
				// done: proj is set&lt;br /&gt;
&lt;br /&gt;
			} else if ( proj = wmDomainM[domain] ) { // multi-lang domains&lt;br /&gt;
				if ( !subdomain ) {&lt;br /&gt;
					// done: e.g. 'wikisource.org'&lt;br /&gt;
				} else if ( proj == 'w' &amp;amp;&amp;amp; subdomain == 'test' ) {&lt;br /&gt;
					proj = 'testwiki';&lt;br /&gt;
				} else if ( subdomain.length &amp;gt;= 2 ) {&lt;br /&gt;
					lang = subdomain;&lt;br /&gt;
				} else {&lt;br /&gt;
					return null;&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
			} else {&lt;br /&gt;
				return null; // unrecognized domain&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			return [ proj, lang ];&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		function unSecure( url ) {&lt;br /&gt;
			var mm = /https:\/\/secure\.wikimedia\.org\/(\w+)\/(\w+)\/([^\]\|\n\r ]+)/i.exec( url );&lt;br /&gt;
			if ( !mm ) {&lt;br /&gt;
				return url;&lt;br /&gt;
			}&lt;br /&gt;
			var domain = mm[1].toLowerCase(), sub = mm[2].toLowerCase();&lt;br /&gt;
&lt;br /&gt;
			if ( !wmDomainM[domain] ) {&lt;br /&gt;
				return url; // domain not recognized&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if ( domain == 'wikipedia' ) { // handle some special cases&lt;br /&gt;
				switch ( sub ) {&lt;br /&gt;
				case 'mediawiki':&lt;br /&gt;
					sub = 'www';&lt;br /&gt;
					domain = 'mediawiki';&lt;br /&gt;
					break;&lt;br /&gt;
				case 'foundation':&lt;br /&gt;
					sub = '';&lt;br /&gt;
					domain = 'wikimediafoundation';&lt;br /&gt;
					break;&lt;br /&gt;
				case 'sources':&lt;br /&gt;
					sub = '';&lt;br /&gt;
					domain = 'wikisource';&lt;br /&gt;
					break;&lt;br /&gt;
				default:&lt;br /&gt;
					if ( wmSubDomains.test( sub ) ) {&lt;br /&gt;
						domain = 'wikimedia'; // .../wikipedia/meta -&amp;gt;&lt;br /&gt;
						// meta.wikimedia.org&lt;br /&gt;
					}&lt;br /&gt;
					// otherwise: consider it language: .../wikipedia/en&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			return 'http://' + ( sub ? sub + '.' : '' ) + domain + '.org/' + mm[3];&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		function isColonNeeded( pg ) {&lt;br /&gt;
			if ( !/:/.test( pg ) ) {&lt;br /&gt;
				return false;&lt;br /&gt;
			}&lt;br /&gt;
			if ( !colonNS ) { // define list of all possible category and file&lt;br /&gt;
				// namespaces&lt;br /&gt;
				var list = [ 'file', 'category' ]; // canonical aliases&lt;br /&gt;
				for ( var name in mw.config.get( 'wgNamespaceIds' ) ) {&lt;br /&gt;
					if ( ( mw.config.get( 'wgNamespaceIds' )[name] == 6 || mw.config.get( 'wgNamespaceIds' )[name] == 14 ) &amp;amp;&amp;amp; $.inArray( name, list ) == -1 ) {&lt;br /&gt;
						list.push( name );&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				colonNS = RegExp( '^(' + list.join( '|' ) + ') *:', 'i' );&lt;br /&gt;
			}&lt;br /&gt;
			return colonNS.test( $.trim( pg ) );&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
} )();&lt;/div&gt;</summary>
		<author><name>Gerges</name></author>
	</entry>
</feed>