User:PerfektesChaos/js/WikiSyntaxTextMod/d.js

Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
/// PerfektesChaos/js/WikiSyntaxTextMod/d.js
/// 2021-05-21 PerfektesChaos@de.wikipedia
// ResourceLoader:  compatible; dependencies:
//      user, user.options, mediawiki.user, mediawiki.util, mediawiki.cookie
/// Fingerprint: #0#0#
/// @license: CC-by-sa/4.0 GPLv3
/// <nowiki>
/* global window:false, mw:true, mediaWiki:false                       */
/* jshint bitwise:true, curly:true, eqeqeq:true, latedef:true,
          laxbreak:true,
          nocomma:true, strict:true, undef:true, unused:true           */


if ( typeof mediaWiki  !==  "object" ) {   // disconnected
   mw  =  { config: false,
            libs:   { },
            log:    function () { "use strict"; },
            str:    { },
            util:   { }
          };
}
if ( typeof mw.libs.WikiSyntaxTextMod  !==  "object"   ||
    ! mw.libs.WikiSyntaxTextMod ) {
   mw.libs.WikiSyntaxTextMod  =  {  bb: { }  };
}
if ( ! mw.libs.WikiSyntaxTextMod.vsn ) {
   mw.libs.WikiSyntaxTextMod.vsn  =  -7.3;
}
// This is the main script of a suite of 13 modules
// External access:
//    WikiSyntaxTextMod_About()
//    WikiSyntaxTextMod_Run()
if ( typeof mw.libs.WikiSyntaxTextMod.bb  !==  "object" ) {
   mw.libs.WikiSyntaxTextMod.bb  =  { };
}
// Requires: JavaScript 1.3
//           (String.charCodeAt String.fromCharCode String.replace)
//           JavaScript 1.5  RegExp non-capturing parenthese
// Requires: MediaWiki 1.23
//           (mw.hook,
//            1.18: mw.libs;
//            1.17: mw.config mw.loader mw.util
//                  jQuery/core jQuery.cookie)



// Uses:
//    mediaWiki::   mw::
//    >  .config
//    >  .loader
//    >  .util
//    jQuery::
//       .cookie()
//       .isArray()
//       .ready()
//       .trigger()
//       .trim()
//    wikEd::
//       >  .disabled
//       .UpdateFrame()
//       .Setup()
//       .UpdateTextarea()



