Revision 137476 of "User:PerfektesChaos/js/WikiSyntaxTextMod/dX.js" on testwiki

/// PerfektesChaos/js/WikisyntaxTextMod/?X.js
/// 2012-05-30 [email protected]
/// Fingerprint: #0#0#
/// <nowiki>
/* jshint curly:true, latedef:true, laxbreak:true,
           trailing:true, undef:true, white:false  */
/* global jQuery: true, mw: true, mediaWiki: false, window: false      */
/*jslint   plusplus: true, regexp: true, sloppy: true, unparam: true,
           vars: true, white: true, maxerr: 50 */
/*globals  jQuery: true, mw: true, mediaWiki: false, window: false     */



if (typeof(mediaWiki) !== "object") {   // disconnected
   mw      =  { libs: { },
                log:  function () {}
              };
   jQuery  =  {};
}
if (typeof(mw.libs.WikiSyntaxTextMod) !== "object") {   // isolated
   mw.libs.WikiSyntaxTextMod  =  { debugging: false };
}
if (typeof(mw.libs.WikiSyntaxTextMod.X) !== "object") {
   mw.libs.WikiSyntaxTextMod.X  =  { };
}
mw.libs.WikiSyntaxTextMod.X.vsn  =  -0.531;
if (typeof(mw.libs.WikiSyntaxTextMod.bb) !== "object") {
   mw.libs.WikiSyntaxTextMod.bb  =  { };
}
if (typeof(mw.libs.WikiSyntaxTextMod.main) !== "object") {
   mw.libs.WikiSyntaxTextMod.main  =  { };
}



// Requires: JavaScript 1.5   RegExp non-capturing parenthese
// mw.log(WSTM.debugging,"",0);



//-----------------------------------------------------------------------



mw.libs.WikiSyntaxTextMod.bb.chrX  =  function (WSTM) {
   if (typeof(WSTM.w) !== "object") {
      WSTM.w  =  { };
   }
   if (typeof(WSTM.w.chr) !== "object") {
      WSTM.w.chr  =  { detected:  { ampersand: false,
                                    exchange: 0,
                                    nbHyphen: false,
                                    ordMasc:  false,
                                    tab:      false,
                                    tabEOL:   false,
                                    white:    false },
                       re:        { }
                     };
   }



WSTM.w.chr.flushEntities  =  function (adjust) {
   // Exchange undesired entities in modifiable nodes with UCS chars
   // Precondition:
   //    adjust  -- WikiTom to be analyzed
   // Postcondition:
   //    Nodes are modified where suitable.
   // Uses:
   //    >  .o.WikiTom.TextOnly
   //    >< .w.chr.re.entities
   //    .w.chr.flushEntities()  -- recursive
   //    .w.chr.flat()
   // 2012-04-30 [email protected]
   var c;
   var e;
   var f;
   var i;
   var j;
   var k;
   var l;
   var m;
   var n;
   var s;
   var r;
   if (adjust.children) {
      n  =  adjust.children.length;
      for (i = 0;  i < n;  i++) {
         this.flushEntities(adjust.children[i]);
      }   // for i
   } else if (adjust.lookup) {
      if (adjust.mode <= WSTM.o.WikiTom.TextOnly) {
         s  =  adjust.source;
         if (s) {
            m  =  false;
            i  =  s.indexOf("&");
            if (i >= 0) {
               if (! this.re.entities) {
                  k  =  "&#x?[0-9A-Fa-f+]+;";
                  r  =  "&[A-Za-z][a-zETH][a-zHO]" +
                        "[a-zR123]?[a-zN1234]?[a-z24]?[a-z]?;";
                  this.re.entities  =  [ new RegExp(k, "g"),
                                         new RegExp(r, "g") ];
               }
               for (k = 0;  k < 2;  k++) {
                  l  =  (k === 1);
                  r  =  this.re.entities[k];
                  r.lastIndex  =  0;
                  do {
                     j  =  r.lastIndex;
                     f  =  r.exec(s);
                     if (f) {
                        e  =  f[0];
                        if (e !== "&nbsp;") {
                           c  =  this.flat(e, l);
                           if (c) {
mw.log(WSTM.debugging,".w.chr.flushEntities()"+c,0);
                              j  =  f.index;
                              m  =  j + e.length;
                              s  =  s.substr(0, j)  +  c  +  s.substr(m);
                              r.lastIndex  =  j + 1;
                           }   //
                        }   // replace, except nbsp
                     }   // found?
                  } while (f);   // do
               }   // for k
            }   // '&' in node
            if (m) {
               if (adjust.source !== s) {
                  adjust.fresh(s);
               }
            }
         }
      }
   }
};   // .w.chr.flushEntities()



};   // .bb.chrX()
mw.libs.WikiSyntaxTextMod.bb.chrX(mw.libs.WikiSyntaxTextMod);
delete mw.libs.WikiSyntaxTextMod.bb.chrX;



