Участник:X-romix/urldecoder.js

//Преобразует ссылки в читаемый формат.
//Скомпилированный вариант из:
//Участник:Alex Smotrov/urldecoder.js (преобразование ссылки)
//Участник:X-romix/refconv.js (процедура выделения ссылки)

if (typeof urlDecoderEngNames == 'boolean') 
urlDecoderEngNames = {
'User' : 'Участник',
'User_talk' : 'Обсуждение_участника',
'Special' : 'Служебная',
'Template': 'Шаблон',
'Template_talk': 'Обсуждение_шаблона',
'MediaWiki_talk': 'Обсуждение_MediaWiki'
} 

var urlDecoderTooltip = 'Раскодировать все URL в выделенном тексте или один URL перед курсором или '


if (mw.config.get('wgAction')=='edit' || mw.config.get('wgAction')=='submit') addOnloadHook(urlDecoderAddButton)


function urlDecoderAddButton() {
 addToolbarButton('%%', urlDecoderRun, 'btndecodeURL', 
    window.urlDecoderTooltip || 'Decode all URLS in selected text or one URL just before cursor or ')
 function addToolbarButton(name, onclick, id, tooltip, accesskey){
	var toolbar = document.getElementById('toolbar')
	if (!toolbar) return
	var newBtn = document.createElement('input')
	newBtn.type = 'button'; newBtn.style.cssText = 'background:#adbede; height:22px; vertical-align:middle; padding:0'
	if (name) newBtn.value = name
	if (onclick) newBtn.onclick = onclick
	if (id) newBtn.id = id
	if (tooltip) newBtn.title = tooltip
	if (accesskey) newBtn.accessKey = accesskey
	toolbar.appendChild(newBtn)
	return newBtn
 }
}




