Участник:Ariely/addEditAndRevertLinks.js

Материал из Википедии — свободной энциклопедии
// ============================================================
 // BEGIN addEditAndRevertLinks
 // (первоначально создан [[:de:Benutzer:Berlin-Jurist]] AFAIK)
 // Revert-Fkt hinzugefügt + Beschränkung auf Seiten wo es Sinn macht. [[:de:enutzer:Littl]].
 //
 // verschiedene Fixes von [[:de:Benutzer:PDD]]:
 // - verwirrende Extrabuttons auf den Diff-Seiten (oben in den Tabs) entfernt
 // - ausführlichere Revert-Informationen
 // - bessere Erkennung von zu revertierenden/editierenden Links
 // - optional Benutzer-Link in Revertinfo (über var revlinkshowuser)
 // - Anpassung auf neue MediaWiki-Oberfläche (31.5.2006)
 // - Verhinderung zu langer Editkommentare
 // adapted for Russian Wikipedia by [[ru:User:ariely]] from [[:de:Benutzer:PDD/addEditAndRevertLinks.js]] (24.12.2008)  

 // <nowiki>                 
 
 // Variables that should be defined in your monobook
 if (typeof(editlinkoldversion) == 'undefined')
     var editlinkoldversion = true;                // Bearbeiten-Link für ältere Versionen anzeigen?
 if (typeof(editlinktxt) == 'undefined')
     var editlinktxt = "править";                  // Text des Edit-Links
 if (typeof(revertwithreason) == 'undefined')
     var revertwithreason = true;                  // Revert-Link mit Grund-Eingabe anzeigen?
 if (typeof(revlinktxt) == 'undefined')
     var revlinktxt = "вернуть";                   // Text des Revert-Links
 if (typeof(revlinkshowuser) == 'undefined')
     var revlinkshowuser = true;                   // beim Revertieren über (Rev)-Link letzten Benutzer angeben?
 if (typeof(rvisminor) == 'undefined')
     var rvisminor = true;                         // sind Reverts mit "(rev)"-Link Minor-Changes?
 if (typeof(aearldefault) == 'undefined')
     var aearldefault = "Причина: Вандализм";      // Defaultgrund beim Revertieren
 if (typeof(aerhistory) == 'undefined') 
     var aerhistory = true;                        // Links auch in der Versionsgeschichte?
 if (typeof(aearlhere) == 'undefined') 
     var aearlhere = true;                         // Revertaktion im selben Browserfenster?
 
 var asuserp    = "asuser";     // usertoken
 var astimep    = "astime";     // timestamptoken
 var subjp      = "subj";       // Subject
 var minorp     = "minor";      // (k)leine Änderung

 /*
  * trim()
  * Leerzeichen am Anfang und Ende entfernen
  */
 
 function trim(str) {
   return str.replace(/^\s*|\s*$/g,"");
 }

 /*
  * Stringlänge überprüfen für Zusammenfassungszeile
  */
 
 function EditCommentLength(str) {
   return (199-str.length);
 }

 // token functions
 function generate_asuser () {
   return encodeURIComponent(mw.config.get('wgUserName'));
 }
 
 function validate_asuser (asuser) {
   var retval = false;
   if (encodeURIComponent(asuser) == generate_asuser() )
      retval = true;
 
   return retval;
 }

 function generate_astime () {
   var arbitrary_datestamp = Date.UTC(2008,10,1,0,0,0,0); // 1.11.2008
   var current_date = new Date();
   var current_timestamp = current_date.getTime();
 
   return ( Math.floor((current_timestamp - arbitrary_datestamp) / 1000) );
 }

 function addEditAndRevertLinks() {
 
   var is_history = (UrlParameters['action']=='history');
   var is_diff = (UrlParameters['diff']>'');
 
   var mainNode = document;
 
   if (is_history) {
     for (var i=0; mainNode = document.body.getElementsByTagName("UL")[i]; i++)
        if (mainNode.id == "pagehistory")
            tagNodes (mainNode, is_history, is_diff);
   }
   else if (is_diff) {
     for (var i=0; mainNode = document.body.getElementsByTagName("TD")[i]; i++)
        if ((mainNode.className == "diff-otitle") || (mainNode.className == "diff-ntitle"))
            tagNodes (mainNode, is_history, is_diff);
   }
 }
 // END addEditAndRevertLinks
 // ============================================================
 
 // tagNodes (tagging descendant nodes of mainNode)
 function tagNodes (mainNode, is_history, is_diff) {
 
   var Edit = "(" + editlinktxt + ")";
   var Rv   = "(" + revlinktxt + ")";
 
   var first= true;
   for (var i=0; aNode = mainNode.getElementsByTagName("A")[i]; i++)
   {
     // if it's a link to an old version but not a diff-link and not already an edit link
     if ( (href = aNode.getAttribute("href")) && (href.search(/oldid=/) != -1) 
          && (href.search(/diff=/) == -1) && (href.search(/action=edit/) == -1) )
     {
       // Create Edit link (only on history; new MW has edit links on diffpage so we can skip this)
       if (editlinkoldversion  && is_history) {
         var EditNode = document.createElement('a');
         EditNode.setAttribute('href', href + '&action=edit#summary'); 
         var EditTextNode = document.createTextNode(Edit);
         EditNode.appendChild(EditTextNode);
         // Add Edit Link To Old Version Link
         aNode.parentNode.insertBefore( EditNode, aNode.nextSibling );
         // Insert whitespace before Edit Link
         aNode.parentNode.insertBefore( document.createTextNode(' '), aNode.nextSibling );
         // jump over inserted (edit) anchor
         i++;
       }
 
       // Create RV Link
       if (revertwithreason && (is_diff || (is_history && !first))) {  
        var rvtimestamp = aNode.innerHTML.replace(/.*vom /,'');
        var rvtsdate = rvtimestamp.replace(/.*, /,'');
        var rvtstime = rvtimestamp.replace(/, .*/,'');
        // для формата дат по ISO 8601 пока нет обработки
        if (rvtsdate == rvtstime) rvtstime = '';
 
        // Имена участников вообще надо было исключить из href (чтобы правильно адаптировать UTF8),
        // но тогда для IP-адресов понадобится отдельная обработка...
        var rvuser;
        if (is_history)
           rvuser = mainNode.getElementsByTagName("A")[i+1].innerHTML;
        else  {
           // is_diff
           // левая сторона?
           if (mainNode.getElementsByTagName("A")[i+3].innerHTML == "обсуждение")
              rvuser = mainNode.getElementsByTagName("A")[i+2].innerHTML;
           // правая сторона
           else
              rvuser = mainNode.getElementsByTagName("A")[i+3].innerHTML;
        }
        // маленькое исправление для ников с '&'
        rvuser = rvuser.split('&amp;').join('&');
 
        var defaultgrund = 'Возвращено к версии от ' + rvtsdate + 
                           ((rvtstime == '')? '' : (' (' + rvtstime + ')'));
        if (revlinkshowuser)
            defaultgrund = 'Возвращено к версии [[Участник:' + rvuser + '|' + rvuser + ']] (' + rvtsdate +
            ((rvtstime == '')? '' : (', ' + rvtstime)) + ')';
 
        var Rvnode = document.createElement('a');
        Rvnode.setAttribute('href', 'javascript:revertme("' + encodeURI(href) + '", "' + defaultgrund + '")');     
        var RvTextNode = document.createTextNode(Rv);
        Rvnode.appendChild(RvTextNode);
        aNode.parentNode.insertBefore( Rvnode, aNode.nextSibling );
        aNode.parentNode.insertBefore( document.createTextNode(' '), aNode.nextSibling );
        // jump over inserted (rev) anchor
        i++;
       } // END if2
       first=false;
     } // END if1
   } // END for
 }
 // END tagNodes
 // ============================================================
 
 // revertme by Littl, extended by PDD
 function revertme (href, defaultgrund) {
   var detailgrund = prompt(defaultgrund, aearldefault);
   if (detailgrund == null) return;
 
  detailgrund = trim(detailgrund);
   switch (detailgrund) {
      case "не каталог":  detailgrund='Причина: Википедия не каталог ссылок (см. [[ВП:ВС]]).';
                   break;
      case "спам":  detailgrund='Причина: ссылка несёт рекламный харрактер (см. [[ВП:ВС]]).';
                   break;
      case "обсудить":  detailgrund='См. страницу обсуждения статьи.';
                   break;
      case "консенсус": detailgrund='Пожалуйста, достигните прежде консенсуса на странице обсуждения статьи.';
                   break;
      case "вандал":   detailgrund='Причина:Вандализм.';
                   break;
      case "варвар":   detailgrund='Причина:Варварство.';
                   break;
      case "ошибка":   detailgrund='Причина: исправление ошибки';
                   break;
      case "аноним":  detailgrund='Удалена анонимная реплика.';
                   break;
      case "упс":  detailgrund='Причина: ошибочный ввод.';
                   break;
      case "вики": detailgrund='Не стоит злоупотреблять викификацией.';
                   break;
      case "коммент": detailgrund='Комментарии следует размещать на странице обсуждения статьи.';
                   break;
      case "факт":   detailgrund='Существенные изменения в статье следует [[ВП:Ссылки на источники|обосновать]].';
                   break;
      case "незнач":   detailgrund='Важность внесённой информации сомнительна.';
                   break;
      case "НТЗ":  detailgrund='Правки нарушают принцип [[ВП:НТЗ|нейтральной точки зрения]].';
                   break;
      case "удал":  detailgrund='Необоснованное удаление существенных фактов.';
                   break;
      case "ЧНЯВ": detailgrund='Данная правка не [[ВП:ЧНЯВ|способствует развитию энциклопедии]].';
                   break;
      case "стиль":  detailgrund='Неэнциклопедический стиль.';
                   break;
      case "чужая":  detailgrund='Не следует изменять чужие реплики.';
                   break;
   }
 
 // обеспечить, чтобы описание изменений поместилось в строке комментария
   if (EditCommentLength(defaultgrund+detailgrund+2) < 0) {
      // слишком длинный комментарий, прежде всего сокращаем defaultgrund
      defaultgrund = 'Возвращено';
      var commenttoolong = true;
      while ((commenttoolong == true) && (detailgrund != null)) {
        if ((superflu=EditCommentLength(defaultgrund+detailgrund+2)) < 0)
            detailgrund = prompt("Описание изменений слишком длинное.\n Сократите его, пожалуйста, на "+(0-superflu)+" знаков", detailgrund);
        else
            commenttoolong = false;
      }
   }

   if (detailgrund == null) return;
   if (detailgrund=='') grund = trim(defaultgrund);
   else grund = defaultgrund + ((defaultgrund == 'Возвращено')? ': ' : '. ') + detailgrund;
 
   href = href + "&action=edit&" + asuserp + "=" + generate_asuser() + "&" + astimep + "=" + generate_astime() + "&" + subjp + "=" + encodeURIComponent(grund);
   if (rvisminor) href = href + "&" + minorp + "=1";
   if (aearlhere)
      window.open (href,'_self','',true);
   else
      window.open (href,'_blank');
   window.focus(); 
 }
 // END revertme
 // ============================================================
 
 addOnloadHook(addEditAndRevertLinks);
 
 // </nowiki>