<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://xn--b1amah.xn--d1ad.xn--p1ai/w/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://xn--b1amah.xn--d1ad.xn--p1ai/w/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-urldecoder.js</id>
		<title>MediaWiki:Gadget-urldecoder.js - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://xn--b1amah.xn--d1ad.xn--p1ai/w/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-urldecoder.js"/>
		<link rel="alternate" type="text/html" href="http://xn--b1amah.xn--d1ad.xn--p1ai/w/index.php?title=MediaWiki:Gadget-urldecoder.js&amp;action=history"/>
		<updated>2026-05-26T21:39:51Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.23.17</generator>

	<entry>
		<id>http://xn--b1amah.xn--d1ad.xn--p1ai/w/index.php?title=MediaWiki:Gadget-urldecoder.js&amp;diff=1378&amp;oldid=prev</id>
		<title>Admin: Отмена правки 1374 участника Admin (обсуждение)</title>
		<link rel="alternate" type="text/html" href="http://xn--b1amah.xn--d1ad.xn--p1ai/w/index.php?title=MediaWiki:Gadget-urldecoder.js&amp;diff=1378&amp;oldid=prev"/>
				<updated>2011-06-28T12:32:49Z</updated>
		
		<summary type="html">&lt;p&gt;Отмена правки 1374 участника &lt;a href=&quot;/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Admin&quot; title=&quot;Служебная:Вклад/Admin&quot;&gt;Admin&lt;/a&gt; (&lt;a href=&quot;/wiki/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Admin&quot; title=&quot;Обсуждение участника:Admin&quot;&gt;обсуждение&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;function urlDecoderButton(){&lt;br /&gt;
 addFuncButton2('urlDecoder', urlDecoderRun, 'http://upload.wikimedia.org/wikipedia/commons/9/91/Link_go.png', 'Decode URL before cursor or all URLs in selected text', window.urlDecoderKey)&lt;br /&gt;
}&lt;br /&gt;
if (wgAction=='edit' || wgAction=='submit') addOnloadHook(urlDecoderButton)&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
function addFuncButton2(id, func, img, title, akey){&lt;br /&gt;
 if (window.wgWikiEditorEnabledModules &amp;amp;&amp;amp; wgWikiEditorEnabledModules.toolbar){ //new&lt;br /&gt;
  var msg = {}; msg[id] = title;  mw.usability.addMessages(msg)&lt;br /&gt;
  // $j('#wpTextbox1').wikiEditor('addToToolbar', { section:'main', groups: {'ruwp':{}}})&lt;br /&gt;
  $j('#wpTextbox1').wikiEditor('addToToolbar', {&lt;br /&gt;
   section:'main', //groups: {'mytools':{}},&lt;br /&gt;
   group:'insert', tools: {id:{&lt;br /&gt;
     type:'button',&lt;br /&gt;
     action: {type:'callback', execute: func},&lt;br /&gt;
     labelMsg:id,&lt;br /&gt;
     icon:img&lt;br /&gt;
  }}})&lt;br /&gt;
 }else{ //old&lt;br /&gt;
  var tlb_ = document.getElementById('toolbar')&lt;br /&gt;
  if (!tlb_) return&lt;br /&gt;
  var i=document.createElement('img')&lt;br /&gt;
  i.className='mw-toolbar-custombutton'; i.id=id&lt;br /&gt;
  i.onclick=func; i.src=img; i.title=title; i.alt=title.substr(0,3)&lt;br /&gt;
   appendCSS('img.mw-toolbar-custombutton {height:20px; background-color:#bce; border:1px outset #bce; margin:0 1px; cursor:pointer}')&lt;br /&gt;
  tlb_.appendChild(i)&lt;br /&gt;
  if (akey){ i.accessKey = akey; i.title += ' ['+akey+']'; updateTooltipAccessKeys([i]) }&lt;br /&gt;
 } &lt;br /&gt;
} &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
function urlDecoderRun(){ //main function&lt;br /&gt;
 &lt;br /&gt;
var httpRegExp = '(https?:\\/\\/[^\\]\\[\\n\\r&amp;lt;&amp;gt;&amp;quot; ]+)' //  except []&amp;lt;&amp;gt;&amp;quot;&lt;br /&gt;
var beforeCursor = new RegExp('(\\[{0,2})'+httpRegExp+'( +[^\\]\n]+)?\\]{0,2}$', 'i') &lt;br /&gt;
var localPrefix = WMPrefixes(unSecure(wgServer+wgScript))&lt;br /&gt;
var newText, linkSize, txtarea = document.editform.wpTextbox1&lt;br /&gt;
var isBeforeCursor = false&lt;br /&gt;
 &lt;br /&gt;
if (document.selection) { //IE/Opera&lt;br /&gt;
  var scrollTop = document.documentElement.scrollTop&lt;br /&gt;
  txtarea.focus()&lt;br /&gt;
  range = document.selection.createRange()&lt;br /&gt;
  if (!range.moveStart) return&lt;br /&gt;
  if (range.text){&lt;br /&gt;
    newText = processSelText(range.text)&lt;br /&gt;
  }else { //no selection&lt;br /&gt;
    if (!(rr=range.duplicate())) return&lt;br /&gt;
    rr.moveStart('character', - 1500)&lt;br /&gt;
    linkSize = processBeforeCursor(rr.text)&lt;br /&gt;
    if (!linkSize) return&lt;br /&gt;
    range.moveStart('character', - linkSize) //select matched&lt;br /&gt;
  }&lt;br /&gt;
  //replace text&lt;br /&gt;
  if (newText != range.text){&lt;br /&gt;
    range.text = newText&lt;br /&gt;
    if (navigator.userAgent.indexOf('MSIE') != -1) newText = newText.replace(/\r/g,'') //for IE: do not count \r&lt;br /&gt;
    range.moveStart('character', - newText.length)&lt;br /&gt;
    range.select()&lt;br /&gt;
  }&lt;br /&gt;
  document.documentElement.scrollTop = scrollTop //restore window scroll position&lt;br /&gt;
 &lt;br /&gt;
}else if (txtarea.selectionStart || txtarea.selectionStart == '0') { // Mozilla&lt;br /&gt;
  var scrollTop = txtarea.scrollTop, txt = txtarea.value&lt;br /&gt;
  txtarea.focus()&lt;br /&gt;
  var startPos = txtarea.selectionStart, endPos = txtarea.selectionEnd&lt;br /&gt;
  if (startPos != endPos){&lt;br /&gt;
    newText = processSelText(txt.substring(startPos, endPos))&lt;br /&gt;
  }else{ //no selection&lt;br /&gt;
	linkSize = processBeforeCursor(txt.substring((endPos-1500&amp;gt;0?endPos-1500:0), endPos))&lt;br /&gt;
    if (!linkSize) return&lt;br /&gt;
    startPos = endPos - linkSize //select matched&lt;br /&gt;
  }&lt;br /&gt;
  //replace text&lt;br /&gt;
  if (newText != txt.substring(startPos, endPos)){&lt;br /&gt;
    txtarea.value = txt.substring(0, startPos) + newText +	txt.substring(endPos, txtarea.value.length)&lt;br /&gt;
    txtarea.selectionEnd = startPos + newText.length&lt;br /&gt;
    txtarea.selectionStart = startPos&lt;br /&gt;
  }&lt;br /&gt;
  txtarea.scrollTop = scrollTop&lt;br /&gt;
}//end of main function&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
function processBeforeCursor(str){//finds http:.* in string, returns its length and also newText var&lt;br /&gt;
 isBeforeCursor = true&lt;br /&gt;
 var pos = str.lastIndexOf('http://')&lt;br /&gt;
 if (pos == -1) pos = str.lastIndexOf('https://')&lt;br /&gt;
 if (pos == -1) return 0&lt;br /&gt;
 if (pos &amp;gt;= 2)  str = str.substring(pos-2) //move left to include leading [s&lt;br /&gt;
 var ma = str.match(beforeCursor) // result: (whole string)' '[', 'http:...', ' name]'&lt;br /&gt;
 if (!ma) return 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;
 return ma[0].length&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function processSelText(txt){&lt;br /&gt;
 txt = txt.replace(RegExp('(\\[{0,2})' + httpRegExp + '([^\\]\\[\\n\\r]*?\\]\\]?)?', 'ig'),&lt;br /&gt;
  simplifyMatched)&lt;br /&gt;
 if (window.urlDecoderIntLinks){&lt;br /&gt;
  var ut = 'user_talk' //skip user_talk, usually in sig&lt;br /&gt;
  if (window.wgFormattedNamespaces) ut = wgFormattedNamespaces[3].replace(/ /g,'_')&lt;br /&gt;
  ut = RegExp ('\\[\\[' + ut.toLowerCase() + ':[^#]+$', 'i')&lt;br /&gt;
  txt = txt.replace(/\[\[[^\]\|\n]+/g, function(lnk){&lt;br /&gt;
   return ut.test(lnk) ? lnk : decodeAnchor(lnk)&lt;br /&gt;
   })&lt;br /&gt;
 }  &lt;br /&gt;
 return txt&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
function simplifyMatched(str, bracket, url, rest){//arguments: (whole string), '[', url, ' name]'; calls decodeUrl&lt;br /&gt;
 if (!bracket){//no brackets, just url&lt;br /&gt;
   var trail = url.match(RegExp('[,;\\\\\.:!\\?' //trailing punctuation, per Parser.php&lt;br /&gt;
    + (!/\(/.test(url) ? '\\)' : '') + ']+$' ))  //trailing no-matching )&lt;br /&gt;
   if (trail) url = url.substring(0, url.length-trail[0].length) //move these out of url&lt;br /&gt;
   return decodeUrl(url) + str.substring(url.length)&lt;br /&gt;
 }else if (rest) //both brackets and possibly name&lt;br /&gt;
   return decodeUrl(url, rest.replace(/\]+$|^ +| +$/g,'')) //trim ending brackets and spaces in 'name]'&lt;br /&gt;
 else return str //probably broken wikicode in selected text&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function decodeUrl(url, name){ //url -&amp;gt; %-decoded -&amp;gt; [[link|name]] (if possible); name is optional&lt;br /&gt;
 url = unSecure(url)&lt;br /&gt;
 if (url.indexOf('%') != -1) try { url = decodeURI(url) } catch(e){}  //decode %&lt;br /&gt;
 url = url.replace(/%(3B|2F|2C|3A)/g, decodeURIComponent) //decode ;/,:&lt;br /&gt;
 url = url.replace(/[ &amp;lt;&amp;gt;&amp;quot;\[\]]/g, encodeURIComponent) //&amp;quot; disallowed chars&lt;br /&gt;
 if (isBeforeCursor)&lt;br /&gt;
   for (var n in window.urlDecoderEngNames) //to eng keywords&lt;br /&gt;
     url = url.replace(RegExp('(title=|wiki\/)('+urlDecoderEngNames[n]+':)'), '$1' + n + ':')&lt;br /&gt;
 var link&lt;br /&gt;
 if (!/(\}\}|\|)$/.test(url)) link = toWikilink(url) //trailing | or }}  can be a part of template, skip to be safe&lt;br /&gt;
 if (!link &amp;amp;&amp;amp; window.urlDecoderCustom&lt;br /&gt;
     &amp;amp;&amp;amp; (link = urlDecoderCustom(url)) &amp;amp;&amp;amp; /^(https?:\/\/|\{\{)/.test(link))&lt;br /&gt;
	  {url = link; link = null} //still external&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 ((wgNamespaceNumber==0 || wgNamespaceNumber==14)&lt;br /&gt;
      &amp;amp;&amp;amp; isBeforeCursor)  &lt;br /&gt;
	  link=link.replace(/^:/,'') //probably interwiki&lt;br /&gt;
  return '[\[' + link + (name?'|'+name:'') + ']]'&lt;br /&gt;
 }&lt;br /&gt;
 if (isBeforeCursor || typeof name == 'string')&lt;br /&gt;
   url = url.replace(/''/g,'%27%27')//techically '' means the end of URL, but more likely it's part of it&lt;br /&gt;
 if (typeof name == 'string') return '[' + url + (name?' '+name:'') + ']' //empty name&lt;br /&gt;
 else return url&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function toWikilink(url){//url -&amp;gt; wikilink, otherwise null&lt;br /&gt;
 //try bugzilla and user-defined prefixes&lt;br /&gt;
 if (!window.urlDecoderPrefixes) urlDecoderPrefixes = {}&lt;br /&gt;
 urlDecoderPrefixes['https://bugzilla.wikimedia.org/show_bug.cgi?id=']='mediazilla'&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;
 //try WM prefixes&lt;br /&gt;
 var parts = url.substring(7).split('/')&lt;br /&gt;
 if (parts[1]!='wiki' || url.indexOf('?')!=-1) return null&lt;br /&gt;
 var linkPrefix = WMPrefixes(url.toLowerCase()), prefixes = ''&lt;br /&gt;
 if (!linkPrefix) return null&lt;br /&gt;
 var title = url.substring(parts[0].length + parts[1].length + 9) //get part after  /wiki/&lt;br /&gt;
 title = decodeAnchor(title)&lt;br /&gt;
 if (linkPrefix[0] &amp;amp;&amp;amp; (linkPrefix[0] != localPrefix[0])) prefixes = linkPrefix[0]&lt;br /&gt;
 if (linkPrefix[1] &amp;amp;&amp;amp; (linkPrefix[1] != localPrefix[1])) prefixes += ':' + linkPrefix[1]&lt;br /&gt;
 if (prefixes || isColonNeeded(title)) prefixes += ':' //dividing colon or cat/file leading colon&lt;br /&gt;
 return prefixes + title&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
function decodeAnchor(link){//simplify internal link: replace %20 and _ 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) return link //no anchor&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.replace( //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){ hidden[++hidIdx] = s; return '\x01' + hidIdx + '\x02' }&lt;br /&gt;
 )&lt;br /&gt;
 //decode 1-byte chars: all symbols except  -.:_  and []{} prohibited in 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) return ch; else return hhh&lt;br /&gt;
 })&lt;br /&gt;
 //unhide IPs and return&lt;br /&gt;
 for (var i=hidIdx; i&amp;gt;=0; i--) anchor = anchor.replace('\x01'+i+'\x02', hidden[i])&lt;br /&gt;
 if (anchor.indexOf(&amp;quot;''&amp;quot;) != -1) return link //cannot have double '' in link&lt;br /&gt;
 else return parts[0] + '#' + anchor&lt;br /&gt;
 &lt;br /&gt;
 function deChar(ss){ &lt;br /&gt;
  try{ss = decodeURIComponent(ss.replace(/\.([0-9A-F][0-9A-F])/g, '%$1'))} catch(e){}&lt;br /&gt;
  return ss&lt;br /&gt;
 } &lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function WMPrefixes(url){  // htp://en.wikipedia.org/wiki/...  -&amp;gt; [ 'w',  'en']&lt;br /&gt;
 var dd = url.substring(7).split('/')[0].split('.') // -&amp;gt; ['en','wikipedia','org']&lt;br /&gt;
 if (dd.pop() != 'org') return null&lt;br /&gt;
 var proj='', lang = '', part = dd.pop()&lt;br /&gt;
 if (proj = {'mediawiki':'mw','wikimediafoundation':'foundation'}[part]);&lt;br /&gt;
 else if (proj = {'wikipedia':'w','wikibooks':'b','wikinews':'n','wikiquote':'q',&lt;br /&gt;
 'wikisource':'s','wikiversity':'v','wiktionary':'wikt'}[part]){&lt;br /&gt;
   lang = dd.pop()&lt;br /&gt;
   if (!lang || lang=='www') lang = ''&lt;br /&gt;
   else if (lang=='test') {lang=''; proj='testwiki'}&lt;br /&gt;
 }else if (part == 'wikimedia'){&lt;br /&gt;
   part = dd.pop()&lt;br /&gt;
   if (!part || part=='www') proj = 'foundation'&lt;br /&gt;
   else if (/^(meta|commons|incubator|species|strategy)$/.test(part)) proj = part&lt;br /&gt;
   else return null&lt;br /&gt;
 }else return null&lt;br /&gt;
 return [proj, lang]&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function unSecure(url){&lt;br /&gt;
 return url.replace(/https:\/\/secure\.wikimedia\.org\/(\w+)\/(\w+)\/([^\]\|\n\r ]+)/,&lt;br /&gt;
  'http://$2.$1.org/$3')&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function isColonNeeded(pg){&lt;br /&gt;
 if (pg.indexOf(':')==-1) return false&lt;br /&gt;
 else return RegExp('^('+getDecoderNS()+'|file|category) *:','i').test(pg)&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function getDecoderNS(){&lt;br /&gt;
 if (!window.urlDecoderNS) var urlDecoderNS = {}&lt;br /&gt;
 urlDecoderNS.en = 'image'&lt;br /&gt;
 var ns = urlDecoderNS[wgContentLanguage]&lt;br /&gt;
 if (typeof ns == 'string') return ns //user-defined list&lt;br /&gt;
 if (!window.wgNamespaceIds) {&lt;br /&gt;
   alert('Warning: wgNamespaceIds not defined, old MediaWiki version?'); return '' &lt;br /&gt;
 }&lt;br /&gt;
 ns = ''&lt;br /&gt;
 for (var name in wgNamespaceIds)&lt;br /&gt;
   if (wgNamespaceIds[name]==6 || wgNamespaceIds[name]==14)&lt;br /&gt;
     ns += '|' + name&lt;br /&gt;
 ns = ns.substring(1)&lt;br /&gt;
 urlDecoderNS[wgContentLanguage] = ns&lt;br /&gt;
 return ns&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	</feed>