MediaWiki:Gadget-RC-Filter.js

Aus Wiktionary, dem freien Wörterbuch
//<nowiki>
 
// begin namespace: RCFilter
(function( _public, $, undefined ) {
 
var users = {};
var names = {};
var conf = {};
var gruppiert = false;

_public.init = function ()
{

 _public.load();

 if (conf.kurz) {
  if (mw.config.get("wgCanonicalNamespace") == "Special" &&
      mw.config.get("wgCanonicalSpecialPageName") == "Contributions") {
   _public.shorten1("ul.mw-contributions-list a");
  }

  if (mw.config.get("wgAction") == "history") {
   _public.shorten2();
  }
 }

 var pn = mw.config.get("wgPageName");
 if (pn == "Spezial:Letzte_Änderungen") {

  $(".rcoptions").each(function(index, element) {
   var buttons = ' Filter: <a title="Einstellungen" href="' + buildUrl2("Hilfe:RC-Filter","") + '">&#x2261;</a>';
   buttons += ' | <a title="Feste Breite" href="javascript:RCFilter.breite(16)">F</a>';
   buttons += ' | <a title="Nach Namensräumen gruppieren" href="javascript:RCFilter.gruppieren()">G</a>';
   buttons += ' | <a title="Kurze Links" href="javascript:RCFilter.shorten()">K</a>';
   buttons += ' | <a title="blende Markierungen aus/ein" href="javascript:RCFilter.fadeMarkierung()">M</a>';
   buttons += ' | <a title="Links in neuem Fenster/Tab öffnen" href="javascript:RCFilter.newWindowTab()">N</a>';
   buttons += ' | <a title="blende Uhrzeiten aus/ein" href="javascript:RCFilter.fadeClock()">U</a>';
   buttons += ' | <a title="Zeit und Bytes nach vorn" href="javascript:RCFilter.moveZeit()">Z</a>';
   buttons += ' | <a title="blende Reimzeilen aus/ein" href="javascript:RCFilter.fadeLine('+
    '\'(+Reim\')">Reim</a>';
   buttons += ' | <a title="blende autoedit-Zeilen aus/ein" href="javascript:RCFilter.fadeLine('+
    '\'(autoedit\')">autoedit</a>';


   if (conf.neue) {
    _public.newWindowTab();
   }

   if (conf.breite > 0) {
    _public.breite(conf.breite);
   }

   if (conf.kurz) {
    _public.shorten();
    _public.shortenLi1("ul.special li>span.mw-changeslist-line-inner");
   }

   if (conf.uhr) {
    _public.fadeClock();
   }

   if (conf.zeit) {
    _public.moveZeit();
   }

   if (conf.mark) {
    _public.fadeMarkierung();
   }

   if (conf.reim) {
    _public.fadeLine('(+Reim');
   }

   if (conf.auto) {
	_public.fadeLine('(autoedit');
   }

   if (configDefault("KeineLegende",false)) {
    $("div.mw-changeslist-legend").hide();
   }

   $("ul.special a[title^='Benutzer Diskussion:']").each(function(index, element) {
    if (users.hasOwnProperty(element.title.substr(20))){
     users[element.title.substr(20)].cnt++;
    } else {
     users[element.title.substr(20)] = {cnt:1};
    }
   });

   var u,i;
   var sorta = [];
   var topUser = conf.topuser;
   var bs = ' Top '+topUser+': ';
   for (u in users) {
    sorta.push(10000+users[u].cnt+';'+u.replace(/ \(Seite nicht vorhanden\)/,''));
   }
   sorta.sort();
   for (i = sorta.length-1; i >= sorta.length-topUser && i >= 0; i--) {
    a = sorta[i].split(/;/);
    buttons += bs+'<a title="blende Benutzerzeilen aus/ein" href="javascript:RCFilter.fadeUser(\''+
      a[1]+'\')">'+a[1]+'</a>';
    buttons += ' <a title="nur diesen Benutzer anzeigen" href="javascript:RCFilter.fadeUserIn(\''+
      a[1]+'\')">('+ (parseInt(a[0])-10000) +')</a>';
    bs = ' | ';
   }

   var logs = $("ul.special li:has(span.mw-changeslist-log-entry)");
   if (logs && logs.length > 0) {
     names["Logbuch"] = {cnt:logs.length};
   }

   $("ul.special a.mw-changeslist-title").each(function(index, element) {
    sp = element.title.split(":",2);
    var nr = sp[0];
    if (sp.length < 2) {
     nr = "Einträge";
    }
    if (nr.search(/Diskussion$/) >= 0) {
     nr = "Diskussion";
    }
    if (names.hasOwnProperty(nr)){
     names[nr].cnt++;
    }else{
     names[nr] = {cnt:1};
    }

   });

   u,i;
   sorta = [];
   bs = ' Namensraum: ';
   for (u in names) {
    sorta.push(10000+names[u].cnt+';'+u);
   }
   sorta.sort();
   for (i = sorta.length-1; i >=0; i--) {
    a = sorta[i].split(/;/);
    buttons += bs+'<a title="blende Namensraum aus" href="javascript:RCFilter.fadeNames(\''+
      a[1]+'\')">'+a[1]+'</a>';
    buttons += ' <a title="nur diesen Namensraum anzeigen" href="javascript:RCFilter.fadeNamesIn(\''+
      a[1]+'\')">('+ (parseInt(a[0])-10000) +')</a>';
    bs = ' | ';
   }

   var lastli = $("ul.special li:last")[0];
   if ( lastli !== undefined) {
     var anzAb = lastli.getAttribute("data-mw-ts");
     if (anzAb == null || anzAb.length == 0) {
       anzAb = "19991231230000";
     }
   }

   var fdat = DateFromString(anzAb);

   var td = "" + lpad(fdat.getDate()) + "." + lpad(fdat.getMonth()+1) + "." + lpad(fdat.getFullYear());
   var tt = "" + lpad(fdat.getHours()) + ":" + lpad(fdat.getMinutes());

   buttons += ' Der erste Listeneintrag ist vom: <a href="#footer">' + td + ', ' + tt + '</a> Uhr.';

   var div = document.createElement("div");
   div.innerHTML += buttons;
   element.appendChild(div);
  })

 }

 if (conf.grup) {
   _public.gruppieren();
 }

 // Benutzerbeiträge ab letztem Zeitpunkt anzeigen
 if (pn.lastIndexOf("Spezial:Beiträge",0) == 0) {
  var title = mw.config.get("wgTitle");
  var tu = title.substr(9);
  var d = new Date();
  var di = d.toISOString().replace(/[T\-:]/g,'').substr(0,14);
  var dl = d.toLocaleString();

  $(".mw-contributions-table").each(function(index, element) {
    var buttons = '<td colspan="2"><a title="Beiträge seit Zeitpunkt" href="'
    + buildUrl2('Spezial:' + title)
    + 'href="https://de.wiktionary.org/w/index.php?title=Spezial:'
    + '&dir=prev&offset=' + di + '&target=' + tu
    + '">Nur Änderungen seit ' + dl + ' Uhr zeigen.</a></td>';

   var tr = document.createElement("tr");
   tr.innerHTML += buttons;
   element.appendChild(tr);
  })
 }


 if (mw.config.get("wgAction") == "history") {
  //hideBotsLink();
 }

}


function configDefault(s,d) {
 if (RCFilter.hasOwnProperty(s)) {
  return RCFilter[s];
 }
 return d;
}


// YYYYMMDDHHMISS 
function DateFromString(s) {
  return new Date(Date.UTC(parseInt(s.slice(0,4),10),
  parseInt(s.slice(4,6),10)-1,
  parseInt(s.slice(6,8),10),
  parseInt(s.slice(8,10),10),
  parseInt(s.slice(10,12),10),
  parseInt(s.slice(12,14),10)));
}


function lpad(i) {
 var s = "" + i;
 if (s.length < 2) {
  s = "0" + s;
 }
 return s;
}


function newA(node,d,h) {
 node.parentNode.insertBefore(document.createTextNode(" "), node.nextSibling);
 var dutc = new Date (d.getFullYear(), d.getMonth(), d.getDate(), h, 0, 0);
 var dt = lpad(dutc.getUTCFullYear()) + lpad(dutc.getUTCMonth()+1) + lpad(dutc.getUTCDate())
        + lpad(dutc.getUTCHours()) + "0000";
 var newNode = document.createElement("A");
 newNode.href = mw.config.get("wgScript") + "?title=Spezial:Letzte_%C3%84nderungen&limit=999&from=" + dt;
 newNode.appendChild(document.createTextNode(lpad(h)));
 node.parentNode.insertBefore(newNode, node.nextSibling);
}


function newLI(ul, txt, selection) {
 if (txt != "Logbuch") {
   var li = document.createElement("li");
   li.style.listStyle = "none";
   li.innerHTML = "&nbsp;";
   $(li).appendTo(ul);
 }
 li = document.createElement("li");
 li.style.listStyle = "none";
 li.innerHTML = "<b>" + txt + ":</b>";
 $(li).appendTo(ul);
 $(selection).appendTo(ul);
}


function newBox(id,txt) {
  return '<input type="checkbox" id="cbox_' + id + '" name="form1" value="' + txt +
         '"/>' + txt + '<br />'
}


_public.config = function () {
  _public.load();
  $("#rcFilterConfig").after(
    '<form>', '<b><span id="rcconfig" name="form1">Konfiguration:</span','</b><br />',
    newBox("grup", "Gruppieren") +
    newBox("kurz", "Kurze Links") +
    newBox("mark", "Markierungen ausblenden") +
    newBox("neue", "Links in neuen Seiten öffnen") +
    newBox("uhr", "Uhrzeit ausblenden") +
    newBox("zeit", "Zeit und Bytes nach vorn") +
    newBox("reim", "Reimzeilen ausblenden") +
    newBox("auto", "autoedit-Zeilen ausblenden"),
    '<input type="number" id="topuser" name="form1"  min="3" max="15" />Anzahl Top-User (3-15)<br />',
    '<input type="number" id="breite" name="form1"  min="0" max="30" />Mindestbreite des Seitennamens (0 = aus)<br />',
    '</form>');
  _public.setConfig();
  createButtonSave();

};


_public.load = function () {
  var value = mw.cookie.get('PreferencesRCFilterJs') || 'k|n|u|z|r|a|tu~5|br~0';
  
  var params = value.split("|");
  var i;
  for ( i = 0; i < params.length; i++) {
    if (params[i] == "g") conf.grup = false;
    if (params[i] == "G") conf.grup = true;
    if (params[i] == "k") conf.kurz = false;
    if (params[i] == "K") conf.kurz = true;
    if (params[i] == "m") conf.mark = false;
    if (params[i] == "M") conf.mark = true;
    if (params[i] == "n") conf.neue = false;
    if (params[i] == "N") conf.neue = true;
    if (params[i] == "u") conf.uhr  = false;
    if (params[i] == "U") conf.uhr  = true;
    if (params[i] == "z") conf.zeit = false;
    if (params[i] == "Z") conf.zeit = true;
    if (params[i] == "r") conf.reim = false;
    if (params[i] == "R") conf.reim = true;
    if (params[i] == "a") conf.auto = false;
    if (params[i] == "A") conf.auto = true;
    if (params[i].startsWith("tu~")) {
      conf.topuser = Number(params[i].slice(3));
    }
    if (params[i].startsWith("br~")) {
      conf.breite = Number(params[i].slice(3));
    }
  }
}


_public.setConfig = function () {
  document.getElementById("cbox_grup").checked = conf.grup;
  document.getElementById("cbox_kurz").checked = conf.kurz;
  document.getElementById("cbox_mark").checked = conf.mark;
  document.getElementById("cbox_neue").checked = conf.neue;
  document.getElementById("cbox_uhr").checked = conf.uhr;
  document.getElementById("cbox_zeit").checked = conf.zeit;
  document.getElementById("cbox_reim").checked = conf.reim;
  document.getElementById("cbox_auto").checked = conf.auto;
  document.getElementById("topuser").value = conf.topuser;
  document.getElementById("breite").value = conf.breite;
}


_public.save = function () {
  conf.topuser = document.getElementById("topuser").value;
  conf.breite = document.getElementById("breite").value;
  conf.grup = document.getElementById("cbox_grup").checked;
  conf.kurz = document.getElementById("cbox_kurz").checked;
  conf.mark = document.getElementById("cbox_mark").checked;
  conf.neue = document.getElementById("cbox_neue").checked;
  conf.uhr  = document.getElementById("cbox_uhr").checked;
  conf.zeit = document.getElementById("cbox_zeit").checked;
  conf.reim = document.getElementById("cbox_reim").checked;
  conf.auto = document.getElementById("cbox_auto").checked;
  var value = "";
  value += conf.grup ? "G" : "g";
  value += conf.kurz ? "|K" : "|k";
  value += conf.mark ? "|M" : "|m";
  value += conf.neue ? "|N" : "|n";
  value += conf.uhr  ? "|U" : "|u";
  value += conf.zeit ? "|Z" : "|z";
  value += conf.reim ? "|R" : "|r";
  value += conf.auto ? "|A" : "|a";
  value += "|tu~" + conf.topuser.toString();
  value += "|br~" + conf.breite.toString();
  mw.cookie.set('PreferencesRCFilterJs', value, {expires: 86400 * 399});
  document.getElementById("speicher").style.display = '';
}


function createButtonSave(){
  $("#rcFilterSave").after('<br />',
    '<input type="button" title="Einstellungen in einem Cookie speichern" value="Einstellungen speichern" onclick="RCFilter.save();return false;">','<span id="speicher" style="display:none"> gespeichert</span>');
}


_public.fadeLine = function (filter)
{
 $("ul.special > li:contains('"+filter+"')").fadeToggle();
};


_public.fadeIn = function (user)
{
 $("ul.special > li:has(a)").fadeIn();
};


_public.fadeUser = function (user)
{
 $("ul.special > li:has(a[title='Spezial:Beiträge/"+user+"'])").fadeToggle();
};


_public.fadeUserIn = function (user)
{
 $("ul.special > li:has(a)").fadeOut();
 $("ul.special > li:has(a[title='Spezial:Beiträge/"+user+"'])").fadeIn();
};


_public.fadeNames = function (nr)
{
 var sel = "ul.special > li:has(a.mw-changeslist-title[title^='"+nr+":'])";
 if (nr == "Diskussion") {
  sel = "ul.special > li:has(a.mw-changeslist-title[title*='"+nr+":'])";
 }
 if (nr == "Logbuch") {
  sel = "ul.special li:has(span.mw-changeslist-log-entry)";
 }
 if (nr == "Einträge") {
  $("ul.special a.mw-changeslist-title").each(function(index, element) {
    if (element.title.search(/:/) < 0) {
     $(element).closest( "li" ).fadeToggle();
    }
   });
  return;
 }
 $(sel).fadeToggle();
};


_public.fadeNamesIn = function (nr)
{
 $("ul.special > li:has(a)").fadeOut();
 var sel = "ul.special > li:has(a.mw-changeslist-title[title^='"+nr+":'])";
 if (nr == "Diskussion") {
  sel = "ul.special > li:has(a.mw-changeslist-title[title*='"+nr+":'])";
 }
 if (nr == "Logbuch") {
  sel = "ul.special li:has(span.mw-changeslist-log-entry)";
 }
 if (nr == "Einträge") {
  $("ul.special a.mw-changeslist-title").each(function(index, element) {
    if (element.title.search(/:/) < 0) {
     $(element).closest( "li" ).fadeIn();
    }
   });
  return;
 }
 $(sel).fadeIn();
};


_public.fadeClock = function ()
{
 $("ul.special span.mw-changeslist-date").fadeToggle();
};


_public.moveZeit = function ()
{
 _public.moveLi1("ul.special li>span.mw-changeslist-line-inner");
};


_public.fadeMarkierung = function ()
{
 $("ul.special span.mw-tag-marker").fadeToggle();
};


_public.breite = function (breit) {
  if (breit > 0) {
    $("ul.special span.mw-title").css({"display":"inline-block", "min-width":breit + "em"});
  }
};


_public.gruppieren = function () {
  if (gruppiert) return;

  gruppiert = true;
  var ul1 = document.createElement("ul");
  ul1.classList.add("special");
  var list = document.getElementsByClassName("mw-changeslist");
  list[0].prepend(ul1);

  var sel;

  for (nr in names) {
    if (nr == "Logbuch") {
      sel = "ul.special li:has(span.mw-changeslist-log-entry)";
    } else if (nr == "Diskussion") {
      sel = "ul.special > li:has(a.mw-changeslist-title[title*='"+nr+":'])";
    } else {
      sel = "ul.special > li:has(a.mw-changeslist-title[title^='"+nr+":'])";
    }

    if (nr != "Einträge") {
      newLI(ul1, nr, sel);
    }
  }
};


_public.newWindowTab = function () {
  $("ul.special a").attr("target", "_blank");
};


_public.shorten = function () {
 _public.shorten1("ul.special a");
};


_public.shorten1 = function (where) {
  $(where).each(function(index, element) {

    var t = $(element).text();

    if (t.indexOf("Unterschied") >= 0) {
      $(element).text(" U");
    }
    if (t.indexOf("Versionen") == 0) {
      $(element).text("V ");
      var pa = element.parentElement;  // <span>
      if (pa.previousSibling) {  // ein leerer Unterschied? neuer Eintrag
        var nv = pa.previousSibling.innerHTML;
        if (nv && nv.indexOf("Unterschied") >= 0) {
          pa.previousSibling.innerHTML = " N "
        }
      }
    }
    if (t.indexOf("Diskussion") == 0 && t.indexOf(":") < 0) {
      $(element).text(" D");
    }
    if (t.indexOf("Beiträge") >= 0) {
      $(element).text(" B ");
    }
    if (t.indexOf("Sperren") >= 0) {
      $(element).text("S ");
    }
    if (t.indexOf("Zurücksetzen") >= 0) {
      $(element).text(" Z ");
    }
    if (t.indexOf("Markierung") >= 0) {
      $(element).text(" M");
    }

  });
};


_public.shortenLi1 = function (where) {
  $(where).each(function(index, element) {

    for (var child = element.firstChild; child !== null; child = child.nextSibling) {

      if (hasClass(child, "mw-changeslist-links")) {
        child.innerHTML = child.innerHTML.replace(">Unterschied</a>","> U </a>");
        child.innerHTML = child.innerHTML.replace(">Unterschied</span>","> U </span>");
        child.innerHTML = child.innerHTML.replace(">Versionen</a>","> V </a>");
        target = child;
      }

      if (hasClass(child, "mw-usertoollinks")) {
        child.innerHTML = child.innerHTML.replace(">Diskussion</a>","> D </a>");
        child.innerHTML = child.innerHTML.replace(">Beiträge</a>","> B </a>");
        child.innerHTML = child.innerHTML.replace(">Sperren</a>","> S </a>");
      }

      if (hasClass(child, "mw-tag-markers")) {
        child.innerHTML = child.innerHTML.replace("Markierungen</a>","> M </a>");
      }

      if (hasClass(child, "mw-rollback-link")) {
        child.innerHTML = child.innerHTML.replace(">Zurücksetzen</a>","> Z </a>");
      }
    }

  });
};


_public.moveLi1 = function (where) {
  $(where).each(function(index, element) {
    var target;
    var rem;

    for (var child = element.firstChild; child !== null; child = child.nextSibling) {

      if (hasClass(child, "mw-changeslist-links")) {
        target = child;
      }

      if (hasClass(child, "mw-changeslist-date")) {
        if (child.innerHTML.length < 6) {
          child.innerHTML += '&nbsp;';
        }
        if (target) {
          target.insertAdjacentElement('beforebegin',child);
        }
      }

      if (hasClass(child, "mw-diff-bytes")) {
        if (target) {
          rem = child.nextElementSibling;   // Separator später entfernen
          child.innerHTML = child.innerHTML.replace(" Bytes","");
          child.innerHTML = child.innerHTML.replace(" Byte","");
          child.style.display = "inline-block";
          child.style.textAlign = "right";
          child.style.width = "4.5em";
          child.style.whiteSpace = "nowrap";
          target.insertAdjacentElement('beforebegin',child);
          target.insertAdjacentText('beforebegin'," . . ");
        }
      }

    }
    if (rem) rem.remove();

  });
};


_public.shorten2 = function () {
  $("#pagehistory a").each(function(index, element) {

    var t = $(element).text();
    if (element.previousSibling) {
      var nv = element.previousSibling.nodeValue;
      if (nv && nv.indexOf("(Unterschied | ") == 0) {
        element.previousSibling.nodeValue = "( U | ";
      }
      var nv = element.previousSibling.nodeValue;
      if (nv && nv.indexOf("(Aktuell | ") == 0) {
        element.previousSibling.nodeValue = "(Akt | ";
      }
    }
    if (t.indexOf("Aktuell") >= 0) {
      $(element).text("Akt");
    }
    if (t.indexOf("Vorherige") >= 0) {
      $(element).text(" Vor");
    }
    if (t.indexOf("Unterschied") >= 0) {
      $(element).text(" U");
    }
    if (t.indexOf("Versionen") == 0) {
      $(element).text("V ");
    }
    if (t.indexOf("Diskussion") == 0 && t.indexOf(":") < 0) {
      $(element).text(" D");
    }
    if (t.indexOf("Beiträge") >= 0) {
      $(element).text(" B ");
    }
    if (t.indexOf("Sperren") >= 0) {
      $(element).text("S ");
    }
    if (t.indexOf("Zurücksetzen") >= 0) {
      $(element).text(" Z ");
    }
    if (t.indexOf("rückgängig machen") >= 0) {
      $(element).text(" r ");
    }

  });
};


function hasClass(element, clsName) {
  return (' ' + element.className + ' ').indexOf(' ' + clsName + ' ') > -1;
}


function addCORS() {
 if (window.location.hostname.indexOf(".m.") >= 0) {  // mobile site
  return "origin=" + window.location.protocol + "//" + window.location.hostname + "&";
 }
 return "";
}

function getServer() {
 var server = mw.config.get("wgServer");
 if (window.location.hostname.indexOf(".m.") >= 0) {  // mobile site
  if (server.indexOf(".m.") < 0) {
   return server.replace(".", ".m.");
  }
 }
 return server;
}

function buildApi(t,p) {
 return getServer() + mw.config.get("wgScriptPath") + "/api.php?" + addCORS() +
        p + mw.util.wikiUrlencode(t);
}

function buildUrl2(t,p) {
 return getServer() + mw.config.get("wgScript") + "?title=" + mw.util.wikiUrlencode(t) + p;
}


// end namespace: RCFilter
}( window.RCFilter = window.RCFilter || {}, jQuery ));

if (mw.config.get("wgPageName") == "Spezial:Letzte_Änderungen") {
  jQuery(document).ready(RCFilter.init)
}

if (mw.config.get("wgPageName") == "Hilfe:RC-Filter" && mw.config.get("wgAction") == "view") {
  jQuery(document).ready(RCFilter.config);
}


//</nowiki>