//-----------------------------------------------------------------------



mw.libs.WikiSyntaxTextMod.bb.elemX  =  function (WSTM) {
   if (typeof(WSTM.w) !== "object") {
      WSTM.w  =  { };
   }
   if (typeof(WSTM.w.elem) !== "object") {
      WSTM.w.elem  =  { };
   }



};   // .bb.elemX()
mw.libs.WikiSyntaxTextMod.bb.elemX(mw.libs.WikiSyntaxTextMod);
delete mw.libs.WikiSyntaxTextMod.bb.elemX;



//-----------------------------------------------------------------------



mw.libs.WikiSyntaxTextMod.bb.linkX  =  function (WSTM) {
   // Analysis of link -- web and wiki
   // 2012-05-18 [email protected]
   if (typeof(WSTM.w.link) !== "object") {
      WSTM.w.link  =  { wiki:      { },
                        web:       { }
                      };
   }



WSTM.w.link.format  =  function (adjust, about, above, adhere) {
   // Format found '[' in WikiTom, analyze and process link
   // Precondition:
   //    adjust  -- WikiTom element
   //    about   -- location object
   //               .i   string position of beginning "["
   //               .k   sibling number of adjust
   //    above   -- top level
   //    adhere  -- true: freeze link targets
   // Postcondition:
   //    Returns array with start location for next search
   //            .i       string position of termination
   //            .k       sibling number of termination
   //            .target  WikiTom, if category or interwiki
   // Uses:
   //    >  .o.Wikilink.instance
   //    >  .w.link.reHead
   //    >  .o.Wikilink.ModeIw
   //    >  .o.Wikilink.ModeFile
   //    >  .o.WikiTom.LinkFile
   //    >  .o.Wikilink.ModeCat
   //    >  .o.WikiTom.LinkCategory
   //    >  .o.WikiTom.LinkInterWiki
   //    >  .o.WikiTom.LinkWiki
   //    >  .mod.hyper
   //     < .o.WikiTom().mode
   //     < .o.WikiTom().lookup
   //    .o.WikiTom().fetch()
   //    .o.WikiTom().focus()
   //    .o.WikiTom().flip()
   //    .errors.found()
   //    .o.wikilink::
   //          .set()
   //          .getChange()
   //          .getError()
   //          .getUserModified()
   //          .getType()
   //          .getTargetLength()
   //          .getIncrement()
   //    .o.WikiTom().folder()
   //    .w.link.web.format()
   // 2012-06-31 [email protected]
   var got;
   var j      =  about.i;
   var m      =  1;
   var mode   =  0;
   var n;
   var r      =  { i: j + 1,  k: about.k };
   var s;
   var wlink  =  WSTM.o.Wikilink.instance;
   var wtom;
   if (adjust.fetch(r.k, r.i, true)  ===  91) {   // '['
      mode  =  10;   // "[["
//mw.log(WSTM.debugging,".w.link.format() ["+adjust.fetch(r.k, r.i, false).substr(0,100),0);
   } else {
      s  =  adjust.fetch(r.k, r.i, false);
//mw.log(WSTM.debugging,".w.link.format() "+s.substr(0,100),0);
      if (s) {
         got  =  this.reHead.exec(s);
         if (got) {
            if (got.index) {   // ^ matches multiline
            } else {
               if (got[1]) {   // bad format: spaces between brackets
                  j  +=  got[1].length;
// TODO: test
               }
               if (got[2]) {
                  mode  =  11;
               } else {
                  mode  =  20;   // "[//"   or   "[https://" etc.
               }
            }
         } else {
            got  =  /^([^\[|\n]+)([^\]\[|\n]+)?\](.)/.exec(s);
            if (got) {
               if (! got.index) {   // ^ matches multiline
                  if (got[3] === "]") {
                     if (got[1].length < 100) {   // MAX_WIKILINK_LENGTH
                        mode  =  12;   // bad: second bracket missing
                        if (got[2]) {
                           if (got[2].length > 200) {// MAX_LINKTITLE_LEN
                              mode  =  0;
                           }
                        }
                     }
                  }
               }
            }
         }
      }
   }
   switch (mode) {
      case 10 :
      case 11 :
      case 12 :
         if (mode > 10) {
mw.log(WSTM.debugging,".w.link.format() mode="+mode,0);
         }
         wtom  =  adjust.focus(r.k);
         wlink.set(wtom, j, adhere, wtom, WSTM.mod.hyper);
         // "["        case 12   setLoose
         if (wlink.getChange()) {
            n  =  wlink.getRemoveFrom();
            adjust.flip(r.k,
                        j + n,
                        wlink.getRemoveTo() - n,
                        wlink.getTextReplace());
            if (wlink.getError()  ||  wlink.getUserModified()) {
               WSTM.mod.lazy  =  false;
            }
         }
         n  =  wlink.getType();
         if (adjust.parent) {
            if (n === WSTM.o.Wikilink.ModeIw  &&  ! above) {
               s  =  adjust.fetch(r.k, j, false);
               WSTM.errors.found("wikilinkInterwikiDeep",
                                 false,
                                 s.substr(0, 50));
               mode  =  0;
            }   // interwiki
         }
         if (adhere) {
            n  =  wlink.getTargetLength();
            if (n) {
               j    +=  2;
               got   =  adjust.folder(j,  r.k,  j + n,  r.k);
               m     =  wlink.getIncrement();
               if (got) {
                  got.lookup  =  false;
                  switch (wlink.getType()) {   // magicNumber->const
                     case WSTM.o.Wikilink.ModeFile :
                        got.mode  =  WSTM.o.WikiTom.LinkFile;
                        break;
                     case WSTM.o.Wikilink.ModeCat :
                        got.mode    =  WSTM.o.WikiTom.LinkCategory;
                        got.leader  =  wlink.getLeader();
                        r.target    =  got;
                        break;
                     case WSTM.o.Wikilink.ModeIw :
                        got.mode    =  WSTM.o.WikiTom.LinkInterWiki;
                        got.leader  =  wlink.getLeader();
                        r.target    =  got;
                        break;
                     default:
                        got.mode  =  WSTM.o.WikiTom.LinkWiki;
                        break;
                  }   // switch wlink.mode
                  r.k  +=  2;
                  j     =  0;
                  m     =  0;
               }
            }
         } else {
            m  =  2;
         }
         if (mode > 10) {
            s  =  adjust.fetch(r.k, j, false);
            WSTM.errors.found("wikilinkBracketsAhead",
                              false,
                              s.substr(0, 50));
         }
         break;
      case 20 :
         got  =  WSTM.w.link.web.format(adjust,
                                        { i: j + 1,  j: 0,  k: r.k },
                                        adhere,
                                        false,
                                        WSTM.mod.hyper);
         if (got) {
            m  =  got[1];
            if (got[2]) {
               s  =  adjust.fetch(r.k, 0, false);
               adjust.flip(r.k, 0, s.length, got[2]);
               if (got[3]) {
                  WSTM.mod.lazy  =  false;
               }
            }
            if (typeof(got[0]) === "number") {
               j  =  got[0];
            }
            r.mode   =  got[4];
            if (adhere && r.mode) {
               got  =  adjust.folder(j, r.k, m, r.k);
               if (got) {
                  got.lookup  =  false;
                  got.mode    =  r.mode;
               }
               r.k  +=  2;
               j     =  0;
               m     =  0;
            }
         }
         break;
   }   // switch mode
   r.i  =  j + m;
   return  r;
};   // .w.link.format()



};   // .bb.linkX()
mw.libs.WikiSyntaxTextMod.bb.linkX(mw.libs.WikiSyntaxTextMod);
delete mw.libs.WikiSyntaxTextMod.bb.linkX;