function urlDecoderRun(){ //main function

var projPrefix = {
'test.wikipedia.org': 'testwiki',
'wikipedia.org':  'w',
'wikibooks.org':  'b',
'wikinews.org':   'n',
'wikiquote.org':  'q',
'wikisource.org': 's',
'wikiversity.org':'v', 
'wiktionary.org': 'wikt',
'mediawiki.org':'mw', 
'www.wikimedia.org': 'foundation',
'wikimedia.org': '*',
'wikimediafoundation.org': 'foundation'
} 
var httpBeforeCursor = /(\[{0,2})(https?:\/\/[^\]\n\r <>]+)$/i
var localPrefix = getPrefixes(mw.config.get('wgServer').substring(7))

 //Проверяем, поддерживает ли браузер регулярные выражения (RegExp)	
 if (('code'.replace(/d/g, 'r') != 'core') 
    || (navigator.appName=='Netscape' && navigator.appVersion.substr (0, 1) < 5))
  { alert("Скрипт не может работать в вашем браузере.\n Script cannot work in your browser"); return }
 
 var txt, hidden = [], hidIdx = 0, wpTextbox1 = document.editform.wpTextbox1
 
 wpTextbox1.focus();
 
 var winScroll=getScrollTop(wpTextbox1)//remember window scroll
 var startPos = getSelectionStart(wpTextbox1) 
 var endPos = startPos+getSelectionLength(wpTextbox1)
 
 if (startPos==-2)
 // Для браузеров, которые не умеют возвращать выделенный фрагмент, выдаем ошибку
   { alert("Скрипт не может работать в вашем браузере.\n Script cannot work in your browser"); return }
 
	if (startPos==endPos){
	  while (1==1){
		if (startPos==0) break;
		var str= wpTextbox1.value.substring(startPos, startPos+7);
		if (str.search(/https?\:\/\//i)!=-1) break;
		startPos--;
	  }
	  
	  //теперь startPos указывает на начало адреса http, либо ушло в 0.
	  var str= wpTextbox1.value.substr(startPos);
	  if (str.search(/https?\:\/\//i)==-1){
	    alert('В текущей позиции курсора не найден интернет-адрес http:// ');
		return;
	  }
	  
	  //ищем конец ссылки
	  
	  endPos=str.search(/[\s\]\t\n\<\>]/);
	  if (endPos==-1) {endPos=str.length;}
	  endPos=endPos+startPos;
 
	}
 
    txt = wpTextbox1.value.substring(startPos, endPos)
    if (txt == '') return;
	
	txt=decodeLinks(txt);
 
    wpTextbox1.value = wpTextbox1.value.substring(0, startPos) + txt + wpTextbox1.value.substring(endPos)
    
 
	setSelectionRange(wpTextbox1, startPos, startPos + txt.length)
 
	setScrollTop(wpTextbox1, winScroll)//scroll back


/*

if (wgServer == 'https://secure.wikimedia.org')
  localPrefix = getPrefixes(wgScript.split('/')[2]+'.'+wgScript.split('/')[1]+'.org')
var selText, newText, matched, txtarea = document.editform.wpTextbox1

if (document.selection) { //IE/Opera
  var scrollTop = document.documentElement.scrollTop
  txtarea.focus()
  range = document.selection.createRange()
  if (!range.moveStart) return //some older browser?
  selText = range.text
  if (selText){
     newText = decodeLinks(selText)
  }else { //no selection, check if we're at the end of URL
 
    if (!range.duplicate) return
    rr = range.duplicate()
    rr.moveStart('character', - 300)
    matched = rr.text.match(httpBeforeCursor)
    if (!matched) return
    range.moveStart('character', - matched[0].length) //select matched
    selText = range.text
    newText = decodeLinkBeforeCursor(matched[1], matched[2])
	
	
	
  }
  //replace text if changed
  if (newText != selText){
    range.text = newText
    if (navigator.userAgent.indexOf('MSIE') != -1) newText = newText.replace(/\r/g,'') //for IE: do not count \r
    range.moveStart('character', - newText.length)
    range.select()
  }
  document.documentElement.scrollTop = scrollTop //restore window scroll position

}else if (txtarea.selectionStart || txtarea.selectionStart == '0') { // Mozilla
  var scrollTop = txtarea.scrollTop, txt = txtarea.value
  txtarea.focus()
  var startPos = txtarea.selectionStart, endPos = txtarea.selectionEnd
  if (startPos != endPos){
    selText = txt.substring(startPos, endPos)
    newText = decodeLinks(selText)
  }else{ //no selection, check if we're at the end of URL
    matched = txt.substring((endPos-300>0?endPos-300:0), endPos).match(httpBeforeCursor)
    if (!matched) return
    startPos = endPos - matched[0].length //select matched
    selText = matched[0]
    newText = decodeLinkBeforeCursor(matched[1], matched[2])
  }
  //replace text if changed
  if (newText != selText){
    txtarea.value = txt.substring(0, startPos) + newText +	txt.substring(endPos, txtarea.value.length)
    txtarea.selectionEnd = startPos + newText.length
    txtarea.selectionStart = startPos
  }
  txtarea.scrollTop = scrollTop
  
 */ 




// *** Internal functions ***

//decode many links in selected text
function decodeLinks(txt){

 txt = txt.replace(/\[?\[(https?:\/\/[^\[\]]+)\]\]?/g, bracketedLink)
 txt = txt.replace(/(^|[^\[])(https?:\/\/[^\n\r ]+)/g, simpleLink) //unnamed link
 return txt

 function bracketedLink(str, url){
  var name = '', i = url.indexOf(' ')
  if (i != -1) { name = url.substring(i+1); url = url.substring(0,i) }
  str = decodeLink(url, name)
  if (str.charAt(0) != '[' ) str = '['+str+']' //not a wiki link, restore (single)  brackets
  return str
 }

 function simpleLink(str, charBefore, url){
   return charBefore + decodeNonameLink(url)
 }

}

//decode (leading bracket(s)) and one url
function decodeLinkBeforeCursor(brackets, url){ 
 var link = decodeNonameLink(url)
 if (link.charAt(0) != '[' && brackets) link = '[' + link //was not converted to wiki link: add just one bracket
 return link
}


//decode one link without name, make sure it does not end with dot
function decodeNonameLink(txt){
 var dot = ''
 if (txt.charAt(txt.length-1) == '.') { dot = '.'; txt = txt.substring(0, txt.length-1) }
 txt = decodeLink(txt)
 return txt + dot
}


function decodeLink(url, name){
 var parts
 //secure Wikimedia link into non-secure
 url = url.replace(/https:\/\/secure.wikimedia.org\/(\w+)\/(\w+)\/([^\]\|\n\r ]+)/,  'http://$2.$1.org/$3')
 //bugzilla
 if (parts = url.match(/^https:\/\/bugzilla\.wikimedia.org\/show_bug\.cgi\?id=(\d+)/))
    return '[\[mediazilla:'+parts[1]+']]'
 //decode %
 if (url.indexOf('%') != -1) try { url = decodeURI(url) } catch(e){}
 if (url.indexOf('%') != -1) url = url.replace(/%3A/g,':').replace(/%2F/g,'/').replace(/%2C/g,',')
 url = url.replace(/ /g,'_')
 //convert to eng keywords
 for (var n in window.urlDecoderEngNames)
    url = url.replace(RegExp('(title=|wiki\/)('+urlDecoderEngNames[n]+':)'), '$1' + n + ':')
 //analyze
 parts = url.substring(7).split('/')
 var domain = parts[0]
 var linkPrefix = getPrefixes(domain)
 //return unchanged if cannot convert  into wiki link 
 if (!linkPrefix || parts[1] != 'wiki' || url.indexOf('?')!=-1) 
    return name ?  '[' + url + ' ' + name + ']' : url
 //convert to wiki link
 var prefixes = ''
 var title = url.substring(parts[0].length + parts[1].length + 9) //get part after  /wiki/
 title = title.replace(/_/g, ' ')
 //prefixes
 if (linkPrefix[0] && (linkPrefix[0] != localPrefix[0])) prefixes += linkPrefix[0]
 if (linkPrefix[1] && (linkPrefix[1] != localPrefix[1])) prefixes += ':'+linkPrefix[1]
 //add extra : if needed  
 if (prefixes) prefixes += ':'
 else if (/^image:|\.(jpg|png|svg|gif)$|^category:|^категория:/i.test(title)) prefixes = ':'
 //decode anchor
 parts = title.split('#')
 if (parts.length == 2) try { 
   title = parts[0] + '#' + decodeURIComponent(parts[1].replace(/(\.)([0-9A-F][0-9A-F])/g, '%$2'))
 }catch(e){}
 //return
 return  '[\[' + prefixes + title + ( name ? '|'+name : '') + ']]'
}


function getPrefixes(domain){  //en.wikipedia.org -> [ 'w',  'en'] , using projPrefix{}
 domain = domain.toLowerCase() 
 var proj, isFound
 for (proj in projPrefix)  if (domain.indexOf(proj) != -1) {isFound=true; break}
 if (!isFound) return null 
 var prefix = projPrefix[proj], lang = ''
 if (prefix == '*') prefix = domain.split('.')[0] // .wikimedia.org project
 else if ((domain=domain.replace(proj, '')) && (domain != 'www.')) lang = domain.split('.')[0] //multi-lang project
 //else if (prefix.charAt(0) == ':'){ //multi-lang project   if (pp.length == 3) lang = pp[0]
 return [prefix, lang]
}

//подсчитывает концы строк в фрагменте текста
function countCrlf(str){
  var cnt=0;
  for(var i=0; i<str.length; i++){
    var c=str.charCodeAt(i);
	if (c==13){
	  cnt++;
	}
  }
  return cnt;
}

//Браузеро-независимый setSelectionRange - изменяет начало и конец
//выделенного фрагмента в поле ввода input
function setSelectionRange(input, start, end) {
  if (typeof wpTextbox1.selectionStart != 'undefined' 
    && (navigator.productSub > 20031000 || is_safari)) { 
	//Mozilla/Opera/Safari3
	input.setSelectionRange(start, end);
  }else if (document.selection && document.selection.createRange) { 
 	 //Internet Explorer
		var range = input.createTextRange();
		range.collapse(true);
		range.moveStart("character", start - countCrlf(input.value.substring(0, start)));
		range.moveEnd("character", end - start - countCrlf(input.value.substring(start, end)));
		range.select();
  }	 
};

//Браузеро-независимое получение длины
//выделенного фрагмента в поле ввода input
function getSelectionLength(input) {
  if (typeof wpTextbox1.selectionStart != 'undefined' 
    && (navigator.productSub > 20031000 || is_safari)) { 
	//Mozilla/Opera/Safari3
	return input.selectionEnd-input.selectionStart;
  }else if (document.selection && document.selection.createRange) { 
 	 //Internet Explorer
	 input.focus()
	 var range = document.selection.createRange()
	 return range.text.length
  }	else 
     return -2;
};

//Браузеро-независимый getSelectionStart - возвращает позицию начала 
//выделенного фрагмента в поле ввода input, или позицию курсора в поле ввода
function getSelectionStart(input) {
  if (typeof wpTextbox1.selectionStart != 'undefined' 
    && (navigator.productSub > 20031000 || is_safari)) { 
	//Mozilla/Opera/Safari3
	return input.selectionStart;
  }else if (document.selection && document.selection.createRange) { 
 	 //Internet Explorer
	 input.focus()
	 //return Math.abs(document.selection.createRange().moveStart("character", -1000000));

	 
	var temp = input.value; 
	input.focus()
	var range = document.selection.createRange()
	var length = range.text.length 
    var txt = range.text
    range.text="{50E9CD6A-BC3E-4B44-9107-FFF6A65DC28E}" //фтыкаем гуид чтобы найти положение курсора в IE
	 //Статья http://www.bazon.net/mishoo/articles.epl?art_id=1292 
	 //рекомендует фтыкать тильду, но гуид лучше, потому что он гарантированно не встретится в тексте
	 var vv=input.value;
	 var startPos = vv.search("{50E9CD6A-BC3E-4B44-9107-FFF6A65DC28E}") //ищем этот гуид
	 input.value=temp //восстанавливаем текст, который был в поле ввода
	 setSelectionRange(input, startPos, startPos+length) //восстанавливаем выделение
	 return startPos
	 
  }	else 
     return -2;
};


//Браузеро-независимый getScrollTop - возвращает позицию прокрутки
//в поле ввода input
function getScrollTop(input) {
  if (typeof wpTextbox1.selectionStart != 'undefined' 
    && (navigator.productSub > 20031000 || is_safari)) { 
	//Mozilla/Opera/Safari3
	return input.scrollTop
  }else if (document.selection && document.selection.createRange) { 
 	 //Internet Explorer
	input.focus()
	return document.documentElement.scrollTop
  }	else 
     return -2;
};

//Браузеро-независимый setScrollTop - устанавливает позицию прокрутки
//в поле ввода input
function setScrollTop(input, top) {
  if (typeof wpTextbox1.selectionStart != 'undefined' 
    && (navigator.productSub > 20031000 || is_safari)) { 
	//Mozilla/Opera/Safari3
	input.scrollTop=top
  }else if (document.selection && document.selection.createRange) { 
 	 //Internet Explorer
	input.focus()
	document.documentElement.scrollTop=top
  }
};


}
Prefix: a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9

Portal di Ensiklopedia Dunia

Kembali kehalaman sebelumnya