Pengguna:Yair rand/rhymesedit.js

Daripada Wiktionary

Catatan: Selepas menyiarkan perubahan, anda mungkin perlu memintas cache pelayar untuk melihatnya.

  • Firefox / Safari: Tahan Shift sambil mengklik Reload, atau tekan sama ada Ctrl-F5 atau Ctrl-R (⌘-R pada Mac)
  • Google Chrome: Tekan Ctrl-Shift-R (⌘-Shift-R pada Mac)
  • Internet Explorer / Edge: Tahan Ctrl sambil mengklik Refresh, atau tekan Ctrl-F5
  • Opera: Tekan Ctrl-F5.
/*
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

*/

var ccc,
  numberOfRhymesAdded = 0;
function setUpRhymeAdder(qq,ii)
{
var findNumberOfHeaders = +qq.lastChild.getElementsByTagName('a')[0].href.match(/\d*$/),
  qqq;
editor=new Editor();
new AdderWrapper(editor,
  {
  'createForm':function(){
    return qqq=newNode('form',
      newNode('label','Add new rhyme: ',
        newNode('input',{'name':'rhyme'})
      ),
      newNode('input',{'type':'submit','value':'Add'})
    )},
  'fields':{'rhyme':function(txt,error){return txt||error('Please specify a rhyme.')}},
  '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;
          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;
              while(wikitext.substr(iiii).match(/^[^=]*\*/)&&String(wikitext.substr(iiii).match(/.*/)).toLowerCase()<"* [["+values.rhyme.toLowerCase()+"]]")
              {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':"+rhyme [["+values.rhyme+"]]",
            'after_save':function(){
              numberOfRhymesAdded++;
              document.body.style.cursor = 'wait';
              JsMwApi().page(values.rhyme).edit(
                function(text, saveFunction, editRes){
                  var langcode = setUpRhymeAdder.langCode || (new LangMetadata()).cleanLangCode(langname),
                    rhymehome = mw.config.get("wgTitle").split("/")[1];
                  if(text.match('=='+langname+'==') && !text.match("\\{\\{rhymes(\\|lang="+langcode+"\\|"+util.escapeRe(rhymehome)+"|\\|"+util.escapeRe(rhymehome)+"\\|lang="+langcode+"|\\|"+util.escapeRe(rhymehome)+")\\}\\}")){
                    if(!String(text.match("=="+langname+"==[\\s\\S]*?(----|$)")).match("=Pronunciation=")){
                      text=text.replace(RegExp("(=="+langname+"==[\\s\\S]*?(?=\n=+(?=[^=])(?!(Etymology=|Alternative))))"),"$1\n===Pronunciation===\n")
                    }
                    text=text.replace(
                      RegExp('(=='+langname+'==[\\s\\S]*?=+Pronunciation=+[\\s\\S]*?\n(?![\:\*]))'),
                      '$1* {'+'{rhymes|'+rhymehome+"|lang="+langcode+'}}\n'
                    )
                  }
                  if(text){
                    saveFunction(text, {summary: "+rhyme [["+mw.config.get("wgPageName")+"|"+"-"+rhymehome+"]]"}, function(){
                      document.body.style.cursor= --numberOfRhymesAdded ? 'wait' : '';
                    });
                  }else{
                    document.body.style.cursor= --numberOfRhymesAdded ? 'wait' : '';
                  }
                }
              )
            }
          },temp)
        }
      )
    }
  },qq.parentNode,ii.nextSibling)
}

$(function(){
  if(mw.config.get("wgNamespaceNumber")==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("syllable")!=-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);
        }
        try { setUpRhymeAdder(q[i], ii) } catch( e ){ };
      }
    }
  }
})