//-----------------------------------------------------------------------



/*
mw.libs.WikiSyntaxTextMod.w.polish.strong  =  function () {
   // Remove superfluous ''' from headlines
   // Postcondition:
   //    stringDOM_Nodelist  Nodes are modified where suitable.
   //    RegExp was used.
   // Uses:
   //    >< .tx.tree
   //    stringDOM_Nodelist::
   //          .find()
   //          .getNode()
   //          .modify()
   // Requires: JavaScript 1.3   charCodeAt()
   // 2011-12-31 [email protected]
   with (mw.libs.WikiSyntaxTextMod) {
      var i;
      var join;
      var keep;
      var node;
      var reHead   =  false;
      var reLine   =  new RegExp("\n=+.*'''.*= *\n", "g");
      var store;
      var target   =  [reLine, 0];
      var bold     =  tx.tree.find(target, 0, 0);
      while (bold) {
         store  =  bold[2].substr(1);
         join   =  store.length;
         if (store.charCodeAt(0) === 61) {   // '='
            if (! reHead) {
               reHead  =  new RegExp("^(==+)[^=\n].+[^=\n]\\1 *\n",  "");
            }
            if (! reHead.test(store)) {
               store  =  false;
            }
         }
         if (store) {
            i     =  store.indexOf("'''");
            node  =  tx.tree.getNode(bold[1]);
            keep  =  bold[0] - node.beg + 1;
            while (i >= 0) {
               store  =  (i > 0  ?  store.substr(0, i)  :  "")
                         +   store.substr(i + 3);
               i      =  store.indexOf("'''");
            }   // while
            node.modify(keep,  store,  keep + join);
            join  =  store.length;
         }
         bold  =  tx.tree.find(target,  bold[0] + join,  bold[1]);
      }   // while bold
   }   // with WSTM
};   // .w.polish.strong()
*/



