MediaWiki:Gadget-importUtility/utl.js

In diesem Artikel wird das Thema MediaWiki:Gadget-importUtility/utl.js aus verschiedenen Perspektiven behandelt, mit dem Ziel, eine globale und vollständige Sicht auf dieses relevante Thema zu bieten. Es werden verschiedene Aspekte im Zusammenhang mit MediaWiki:Gadget-importUtility/utl.js analysiert und seine Auswirkungen auf sozialer, wirtschaftlicher, politischer und kultureller Ebene untersucht. Darüber hinaus werden die neuesten Forschungsergebnisse und Fortschritte auf diesem Gebiet sowie die Meinungen von Experten und Spezialisten auf diesem Gebiet untersucht. MediaWiki:Gadget-importUtility/utl.js ist ein Thema von großem Interesse und Aktualität, das eine detaillierte und gründliche Untersuchung verdient. Aus diesem Grund möchte dieser Artikel eine umfassende Vision bieten, um seine Bedeutung und seinen Umfang zu verstehen.
/// Gadget-importUtility/utl.js
//  Shared utilities for any kind of page
/// 2018-08-24 [email protected]
//  ResourceLoader: compatible;
//    dependencies: user, mediawiki.util
//  Namespaces:     *
//  Build:          .utl .batch .cnf .known
//  Documentation:  ]
/// Fingerprint:    #0#0#
/// @license GPL  (+GFDL, LGPL, CC-BY-SA)
/// <nowiki>
/* global window: false                                                */
/* jshint forin: false,
          bitwise:true, curly:true, eqeqeq:true, latedef:true,
          laxbreak:true,
          nocomma:true, strict:true, undef:true, unused:true           */