mw.libs.WikiSyntaxTextMod.bb.util  =  function ( WSTM ) {
   // From general utility package
   // 2012-05-18 PerfektesChaos@de.wikipedia
   "use strict";
   if ( typeof WSTM.util  !==  "object" ) {
      WSTM.util  =  { };
   }



   WSTM.util.fiatObjects  =  function ( adult, activate, assign ) {
      // Ensure existence of at least empty object
      // Precondition:
      //    adult     -- parent object
      //    activate  -- String with name of child object
      //    assign    -- optional object with initial definition
      //                 if containing object components,
      //                 they will be asserted as well
      // Postcondition:
      //    adult has been extended
      // Uses:
      //    .util.fiatObjects()  -- recursive
      // 2012-05-18 PerfektesChaos@de.wikipedia
      var elt,
          obj,
          s;
      if ( typeof adult[ activate ]  !==  "object" ) {
         adult[activate]  =  ( assign  ?  assign  :  { } );
      }
      if ( assign ) {
         obj  =  adult[ activate ];
         for ( s in assign ) {
            if ( assign.hasOwnProperty( s ) ) {
               elt  =  assign[ s ];
               if ( typeof elt  ===  "object" ) {
                  WSTM.util.fiatObjects( obj, s, elt );
               }
            }
         }  //  for s in obj
      }
   };   // .util.fiatObjects()



   WSTM.util.yymmddhhmmss  =  function ( align ) {
      // Build date and time stamp
      // Precondition:
      //    align  -- Date object
      // Postcondition:
      //    Returns string formatted
      // Uses:
      //    .str.fromNum()
      // 2012-03-28 PerfektesChaos@de.wikipedia
      var s  =    ( align.getFullYear() % 100 )  *  10000
               +  ( align.getMonth() + 1 )  *  100
               +    align.getDate(),
          t  =      align.getHours()  *  10000
               +    align.getMinutes()  *  100
               +    align.getSeconds();
      return  ( WSTM.str.fromNum( s )  +  WSTM.str.fromNum( t ) );
   };   // .util.yymmddhhmmss()



   WSTM.util.fiatObjects( WSTM,  "debugging",  { loud: false } );



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



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



mw.libs.WikiSyntaxTextMod.bb.config  =  function ( WSTM ) {
   // Variables for global usage in WSTM
   // 2013-01-07 PerfektesChaos@de.wikipedia
   "use strict";
   WSTM.type  =  "WikiSyntaxTextMod";
   WSTM.doc   =  "[[w:de:User:PerfektesChaos/js/" + WSTM.type + "]]";


   if ( typeof WSTM.g  !==  "object" ) {
      WSTM.g     =  { learnt:     false,
                      mediaWiki : false,
                      wDBname   : undefined,
                      wNsIds    : undefined,   // wgNamespaceIds
                      wNsNumber : undefined,
                      wPageName : undefined,
                      wRevID    : undefined,   // wgCurRevisionId
                      wServer   : undefined,
                      wTitle    : undefined,
                      wUserLang : undefined,   // wgUserLanguage
                      projLang  : undefined,   // ~ wgContentLanguage
                      projLone  : undefined,   // no language versions
                      projType  : undefined,   // ~ wgSiteName downcased
                      userLang  : undefined    // ~ wgUserLanguage
                    };
      WSTM.ia    =  false;
   }   // multiple loading?



   WSTM.g.fetch  =  function ( assign, access, apply ) {
      // Set WSTM global variable by retrieving from mediaWiki context
      // Precondition:
      //    assign  -- variable
      //               undefined for .mediaWiki
      //    access  -- string with name
      //               false for .mediaWiki
      //    apply   -- string with local name, or false
      // Postcondition:
      //    Returns undefined if no value found
      // Uses:
      //    >  window
      //    >  mediaWiki
      //     < .g.mediaWiki
      //     < .g.wDBname
      //     < .g.wNsIds
      //     < .g.wNsNumber
      //     < .g.wPageName
      //     < .g.wRevID
      //     < .g.wServer
      //     < .g.wTitle
      //     < .g.wUserLang
      //    mw.config.get()
      // 2020-02-01 PerfektesChaos@de.wikipedia
      var r, v;
      if ( apply ) {
         if ( typeof this[ apply ]  !==  undefined ) {
            r  =  this[ apply ];
         }
      } else {
         r  =  assign;
      }   // access
      if ( r === undefined ) {
         if ( ! this.mediaWiki ) {
            if ( typeof window  ===  "object"   &&
                 window   &&
                 typeof window.mediaWiki  ===  "object" ) {
               this.mediaWiki  =  window.mediaWiki;
               r               =  this.mediaWiki;
            }
         }   // this.mediaWiki
         if ( this.mediaWiki ) {
            if ( access ) {
               v  =  mw.config.get( access );
               if ( v !== null  &&  access ) {
                  switch ( access ) {
                     case "wgContentLanguage" :
                        this.wPageLang  =  v;
                        break;
                     case "wgCurRevisionId" :
                        this.wRevID     =  v;
                        break;
                     case "wgDBname" :
                        this.wDBname    =  v;
                        break;
                     case "wgNamespaceIds" :
                        this.wNsIds     =  v;
                        break;
                     case "wgNamespaceNumber" :
                        this.wNsNumber  =  v;
                        break;
                     case "wgPageName" :
                        this.wPageName  =  v;
                        break;
                     case "wgServer" :
                        this.wServer    =  v;
                        break;
                     case "wgTitle" :
                        this.wTitle     =  v;
                        break;
                     case "wgUserLanguage" :
                        this.wUserLang  =  v;
                        break;
                  }   // switch  access
                  r  =  v;
               }   // val
            } else {
               r  =  this.mediaWiki;
            }   // access
         }   // mediaWiki
      }   // undefined
      return r;
   };   // .g.fetch()



   // Possible user configuration
   // Uses:
   //    .util.fiatObjects()
   // 2012-11-02 PerfektesChaos@de.wikipedia
   WSTM.util.fiatObjects( WSTM,  "config",
                          { lang:     { },
                            load:     { },
                            page:     { } } );
/*
   if (typeof(WSTM.config.load) !== "object") {
      WSTM.config.load  =  { after:   false,
                             api:     false,
                             inhibit: false,
                             updater: false };
   }
   if (typeof(WSTM.config.page) !== "object") {
      WSTM.config.page  =  { exclude: false,
                             include: false,
                             oldid:   false,
                             support: false };
   }
*/
   if ( typeof WSTM.config.load.after  !==  "function" ) {
      WSTM.config.load.after  =  false;
   }
};   // .bb.config()
mw.libs.WikiSyntaxTextMod.bb.config( mw.libs.WikiSyntaxTextMod );
delete mw.libs.WikiSyntaxTextMod.bb.config;



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



mw.libs.WikiSyntaxTextMod.bb.str  =  function ( WSTM ) {
   // Copied from string utility package.
   // Uses:
   //    .util.fiatObjects()
   // 2013-08-22 PerfektesChaos@de.wikipedia
   "use strict";
   WSTM.util.fiatObjects( WSTM,  "str",  { } );



   WSTM.str.fromNum  =  function ( adjust ) {
      /**
       Format number as string
       @version 2011-10-09 PerfektesChaos@de.wikipedia
       @param   adjust  number to be formatted
       @return  adjust as string
      */
      return adjust.toString();
   };   // .str.fromNum()



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



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



mw.libs.WikiSyntaxTextMod.bb.api  =  function ( WSTM ) {
   // API recommended to users
   // Uses:
   //    .util.fiatObjects()
   // 2015-03-08 PerfektesChaos@de.wikipedia
   "use strict";
   WSTM.util.fiatObjects( WSTM,  "api",  { loaded: false } );



   WSTM.api.isAppropriate  =  function ( advanced ) {
      // Check whether WikisyntaxTextMod is appropriate
      // Precondition:
      //    advanced  -- true: interactive request
      //    Wikiserver environment  -- not wgIsArticle
      // Postcondition:
      //    Returns true iff current page is appropriate.
      // Uses:
      //    >< .g.wNsNumber
      //    >< .g.wTitle
      //    >< .config.page.oldid
      //    >< .config.page.exclude
      //    >< .config.page.include
      //    >< .config.page.support
      //    .g.fetch()
      //    .mw.config.get()
      //    .main.isEditable()
      //    .main.isPageMatch()
      //    mw.util.getParamValue()
      // 2016-01-01 PerfektesChaos@de.wikipedia
      var pg        =  WSTM.config.page,
          r         =  false,
          suffixes  =  ".css.js.lua.uue.",
          i,
          leeway,
          legal,
          select;
      WSTM.g.fetch( false, "wgNamespaceNumber", "wNsNumber" );
      WSTM.g.fetch( false, "wgTitle",           "wTitle" );
      if ( typeof WSTM.g.wNsNumber  === "number"  &&
           typeof WSTM.g.wTitle  === "string" ) {
         leeway  =  false;
         legal   =  ( WSTM.g.wNsNumber === 0 );
         if ( WSTM.g.wNsNumber >= 0  &&
              WSTM.g.wNsNumber % 2  ===  0  &&
              WSTM.g.wNsNumber  !==  8 ) {
            leeway  =  true;
            if ( mw.util.getParamValue( "oldid" ) ) {
               if ( typeof pg.oldid  !==  "boolean" ) {
                  pg.oldid  =  false;
               }
               leeway  =  pg.oldid;
               legal   =  leeway;
            }   // not the standard version
            if ( WSTM.g.wNsNumber ) {
               if ( mw.config.get( "wgPageContentModel" )
                                                       === "wikitext" ) {
                  i  =  WSTM.g.wTitle.lastIndexOf( "." );
                  if ( i > 0 ) {
                     select  =  WSTM.g.wTitle.substr( i ).toLowerCase();
                     if ( suffixes.indexOf( select + "." )  >=  0 ) {
                        leeway  =  false;
                        legal   =  false;
                     }
                  }
               } else {
                  leeway  =  false;
                  legal   =  false;
               }
            }   // maybe user namespace
            if ( leeway  &&  ! WSTM.main.isEditable() ) {
               leeway  =  false;
               legal   =  false;
            }   // restriction
         }   // no discussion or special page
         if ( ! legal  &&  leeway ) {   // generally possible
            if ( typeof pg.include  ===  "object" ) {
               legal  =  WSTM.main.isPageMatch( pg.include );
            }   // defined
            if ( ! legal  &&  advanced === true ) {
               select  =  typeof pg.support;
               if ( select === "object" ) {
                  legal  =  WSTM.main.isPageMatch( pg.support );
               } else if ( select === "boolean" ) {
                  legal  =  pg.support;
               }
            }   // interactive?
         }   // leeway
         if ( legal ) {   // bail out?
            if ( typeof pg.exclude  ===  "object" ) {
               legal  =  ! WSTM.main.isPageMatch( pg.exclude );
            }   //  defined
         }
         r  =  legal;
      } else {
         mw.log( WSTM.debugging,
                 ".api.isAppropriate()   failed g.fetch",
                 3 );
      }
      return r;
   };   // .api.isAppropriate()



   WSTM.api.load  =  function ( action ) {
      // Request loading of outsourced modules
      // Precondition:
      //    action  -- user defined external callback function
      //               true:   run automatic
      //               false:  do nothing than updating
      //    Any Wikimedia project
      // Postcondition:
      //    Loading of all dependencies is initiated
      // Remark: May be used as event handler -- 'this' is not accessed
      // Uses:
      //    .prefs.first()
      //    (.main.further)
      // 2015-09-14 PerfektesChaos@de.wikipedia
      WSTM.prefs.first( function () {
                           WSTM.main.further( action );
                        } );
   };   // .api.load()



   WSTM.api.run  =  function () {
      // Launch syntax and user defined replacement manually
      // Precondition:
      //    Wikiserver environment for editpage with "editform"
      // Postcondition:
      //    Returns void(0), as required in GUI action.
      //    wpTextbox1 value of "editform" is modified, if appropriate.
      // Remark: May be used as event handler -- 'this' is not accessed
      // Uses:
      //    >< .config.page.oldid
      //    .api.isAppropriate()
      //    .api.load()
      // 2012-11-02 PerfektesChaos@de.wikipedia
      if ( typeof WSTM.config.page.oldid  !==  "boolean" ) {
         WSTM.config.page.oldid  =  true;
      }
      if ( WSTM.api.isAppropriate( true ) ) {   // fool proof
         WSTM.api.load( true );
      }
      return void( 0 );
   };   // .api.run()



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



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



mw.libs.WikiSyntaxTextMod.bb.errors  =  function ( WSTM ) {
   // Detected syntax error handling
   // Uses:
   //    .util.fiatObjects()
   // 2012-10-11 PerfektesChaos@de.wikipedia
   "use strict";
   WSTM.util.fiatObjects( WSTM,  "errors",  { } );
   WSTM.errors.swift   =  "WikiSyntaxTextMod_errors";



   WSTM.errors.fault  =  function () {
      // Wrap external function for presenting error list
      // Uses:
      //    .errors.format()
      // Remark: Used as event handler -- 'this' is not WSTM.errors
      // 2011-12-23 PerfektesChaos@de.wikipedia
      WSTM.errors.format();
   };   // .errors.fault()



   WSTM.errors.fetch  =  function () {
      // Find error comment in TEXTAREA, and remove if detected
      // Postcondition:
      //    Return true, iff found, and set .errors.story
      // Uses:
      //     < .errors.story
      //    .main.textarea()
      //    .errors.frozen()
      //    (.errors.fault)
      // 2012-10-11 PerfektesChaos@de.wikipedia
      var r       =  false,
          s       =  WSTM.main.textarea( false, false ),
          i,
          j,
          k,
          n,
          scan,
          story;
      this.story  =  false;
      if ( typeof s  ===  "string" ) {
         scan  =  this.frozen();
         i     =  s.indexOf( scan );
         if ( i >= 0 ) {
            n  =  scan.length;
            j  =  s.indexOf( "-->",  i + n );
            if ( j >= 0 ) {
               story   =  s.slice( i + n,  j );
               k       =  story.indexOf( "\n" );
               j      += 3;
               if ( s.charCodeAt( j )  ===  10 ) {   // \n
                  j++;
               }
               s  =  ( i > 0  ?  s.substr( 0, i )  :  "" )
                     +   s.substr( j );
               WSTM.main.textarea( s, true );
               r  =  ( k >= 0 );
               if ( r ) {
                  this.story  =  story.substr( k );
               }
            }
         }   // ErrorMsgID
      } else {   // Spamschutzfilter
         mw.log( WSTM.debugging,
                 ".errors.fetch()  Textarea failed",
                 3 );
      }
      return  r;
   };   // .errors.fetch()



   WSTM.errors.find  =  function () {
      // Retrieve specific formatted error message from sessionStorage
      // Postcondition:
      //    Return value, iff found, and set .errors.swap
      // Uses:
      //    >  sessionStorage
      //    >  .errors.swift
      //    >  .errors.starter
      //     < .errors.joint
      //     < .errors.swap
      //    sessionStorage.getItem()
      //    sessionStorage.()
      //    .errors.fixing()
      // 2015-03-10 PerfektesChaos@de.wikipedia
      var r  =  false,
          s;
      this.swap  =  false;
      if ( typeof window.sessionStorage  ===  "object" ) {
         s  =  window.sessionStorage.getItem( this.swift );
         if ( typeof s  ===  "string"   &&
              s ) {
            this.fixing();
            this.joint  =  s.indexOf( this.starter );
            if ( this.joint >= 0 ) {
               this.swap  =  s;
               r          =  s;
            }
            window.sessionStorage.setItem( this.swift, "" );
         }
      }
      return r;
   };   // .errors.find()



   WSTM.errors.fixing  =  function () {
      // Ensure standardized XML identifier for formatted error message
      // Uses:
      //    >< .g.wRevID
      //    >< .errors.starter
      //    .g.fetch()
      // 2012-10-12 PerfektesChaos@de.wikipedia
      if ( ! this.starter ) {
         WSTM.g.fetch( false, "wgCurRevisionId", "wRevID" );
         this.starter  =  "<WSTM id='" + WSTM.g.wRevID + "'>";
      }
   };   // .errors.fixing()



   WSTM.errors.frozen  =  function () {
      // Retrieve standardized identifier for error message summaries
      // Postcondition:
      //    Return standardized identifier
      // 2011-12-23 PerfektesChaos@de.wikipedia
      var s  =  " ##";   // hide from dumps
      return  "<!-- " + "WikiSyntaxTextMod" + s + " ERROR in PAGE" + s;
   };   // .errors.frozen()



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



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



mw.libs.WikiSyntaxTextMod.bb.main  =  function ( WSTM ) {
   // Top level functions (internal)
   // 2018-09-14 PerfektesChaos@de.wikipedia
   "use strict";
   if ( typeof WSTM.main  !==  "object" ) {
      WSTM.main  =  { };
   }
   WSTM.main.bb      =  false;
   WSTM.main.fiat    =  false;
   WSTM.main.scheme  =  false;
   WSTM.main.score   =  "r";
   WSTM.main.self    =  "User:PerfektesChaos";
   WSTM.main.seal    =  "user:PerfektesChaos/WikiSyntaxTextMod";
   WSTM.main.server  =  "en.wikipedia.org";
   WSTM.main.site    =  "";
   WSTM.main.subdir  =  "WikiSyntaxTextMod";
   WSTM.main.swift   =  "WikiSyntaxTextMod_rvIDs";
   WSTM.main.vc      =  { next: 0,
                          rv:   false };
   if ( typeof WSTM.debugging.site  ===  "string" ) {
      WSTM.main.site  =  WSTM.debugging.site;
   }
   if ( typeof WSTM.vsn  ===  "number" ) {
      if ( typeof WSTM.debugging.prefix  ===  "string" ) {
         WSTM.main.score  =  WSTM.debugging.prefix;
      } else if ( WSTM.vsn < 0 ) {
         WSTM.main.score  =  "d";
      }   // no debugging package defined
      WSTM.vsn  =  WSTM.main.site
                   + "(" + WSTM.main.score + ")"
                   + " Run=" + WSTM.vsn;
   }   // multiple loading?
   if ( typeof WSTM.debugging.subdir  ===  "string" ) {
      WSTM.main.subdir  =  WSTM.debugging.subdir;
   }
   if ( typeof WSTM.debugging.subs  ===  "string" ) {
      WSTM.main.subs  =  WSTM.debugging.subs;
   } else {
      WSTM.main.subs  =  "MWCEIHTXOLUS";
      if ( WSTM.main.site === "file:/" ) {
         WSTM.main.subs  =  WSTM.main.subs + "Z";
      }
   }



   WSTM.main.actionSubmit  =  function () {
      // Perform action=submit mode: Possible error msg to be displayed
      // Precondition:
      //    Interactive mode (web form) with wgAction==submit
      // Remark: Used as event handler -- 'this' is not WSTM.main
      // Uses:
      //    .errors.fetch()
      //    .errors.find()
      //    .api.load()
      //    (.errors.fault)
      // Requires: JavaScript 1.3   charCodeAt()
      // 2012-01-16 PerfektesChaos@de.wikipedia
      var load  =  false;
      if ( WSTM.errors.fetch() ) {
         load  =  true;
      } else if ( WSTM.errors.find() ) {
         load  =  true;
      }
      if ( load ) {
         WSTM.api.load( WSTM.errors.fault );
      }
   };   // .main.actionSubmit()



   WSTM.main.features  =  function ( arrange, alter ) {
      // Handle external scripts, e.g. WikEd
      // Precondition:
      //    arrange  -- undefined:  before load
      //                true:       initialize, no decoration
      //                false:      update
      //    alter    -- if arrange: show pretty change, not only diffpage
      // Remark: Used as event handler -- 'this' is not WSTM.main
      // Uses:
      //    >< .ia
      //    (.main.features)
      //    >  window
      //    >  editToolStrIns::
      //          >< .off
      //          .update()
      //    >  wikEd::
      //          >  .disabled
      //          >< .turnedOn
      //          >< .useWikEd
      //          .Setup()
      //          .UpdateFrame()
      //          .UpdateTextarea()
      //    .util.fiatObjects()
      // Notes:
      //    editToolStrIns:
      //       ...
      //    WikEd -- six cases:
      //       1. First beginning, then major change
      //          -> WSTM, Diff
      //          true, false
      //       2. First beginning, then minor changes
      //          -> WSTM, Setup
      //          true, true
      //       3. First beginning, no changes
      //          -> WSTM, Setup
      //          true, true
      //       4. Later started, then major change
      //          -> Setup?, UpdateTextarea, WSTM, Diff
      //          false, false
      //       5. Later started, then minor changes
      //          -> Setup?, UpdateTextarea, WSTM, UpdateFrame
      //          false, true
      //       6. Later started, no changes
      //          -> Setup?, UpdateTextarea, WSTM
      //          false, false
      // 2020-02-25 PerfektesChaos@de.wikipedia
      var IAEXT,
          wE;
      if ( typeof window  ===  "object" ) {   // online interactive
         WSTM.util.fiatObjects( WSTM,  "ia",
                                { ext:       false,
                                  $editform: false,
                                  $textarea: false } );
         if ( typeof arrange  !== "boolean" ) {   // before load
            WSTM.util.fiatObjects( WSTM.ia,  "ext",  { } );
            IAEXT  =  WSTM.ia.ext;
            if ( typeof mw.libs.editToolStrIns  ===  "object" ) {
               IAEXT.editToolStrIns  =  false;
            }
            if ( typeof window.wikEd === "object"
                 &&  window.wikEd
                 &&  window.wikEd.UpdateTextarea
                 &&  ! IAEXT.wikEd ) {
               wE  =  window.wikEd;
               IAEXT.wikEd  =  { skipWSTM:        true,
                                 setupWSTM:       false,
                                 beginWSTM:       false,
                                 disabled:        wE.disabled,
                                 highlightSyntax: wE.highlightSyntax,
                                 turnedOn:        wE.turnedOn,
                                 useWikEd:        wE.useWikEd };
               if ( window.document
                        .getElementsByName( "wikEdStartupFlag" )[ 0 ] ) {
                  if ( wE.origVersion === wE.lastVersion ) {
                     IAEXT.wikEd.beginWSTM  =  true;
                     wE.highlightSyntax     =  false;
                     wE.disabled            =  true;
                  }
               } else if ( typeof wE.Setup  ===  "function"
                           &&  ! wE.disabled
                           &&  wE.turnedOn
                           &&  wE.useWikEd) {
                  try {
                     wE.RemoveEventListener( window,
                                             "load",
                                             wE.Setup,
                                             false  );
                  } catch ( e1 ) {
                  }
                  try {
                     wE.RemoveEventListener( window.document,
                                             "DOMContentLoaded",
                                             wE.Setup,
                                             false );
                  } catch ( e2 ) {
                  }
               }
            }   // wikEd
         } else if ( WSTM.ia.ext ) {   // after load, any
            IAEXT  =  WSTM.ia.ext;
            if ( IAEXT.wikEd ) {
               wE  =  window.wikEd;
               if ( arrange ) {
                  if ( IAEXT.wikEd.beginWSTM ) {
                     if ( typeof IAEXT.wikEd.disabled  ===  "boolean" ) {
                        IAEXT.wikEd.setupWSTM  =  true;
                     }
                  }
                  if ( ! IAEXT.wikEd.setupWSTM  &&
                       ! IAEXT.wikEd.beginWSTM ) {
                     // asynchronous overrun
                     if ( IAEXT.wikEd.flag ) {
                        IAEXT.wikEd.flag.removeAttribute( "name" );
                        IAEXT.wikEd.flag  =  false;
                     }
                     if ( typeof wE.Setup  ===  "function" ) {
                        wE.Setup();
                     }
                     IAEXT.wikEd.disabled   =  wE.disabled;
                     wE.disabled  =  false;
                     IAEXT.wikEd.setupWSTM  =  true;
                  }
               }
               if ( ! IAEXT.wikEd.beginWSTM
                    &&  ! wE.disabled
                    &&  wE.turnedOn
                    &&  wE.useWikEd ) {
                  if ( arrange ) {
                     wE.UpdateTextarea( null );
                     wE.config.onHook.push( WSTM.main.features );
                  } else {
                     if ( alter ) {
                        wE.highlightSyntax  =
                                             IAEXT.wikEd.highlightSyntax;
                        wE.useWikEd         =  IAEXT.wikEd.useWikEd;
                        if ( wE.useWikEd ) {
                           wE.UpdateFrame( null );
                        }
                     } else {
                        wE.disabled  =  true;
                        wE.useWikEd  =  false;
                     }
                  }
                  IAEXT.wikEd.beginWSTM  =  false;
               }
            }   // "wikEd"
         }
      }   // window
   };   // .main.features()



   WSTM.main.fire  =  function () {
      // Execute appropriate major entry function by interactive call
      // Precondition:
      //    Loading of outsourced modules complete
      // Postcondition:
      //    .main.full() aut idem started
      // Remark: May be used as event handler -- 'this' is not accessed
      // Uses:
      //    >  .g.wNsNumber
      //    >  (.main.full)
      //    >< .main.fiat
      //     < .api.loaded
      //    .main.ready()
      //    .main.features()
      //    .prefs.first()
      //    jQuery().ready()
      //    (.main.fiat)
      // 2015-09-19 PerfektesChaos@de.wikipedia
      var fun;
      WSTM.main.ready( true );
      WSTM.api.loaded  =  true;
      if ( WSTM.g.wNsNumber === -1 ) {
         WSTM.prefs.form();
      } else if ( WSTM.main.fiat ) {
         if ( typeof WSTM.main.fiat  ===  "function" ) {
            fun  =  WSTM.main.fiat;
         } else {
            fun  =  WSTM.main.full;
         }
         WSTM.main.fiat  =  false;
         WSTM.main.features();
         window.jQuery( function () {
                           WSTM.main.features();
                           if ( fun  ===  WSTM.main.full ) {
                              WSTM.prefs.first( WSTM.main.full );
                           } else {
                              fun();
                           }
                        } );
      }
   };   // .main.fire()



   WSTM.main.focus  =  function () {
      // Focus interest on message region
      // Postcondition:
      //    Return jQuery object to insert before into page, or false
      // Uses:
      //    mw.util.addCSS()
      //    jQuery()
      // 2021-05-21 PerfektesChaos@de.wikipedia
      var $r  =  false,
          $e;
      if ( typeof window  ===  "object" ) {   // online
         if ( typeof mw.util  ===  "object" ) {
            mw.util.addCSS( ".cn-fundraiser-banner,"
                            + "#mw-js-message,"
                            + "#siteNotice,"
                            + "#fundraising\n"
                            + "{display: none;}" );
         }
         if ( typeof window.jQuery  ===  "function" ) {   // WMF context
            if ( window.jQuery( ".mw-body-content" ).length ) {
               $e  =  window.jQuery( ".mw-body-content" ).eq( 0 );
            } else if ( window.jQuery( "#article" ).length ) {
               $e  =  window.jQuery( "#article" );
            } else {
               $e  =  window.jQuery( "#content" );
            }
            if ( $e.length ) {
               $r  =  $e;
            }
         }
      }   // window
      return $r;
   };   // .main.focus()



   WSTM.main.follow  =  function () {
      // Test for portlet equipping
      // Precondition:
      //    preferencesGadgetOptions enabled
      // Remark: Used as event handler -- 'this' is not WSTM.main
      // Uses:
      //    >  .config.portlet
      //    .prefs.fetch()
      //    jQuery().ready()
      //    (.main.force)
      // 2012-10-12 PerfektesChaos@de.wikipedia
      WSTM.prefs.fetch();
      if ( WSTM.config.portlet ) {
         window.jQuery( WSTM.main.force );
      }
   };   // .main.follow()



   WSTM.main.force  =  function () {
      // Decorate skin with portlet link to Run()
      // Precondition:
      //    Decoration is suitable and desired.
      // Remark: Used as event handler -- 'this' is not WSTM.main
      // Uses:
      //    >  .vsn
      //    >  .type
      //    >  .config.portlet
      //     < .main.$portlet
      //    jQuery::
      //       .trim()
      //       ().get()
      //       ().find()
      //       ().click()
      //    mw::
      //       .config.get()
      //       .util.addPortletLink()
      // 2015-02-24 PerfektesChaos@de.wikipedia
      var say     =  "Start WikiSyntaxTextMod * Version: " + WSTM.vsn,
          scope   =  false,
          select  =  "ca-WSTM-run",
          show    =  WSTM.type,
          stick   =  false,
          swift   =  null,
          s,
          $li;
      if ( typeof WSTM.config.portlet  ===  "object" ) {
         s  =  WSTM.config.portlet.scope;
         if ( typeof s  ===  "string" ) {
            s  =  window.jQuery.trim( s );
            if ( s.charCodeAt( 0 )  ===  35 ) {   // '#'
               s  =  s.substr( 1 );
            }
            if ( s.length ) {
               scope  =  s;
            }
         }
         s  =  WSTM.config.portlet.show;
         if ( typeof s  ===  "string" ) {
            s  =  window.jQuery.trim( s );
            if ( s.length ) {
               show  =  s;
            }
         }
         s  =  WSTM.config.portlet.stick;
         if ( typeof s  ===  "string" ) {
            s  =  window.jQuery.trim( s );
            if ( s.length ) {
               stick  =  s;
            }
         }
         s  =  WSTM.config.portlet.swift;
         if ( typeof s  ===  "string" ) {
            s  =  window.jQuery.trim( s );
            if ( s.length ) {
               swift  =  s;
            }
         }
      } else {
         WSTM.config.portlet  =  { };
      }
      if ( ! scope ) {
         if ( mw.config.get( "skin" )  ===  "vector" ) {
            scope  =  "p-cactions";
         }
      }
      if ( scope === "p-cactions" ) {
         $li  =  window.jQuery( window.document )
                       .find( "#p-cactions .menu li" );
         if ( $li.length ) {
            stick  =  $li.get( 0 );
         } else {
            stick  =  "#-";
         }
      } else if ( ! scope ) {
         scope  =  "p-tb";
      }
      if ( ! stick ) {
         if ( scope === "p-tb" ) {
            stick  =  "#t-whatlinkshere";
         }
      }
      if ( typeof WSTM.main.$portlet  ===  "object" ) {
         WSTM.main.$portlet.remove();
      }
      WSTM.main.$portlet  =  mw.util.addPortletLink( scope,
                                                     "#",
                                                     show,
                                                     select,
                                                     say,
                                                     swift,
                                                     stick );
      WSTM.main.$portlet  =  window.jQuery( WSTM.main.$portlet );
      WSTM.main.$portlet.click( function () {   WSTM.api.load( true );
                                            } );
   };   // .main.force()



   WSTM.main.further  =  function ( action ) {
      // Perform loading of outsourced modules
      // Precondition:
      //    action  -- user defined external callback function
      //               true:   run automatic
      //               false:  do nothing than updating
      //    preferencesGadgetOptions enabled
      //    Any Wikimedia project
      // Postcondition:
      //    Loading of all dependencies is initiated
      // Remark: May be used as event handler -- 'this' is not accessed
      // Uses:
      //    >  .api.loaded
      //    >  .main.subs
      //    >  .debugging
      //    >  .debugging.feeder
      //    >  .debugging.loud
      //    >  .main.score
      //    >  .main.server
      //    >  .main.site
      //    >  .main.self
      //    >  .main.subdir
      //    >  .g.wNsNumber
      //    >< .main.vsn
      //     < .main.fiat
      //     < .main.sister
      //    .util.yymmddhhmmss()
      //    .prefs.first()
      //    WSTM.main.load()
      //    .main.vc.update()
      //    (.main.fire)
      // Requires: JavaScript 1.3   charCodeAt()
      // 2018-09-14 PerfektesChaos@de.wikipedia
      var lazy    =  ( action !== false  &&  ! WSTM.api.loaded ),
          local   =  false,
          b,
          i,
          k,
          n,
          s,
          saver,
          script,
          sign,
          stamp,
          use;
      if ( ! WSTM.api.loaded   &&
           typeof WSTM.debugging  === "object" ) {
         if ( typeof WSTM.debugging.feeder  ===  "function" ) {
            if ( action ) {
               local  =  WSTM.debugging.feeder( WSTM.main.subs );
            } else {
               local  =  true;
            }
         } else if ( WSTM.debugging.loud ) {
            lazy  =  false;
         }
      }
      if ( action ) {
         b  =  typeof action;
         if ( b === "function"  ||  b === "boolean" ) {
            WSTM.main.fiat  =  action;
            if ( action === true ) {
               WSTM.prefs.first();
            }
         }   // action
      }   // action
      if ( WSTM.api.loaded && action ) {
         WSTM.prefs.first( WSTM.main.fire );
      } else if ( ! local) {
         k         =  ( WSTM.main.site === "test" ? 9 : 7 );
         saver     =  false;
         stamp     =  WSTM.util.yymmddhhmmss( new Date() );
         WSTM.vsn  =  WSTM.vsn + "*";
         n         =  ( action ? WSTM.main.subs.length : 0 );
         script    =  WSTM.main.self + "/js/"
                      + WSTM.main.subdir + "/" + WSTM.main.score;
         stamp     =  stamp.substr( 0, k );
         if ( n > 0 ) {
            use  =  [ ];
            for ( i = 0;  i < n;  i++ ) {
               s      =  WSTM.main.subs.substr( i, 1 );
               saver  =  WSTM.main.vc.get( s );
               if ( ! saver ) {
                  saver  =  stamp;
               }
               sign  =  WSTM.main.seal + "/" + s;
               WSTM.main.load( sign,
                               WSTM.main.server,
                               script + s + ".js",
                               saver );
               use.push( sign );
            }   // for i
         }
         if ( action  ||  WSTM.g.wNsNumber === -1 ) {
            WSTM.prefs.first( WSTM.main.fire, use );
         }   // already loaded, continue right now
         WSTM.main.vc.update();
      }
   };   // .main.further()



   WSTM.main.isEditable  =  function () {
      // Is the current user permitted to edit this page?
      // Postcondition:
      //    Return true iff no restriction detected
      // Uses:
      //    mw.config.get()
      // 2015-10-24 PerfektesChaos@de.wikipedia
      var env     =  mw.config.get( [ "wgRestrictionEdit",
                                      "wgUserGroups" ] ),
          dont    =  env.wgRestrictionEdit,
          r       =  true,
          groups,
          i,
          j,
          m,
          n,
          ng,
          p,
          trsl;
      if ( dont   &&   typeof dont  ===  "object" ) {
         n  =  dont.length;
         if ( n ) {
            groups  =  env.wgUserGroups;
            r       =  false;
            if ( groups ) {
               ng  =  groups.length;
               if ( ng ) {
                  trsl  =  { autoconfirmed:       "autoconfirmed",
                             editeditorprotected: "editor",
                             sysop:               "sysop" };
                  m     =  n;
                  for ( i = 0;  i < n;  i++ ) {
                     p  =  trsl[ dont[i] ];
                     if ( p ) {
                        for ( j = 0;  j < ng;  j++ ) {
                           if ( p === groups[ j ] ) {
                              m--;
                              break;   // for j
                           }
                        }   // for j
                     } else {   // may contain "" or null
                        m--;
                     }
                  }   // for i
                  r  =  ( m === 0 );
               }
            }
         }
      }
      return r;
   };   // .main.isEditable



   WSTM.main.isPageMatch  =  function ( accomplish ) {
      // Does current page accomplish?
      // Precondition:
      //    accomplish  -- array of rules
      //                   Each rule is a string interpreted as RegExp
      //                   Generally any matching of article / page name
      //                   If starting with ':', it is full qualified
      //                   Full qualified starts with ":DB:"
      //                   DB is a project name like
      //                   "enwiki", "commonswiki", "svwikisource"
      // Postcondition:
      //    Returns true
      //            iff current page is matched by any rule in accomplish
      // Uses:
      //    >< .g.wDBname
      //    >< .g.wPageName
      //    .g.fetch()
      //    jQuery.isArray()
      // Requires: JavaScript 1.3   charCodeAt()
      // 2012-11-11 PerfektesChaos@de.wikipedia
      var f  =  false,
          e,
          i,
          k,
          n,
          r;
      if ( window.jQuery.isArray( accomplish ) ) {
         WSTM.g.fetch( false, "wgDBname",   "wDBname" );
         WSTM.g.fetch( false, "wgPageName", "wPageName" );
         if ( WSTM.g.wDBname   !== null  &&
              WSTM.g.wPageName !== null ) {
            n  =  accomplish.length;
            for ( i = 0;  i < n;   i++ ) {
               e  =  accomplish[i];
               if ( typeof e  ===  "string" ) {
                  if ( e.charCodeAt( 0 ) === 58 ) {   // ':'
                     k  =  WSTM.g.wDBname.length;
                     if ( e.charCodeAt( k+1 ) !== 58 ) {   // ':'
                        k  =  false;
                     } else if ( e.substr( 1, k )
                                 !==  WSTM.g.wDBname ) {
                        k  =  false;
                     } else {
                        e  =  "^"  +  e.substr( k + 2 );
                     }
                     if ( ! k ) {
                        k  =  e.substr( 1 ).indexOf( ":" );
                        r  =  "^"  +  e.substr( 1, k )  +  "$";
                        r  =  new RegExp( r, "i" );
                        if ( r.test( WSTM.g.wDBname ) ) {
                           e  =  "^"  +  e.substr( k + 2 );
                        } else {
                           e  =  false;
                        }
                     }
                  }   // full qualified
                  if ( e ) {
                     r  =  new RegExp( e, "i" );
                     f  =  r.test( WSTM.g.wPageName );
                     if ( f ) {
                        break;   // for i
                     }   // match
                  }   // wgDBname match
               }   // string
            }   // for i
         }   // crash-safe global
      }   // isArray
      return f;
   };   // .main.isPageMatch()



   WSTM.main.load  =  function ( assigned, at, access, age, after ) {
      // Load external script
      // Precondition:
      //    assigned  -- signature
      //    at        -- domain
      //    access    -- page name (encoded)
      //    age       -- maxage, or not
      //    after     -- cache appendix, or not
      // Uses:
      //    mw.loader.getState()
      //    mw.loader.state()
      // 2018-09-10 PerfektesChaos@de.wikipedia
      var rls, s;
      if ( ! mw.loader.getState( assigned ) ) {
         rls = { };
         rls[ assigned ] = "loading";
         mw.loader.state( rls );
         s  =  "https://" + at + "/w/index.php?title=" + access
               + "&action=raw&ctype=text/javascript";
         if ( age ) {
            s  =  s + "&bcache=1&maxage=" + age;
         }
         if ( after ) {
            s  =  s + "&" + after + "*";
         }
         mw.loader.load( s );
      }
   };   // WSTM.main.load()



   WSTM.main.ready  =  function ( all ) {
      // Declare ResourceLoader state, trigger loadWikiScript event
      // Precondition:
      //    all  -- false:  head module only
      //            true:   including any sub-module
      // Uses:
      //    >  .main.seal
      //     < .api.loaded
      //    mw.loader.getState()
      //    mw.loader.state()
      //    mw.hook()
      //    jQuery().trigger()
      // 2018-09-03 PerfektesChaos@de.wikipedia
      var sign  =  this.seal  +  ( all ? "/*" : "" ),
          rls;
      if ( all ) {
         WSTM.api.loaded  =  true;
      }
      if ( mw.loader.getState( sign )  !==  "ready" ) {
         rls  =  { };
         rls[ sign ] = "ready";
         mw.loader.state( rls );
      }
      if ( typeof mw.hook  !==  "undefined" ) {
         mw.hook( "WikiSyntaxTextMod.ready" ).fire();
         if ( all ) {
            mw.hook( "WikiSyntaxTextMod/*.ready" ).fire();
         }
      }
      if ( typeof window.jQuery  ===  "function" ) {   // WMF context
         window.jQuery( window.document ).trigger( "loadWikiScript",
                                                   [ sign ] );
      }
   };   // .main.ready()



   WSTM.main.textarea  =  function ( alter, advance ) {
      // Retrieve or replace wikitext using edit area
      // Precondition:
      //    Interactive mode (web form)
      //    alter   -- false or undefined: Retrieve wikitext
      //               string:             Modified wikitext to be stored
      //    advance -- true: no formatting required,
      //                     quick update; diffpage will be shown next
      // Postcondition:
      //    Return  string:  wpTextbox1 content  if ! alter
      //            false:   if alter
      //                     if ! alter:  editform unavailable
      //                                  or area not modifiable
      // Uses:
      //    >  .ia
      //    >< .ia.$editform
      //    >< .ia.$textarea
      //    .main.features()
      //    jQuery()
      //    "editform"
      //       >< .wpTextbox1
      // 2012-02-14 PerfektesChaos@de.wikipedia
      var r      =  false,
          $box,
          $form;
      if ( WSTM.ia ) {   // online interactive and initialized
         if ( ! WSTM.ia.$editform ) {
            $form  =  window.jQuery( "#editform" );
            if ( $form.length ) {   // editing
               $box  =  window.jQuery( "#wpTextbox1" );
               if ( $box.length ) {   // textarea
                  if ( ! $box.attr( "readonly" ) ) {   // modifiable
                     WSTM.ia.$editform  =  $form;
                     WSTM.ia.$textarea  =  $box;
                  }   // modifiable
               }   // textarea
            }   // editing
         }   // ! $editform
         if ( WSTM.ia.$textarea ) {
            this.features( true );
            if ( typeof alter  ===  "string" ) {   // replace
               WSTM.ia.$textarea.val( alter );
               this.features( false,  ! advance );
            } else {   // retrieve
               r  =  WSTM.ia.$textarea.val();
            }   // mode
         }   // $textarea
      }   // online
      return r;
   };   // .main.textarea()



   WSTM.main.wait  =  function ( aware, aged ) {
      // Wait for loading of outsourced modules
      // Precondition:
      //    aware  -- letter of module finished loading:  "L", "U", ...
      //    aged   -- version number of module
      //    Loading of _L and _U and ... in progress
      //    preferencesGadgetOptions ready
      // Postcondition:
      //    .main.full() aut idem started, when all ready
      //    else wait (do nothing)
      // Uses:
      //    >  .main.subs
      //    >  .main.$portlet
      //    >  .type
      //    >  .g.wNsNumber
      //    >  .api.loaded
      //    >< .main.bb
      //    >< .vsn
      //    jQuery().find()
      //    jQuery().attr()
      //    .main.fire()
      // 2015-02-24 PerfektesChaos@de.wikipedia
      var launch  =  true,
          n       =  this.subs.length,
          e,
          i,
          s;
      if ( ! this.bb ) {
         this.bb  =  { };
      }
      for ( i = 0;  i < n;  i++ ) {
         s  =  this.subs.substr( i, 1 );
         if ( ! this.bb[ s ] ) {
            this.bb[ s ]  =  { load: false,
                               vsn:  0 };
         }
      }   // for i
      for ( i = 0;  i < n;  i++ ) {
         s  =  this.subs.substr( i, 1 );
         e  =  this.bb[ s ];
         if ( s === aware ) {
            if ( ! e.load ) {
               e.vsn     =  aged;
               e.load    =  true;
               WSTM.vsn  =  WSTM.vsn + ", " + aware + "=" + aged;
            }   // still working
         } else if ( ! e.load ) {
            launch  =  false;
         }   // missing
      }   // for i
      if ( typeof this.$portlet  ===  "object" ) {
         s  =  "Start WikiSyntaxTextMod * Version: " + WSTM.vsn;
         this.$portlet.find( "a" ).attr( "title", s );
      }
      if ( launch  &&  ! WSTM.api.loaded ) {
         this.fire();
      }
   };   // .main.wait()



   WSTM.main.vc.format  =  function ( about, assign ) {
      // Format revision ID of outsourced module for cookie
      // Precondition:
      //    about   -- module type (single letter)
      //    assign  -- revision ID (number or RE string)
      // Postcondition:
      //    Returns string to be appended
      // Uses:
      //    >  .main.score
      //    >  .main.site
      // 2012-01-14 PerfektesChaos@de.wikipedia
      var r  =  this.score + about + "_" + assign + "~";
      if ( this.site.length ) {
         r  =  this.site + "-" + r;
      }
      return r;
   };   // .main.vc.format()



   WSTM.main.vc.get  =  function ( about ) {
      // Query revision IDs of outsourced modules
      // Precondition:
      //    about  -- module type (single letter)
      // Postcondition:
      //    Returns  false   if unknown
      //             string  with revision ID
      // Uses:
      //    >  localStorage
      //    >  .main.swift
      //    >  .main.score
      //    >< .main.vc.rv
      //     < .main.vc.next
      //    localStorage.getItem()
      //    mw.cookie.set()
      // 2018-09-10 PerfektesChaos@de.wikipedia
      var i, r, rv, s, store;
      if ( this.rv ) {
         r  =  this.rv[ about ];
      } else {
         this.rv  =  { };
         r        =  false;
         if ( typeof window.localStorage  ===  "object" ) {
            try {
               store  =  window.localStorage.getItem( WSTM.main.swift );
            } catch ( err ) {
            }
         } else {
            store  =  window.mw.cookie.get( WSTM.main.swift );
         }
         if ( store ) {
            rv  =  store.split( "~" );
            if ( rv[ 0 ] ) {
               this.next  =  parseInt( rv[ 0 ], 10 );
               if ( ! isNaN( this.next )  &&  this.next > 0 ) {
                  for ( i = 1;  i < rv.length;  i++ ) {
                     s  =  rv[ i ];
                     if ( s.substr( 0, 1 )  ===  WSTM.main.score ) {
                        this.rv[ s.substr( 1, 1 ) ]  =
                                           parseInt( s.substr( 3 ), 10 );
                     }
                  }   // for i
                  r  =  this.rv[ about ];
               }
            }
         }
      }
      return r;
   };   // .main.vc.get()



   WSTM.main.vc.put  =  function ( arrived ) {
      // Put revision ID of outsourced module into cookie
      // Precondition:
      //    arrived  -- versionControl data
      // Postcondition:
      // Uses:
      //    >  localStorage
      //    >  .main.subdir
      //    localStorage.setItem()
      //    mw.cookie.set()
      // 2018-09-10 PerfektesChaos@de.wikipedia
      var date,
          e,
          i,
          k,
          rv,
          store,
          sub;
      if ( typeof arrived  ===  "object"
           &&     arrived   &&
           typeof arrived.revisions  ===  "object"
           &&     arrived.revisions   &&
           typeof arrived.revisions.length  ===  "number" ) {
         date   =  new Date();
         store  =  date.valueOf() + "~";
         sub    =  "js/" + WSTM.main.subdir + "/";
         k      =  sub.length;
         rv     =  arrived.revisions;
         for ( i = 0;  i < rv.length;  i++ ) {
            e  =  rv[ i ];
            if ( typeof e  ===  "object"
                 &&     e   &&
                 typeof e.src  ===  "string"   &&
                 typeof e.id   ===  "number" ) {
               if ( e.src.substr( 0, k )  ===  sub   &&
                    e.src.substr( k +1, 1 )  !==  "."   &&
                    e.id ) {
                  store  =  store + e.src.substr( k, 2 )  +  "_"
                                  + e.id + "~";
               }
            }
         }   // for i
         if ( typeof window.localStorage  ===  "object" ) {
            try {
               window.localStorage.setItem( WSTM.main.swift, store );
            } catch ( err ) {
            }
         } else {
            window.mw.cookie.set( WSTM.main.swift,
                                  store,
                                  { expires: 7,
                                    path:    "/" } );
         }
      }
   };   // .main.vc.put()



   WSTM.main.vc.update  =  function () {
      //    >  .main.score
      //    >  .main.vc.next
      //    WSTM.main.load()
      //    mw.hook()
      //    (.main.vc.put)
      // 2018-09-19 PerfektesChaos@de.wikipedia
      var date, max;
      if ( typeof mw.hook  !==  "undefined" ) {
         date  =  new Date();
         max   =  ( WSTM.main.score === "d"  ?  1000000  :  86400000 );
         if ( date.valueOf() - max  >  this.next ) {
            WSTM.main.load( "user:PerfektesChaos/versionControl",
                            "en.wikipedia.org",
                            "User:PerfektesChaos/js/versionControl/" +
                            WSTM.main.score + ".js" );
            mw.hook( "user:PerfektesChaos/versionControl.retrieve" )
              .fire( { "site":  "en.wikipedia.org",
                       "space": "User:PerfektesChaos",
                       "store": "versionControl" },
                     function ( answer ) {
                        WSTM.main.vc.put( answer );
                     } );
         }
      }
   };   // .main.vc.update()



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



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



mw.libs.WikiSyntaxTextMod.bb.prefs  =  function ( WSTM ) {
   // Preferences (interactive on Special:Gadgets)
   // 2018-09-10 PerfektesChaos@de.wikipedia
   "use strict";
   WSTM.util.fiatObjects( WSTM,
                          "prefs",
                          { loaded: false,
                            supply: "preferencesGadgetOptions" } );



   WSTM.prefs.fetch  =  function () {
      // Retrieve preferences and overwrite presets
      // Uses:
      //    >  .prefs.supply
      //    >  .type
      //    >< .config.portlet
      //     < .config.diffPage
      //    mw.libs.preferencesGadgetOptions.fetch()
      // 2015-09-15 PerfektesChaos@de.wikipedia
      var vals  =  false;
      if ( typeof mw.libs[ this.supply ]   ===  "object"
           &&     mw.libs[ this.supply ]
           &&     mw.libs[ this.supply ].fetch ) {
         vals  =  mw.libs[ this.supply ].fetch( WSTM.type );
      }
      if ( vals ) {
         WSTM.config.diffPage  =  vals.diffPage;
         if ( ! WSTM.config.portlet
              ||   typeof WSTM.config.portlet  ===  "boolean" ) {
            WSTM.config.portlet  =  vals.portlet;
         }
      }
   };   // .prefs.fetch()



   WSTM.prefs.first  =  function ( after, also ) {
      // Prepare ResourceLoader availability of preferencesGadgetOptions
      // Precondition:
      //    after  -- function to continue
      //    also   -- array of more prerequisites, or false
      // Postcondition:
      //    load requested, if not yet defined
      // Uses:
      //    this
      //    >  .prefs.supply
      //    WSTM.main.load()
      //    mw.loader.using()
      //    .prefs.follow()
      //    (.prefs.follow)
      // 2018-09-10 PerfektesChaos@de.wikipedia
      WSTM.main.load( "ext.gadget." + this.supply,
                      "en.wikipedia.org",
                      "User:PerfektesChaos/js/" + this.supply + "/r.js",
                      604801 );
      if ( after ) {
         if ( also ) {
            mw.loader.using( also,
                             function () {   WSTM.prefs.follow( after );
                                         } );
         } else {
            WSTM.prefs.follow( after );
         }
      }
   };   // .prefs.first()



   WSTM.prefs.follow  =  function ( action ) {
      // Register main start function for launch when options ready
      // Precondition:
      //    action  -- function to continue
      // Uses:
      //    >  .prefs.supply
      //    >< .prefs.loaded
      //    mw.hook()
      //    (action)
      // Remark: May be used as event handler -- 'this' is not accessed
      // 2018-09-06 PerfektesChaos@de.wikipedia
      if ( WSTM.prefs.loaded ) {
         action();
      } else {
         mw.hook( WSTM.prefs.supply + ".ready" )
            .add( function () { WSTM.prefs.loaded  =  true;
                                action();
                              } );
      }
   };   // .prefs.follow()



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



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



if ( typeof window  ===  "object"  &&  window ) {   // online
   // Convenience methods (interactive)
   // 2013-03-08 PerfektesChaos@de.wikipedia



   window.WikiSyntaxTextMod_About  =  function () {
      // Pop up message box with version information, or return version
      // Postcondition:
      //    Message box is displayed.
      //    Returns void(0), as required in GUI action, if browser window
      // Uses:
      //    >  window
      //    >  .vsn
      //    .main.focus()
      //    jQuery()
      /// 2018-09-03 PerfektesChaos@de.wikipedia
      "use strict";
      var r  =  mw.libs.WikiSyntaxTextMod.vsn,
          $c,
          $m;
      if ( typeof window  ===  "object" ) {   // online
         $c  =  mw.libs.WikiSyntaxTextMod.main.focus();
         if ( $c ) {
            $m  =  window.jQuery( "<div>" );
            $m.css( "border", "solid 1px #0000FF" )
              .text( r );
            $c.before( $m );
         }
         if ( typeof window.console  ===  "object"   &&
              typeof window.console.info  ===  "function" ) {
            window.console.info( r );
         }
         if ( typeof window.alert  ===  "function" ) {
            window.alert( r );
         }
         r  =  void( 0 );
      }
      return r;
   };   // WikiSyntaxTextMod_About()



   window.WikiSyntaxTextMod_Run  =  function  () {
      // External access (API): Launch replacement manually
      // Uses:
      //    .api.run()
      // 2012-02-12 PerfektesChaos@de.wikipedia
      "use strict";
      mw.libs.WikiSyntaxTextMod.api.run();
      return void( 0 );
   };   // WikiSyntaxTextMod_Run()



}   // window "object"



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



mw.libs.WikiSyntaxTextMod.bb.auto  =  function ( WSTM ) {
   // Start execution on import
   // 2012-10-03 PerfektesChaos@de.wikipedia
   "use strict";



   WSTM.autoRun  =  function () {
      // Load and start WikiSyntaxTextMod, if appropriate
      // Precondition:
      //    Wikiserver environment
      // Postcondition:
      //    Returns void(0), as required in GUI action, if browser window
      // Remark: Used as event handler -- 'this' is not WSTM
      // Uses:
      //    >  .g.wNsNumber
      //    >  .config.load.urlPar
      //    >  .config.load.inhibit
      //    >  .config.load.api
      //    >  .config.load.updater
      //    >< .g.wPageName
      //     < .main.lockAuto
      //    .g.fetch()
      //    .prefs.first()
      //    .api.isAppropriate()
      //    mw.loader.using()
      //    .main.features()
      //    .main.actionSubmit()
      //    mw.util.getParamValue()
      //    mw.config.get()
      //    jQuery().ready()
      //    (.api.load)
      //    (.main.follow)
      // 2016-10-08 PerfektesChaos@de.wikipedia
      var launch  =  false,
          lookup  =  false,
          luxury  =  false,
          later,
          learn,
          load,
          lock,
          re,
          start;
      WSTM.main.lockAuto  =  true;
      WSTM.g.fetch( false, "wgNamespaceNumber", "wNsNumber" );
      lock  =  ( WSTM.g.wNsNumber === -1 );
      if ( lock ) {
         luxury  =  ( mw.config.get( "wgCanonicalSpecialPageName" )
                                                       === "Blankpage" );
      } else {
         WSTM.config.load.urlPar  =  mw.util.getParamValue( "wstm" );
         if ( typeof WSTM.config.load.urlPar  ===  "string" ) {
            re  =  new RegExp( "^(0|false$|n|inhibit)" );
            if ( re.test( WSTM.config.load.urlPar ) ) {
               lock  =  true;
            }
         }   // &wstm=
         if ( typeof WSTM.config.load.inhibit  ===  "boolean" ) {
            lock  =  WSTM.config.load.inhibit;
         }
         load  =  ! lock;
         if ( load   &&
              WSTM.g.fetch( undefined, false ) ) {
            load  =  ! mw.config.get( "wgIsArticle" );
         }   // ! wgIsArticle
      }
      if ( load ) {
         start  =  mw.util.getParamValue( "action" );
         learn  =  false;
         if ( start === "edit" ) {
            learn  =  ( !  ( mw.util.getParamValue( "undo" )  ||
                             mw.util.getParamValue( "undoafter" ) ) );
         } else if ( start === "submit" ) {
            lookup  =  true;
         }
         if ( learn || lookup ) {
            load    =  WSTM.api.isAppropriate( false );
            launch  =  learn;
            if ( lookup ) {
               lookup  =  ( WSTM.g.wNsNumber % 2  ===  0 );
               if ( lookup ) {
                  lookup  =  WSTM.api.isAppropriate( true );
               }
            }
         }
      }   // "edit" is always a non-regular page, never IsArticle
      if ( ! load ) {
         if ( typeof WSTM.config.load.updater  ===  "string" ) {
            if ( WSTM.config.load.updater.length ) {
               WSTM.g.fetch( false, "wgPageName", "wPageName" );
               if ( WSTM.g.wPageName !== null ) {
                  re    =  new RegExp( WSTM.config.load.updater, "i" );
                  load  =  ( re.test( WSTM.g.wPageName ) );
               }   // wgPageName
            } else {
               load  =  true;
            }
         }   // config.load.updater
      }   // .config.load.inhibit
      if ( load || luxury || WSTM.config.load.api ) {
         WSTM.api.load( launch || luxury );
      }   // Do it!
      if ( lookup || launch ) {
         if ( lookup ) {
            WSTM.main.features();
            WSTM.prefs.first( function () {
                                 window.jQuery( WSTM.main.actionSubmit );
                              } );
         }
         if ( ! lookup  &&  launch ) {
            later  =  WSTM.api.isAppropriate( true );
         } else {
            later  =  lookup;
         }
         if ( later ) {
            WSTM.prefs.first( WSTM.main.follow );
         }
      }
      return void( 0 );
   };   // .autoRun()



   if ( typeof window  ===  "object"
        &&     window   &&             // online
        typeof WSTM.main.lockAuto  !==  "boolean"   &&
        typeof mw  ===  "object"
        &&     mw   &&
        typeof mw.loader  ===  "object"   &&
        typeof window.jQuery  !==  "undefined"
        &&     window.jQuery ) {
      WSTM.main.lockAuto  =  true;
      WSTM.main.ready( false );
      mw.loader.using( [ "user",
                         "user.options",
                         "mediawiki.user",
                         "mediawiki.util",
                         "mediawiki.cookie" ],
                       WSTM.autoRun );
   }
   if ( typeof WSTM.config.load  ===  "object"
        &&     WSTM.config.load   &&
        typeof WSTM.config.load.after  ===  "function" ) {
      WSTM.config.load.after();
   }
};   // .bb.auto()
mw.libs.WikiSyntaxTextMod.bb.auto( mw.libs.WikiSyntaxTextMod );
delete mw.libs.WikiSyntaxTextMod.bb.auto;



void( 0 );



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

/// EOF </nowiki>   WikiSyntaxTextMod/d.js