//-----------------------------------------------------------------------



mw.libs.WikiSyntaxTextMod.bb.apiX  =  function (WSTM) {
   // Detected syntax error handling
   // 2012-04-30 [email protected]
   if (typeof(WSTM.api) !== "object") {
      WSTM.api  =  { };
   }


WSTM.api.textMod  =  function (adjust) {
   // Main task for modifications of wikitext string
   // Precondition:
   //    adjust  -- string with entire wikitext
   // Postcondition:
   //    Returns  false     if nothing to do
   //             array[2]  [0] modified string
   //                       [1] true if minor edits only (not userdef)
   // Uses:
   //    >  .str.spaces
   //    >  WikisyntaxTextMod_UserHook
   //    >  .mod.comment
   //    >  .mod.lock
   //    >  .w.chr.detected.exchange
   //    >  .w.chr.detected.nbHyphen
   //    >  .mod.plain
   //    >  .mod.plain.raw
   //    >  .mod.plain.name
   //    >  .mod.lenient
   //    >  .text.learnt
   //    >  .w.chr.detected.tabEOL
   //    >< .mod.plain.stm
   //     < .w.encountered
   //     < .str.locateEntities
   //     < .text
   //    .mod.furnish()
   //    .g.factory()
   //    .w.tags.frozen()
   //    .o.WikiTom()
   //    .w.chr.filter()
   //    .w.tags.fire()
   //    .w.chr.flip()
   //    .w.elem.fair()
   //    .w.elem.redirect()
   //    .w.tags.future()
   //    .w.elem.references()
   //    .w.elem.galleries()
   //    .w.template.findISBN()
   //    .w.template.fire()
   //    .w.link.fire()
   //    .w.elem.fixed()
   //    .w.elem.finishing()
   //    .util.translate.further()
   //    .o.WikiTom.replace()
   //    .o.WikiTom.toString()
   //    .()
   // Requires: JavaScript 1.3   charCodeAt()
   // 2012-05-30 [email protected]
   var ext;
   var r      =  false;
   var re     =  new RegExp("\n[ " + WSTM.str.spaces + "]+\n", "g");
   var score  =  adjust;
WSTM.o.WikiTom.Level=-99;
   RegExp.multiline  =  true;
   if (typeof(window) === "object") {
      if (typeof(window.console) === "object") {
         window.console.clear();
      mw.log(WSTM.debugging,".api.textMod()",0);
      }
      if (window.name) {
         mw.log(WSTM.debugging,"window.name='"+window.name+"'",3);
      }
   }
   WSTM.mod.furnish();
   WSTM.g.factory();
   WSTM.w.encountered        =  { cats:      false,
                                  indent:    false,
                                  isbn:      false,
                                  iwiki:     false,
                                  refgroups: false };
   WSTM.str.locateEntities   =  true;
   WSTM.config.xEvaluation    =  jQuery.cookie("xEvaluation");// ////////
   if (typeof(WSTM.config.xEvaluation) === "string") {
       WSTM.config.xEvaluation  =
                        WSTM.config.xEvaluation.replace(/(0|false)/, "");
      WSTM.config.xEvaluation  =  (WSTM.config.xEvaluation.length > 0);
   }
   if (WSTM.mod.comment) {
      WSTM.w.tags.frozen();
   }
   WSTM.text  =  new WSTM.o.WikiTom(adjust, null);
   WSTM.w.chr.filter(WSTM.text);
   WSTM.w.tags.fire(WSTM.text);
   WSTM.w.chr.flip(WSTM.text);
   WSTM.w.elem.fair(WSTM.text);
   WSTM.mod.lock  =  (WSTM.mod.lock
                      || WSTM.w.chr.detected.exchange
                      || WSTM.w.chr.detected.nbHyphen);
   WSTM.w.elem.redirect(WSTM.text);
   if (WSTM.w.tags.future("references", false)) {
      WSTM.w.elem.references(WSTM.text);
   }
   if (WSTM.w.tags.future("gallery", false)) {
      WSTM.w.elem.galleries();
   }
   WSTM.w.template.findISBN();
WSTM.o.WikiTom.Level=0;
   WSTM.w.template.fire(WSTM.text, true);
   WSTM.w.link.fire(WSTM.text, true, WSTM.mod.lock, false);
   if (WSTM.mod.lock && WSTM.w.encountered.indent) {
      WSTM.w.elem.fixed(WSTM.text, true);
   }
   WSTM.w.elem.finishing();
   if (WSTM.mod.plain) {
      if (! WSTM.mod.plain.stm) {
         WSTM.mod.plain.stm  =  WSTM.util.translate.further(
                                                     WSTM.mod.plain.raw,
                                                     false,
                                                     WSTM.mod.plain.name,
                                                     WSTM.mod.lenient);
      }   // _Text
      if (WSTM.mod.plain.stm) {
         WSTM.text.replace(WSTM.mod.plain.stm, false);
      }
   }   // _Text
   if (WSTM.text.learnt || WSTM.w.chr.detected.tabEOL) {
      score  =  WSTM.text.toString();
   }
   // ///////////////////////////////////////////////////////////////////
   if (typeof(WikisyntaxTextMod_UserHook) === "function") {
      var s  =  WikisyntaxTextMod_UserHook(score);
      if (typeof(s) === "string") {
         score  =  s;
      }   // apparently changed by user
   }   // WikisyntaxTextMod_UserHook defined
   if (score !== adjust) {
      // remove trailing whitespace on this occasion:
      re  =  new RegExp("([^=]|[^=]= |==)[ " + WSTM.str.spaces + "]+\n",
                        "g");
      // Test: vorher "([^ =][^=]|==) +\n"
      // Chemiker: Vorlagen behalten Leerzeichen bei leeren Parametern
      score  =  score.replace(re, "$1\n");
      ext    =  score.length - 1;
      if (score.charCodeAt(ext) === 10) {
         while (score.charCodeAt(ext - 1)  ===  10) {
            score  =  score.substr(0, ext);
            ext--;
         }   // while
      }   // score terminated by \n
   }   // changes
   if (typeof(window.console) === "object") {
      WSTM.text.DEBUGparent();
mw.log(WSTM.debugging,".main.bb.X.fn ==================",0,WSTM.X);
mw.log(WSTM.debugging,".main.bb.X.fn",0,WSTM.text);
mw.log(WSTM.debugging,".main.bb.X.fn",0,WSTM.w.encountered);
mw.log(WSTM.debugging,".main.bb.X.fn",0,WSTM.w.chr.detected);
   }
   if (score !== adjust) {
      r  =  [score, WSTM.mod.lazy];
   }   // changes
   return  r;
};   // .api.textMod()



};   // .bb.apiX()
mw.libs.WikiSyntaxTextMod.bb.apiX(mw.libs.WikiSyntaxTextMod);
delete mw.libs.WikiSyntaxTextMod.bb.apiX;



//-----------------------------------------------------------------------



mw.libs.WikiSyntaxTextMod.bb.X  =  function (jQuery, mw, WSTM) {



// Start on import: callback to waiting ...
   if (typeof(WSTM.main.wait) === "function") {
      WSTM.main.wait("X", WSTM.X.vsn);
   }
};
mw.libs.WikiSyntaxTextMod.bb.X(jQuery, mw, mw.libs.WikiSyntaxTextMod);



// Emacs
// Local Variables:
// encoding: iso-8859-1-dos
// fill-column: 80
// End:

/// EOF </nowiki>   WikiSyntaxTextMod/?X.js