MediaWiki:Gadget-rhymesedit.js

Aus Wiktionary, dem freien Wörterbuch
// 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>');
      }

    });
  } 


});