// copied and modified from english wiktionary user Yair rand
// http://en.wiktionary.org/wiki/User:Yair_rand/rhymesedit.js
// version 1.11
/*
Yay, a rhymes editor that automatically updates the entry for the added rhyme.
To do:
*Make less ugly
*Ability to remove/edit rhymes
*Put rhyme template at the bottom of pronunciation section?
*Fix jillion bugs (none of which I'm aware of yet, but I'll find them...)
*Add qualifier button
*/
// drag and drop von Links fuer Eingabefelder
document.addEventListener("drop", function( event ) {
event.preventDefault();
if ( event.target.className == "dragtarget" ) {
var data = decodeURI(event.dataTransfer.getData("text"));
// ggf. Schrägstrich am Ende entfernen
data = data.replace(/\/$/,'');
var lio = data.lastIndexOf('/');
if (lio >= 0) {
data = data.slice(lio + 1);
}
lio = data.lastIndexOf('index.php?title=');
var idx = data.indexOf('&');
if (lio >= 0) {
if (idx < 0) {
data = data.slice(lio + 16);
} else {
data = data.slice(lio + 16,idx);
}
}
idx = data.indexOf('#');
if (idx > 0) {
data = data.slice(0,idx);
}
event.target.value = data;
}
}, false);
function buildUrl(t){
return buildUrl2(t,"&action=raw&maxage=0");
}
function buildUrl2(t,p){
return mw.config.get("wgServer")+mw.config.get("wgScript")+"?title="+mw.util.wikiUrlencode(t)+p;
}
window.rhymesedit = window.rhymesedit || {};
// declared here, to be called from checkpage or GUI
rhymesedit.after_save_text = function(text, rhymehome, langname){
var t2 = text.split(/(\n==[^=])/);
var t3 = [];
var r2 = '{{Reim|'+rhymehome+'|'+langname+'}}\n';
var r1 = ':{{Reime}} '+r2;
var hbsp = ':{{Hörbeispiele}} {{Audio|}}\n';
var i,j;
for (i = 0; i < t2.length; i++){
if (t2[i].indexOf('{{Sprache|'+langname+'}}') >= 0){
t3 = t2[i].split(/(\n===[^=])/);
for (j = 1; j < t3.length; j++){
if (t3[j].length == 5) continue;
if (langname != "Deutsch" || matchLautschriften(t3[j],rhymehome)) {
if (t3[j].indexOf(':{{Reime}}') < 0){
if (t3[j].indexOf(':{{Hörbeispiele') >= 0){
t3[j] = t3[j].replace(/(:\{\{Hörbeispiele[^\v]+?\n)/, '$1' + r1);
} else if (t3[j].indexOf(':{{IPA') >= 0){
t3[j] = t3[j].replace(/(:\{\{IPA[^\v]+?\n)/, '$1' + hbsp + r1);
} else if (t3[j].indexOf('{{Aussprache') >= 0){
t3[j] = t3[j].replace(/(\{\{Aussprache[^\v]+?\n)/, '$1:{{IPA}} {{Lautschrift|}}\n' + hbsp + r1);
} else {
t3[j] = t3[j].replace(/(\{\{Worttrennung[^\v]+?\n)\{\{/, '$1{{Aussprache}}\n:{{IPA}} {{Lautschrift|}}\n' + hbsp + r1 + '\n{{' );
}
} else if (t3[j].indexOf('{{Reim|'+rhymehome+'|') < 0){
// Wenn dieser Reim noch nicht vorhanden ist, eintragen
t3[j] = t3[j].replace(/(\{\{Reim[^\v]+?)\n/, '$1, ' + r2);
t3[j] = t3[j].replace(/\{\{Reime\}\},/, '{{Reime}}'); // Cleanup :{{Reime}}, {{Reim
}
}
}
t2[i] = t3.join('');
}
}
return t2.join('');
};
function matchLautschriften(t,ls) {
var lsa = getLautschriften(t);
if (lsa.length == 0) {
return true; // Aussprache fehlt oder leer
}
for (var i = 0; i < lsa.length; i++) {
//console.log(lsa[i] + " " + ls);
if (makeRhyme(lsa[i]) == ls) {
return true;
}
}
return false;
}
function getLautschriften(t) {
var lsa = [];
var pos1 = t.indexOf("\n{{Aussprache}}");
if (pos1 >= 0) {
var pos2 = t.indexOf("\n{{",pos1 + 1);
if (pos2 >= 0) {
var s = t.slice(pos1,pos2);
lsa = s.match(/\{\{Lautschrift\|[^}]+\}\}/g);
}
}
if (lsa) {
return lsa;
}
return [];
}
function delSofthyphen(t) {
return t.replace(/\u00ad/g, "");
}
function makeRhyme(lsr) {
var tmp = "";
if (lsr.length > 0) {
lsr = lsr.replace(/\{Lautschrift\|/g,"{Lautschrift|ˈ"); // Betonung sicherstellen
lsr = $.trim(lsr);
}
if (lsr.length > 1) {
var li = lsr.lastIndexOf("ˈ");
if (li >= 0) {
tmp = lsr.substr(li);
var vokal = tmp.search(/[aɑeɛiɪoɔøœuʊyʏ]/);
if (tmp[vokal + 1] == '\u032f' || tmp[vokal + 1] == '\u0311') { // unsilbisch unten oder oben
vokal += 2;
}
var bis = tmp.indexOf("}");
tmp = tmp.slice(vokal,bis);
tmp = tmp.replace(/ˌ/g,""); // Nebenbetonung aus Link entfernen
}
}
return tmp;
}
var currAdderText = "";
var ccc;
var numberOfRhymesAdded = 0;
function setUpRhymeAdder(qq,ii)
{
function getRhymeValue() {
var r={'name':'rhyme','class':'dragtarget'};
var m;
if (m=RegExp('[&?]rhyme=([^&]*)').exec(document.location)) {
try {
r.value=decodeURI(m[1]);
return r;
} catch (someError) {}
}
return r;
}
function toSortOrder(s) {
var i,
r='';
for(i=0;i<s.length;i++){
switch(s.charAt(i).toLowerCase()){
case 'ä': r+="aa"; break;
case 'ö': r+="oo"; break;
case 'ß': r+="ss"; break;
case 'ü': r+="uu"; break;
default: r+=s.charAt(i).toLowerCase()+' ';
}
}
return r+' '+s;
}
function handleRhymeResponse(data) {
currAdderText = data;
}
$.get(buildUrl(mw.config.get("wgPageName")), handleRhymeResponse);
var wTitle='Reimwort hinzufügen: ';
var u=ii.previousSibling;
if (u) u=u.previousSibling; // Header
if (u) {
u=$(u).children(".mw-headline");
if (u.length > 0) {
wTitle=$(u[0]).text();
wTitle='Reimwort hinzufügen ('+wTitle+'): ';
}
}
var findNumberOfHeaders = +qq.lastChild.getElementsByTagName('a')[0].href.match(/\d*$/),
qqq;
editor=new Editor();
new AdderWrapper(editor,
{
'createForm':function(){
return qqq=newNode('form',{'class':'noprint'},
newNode('label',wTitle,
newNode('input',getRhymeValue())
),
newNode('input',{'type':'submit','value':'+'})
)},
'fields':{'rhyme':function(txt,error){
var found = false;
var et = editor.getCurrentText();
if (et.length == 0) {
et = currAdderText;
}
if (et.indexOf('[['+txt+']]') >= 0){
found = true;
};
if (found) {
return ''||error('Eingabe bereits vorhanden.');
} else {
return $.trim(delSofthyphen(txt))||error('Bitte ein Reimwort eingeben.')}
}},
'onsubmit':function(values, render){
var langname = mw.config.get("wgTitle").split(':')[0];
if((new LangMetadata()).cleanLangCode(langname) == langname && !setUpRhymeAdder.langCode){
$.get(mw.config.get("wgServer")+mw.config.get("wgScript")+"?title=Template:langrev/"+langname+"&action=raw",function(c){setUpRhymeAdder.langCode = c});
}
qqq.getElementsByTagName('input')[0].value = "";
render('[['+values.rhyme+']]',function(newhtml){
var temp=newNode('li');temp.innerHTML=newhtml;
var iii, iiii, rh;
editor.addEdit({
'edit':function(wikitext){
wikitext=wikitext.replace(/\n\*\[/g,'\n* [');
if(!/Category:.+$/.test(wikitext)){wikitext+="\n"}
iiii=wikitext.indexOf('=');iii=1;
while(iii<findNumberOfHeaders){iiii+=wikitext.substr(iiii+1).search(/\n=/)+1;iii++}
iiii+=wikitext.substr(iiii+1).search(/\*|\n\n|\n[^=\n]*$|\n=/)+1;
iiii += wikitext.charAt(iiii) == "\n";
iii = 0;
rh=toSortOrder("* [["+values.rhyme+"]]");
while(wikitext.substr(iiii).match(/^[^=]*\*/)&&toSortOrder(String(wikitext.substr(iiii).match(/.*/)))<rh)
{iiii+=wikitext.substr(iiii).search(/\n(?!\{)|$/)+1;iii++}
wikitext=wikitext.substr(0,iiii)+(wikitext.charAt(iiii-1)==''?'\n':'')+'* [[' + values.rhyme + ']]\n'+wikitext.substr(iiii)
return ccc=wikitext
},
'redo':function(){var lis = ii.getElementsByTagName('li'); (lis[iii]||lis[iii-1]).parentNode.insertBefore(temp, lis[iii] || null)},
'undo':function(){var lis = ii.getElementsByTagName('li'); (lis[iii]||lis[iii-1]).parentNode.removeChild(temp)},
'summary':"+Reim [["+values.rhyme+"]]",
'after_save':function(){
numberOfRhymesAdded++;
document.body.style.cursor = 'wait';
JsMwApi().page(values.rhyme).edit(
function(text, saveFunction, editRes){
if(editRes.query.pages.hasOwnProperty("-1")) {
document.body.style.cursor= --numberOfRhymesAdded ? 'wait' : '';
return;
}
var langcode = setUpRhymeAdder.langCode || (new LangMetadata()).cleanLangCode(langname);
var rhymehome = mw.config.get("wgTitle").split(":")[1].substr(1);
text = rhymesedit.after_save_text(text, rhymehome, langname);
saveFunction(text, {summary: "+Reim [[" + mw.config.get("wgPageName") + "|-" + rhymehome + "]]"}, function(){
document.body.style.cursor= --numberOfRhymesAdded ? 'wait' : '';
})
}
)
}
},temp)
}
)
}
},qq.parentNode,ii.nextSibling)
}
function setUpListAdder(ul,formnode)
{
function getRhymeValue() {
var r={'name':'rhyme','class':'dragtarget'}
var m;
if (m=RegExp('[&?]rhyme=([^&]*)').exec(document.location)) {
try {
r.value=decodeURI(m[1]);
return r;
} catch (someError) {}
}
return r;
}
function toSortOrder(s) {
var i,
r='';
s=s.replace(/\[\[/g,'').replace(/\]\]/g,'');
for(i=0;i<s.length;i++){
switch(s.charAt(i).toLowerCase()){
case 'ä': r+="aa"; break;
case 'ö': r+="oo"; break;
case 'ß': r+="ss"; break;
case 'ü': r+="uu"; break;
default: r+=s.charAt(i).toLowerCase()+' ';
}
}
return r+String.fromCharCode(1)+s;
}
function handleListResponse(data) {
listAdderText = data;
}
$.get(buildUrl(mw.config.get("wgPageName")), handleListResponse);
// ul.li.a.value
var wHeader, form;
var wTitle='Einfügen: ';
var star="*********".substr(0,1+$(ul).parents("ul").length);
var u=formnode.previousSibling
if (u) u=u.previousSibling; // Header
if (u) {
u=$(u).children(".mw-headline");
if (u.length > 0) {
wTitle=$(u[0]).text();
wTitle='Einfügen (unter '+wTitle+'): ';
}
}
var li=ul.firstChild;
while(li.nodeName!="LI" && li.nextSibling){
li=li.nextSibling;
}
li=li.firstChild;
if (!li) {return;}
if (li.nodeType==3){
wHeader = $.trim(li.nodeValue);
if (!wHeader.length==0){
wHeader = $.trim(li.innerText);
}
wHeader = star+wHeader;
}else{
wHeader = star+"[["+li.firstChild.nodeValue+"]]\n";
}
var editor=new Editor();
new AdderWrapper(editor,
{
'createForm':function(){
return form=newNode(
'form',
{'class':'noprint'},
newNode('label',wTitle, newNode('input',getRhymeValue())),
newNode('input',{'type':'submit','value':'+'})
)
},
'fields':{'rhyme':function(txt,error){
var found = false;
var et = editor.getCurrentText();
if (et.length == 0) {
et = currAdderText;
}
if (et.indexOf('[['+txt+']]') >= 0){
found = true;
};
if (found) {
return ''||error('Eingabe bereits vorhanden.')
} else {
return $.trim(delSofthyphen(txt))||error('Bitte etwas eingeben.')}
}},
'onsubmit':function(values, render){
form.getElementsByTagName('input')[0].value = "";
render('[['+values.rhyme+']]',function(newhtml){
var temp=newNode('li');temp.innerHTML=newhtml;
var iii, ih,ihp, rh;
editor.addEdit({
'edit':function(wikitext){
wikitext=wikitext.replace(/\n\* \[/g,'\n*[');
if(wikitext.charAt(wikitext.length-1) != '\n'){wikitext+='\n';}
ih=wikitext.indexOf(wHeader);
do {
ihp=ih;
ih=wikitext.lastIndexOf('\n',ihp-1);
if(ih == 0 && wikitext.charAt(ih+1) == '*'){ihp=ih;}
} while(ih>0 && wikitext.substr(ih+1,star.length) == star);
if(wikitext.charAt(ihp) == '\n'){ihp++;}
if(ihp==0 || ihp > 0 && wikitext.charAt(ihp-1) == '\n'){
iii = 0;
rh=toSortOrder(star+values.rhyme);
var notfound=true;
do {
var wt=toSortOrder(wikitext.substring(ihp,wikitext.indexOf('\n',ihp+1)));
if (toSortOrder(wikitext.substring(ihp,wikitext.indexOf('\n',ihp+1))) > rh) {
notfound=false;
}else{
ihp = wikitext.indexOf('\n',ihp+1);
iii++;
ihp++;
if(wikitext.charAt(ihp) != '*'){
notfound=false;
}
}
} while (notfound);
wikitext=wikitext.substr(0,ihp)+(wikitext.charAt(ihp-1)==''?'\n':'')
+star+'[[' + values.rhyme + ']]\n'+wikitext.substr(ihp)
}
return wikitext
},
'redo':function(){
var lis = ul.getElementsByTagName('li');
if(iii>=lis.length){
ul.appendChild(temp);
}else{
ul.insertBefore(temp, lis[iii] || null)
}
},
'undo':function(){
var lis = ul.getElementsByTagName('li');
ul.removeChild(temp)
},
'summary':"+[["+values.rhyme+"]]"
},temp)
}
)
}
},ul.parentNode,formnode)
}
jQuery(window).ready(function(){
function pagefromplus(title) {
return mw.util.wikiUrlencode(title.replace(/ /g, "+")).replace(/%2B/g, "+");
}
var ns = mw.config.get("wgNamespaceNumber");
// 106 = Reim
if (ns == 106 && mw.config.get("wgAction") == "view" && !window.dontLoadRhymesAdder)
{
for(var i=0, q=document.getElementsByTagName('h3');i<q.length;i++)
{
if(q[i].innerHTML.indexOf("silbig")!=-1)
{
var ii = q[i].nextSibling;
while(ii&&(!ii.nodeName||!(ii.nodeName=="UL"||ii.nodeName=="DIV"||ii.nodeName=="H3"))){ii=ii.nextSibling}
if( !ii || !ii.nodeName ){
ii = q[i].parentNode.appendChild(newNode('ul', newNode('li', {'style':'display:none;'})));
}
if( ii.nodeName == "H3" ){
ii = ii.parentNode.insertBefore(newNode('ul', newNode('li', {'style':'display:none;'})), ii);
}
setUpRhymeAdder(q[i], ii);
}
}
// $("#mw-content-text h3 + ul").attr( "style", "columns: 9 11em; -moz-columns: 9 11em; -webkit-columns: 9 11em" );
}
// 104 = Thesaurus
if ((ns == 104) && mw.config.get("wgAction") == "view")
{
if($("div.jsNoAdd:first").length < 1) {
var ul=$("div.jsAdd ul:not(#toc ul)").each(function(index, element) {
setUpListAdder(element,element);
});
if(ul.length < 1){
$("#mw-content-text ul:not(#toc ul)").each(function(index, element) {
setUpListAdder(element,element);
});
}
}
}
// 2 = Benutzer, 4 = Wiktionary, 102 = Verzeichnis
if ((ns == 2 || ns == 4 || ns == 102) && mw.config.get("wgAction") == "view"
&& mw.config.get("wgIsProbablyEditable"))
{
$("div.jsAdd ul:not(#toc ul)").each(function(index, element) {
setUpListAdder(element,element);
});
var style = $("div.jsStyle:first");
if (style.length > 0) {
$(style[0].dataset.p1).attr( "style", style[0].dataset.p2 );
}
}
// inputboxextension
if((ns==2||ns==4) && mw.config.get("wgAction")=="view")
{
var ibeid;
var ibewidth;
$(".inputboxextension tr").each(function(index) {
var tf = $( this.firstElementChild ).text();
var tl = $( this.lastElementChild ).text();
if (index % 5 == 0) { // id und width auslesen
ibeid = tf;
ibewidth = tl;
} else if (index % 5 == 1) { // inputbox ermitteln und in tabelle einpacken
$("#"+ibeid + " .createboxInput")
.wrap('<table><tr><td></td></tr></table>')
.parent().before('<td>'+ tf +'</td>')
.after('<td>'+ tl +'</td>');
} else if (tf.substr(0,3) != "{{{") { // weitere parameterinputfelder anfügen
$("#"+ibeid + " tr:last")
.after('<tr><td>'+tf+
'</td><td><input name="preloadparams[]" value="" size="'+ibewidth+
'" type="text"></td><td>'+ tl +'</td></tr>');
}
});
}
});