( function ( mw, $ ) {
   "use strict";
   var Version    =  0.903,
       IUTIL      =  "importUtility",
       Self       =  "utl",
       SIG        =  "ext.gadget." + IUTIL,
       SIGNATURE  =  SIG + "." + Self;
   if ( typeof mw.libs  !==  "object"   ||
        ! mw.libs ) {
      mw.libs  =  { };
   }
   mw.libs.type  =  IUTIL;
   IUTIL                  =  mw.libs;
   if ( typeof IUTIL.vsn  ===  "string" ) {
      IUTIL.vsn  =  IUTIL.vsn + " ";
   } else {
      IUTIL.vsn  =  "";
   }
   IUTIL.vsn  =  IUTIL.vsn + Self.substr( 0, 1 ) + "=" + Version;



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



   if ( typeof IUTIL.cnf  !==  "object" ) {
      // Project independent configuration
      IUTIL.cnf  =  { };
   }


   if ( ! IUTIL.cnf.loaded ) {
      IUTIL.cnf.swift    =  IUTIL.type + "Form";
         // OBSOLETING
         // sessionStorage item ID for form data
         // Uses:
         //    >  .type
         // 2012-12-15 [email protected]
      IUTIL.cnf.spooling  =  "//upload.wikimedia.org/wikipedia/commons"
                             + "/d/de/Ajax-loader.gif";
         // throbber URL
         // 2012-12-15 [email protected]



      IUTIL.cnf.texts  =  {
         // 2014-12-30 [email protected]
         "AjaxWait":      {"en": "Contacting server",
                           "de": "Kommuniziere mit dem GROSSEN GURU"},
         "Archive":       {"en": "Resolved",
                           "de": "Erledigt"},
         "Cancel":        {"en": "Cancel",
                           "de": "Abbruch"},
         "Checking":      {"en": "Check origin page ...",
                           "de": "Prüfe Ursprungsseite ..."},
         "Completed":     {"en": "Completed",
                           "de": "Abgearbeitet"},
         "Conflict":      {"en": "Conflict",
                           "de": "Konflikt"},
         "Count":         {"en": "Number of revisions:",
                           "de": "Versionsanzahl:"},
         "Counting":      {"en": "Counting revisions ...",
                           "de": "Zähle Versionen ..."},
         "DeleteIssue":   {"en": "Delete",
                           "de": "Löschen"},
         "Done":          {"en": "(done)",
                           "de": "(erl.)"},
         "Error":         {"en": "ERROR!",
                           "de": "FEHLER!"},
         "ErrorAjax":     {"en": "ERROR!<br />Ajax transfer failed.",
                           "de": "FEHLER!<br />"
                                 + "Ajax (API) fehlgeschlagen."},
         "ErrorAlready":  {"en": "ERROR!\n"
                                 + "Page has been processed already.",
                           "de": "FEHLER!\n"
                                 + "Seite wurde bereits angepasst\n"
                                 + "{{Importartikel}} schon eingefügt."},
         "ErrorData":     {"en": "Data not recognized",
                           "de": "Daten wurden nicht erkannt"},
         "ErrorNoSource": {"en": "ERROR!\nSource page not found.",
                           "de": "FEHLER!\nQuellseite nicht gefunden."},
         "ErrorRedirect": {"en": "ERROR!\nSource page is redirect.",
                           "de": "Hinweis: Quellseite ist Weiterleitung."},
         "ErrorSignat":   {"en": "ERROR!\nSignature not recognized",
                           "de": "FEHLER!\nSignatur nicht lesbar"},
         "Export":        {"en": "Export",
                           "de": "Export"},
         "GetToken":      {"en": "Get token",
                           "de": "Token kaufen"},
         "GreetingAdd":   {"en": "Optional addendum for message,"
                                 + " terminated by greetings."
                                 + " Free pipe symbols '|'"
                                 + " not permitted.",
                           "de": "Optionale Ergänzung der Nachricht,"
                                 + " endend mit Grußformel."},
         "Hold":          {"en": "started",
                           "de": "in Arbeit"},
         "Imported":      {"en": "Import succeeded",
                           "de": "Import erfolgreich"},
         "Imported0":     {"en": "all revisions already present",
                           "de": "Alle Versionen bereits vorhanden"},
         "Imported1":     {"en": "1 revision imported",
                           "de": "1 Version importiert"},
         "ImportedN":     {"en": "revisions imported",
                           "de": "Versionen importiert"},
         "Malicious":     {"en": "Malicious data detected in field",
                           "de": "Bösartige Daten gefunden im Feld"},
         "Modifying":     {"en": "Start page adaption",
                           "de": "Beginne Seitenanpassung"},
         "Move":          {"en": "Move imported page",
                           "de": "Importierte Seite verschieben"},
         "Moved":         {"en": "Page moved",
                           "de": "Importierte Seite verschoben"},
         "MoveSpace":     {"en": "Source not user subpage",
                           "de": "Quellseite keine BNR-Unterseite"},
         "MoveToSame":    {"en": "Source and target page equal",
                           "de": "Quellseite gleich Zielseite"},
         "Moving":        {"en": "Page moving",
                           "de": "Importierte Seite wird verschoben"},
         "NoPreview":     {"en": "No Preview!",
                           "de": "Keine Vorschau!"},
         "NotFound":      {"en": "Page not found",
                           "de": "Seite wurde nicht gefunden"},
         "NoImport":      {"en": "Import failed",
                           "de": "Import gescheitert"},
         "NoToken":       {"en": "Token refused",
                           "de": "Token wurde verweigert"},
         "NoUserName":    {"en": "No user name",
                           "de": "Kein Benutzername"},
         "NoUserPg":      {"en": "Not a user subpage",
                           "de": "Keine Benutzer-Unterseite."},
         "PageAdapt":     {"en": "Adapt page text",
                           "de": "Seitentext anpassen"},
         "PageAdapted":   {"en": "Page has been adapted.",
                           "de": "Seite wurde angepasst."},
         "PageAdapting":  {"en": "Page adaption.",
                           "de": "Seite wird angepasst."},
         "PageUpdated":   {"en": "Page has been updated.",
                           "de": "Seite wurde aktualisiert."},
         "Robinson":      {"en": "No notification required",
                           "de": "Benötigt keine Benachrichtigung"},
         "SendNotifier":  {"en": "Send notification",
                           "de": "Sende Benachrichtigung"},
         "Start":         {"en": "Start import",
                           "de": "Import starten"},
         "Started":       {"en": "Import has been started.",
                           "de": "Import gestartet."},
         "Swap":          {"en": "Request at Upload",
                           "de": "Anfrage auf Upload"},
         "TempPage":      {"en": "Temporary target page:",
                           "de": "Temporäre Zielseite:"},
         "Tic":           {"en": String.fromCharCode(8730)},
         "Update":        {"en": "Update table",
                           "de": "Aktualisiere Tabelle"},
         "UserNotified":  {"en": "User has been notified.",
                           "de": "Benutzer wurde benachrichtigt."},
         "UserNotify":    {"en": "User notifícation",
                           "de": "Benutzer informieren"},
         "UserNotifying": {"en": "User notification.",
                           "de": "Benutzer wird benachrichtigt."}
      };   // .cnf.texts



      IUTIL.cnf.trans  =  {
         // 2012-11-30 [email protected]
         "de" :        "de",
         "de-at" :     "de",
         "de-ch" :     "de",
         "de-formal" : "de",
         "als" :       "de",
         "bar" :       "de",
         "dsb" :       "de",
         "frr" :       "de",
         "gsw" :       "de",
         "hsb" :       "de",
         "ksh" :       "de",
         "lb" :        "de",
         "nds" :       "de",
         "pdc" :       "de",
         "pdt" :       "de",
         "pfl" :       "de",
         "sli" :       "de",
         "stq" :       "de",
         "vmf" :       "de"
      };   // .cnf.trans



      IUTIL.cnf.favorite  =  function () {
         // Guess user language
         // Uses:
         //    this
         //    >  .cnf.trans
         //    >< .cnf.slang
         //    mw.config.get()
         // 2012-12-23 [email protected]
         var s;
         if ( ! this.slang ) {
            s           =  mw.config.get( "wgUserLanguage" );
            s           =  this.trans;
            this.slang  =  ( s ? s : "en" );
         }
      };   // .cnf.favorite()



      IUTIL.cnf.feature  =  function ( apply, adhere ) {
         // Wrap message text access for user or project language
         // Precondition:
         //    apply   -- text keyword
         //    adhere  -- true: project language;  else user language
         // Postcondition:
         //    Return text closest to user language
         // Uses:
         //    this
         //    >  .cnf.slang
         //    >  .cnf.texts
         //    >  .cnf.project.slang
         //    .cnf.favorite()
         // Remark: To be replaced
         //         if one day ResourceLoader3 gives access to
         //         gadget@translatewiki
         // 2012-12-18 [email protected]
         var e,
             r, slang;
         if ( ! this.slang ) {
            this.favorite();
         }
         e  =  this.texts;
         if ( e ) {
            slang  =  ( adhere ? this.project.slang : this.slang );
            r  =  e;
            if ( ! r ) {
               r  =  e.en;
               if ( ! r ) {
                  r  =  "???" + apply + "???";
               }
            }
         } else {
            r  =  "***" + apply + "***";
         }
         return r;
      };   // .cnf.feature()



      IUTIL.cnf.loaded  =  true;
   }   // ! .cnf.loaded



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



   if ( typeof IUTIL.batch  !==  "object" ) {
      // Utilitiy for API communication, displaying current state
      IUTIL.batch  =  { };



      IUTIL.batch.fine  =  function ( apply ) {
         // Equip page with success message
         //    apply  -- message keyword
         // Uses:
         //    this
         //    >  .$msg
         //    jQuery().empty()
         //    jQuery().css()
         //    jQuery().text()
         //    jQuery().append()
         //    .cnf.feature()
         // 2014-10-10 [email protected]
         var $msg;
         IUTIL.$msg.empty();
         IUTIL.$msg.css( { "border":  "solid 1px #00A000",
                           "color":   "#00A000",
                           "margin":  "3px",
                           "padding": "1em" } );
         switch ( typeof apply ) {
            case "function":
            case "object":
               $msg  =  apply;
               break;
            case "string":
               $msg  =  $( "<span>" );
               $msg.text( IUTIL.cnf.feature( apply, false ) );
               break;
            default:
               $msg  =  $( "<strong>" );
               $msg.text( apply );
         }   // switch typeof apply
         IUTIL.$msg.append( $msg );
      };   // .batch.fine()



      IUTIL.batch.fired  =  function ( await ) {
         // Equip page with waiting loop and throbber
         //    await   -- message keyword, or false
         // Uses:
         //    this
         //    >  .$msg
         //    jQuery().empty()
         //    jQuery().css()
         //    .batch.$flow()
         //    jQuery().append()
         //    jQuery().text()
         //    .cnf.feature()
         // 2014-10-10 [email protected]
         var $span  =  $( "<span>" );
         IUTIL.$msg.empty();
         IUTIL.$msg.css( { "border":  "solid 1px #0000FF",
                           "color":   "#0000FF",
                           "margin":  "3px",
                           "padding": "1em" } );
         IUTIL.$msg.append( this.$flow() );
         IUTIL.$msg.append( $span );
         $span  =  $( "<span>" );
         $span.css( { "margin-left": "3em" } );
         $span.text( IUTIL.cnf.feature( ( await ? await : "AjaxWait" ),
                                        false ) );
         IUTIL.$msg.append( $span );
      };   // .batch.fired()



      IUTIL.batch.$flow  =  function ( alter, adapt ) {
         // Create throbber
         // Precondition:
         //    alter  -- number of pixels other than standard, or false
         //    adapt  -- additional style, or false
         // Postcondition:
         //    Return jQuery with throbber IMG
         // Uses:
         //    >  .cnf.spooling
         //    jQuery()
         //    jQuery().attr()
         // 2014-10-10 [email protected]
         var $r  =  $( "<img />" );
         $r.attr( { "src":    IUTIL.cnf.spooling,
                    "height": ( alter ? alter : "24" )
                  } );
         if ( adapt ) {
            $r.attr( "style", adapt );
         }
         return $r;
      };   // .batch.$flow()
   }   // .batch



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



   if ( typeof IUTIL.known  !==  "object" ) {
      // Check existence of user account
      // Dependencies: mediawiki.api
      IUTIL.known  =  { };



      IUTIL.known.fault  =  function ( arrived ) {
         // Show API failure on account check
         // Precondition:
         //    arrived  -- JSON info of ajax query, or false
         // Uses:
         //    .utl.fault()
         //    mw.log()
         // Remark: Used as event handler -- 'this' is not IUTIL.known
         // 2014-10-10 [email protected]
         IUTIL.utl.fault( false );
         mw.log( {loud:true}, "IUTIL.known.fault()", 2, arrived );
      };   // .known.fault()



      IUTIL.known.fire  =  function ( account ) {
         // Check whether account is valid
         // Precondition:
         //    account  -- user name
         // Uses:
         //    >  mw.Api
         //    .utl.furnish()
         //    (.known.found)
         //    (.known.fault)
         // 2013-01-16 [email protected]
         var q   =  new mw.Api(),
             w   =  { action:  "query",
                      list:    "users",
                      ususers: account,
                      usprop:  "blockinfo" };
         IUTIL.utl.furnish();
         q.get( w ).done( this.found )
                   .fail( this.fault );
      };   // .known.fire()



      IUTIL.known.found  =  function ( arrived ) {
         // Process API aucccess on account check
         // Precondition:
         //    arrived  -- JSON info of ajax query, or false
         // Uses:
         //    >  .$div
         //    .cnf.feature()
         //    jQuery()
         //    jQuery().css()
         //    jQuery().text()
         //    jQuery().append()
         // Remark: Used as event handler -- 'this' is not IUTIL.known
         // 2014-10-10 [email protected]
         var q  =  false,
             $div;
         if ( arrived ) {
            q  =  arrived.query;
            if ( q ) {
               q  =  q.users;
               if ( q ) {
                  q  =  q;
                  if ( q ) {
                     if ( ! q.userid ) {
                        $div  =  $( "<div>" );
                        $div.css( { "border":      "solid 5px #FF0000",
                                    "color":       "#FF0000",
                                    "font-weight": "bold",
                                    "margin":      "10px",
                                    "padding":     "1em" } );
                        $div.text( IUTIL.cnf.feature( "NoUserName",
                                                      false )
                                   + ": " + q.name );
                        IUTIL.$div.append( $div );
                     }
                  }
               }
            }
         }
      };   // .known.found()
   }   // .known



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



   if ( typeof IUTIL.utl  !==  "object" ) {
      // Misc utilitiies
      // Dependencies: user, mediawiki.util
      IUTIL.utl  =  { };



      IUTIL.utl.factory   =  function ( adjust, apply ) {
         // Replace placeholders in string
         // Precondition:
         //    adjust  -- base string with possible placeholders  {{{_}}}
         //               may be empty non-string
         //    apply   -- object with key:value assignments
         // Postcondition:
         //    Returns adapted string
         // 2012-12-26 [email protected]
         var r  =  adjust,
             re, s;
         if ( r ) {
            if ( r.indexOf( "{{{" )  >=  0 ) {
               for ( s in apply ) {
                  re  =  new RegExp( "{{{" + s + "}}}",  "g" );
                  r   =  r.replace( re,  apply );
               }   // for s in apply
            }
         }
         return r;
      };   // .utl.factory()



      IUTIL.utl.fault  =  function ( apply, $assign ) {
         // Equip page with error message box
         // Precondition:
         //    apply     -- HTML error message text, jQuery, or false
         //    $assign   -- jQuery container to be reset
         //                 IUTIL.$div
         //                 IUTIL.$msg
         // Uses:
         //    >  .$msg
         //    jQuery().empty()
         //    jQuery().css()
         //    .cnf.feature()
         //    jQuery().append()
         // 2014-10-10 [email protected]
         var $container = $assign,
             $msg;
         if ( ! $container ) {
            $container  =  IUTIL.$msg;
         }
         $container.empty();
         $container.css( { "border":  "solid 2px #FF0000",
                           "color":   "#FF0000",
                           "margin":  "3px",
                           "padding": "1em" } );
         switch ( typeof apply ) {
            case "function":
            case "object":
               $msg  =  apply;
               break;
            case "string":
               $msg  =  $( "<strong>" );
               $msg.text( apply );
               break;
            default:
               $msg  =  $( "<strong>" );
               $msg.text( IUTIL.cnf.feature( "Error", false ) );
         }   // switch typeof apply
         $container.append( $msg );
      };   // .utl.fault()



      IUTIL.utl.filter  =  function ( adjust ) {
         // Escape pipe symbols in text, but maintain links or templates
         // Precondition:
         //    adjust  -- base string
         // Postcondition:
         //    Return adjust with escaped pipes
         // Uses:
         //    this
         //    >< .str.reWSpaces
         // 2013-01-21 [email protected]
         var r  =  adjust,
             s;
         if ( r.indexOf( "|" )  >=  0 ) {
            if ( ! this.reWSpaces ) {
               this.reWSpaces  =  new RegExp( "+", "g" );
            }
            if ( ! this.rePipeTemplate ) {
               s                     =  "(\\{\\{+)\\|(+\\}\\})";
               this.rePipeTemplate   =  new RegExp( s );
               this.rePipesTemplate  =  new RegExp( s, "g" );
            }
            r  =  r.replace( this.reWSpaces, " " )
                   .replace( /\]/g, "\f" )
                   .replace( /(\+)\|(+\f\f)/g, "$1\t$2" );
            do {
               s  =  r;
               r  =  r.replace( this.rePipesTemplate, "$1\t$2" );
            } while ( s !== r );
            r  =  r.replace( /\|/g, "&#124;" )
                   .replace( /\f/g, "]" )
                   .replace( /\t/g, "|" );
         }
         return r;
      };   // .utl.filter()



      IUTIL.utl.fire  =  function () {
         // Initialize module
         // Precondition:
         //    Standard user module has been loaded.
         // Uses:
         //    >  .options
         //    >< .cnf.user
         // 2014-10-10 [email protected]
         if ( typeof IUTIL.cnf.user  !==  "object" ) {
            if ( IUTIL.options   &&
                 typeof IUTIL.options  ===  "object" ) {
               IUTIL.cnf.user  =  IUTIL.options;
            } else {
               IUTIL.cnf.user  =  { };
            }
         }
      };   // .utl.fire()



      IUTIL.utl.firm  =  function () {
         // Make signature with time stamp
         // Postcondition:
         //    Return string
         // Uses:
         //    mw.config.get()
         // 2012-12-15 [email protected]
         var d  =  new Date(),
             s  =  mw.config.get( "wgUserName" ),
             r  =  "] " + d.toLocaleString();
         return r;
      };   // .utl.firm()



      IUTIL.utl.fold  =  function ( analyze ) {
         // Split page name into namespace and title
         // Precondition:
         //    analyze  -- page name
         // Postcondition:
         //    Returns Array
         //                   ns number
         //                   title
         //                   root of subpage, terminated by '/'
         // Uses:
         //    >< .cnf.reSpace
         //    >< .cnf.roomNs
         //    mw.config.get()
         // 2015-11-08 [email protected]
         var s  =  analyze.replace( /%3A/ig, ":" ),
             r  =  ,
             j  =  s.indexOf( ":" ),
             n;
         if ( j > 0 ) {
            if ( ! IUTIL.cnf.reSpace ) {
               IUTIL.cnf.reSpace  =  new RegExp( " ", "g" );
            }
            if ( ! IUTIL.cnf.roomNs ) {
               IUTIL.cnf.roomNs  =  mw.config.get( "wgNamespaceIds" );
            }
            n  =  s.substr( 0, j ).replace( IUTIL.cnf.reSpace, "_" );
            n  =  IUTIL.cnf.roomNs;
            if ( n ) {
               r  =  ;
               j  =  s.indexOf( "/",   j + 1 );
               if ( j > 0 ) {
                  r  =  s.substr( 0,  j + 1 );
               }
            }
         }
         return r;
      };   // .utl.fold()



      IUTIL.utl.format  =  function ( appoint ) {
         // Format Date object according to ISO 8601 UTC "Z"
         // Precondition:
         //    appoint  -- Date object
         // Postcondition:
         //    Return ISO 8601 string in "Z" time zone
         // 2013-01-05 [email protected]
         var r  =  appoint.getUTCFullYear() + "-",
             i  =  appoint.getUTCMonth() + 1;
         if ( i < 10 ) {
   			i	=  "0" + i;
         }
         r  =  r + i + "-";
         i  =  appoint.getUTCDate();
         if ( i < 10 ) {
   			i	=  "0" + i;
         }
         r  =  r + i + "T";
         i  =  appoint.getUTCHours();
         if ( i < 10 ) {
   			i	=  "0" + i;
         }
         r  =  r + i + ":";
         i  =  appoint.getUTCMinutes();
         if ( i < 10 ) {
   			i	=  "0" + i;
         }
         r  =  r + i + ":";
         i  =  appoint.getUTCSeconds();
         if ( i < 10 ) {
   			i	=  "0" + i;
         }
   		return  r + i + "Z";
      };   // .utl.format()



      IUTIL.utl.furnish  =  function () {
         // Insert containers on page
         // Precondition:
         //    document ready
         // Uses:
         //    >  mw.util.$content
         //    >< .$top
         //    >< .$div
         //     < .$msg
         //    mw.util.addCSS()
         //    jQuery()
         //    jQuery().attr()
         //    jQuery().before()
         //    jQuery().css()
         //    jQuery().prepend()
         // 2014-10-10 [email protected]
         mw.util.addCSS( "#siteNotice,"
                         + ".cn-fundraiser-banner,"
                         + "#fundraising"
                         + "{display: none ! important;}" );
         if ( typeof IUTIL.$div  !==  "object" ) {
            IUTIL.$div  =  $( "<div>" );
            IUTIL.$div.attr( "class", "importUtilityDiv" );
            if ( typeof IUTIL.$top  !==  "object" ) {
               IUTIL.$top  =  $( "#editform" );
               if ( IUTIL.$top.length ) {
                  IUTIL.$top.before( IUTIL.$div );
               } else {
                  IUTIL.$top  =  $( "#mw-content-text" );
                  if ( IUTIL.$top.length ) {
                     IUTIL.$top.prepend( IUTIL.$div );
                  } else {
                     IUTIL.$top  =  $( "#bodyContent" );
                     if ( ! IUTIL.$top.length ) {
                        IUTIL.$top  =  $( "#article" );
                        if ( ! IUTIL.$top.length ) {
                           IUTIL.$top  =  $( "#content" );
                           if ( ! IUTIL.$top.length ) {
                              IUTIL.$top  =  mw.util.$content;
                           }
                        }
                     }
                     IUTIL.$top.before( IUTIL.$div );
                  }
               }
            }
            IUTIL.$msg  =  $( "<div>" );
            IUTIL.$msg.attr( "id", "importUtilityMsg" );
            IUTIL.$div.prepend( IUTIL.$msg );
         }
      };   // .utl.furnish()
   }   // .utl



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



   function fire() {
      // Script unit has been loaded
      // Uses:
      //    >  SIGNATURE
      //    >  .type
      //    >  Self
      //    >  .start
      //    >  SIG
      //    mw.loader.getState()
      //    mw.loader.state()
      //    .utl.fire()
      // 2018-08-24 [email protected]
      var rls, sign;
      if ( mw.loader.getState( SIGNATURE )  !==  "ready" ) {
         rls  =  { };
         rls  =  "ready";
         mw.loader.state( rls );
         sign  =  IUTIL.type + "." + Self;
         mw.hook( sign + ".ready" ).fire( { type: sign,
                                            vsn:  Version } );
         if ( typeof IUTIL.start  ===  "string"
              &&  ( mw.loader.getState( SIG )  ===  "ready" )
              &&  typeof IUTIL  ===  "object"
              &&  IUTIL ) {
            IUTIL.utl.fire();
            IUTIL.fire();
         }
      }
   }   // fire()



   fire();
}( window.mediaWiki, window.jQuery ) );



// Emacs
// Local Variables:
// coding: utf-8-dos
// fill-column: 80
// End:

/// EOF   importUtility/utl.js    </nowiki>