MediaWiki:Skin/Commons:Kugel.js
aus Kamelopedia, der wüsten Enzyklopädie
Hinweis: Leere nach dem Speichern den Browser-Cache, um die Änderungen sehen zu können.
- Firefox/Safari: Umschalttaste drücken und gleichzeitig Aktualisieren anklicken oder entweder Strg+F5 oder Strg+R (⌘+R auf dem Mac) drücken
- Google Chrome: Umschalttaste+Strg+R (⌘+Umschalttaste+R auf dem Mac) drücken
- Internet Explorer: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
- Opera: Extras → Internetspuren löschen … → Individuelle Auswahl → Den kompletten Cache löschen
//importJS("MediaWiki:Skin/Commons:Kugel/simple.js"); /* Parameter: * - cmd: Such-String * - known_modifs: Liste der Bekannten Modifier * - modif_aliases: Modifier-Übersetzungs-Tabelle * - minus: Soll "-Suchwort" in einen Extra-Eintrag "-"? * Return: [Suchwort-Tree, Fehler] */ function analyzeSearchString(cmd, known_modifs, modif_aliases, minus) { //Interne Escapings: // \0l…\0t Literal // \0o Oder // \0u Und // \0t Terminalzeichen für einige Escapings var errors = []; // Schritt 1: Escaping Sequences entfernen und Strip cmd = cmd.replace(/\u0000/g,""); cmd = cmd.replace(/^\s+/, ""); cmd = cmd.replace(/\s+$/, ""); // Schritt 1: Literale entfernen var literals = []; cmd = cmd.replace(/('[^']*'|"[^"]*")/g, function (x) { var lnum = literals.length; literals.push(x.substr(1,x.length-2)); return "\0l"+lnum+"\0t"; }); // Schritt 2: Leerzeichen nach Doppelpunkten entfernen cmd = cmd.replace(/:\s+/g,":"); // Schritt 3: ODER-Blöcke zusammenfassen cmd = cmd.replace(/\s+OR\s+/g, "\0o"); // Schritt 4: UND-Blöcke zusammenfassen (Leerzeichen == AND) cmd = cmd.replace(/\s+AND\s+/g, " "); cmd = cmd.replace(/\s+/g, "\0u"); // Schritt 5: Umwandeln in eine Baumstruktur function raiseError(x) { errors.push(x); if (window.console && window.console.log) console.log(x); } // Debug-Funktionen function Block(modifier,objects) { this.modifier = modifier; this.objects = objects }; Block.prototype.toString = function() { return "("+this.modifier+":"+this.objects+")" }; function processLiterals(x) { return x.replace(/\u0000l[^\u0000]+\u0000t/g, function (x) { return literals[parseInt(x.substr(2,x.length-4))]; }); } function processOrBlocks(x) { // Modif Tuple: (Modifier, String) function getModifTuple(x) { var idx = x.indexOf(":"); var a = x.substr(0,idx); var b = x.substr(idx+1); // Schlüsselwort "-" if(a == "" && minus && b.length>0 && b[0] == "-") { a = "-"; b = b.substr(1); } // Schlüsselwort-Ersetzung if(modif_aliases[a] != null) { var alias = modif_aliases[a]; if(alias instanceof Function) { // komplizierte Ersetzung mittels Funktion var tuple = alias(a,b); a = tuple[0]; b = tuple[1]; } else // String-Ersetzung a = alias; } return [a,b]; } var obj_arr = x.split("\0o"); var modif = getModifTuple(obj_arr[0])[0]; for (var i=0; i<obj_arr.length; i++) { var el = getModifTuple(obj_arr[i]); if( el[0] != modif ) raiseError('"'+modif+'" und "'+el[0]+'" können nicht untereinander mit OR verknüpft werden.'); obj_arr[i] = processLiterals(el[1]); } return new Block(modif,obj_arr); } function processAndBlocks(x) { var arr = x.split("\0u"); for (var i=0; i<arr.length; i++) { arr[i] = processOrBlocks(arr[i]); } return arr; } var tree = processAndBlocks(cmd); return [tree, errors]; } //importJS("MediaWiki:Skin/Commons:Kugel/api.js"); var bs_DPL = { defaultSearch: function (qs) { var redir_prefix = ""; var redir_suffix = ""; if( qs.redir ) { redir_prefix = "{{Follow Tag-Redirect|"; redir_suffix = "}}"; } var dplstring = "{{#dpl:"; var seeitems = []; var seenotitems = []; var t = analyzeSearchString( qs.search, ["category","uses","-category","-uses","filename","createdby","-createdby"], { kat: "category", kategorie: "category", "-kategorie": "-category", benutzt: "uses", "-kat": "-category", "-benutzt": "-uses", "name": "filename", "dateiname": "filename", "author": "createdby", "-author": "-createdby", "autor": "createdby", "-autor": "-createdby", "-": function (a,b) { return ["-category","Commons: " + redir_prefix + b.substr(0,1).toUpperCase()+b.substr(1) + redir_suffix ]}, "": function (a,b) { return ["category","Commons: " + redir_prefix + b.substr(0,1).toUpperCase()+b.substr(1) + redir_suffix ] } }, true ); var parts = t[0]; var errors = t[1]; for (var i=0; i<parts.length; i++) { var part = parts[i]; if (part.modifier == "category") { dplstring += "\n|category=Kategorie:" + part.objects.join("¦Kategorie:"); for (var j=0; j<part.objects.length; j++) seeitems.push("[[:Kategorie:" + part.objects[j] + "]]"); } else if(part.modifier == "uses") { dplstring += "\n|uses=" + part.objects.join("¦"); for (var j=0; j<part.objects.length; j++) seeitems.push("[[:" + part.objects[j] + "]]"); } else if(part.modifier == "createdby") { dplstring += "\n|createdby=" + part.objects.join("¦"); for (var j=0; j<part.objects.length; j++) seeitems.push("[[Kamel:" + part.objects[j] + "]]"); } else if(part.modifier == "filename") { dplstring += "\n|titlematch="+part.objects.join("¦"); // keine Ahnung, auf was man hier verlinken sollte ... } else if (part.modifier == "-category") { dplstring += "\n|notcategory=Kategorie:" + part.objects.join("¦Kategorie:"); for (var j=0; j<part.objects.length; j++) seenotitems.push("[[:Kategorie:" + part.objects[j] + "]]"); } else if(part.modifier == "-uses") { dplstring += "\n|notuses=" + part.objects.join("¦"); for (var j=0; j<part.objects.length; j++) seenotitems.push("[[:" + part.objects[j] + "]]"); } else if(part.modifier == "-createdby") { dplstring += "\n|notcreatedby=" + part.objects.join("¦"); for (var j=0; j<part.objects.length; j++) seenotitems.push("[[Kamel:" + part.objects[j] + "]]"); } else errors.push("Unbekanntes Schlüsselwort: \"" + part.modifier + "\" (ignoriert)"); } if (errors && errors.length > 0) { var ediv = jQuery("#bs_errors"); ediv.text("Es sind Fehler aufgetreten. Falls Ergebnisse angezeigt werden, passen diese vermutlich nicht ganz zur Suchanfrage."); var eul = jQuery("<ul></ul>"); eul.appendTo(ediv); for (var i=0; i<errors.length; i++) { var eli = jQuery("<li></li>"); eli.text(errors[i]); eli.appendTo(eul); } ediv.fadeIn('slow'); } dplstring += "\n|count="+qs.limit; dplstring += "\n|namespace=Datei"; dplstring += "\n|offset="+qs.limit * qs.page; dplstring += "\n|format=²{#tag:gallery¦,\\n%PAGE%²{!}²[[%PAGE%]],,}²"; dplstring += "\n|noresultsheader=''-- keine Ergebnisse --''"; dplstring += "\n}}"; seestring = seeitems.length ? "<div>{{sa}}" + seeitems.join(", ") + "</div>" : ""; seenotstring = seenotitems.length ? "<div>{{sn}}" + seenotitems.join(", ") + "</div>" : ""; jQuery.ajax({ url: "/api.php", data: { action: "parse", format: "xml", text: dplstring + seestring + seenotstring }, dataType: "xml", success: bs_DPL.display, error: bs_DPL.ajaxError }); }, display: function (xml) { var data = jQuery(xml).find("api parse text").text(); jQuery("#bs_results")[0].innerHTML = data; jQuery("#bs_results").fadeIn(); }, ajaxError: function (request,error) { var ediv = jQuery("#bs_errors"); ediv.text("Es sind Fehler aufgetreten: "+error); ediv.fadeIn('slow'); } } /*bs_DPL.defaultSearch({ search:"Kamel", page: 0, limit: 10 });*/ //importJS("MediaWiki:Skin/Commons:Kugel/dpl.js"); var bs_API = { qry: "", defaultSearch: function (p) { bs_API.qry = p.search; if (p.limit == null) p.limit = 16; jQuery.ajax({ url: "/api.php", async: false, data: { sroffset:p.limit * p.page, action:"query", list:"search", srsearch:p.search, srwhat:"text", srnamespace:"6", format:"xml", srlimit: p.limit, srprop:"", srinfo:"" // eigentlich "totalhits|suggestion" aber funktioniert nicht }, success: bs_API.prepareRender, error: bs_API.ajaxError }); }, prepareRender: function (transport) { var results = []; jQuery(transport).find("api query search p").each(function(num,obj) {results.push(jQuery(obj).attr("title")) }); var source = "<gallery>\n"; for(var i=0; i<results.length; i++) { source += results[i]+"|[[:"+results[i]+"]]\n"; } source += "</gallery>"; if(bs_API.qry) { var items = bs_API.qry.split(/\s+/); for (var i = 0; i < items.length; i++) { items[i] = "[[:Kategorie:Commons: " + items[i].substr(0,1).toUpperCase() + items[i].substr(1) + "]]"; } source += "{{sa}} " + items.join(", "); } if (results.length == 0) source = "''-- keine Ergebnisse --''"; jQuery.ajax({ url: "/api.php", data: { action:"parse", text:source, format:"xml", prop: "text" }, success: bs_API.display, error: bs_API.ajaxError }); }, display: function (transport) { var text = jQuery(transport).find("api parse text").text(); var o = jQuery("#bs_results"); o.empty(); o.append(jQuery(text)); o.fadeIn('slow'); }, ajaxError: function (request,error) { var ediv = jQuery("#bs_errors"); ediv.text("Es sind Fehler aufgetreten: "+error); ediv.fadeIn('slow'); } }; var form = null; jQuery(document).ready( function (){ jQuery("#bs_form").empty(); form = jQuery("<form></form>"); form.appendTo("#bs_form"); form.append("<input name='q' type='text' style='width:50%'/>"); form.append("<input type='submit' value='Suchen'><br />"); form.append('<input type="radio" value="API" name="mode" id="bs_mode_api" checked>'); form.append('<label for="bs_mode_api">API</label>'); form.append('<input type="radio" value="DPL" name="mode" id="bs_mode_dpl">'); form.append('<label for="bs_mode_dpl">DPL</label> '); form.append("<a style='font-size:80%;' href='/index.php/Commons:Kugel/Hilfe'>Tipps & Tricks</a>"); form.append('<div id="bs_redir_div" style="display:none;"><input type="checkbox" value="1" name="redir" id="bs_redir" checked><label for="bs_redir">Tag-Redirects auflösen</label></div>'); jQuery('input[name=q]').focus(); }); var currentQuery = {}; var currentEngine = null; /* * Analysiert den Suchstring qs und wählt eine passende Suchmaschine aus. * Rückgabewert ist ein Object {engine:…, render:…, params:…, error:…} * - engine: Pointer auf die Suchfunktion * - params: Parameter-Objekt * - page: Seitennummer, beginnend mit 0 * - optional weitere Parameter * - error: im Erfolgsfall null, sonst Fehlerstring * - render: Pointer auf die Renderfunktion */ function parseQuery (qs) { var mode = jQuery(form).find("input:radio:checked").val(); if (mode == "API") currentEngine = bs_API.defaultSearch; if (mode == "DPL") currentEngine = bs_DPL.defaultSearch; currentQuery = { redir: !! (jQuery("#bs_redir:checked")[0]), search:qs, limit: 12, page: 0 }; currentEngine(currentQuery); } /* transform control spans into "real" control links */ function createControls(name) { jQuery(name+" span").attr("class","pseudolink"); jQuery(name+" span").each(function (num,obj) { jQuery(obj).bind("click", function () { currentQuery.page = num - 1; currentEngine(currentQuery); }); }); jQuery(name+" span:first").each(function (num,obj) { jQuery(obj).unbind("click") jQuery(obj).bind("click", function () { currentQuery.page -= 1; if (currentQuery.page < 0) currentQuery.page = 0 currentEngine(currentQuery); }); }); jQuery(name+" span:last").each(function (num,obj) { jQuery(obj).unbind("click") jQuery(obj).bind("click", function () { currentQuery.page += 1; currentEngine(currentQuery); }); }); } jQuery(document).ready( function () { jQuery("#bs_mode_api").bind("click",function () { jQuery("#bs_redir_div").fadeOut() }); jQuery("#bs_mode_dpl").bind("click",function () { jQuery("#bs_redir_div").fadeIn() }); form.bind('submit', function () { try { jQuery("#bs_logo, #bs_controls, #bs_controls2, #bs_results, #bs_errors").fadeOut('slow'); parseQuery(this.q.value); jQuery("#bs_controls, #bs_controls2, #bs_results").fadeIn('slow'); } catch(e) { if (console && console.log) console.log(e) } finally { return false; } }); createControls("#bs_controls"); createControls("#bs_controls2"); //create an argument dict var argstring = location.search.substr(1).split("&"); argdict = {} for(var i=0; i<argstring.length; i++) { var kv = argstring[i].split("="); argdict[kv[0]] = kv[1]; } // run search directly? if(argdict["bs_q"] != null) //bugfix: +++ decodeURIComponent, damit Sönderzeichün richtig bei Kugel ankommen ... form.find("input:text").val(decodeURIComponent(argdict["bs_q"])); if(argdict["bs_mode"] == "DPL" ) form.find("#bs_mode_dpl")[0].checked = true; if(argdict["bs"] == "submit") form.submit() });