<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://ejwiki.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-wikilinker.js</id>
	<title>MediaWiki:Gadget-wikilinker.js - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://ejwiki.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-wikilinker.js"/>
	<link rel="alternate" type="text/html" href="https://ejwiki.org/index.php?title=MediaWiki:Gadget-wikilinker.js&amp;action=history"/>
	<updated>2026-05-13T19:50:03Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.42.3</generator>
	<entry>
		<id>https://ejwiki.org/index.php?title=MediaWiki:Gadget-wikilinker.js&amp;diff=108686&amp;oldid=prev</id>
		<title>Ariely: Новая страница: «// Russian Wiki Linker // Find link for selected text  if (/edit|submit/.test(wgAction)){   mwCustomEditButtons[&#039;wikilinker&#039;] = [WikiLinker, &#039;commons/b/bd/Wikilinker…»</title>
		<link rel="alternate" type="text/html" href="https://ejwiki.org/index.php?title=MediaWiki:Gadget-wikilinker.js&amp;diff=108686&amp;oldid=prev"/>
		<updated>2011-03-22T21:15:10Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «// Russian Wiki Linker // Find link for selected text  if (/edit|submit/.test(wgAction)){   mwCustomEditButtons[&amp;#039;wikilinker&amp;#039;] = [WikiLinker, &amp;#039;commons/b/bd/Wikilinker…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;// Russian Wiki Linker&lt;br /&gt;
