MediaWiki:Gadget-SearchPrefix.js

Aus Wiktionary, dem freien Wörterbuch
/* <nowiki>
** Ermöglicht die schnelle Auswahl eines Namensraumpräfixes im Suchfeld
*/


// begin namespace: foSearchPrefix
(function( _public, $, undefined ) {


var sf;
var sf1;
var targetNode;
var div0 = false;
var timer;
var grayspace = "[({\.+?$^";
var strNames = "";
var strCanonic = "";
var strId = "";
var strFilter = "/hastemplate:/incategory:/insource:/intitle:";


_public.init = function ()
{
 // var sf = document.querySelector("#p-cactions");
  var sf = document.querySelector("#searchInput");
  if (sf) {
    sf.oninput = function () {
     handleInput(sf);
    };
  }

  sf1 = document.querySelectorAll("input.search.mw-ui-background-icon-search");
  if (sf1) {
    for ( var i = 0; i < sf1.length; i++) {
      sf1[i].oninput = function () {
        handleInput(sf1[i]);
      };
    }
  }

  if (sf || sf1) {
    var jqxhr = $.get( buildApi("", "action=query&format=json&meta=siteinfo&siprop=namespaces"),
      handleResponse);
  }

  if (!sf) {
    return;
  }


  sf.ondblclick = _public.fLinks;
  var anchor85 = '<a style="display: inline-block; width: 83%" onclick="foSearchPrefix.setPre(';
  var anchor15 = '<a style="display: inline-block; width: 13%" onclick="foSearchPrefix.setPre(';

  $(sf).after('<div class="vectorMenu">' +
   // '<input type="button" value="▼"' +
   // ' onclick="foSearchPrefix.fLinks()"' +
   // ' style="margin-top: 0.9em; margin-left: 0.6em; padding-left: 2px; padding-right: 2px">' + 
    '<div id="foSP1" style="padding-left: 3px; font-size: 13px; position: absolute; inset: 40px auto auto 0px;' +
    ' width: 104px; height: auto; display: none; z-index: 20; border-width: 1px; border-style: solid;' +
    ' border-color: #9F9F9F; background-color: white" >' +
    anchor85 + "'Benutzer'" + ')">Benutzer</a>' +
    anchor15 + "'Benutzer_Diskussion'" + ')">D</a>' +
    anchor85 + "'Hilfe'" + ')">Hilfe</a>' +
    anchor15 + "'Hilfe_Diskussion'" + ')">D</a>' +
    anchor85 + "'Kategorie'" + ')">Kategorie</a>' +
    anchor15 + "'Kategorie_Diskussion'" + ')">D</a>' +
    anchor85 + "'MediaWiki'" + ')">MediaWiki</a>' +
    anchor15 + "'MediaWiki_Diskussion'" + ')">D</a>' +
    anchor85 + "'Verzeichnis'" + ')">Verzeichnis</a>' +
    anchor15 + "'Verzeichnis_Diskussion'" + ')">D</a>' +
    anchor85 + "'Vorlage'" + ')">Vorlage</a>' +
    anchor15 + "'Vorlage_Diskussion'" + ')">D</a>' +
    anchor85 + "'Wiktionary'" + ')">Wiktionary</a>' +
    anchor15 + "'Wiktionary_Diskussion'" + ')">D</a>' + '<br /><hr>' +
    anchor85 + "'Verzeichnis:Deutsch'" + ')"><small>Verzeichnis:Deutsch</small></a>' + '<br /><hr>' +
    anchor85 + "'incategory:'" + ')">incategory</a>' +
    anchor85 + "'insource:/'" + ')">insource</a>' +
    anchor85 + "'intitle:'" + ')">intitle</a>' +
    anchor85 + "'hastemplate:'" + ')">hastemplate</a>' +
    '</div></div>'
  );

}


_public.fLinks = function () {
  if (div0) {
    document.querySelector("#foSP1").style.display = "none";
  } else {
    document.querySelector("#foSP1").style.display = "block";
  }
  div0 = !div0;
};


_public.setPre = function (w) {
  document.querySelector("#foSP1").style.display = "none";
  div0 = false;
  var si = document.querySelector("#searchInput");
  si.value = w;
  si.focus();
};


handleInput = function (sf) {
  var s = sf.value;
  var t = "";

  // Ist : oder _ das letzte zeichen der Eingabe?
  if (s.indexOf(":") == s.length - 1 || s.indexOf("_") == s.length - 1 ) {

    // Alle Regexp-relevanten Zeichen maskieren
    for (var i = 0; i < s.length; i++) {
      if (grayspace.indexOf(s[i]) >= 0) {
        t += "\\";
      }
      t +=  s[i];
    }

    // Suchexpression für numerische Werte
    var tid = "/" + t.replace(":","[^:]*?:");

    if (t.indexOf(":") >= 0 ) {
      t = "/" + t.replace(":","[^: ]*?:");  // ohne Leerzeichen
    } else {
      t = "/" + t.replace("_","[^: ]*?\\s[^:]*?:");  // mit Leerzeichen
    }

    var re = new RegExp( t , "gi");
    var result = strNames.match(re);
    if (result && result.length > 0) {
      sf.value = result[0].slice(1);
      return;
    }
    var result = strCanonic.match(re);
    if (result && result.length > 0) {
      sf.value = result[0].slice(1);
      return;
    }
    var result = strFilter.match(re);
    if (result && result.length > 0) {
      sf.value = result[0].slice(1);
      return;
    }
    var result = strId.match(new RegExp( tid , "gi"));
    if (result && result.length > 0) {
      sf.value = result[0].replace(/\/-?[0-9]*/,"");
      return;
    }
  }
};


// Daten zu namespaces auswerten
function handleResponse(data) {

 if (data.query !== undefined && data.query.namespaces !== undefined) {
   var dqn = data.query.namespaces;
   for (var nr in dqn) {
     if (dqn[nr]['*'] != 0) {
       strNames   += "/" + dqn[nr]["*"] + ":";
       strCanonic += "/" + dqn[nr].canonical + ":";
       strId      += "/" + dqn[nr].id + dqn[nr]["*"] + ":";
     }
   }
 }

}


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: foSearchPrefix
}( window.foSearchPrefix = window.foSearchPrefix || {}, jQuery ));

jQuery(document).ready(foSearchPrefix.init);


//</nowiki>