// Find link for selected text&lt;br /&gt;
&lt;br /&gt;
if (/edit|submit/.test(wgAction)){&lt;br /&gt;
  mwCustomEditButtons[&amp;#039;wikilinker&amp;#039;] = [WikiLinker, &amp;#039;commons/b/bd/Wikilinker.png&amp;#039;, &amp;#039;Вики-ссыльщик. Подбирает вики-ссылку для выделенного слова или словосочетания&amp;#039;]&lt;br /&gt;
  importScript(&amp;#039;MediaWiki:Stemmer.js&amp;#039;)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function stemPhrase(phrase) {&lt;br /&gt;
   phrase=phrase.substr(0,100);&lt;br /&gt;
&lt;br /&gt;
   phrase=phrase.replace(/\s/g, &amp;quot; &amp;quot;);&lt;br /&gt;
   phrase=phrase.replace(/—/g, &amp;quot; &amp;quot;);&lt;br /&gt;
   phrase=phrase.replace(/»/g, &amp;quot;&amp;quot;);&lt;br /&gt;
   phrase=phrase.replace(/«/g, &amp;quot;&amp;quot;);&lt;br /&gt;
   phrase=phrase.replace(/\%/g, &amp;quot;&amp;quot;);&lt;br /&gt;
   phrase=phrase.replace(/\&amp;#039;/g, &amp;quot;&amp;quot;);&lt;br /&gt;
   phrase=phrase.replace(/\&amp;quot;/g, &amp;quot;&amp;quot;);&lt;br /&gt;
   phrase=phrase.replace(/_/g, &amp;quot; &amp;quot;);&lt;br /&gt;
   phrase=phrase.replace(/\!/g, &amp;quot; &amp;quot;);&lt;br /&gt;
   phrase=phrase.replace(/\?/g, &amp;quot; &amp;quot;);&lt;br /&gt;
   phrase=phrase.replace(/\./g, &amp;quot; &amp;quot;);&lt;br /&gt;
   phrase=phrase.replace(/\,/g, &amp;quot; &amp;quot;);&lt;br /&gt;
   phrase=phrase.replace(/\:/g, &amp;quot; &amp;quot;);&lt;br /&gt;
   phrase=phrase.replace(/\s+/g, &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
   var rustemmer = new RussianStemmer();&lt;br /&gt;
&lt;br /&gt;
   var arr = phrase.split(&amp;#039; &amp;#039;)&lt;br /&gt;
   var res = &amp;#039;&amp;#039;;&lt;br /&gt;
   var next_res = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
   var n = 0;&lt;br /&gt;
&lt;br /&gt;
   for (var i in arr) {&lt;br /&gt;
      rustemmer.setCurrent(arr[i]);&lt;br /&gt;
      rustemmer.stem();&lt;br /&gt;
      next_res = rustemmer.getCurrent();&lt;br /&gt;
      if (next_res.length &amp;gt; 0) {&lt;br /&gt;
        if (next_res != arr[i] &amp;amp;&amp;amp; n &amp;lt; 3) {&lt;br /&gt;
           res += next_res + &amp;#039;* &amp;#039;;&lt;br /&gt;
           n++; // в строке запроса может быть не более 3 звёздочек&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
           res += next_res + &amp;#039; &amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   // trim string&lt;br /&gt;
   res = res.replace(/(^\s+)|(\s+$)/g, &amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
   return res;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function WikiLinker() {&lt;br /&gt;
&lt;br /&gt;
    var xmlhttp;&lt;br /&gt;
    var prepWin;&lt;br /&gt;
&lt;br /&gt;
    var CantWork = &amp;#039;Сначало нужно выделить слово или словосочетание&amp;#039;;&lt;br /&gt;
    var range;&lt;br /&gt;
    var browserType = 0;&lt;br /&gt;
&lt;br /&gt;
    var requestLength = 0; // длина запроса в словах&lt;br /&gt;
&lt;br /&gt;
    var txt = &amp;#039;&amp;#039;;&lt;br /&gt;
    var wpTextbox1 = document.editform.wpTextbox1;&lt;br /&gt;
&lt;br /&gt;
    var winScroll = document.documentElement.scrollTop;&lt;br /&gt;
&lt;br /&gt;
    wpTextbox1.focus();&lt;br /&gt;
&lt;br /&gt;
    if (typeof wpTextbox1.selectionStart != &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; (navigator.productSub &amp;gt; 20031000 || is_safari || is_opera)) { //Mozilla/Opera/Safari3&lt;br /&gt;
        browserType = 1;&lt;br /&gt;
&lt;br /&gt;
        var textScroll = wpTextbox1.scrollTop;&lt;br /&gt;
        var startPos = wpTextbox1.selectionStart;&lt;br /&gt;
        var endPos = wpTextbox1.selectionEnd;&lt;br /&gt;
        txt = wpTextbox1.value.substring(startPos, endPos);&lt;br /&gt;
&lt;br /&gt;
        // отсекаем последний пробел&lt;br /&gt;
        if (txt.slice(-1) == &amp;#039; &amp;#039;) {&lt;br /&gt;
           txt = txt.slice(0,-1);&lt;br /&gt;
           endPos = endPos - 1;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (txt == &amp;#039;&amp;#039;) {&lt;br /&gt;
            alert(CantWork);&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            processText();&lt;br /&gt;
        }&lt;br /&gt;
        wpTextbox1.selectionStart = startPos;&lt;br /&gt;
        wpTextbox1.selectionEnd = startPos + txt.length;&lt;br /&gt;
        wpTextbox1.scrollTop = textScroll;&lt;br /&gt;
    } else if (document.selection &amp;amp;&amp;amp; document.selection.createRange) { //IE&lt;br /&gt;
        browserType = 2;&lt;br /&gt;
&lt;br /&gt;
        range = document.selection.createRange();&lt;br /&gt;
        txt = range.text;&lt;br /&gt;
&lt;br /&gt;
        // отсекаем последний пробел&lt;br /&gt;
        if (txt.slice(-1) == &amp;#039; &amp;#039;) {&lt;br /&gt;
           txt = txt.slice(0,-1);&lt;br /&gt;
           range.moveEnd(&amp;#039;character&amp;#039;, -1);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (txt == &amp;#039;&amp;#039;) {&lt;br /&gt;
            alert(CantWork);&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            processText();&lt;br /&gt;
        }&lt;br /&gt;
    } else { // other browsers&lt;br /&gt;
        alert(CantWork);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    document.documentElement.scrollTop = winScroll // scroll back, for IE/Opera&lt;br /&gt;
&lt;br /&gt;
    function processText() {&lt;br /&gt;
        var preparedText = stemPhrase(txt);&lt;br /&gt;
&lt;br /&gt;
        requestLength = preparedText.split(&amp;#039; &amp;#039;).length;&lt;br /&gt;
&lt;br /&gt;
        loadXMLDoc(wgServer + wgScriptPath + &amp;#039;/api.php?action=query&amp;amp;list=search&amp;amp;srlimit=5&amp;amp;srprop=&amp;amp;srredirects=1&amp;amp;format=json&amp;amp;srsearch=&amp;#039; + preparedText);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function loadXMLDoc(url) {&lt;br /&gt;
        xmlhttp = GetXmlHttpObject();&lt;br /&gt;
        if (xmlhttp == null) {&lt;br /&gt;
            alert(&amp;quot;Your browser does not support XMLHTTP!&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        xmlhttp.onreadystatechange = stateChanged;&lt;br /&gt;
        xmlhttp.open(&amp;quot;GET&amp;quot;, url, true);&lt;br /&gt;
        xmlhttp.send(null);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function GetXmlHttpObject() {&lt;br /&gt;
        if (window.XMLHttpRequest) {&lt;br /&gt;
            // code for IE7+, Firefox, Chrome, Opera, Safari&lt;br /&gt;
            return new XMLHttpRequest();&lt;br /&gt;
        }&lt;br /&gt;
        if (window.ActiveXObject) {&lt;br /&gt;
            // code for IE6, IE5&lt;br /&gt;
            return new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        return null;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // сравнение по длине строки, без учёта уточнения в скобках&lt;br /&gt;
    // чтобы для &amp;quot;Категори*&amp;quot; выдавалось &amp;quot;Категория (значения)&amp;quot;, а не &amp;quot;Классификация&amp;quot;&lt;br /&gt;
    function compareStringLengths (a, b) {&lt;br /&gt;
      a = a.replace(/ \(.*\)/g, &amp;quot;&amp;quot;);&lt;br /&gt;
      b = b.replace(/ \(.*\)/g, &amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
      if ( a.length &amp;lt; b.length ) return -1;&lt;br /&gt;
      if ( a.length &amp;gt; b.length ) return 1;&lt;br /&gt;
      return 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function initialLower(str) {&lt;br /&gt;
       return str.substr(0, 1).toLowerCase() + str.substr(1);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function stateChanged() {&lt;br /&gt;
        if (xmlhttp.readyState == 4) {&lt;br /&gt;
            if (xmlhttp.status == 200) {&lt;br /&gt;
                var resp = eval(&amp;#039;(&amp;#039; + xmlhttp.responseText + &amp;#039;)&amp;#039;);&lt;br /&gt;
                &lt;br /&gt;
                if (typeof resp.query.search[0] != &amp;#039;undefined&amp;#039;) {&lt;br /&gt;
&lt;br /&gt;
                   var page_name = resp.query.search[0].title;&lt;br /&gt;
&lt;br /&gt;
                   // если в запросе было только одно слово, то выбираем самое короткое название из первых трёх результатов&lt;br /&gt;
                   // чтобы для &amp;quot;Аглией&amp;quot; выдавалось &amp;quot;Англия&amp;quot;, а не &amp;quot;Англиканство&amp;quot;&lt;br /&gt;
&lt;br /&gt;
                   if (requestLength == 1) {&lt;br /&gt;
                      var resar = [];&lt;br /&gt;
                   &lt;br /&gt;
                      for (var j=0;j&amp;lt;=4;j++) {&lt;br /&gt;
                         if (typeof resp.query.search[j] != &amp;#039;undefined&amp;#039; &amp;amp;&amp;amp; txt.substr(0,3).toLowerCase() == resp.query.search[j].title.substr(0,3).toLowerCase() ) {&lt;br /&gt;
                            resar.push(resp.query.search[j].title);&lt;br /&gt;
                         }&lt;br /&gt;
                      }&lt;br /&gt;
                   &lt;br /&gt;
                      resar.sort(compareStringLengths);&lt;br /&gt;
                   &lt;br /&gt;
                      if (typeof resar[0] != &amp;#039;undefined&amp;#039;) {&lt;br /&gt;
                         page_name = resar[0]&lt;br /&gt;
                      }&lt;br /&gt;
                   }&lt;br /&gt;
&lt;br /&gt;
                   // для &amp;quot;форумы&amp;quot; будет &amp;quot;[[форум]]ы&amp;quot;, а не &amp;quot;[[форум|форумы]]&amp;quot;&lt;br /&gt;
                   if ( initialLower(txt.substr(0, page_name.length)) == initialLower(page_name)  &amp;amp;&amp;amp;  page_name.length &amp;lt;= txt.length) {&lt;br /&gt;
                      txt = &amp;#039;[[&amp;#039; + txt.substr(0, page_name.length) + &amp;#039;]]&amp;#039; + txt.substr(page_name.length, txt.length - page_name.length) ;&lt;br /&gt;
                   }&lt;br /&gt;
                   else {&lt;br /&gt;
                      txt = &amp;#039;[[&amp;#039; + page_name + &amp;#039;|&amp;#039; + txt + &amp;#039;]]&amp;#039;; &lt;br /&gt;
                   }&lt;br /&gt;
                }&lt;br /&gt;
                else {&lt;br /&gt;
                   txt = &amp;#039;[[&amp;#039; + &amp;#039;|&amp;#039; + txt + &amp;#039;]]&amp;#039;;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
               if (browserType == 1) { //Mozilla/Opera/Safari3&lt;br /&gt;
                   wpTextbox1.value = wpTextbox1.value.substring(0, startPos) + txt + wpTextbox1.value.substring(endPos);&lt;br /&gt;
&lt;br /&gt;
                   wpTextbox1.selectionStart = startPos;&lt;br /&gt;
                   wpTextbox1.selectionEnd = startPos + txt.length;&lt;br /&gt;
                   wpTextbox1.scrollTop = textScroll;&lt;br /&gt;
               } else if (browserType == 2) { //IE&lt;br /&gt;
                    range.text = txt;&lt;br /&gt;
&lt;br /&gt;
               } else { // other browsers&lt;br /&gt;
                   alert(CantWork);&lt;br /&gt;
               }&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Ariely</name></author>
	</entry>
</feed>