User:PerfektesChaos/js/pageTeaserHint/core/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.
/// User:PerfektesChaos/js/pageTeaserHint/core/d.js
/// 2020-12-27 PerfektesChaos@de.wikipedia
//  Enrich links to pages with teaser presentation now
//  ResourceLoader:  compatible
//    dependencies: mediawiki.api,
//                  mediawiki.storage,
//                  mediawiki.util
/// Fingerprint: #0#0#
/// License: CC-by-sa/4.0
/// <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   = -1.5,
       Signature = "pageTeaserHint",
       Sub       = "core",
       PTHC      = { trigger: { large: true,
                                src:   "OOjs UI icon "
                                       + "camera-invert.svg",
                                sub:   "c2"
                              }
                   },
       API       = { Api:        false,
                     badges:     [ 17437796,
                                   17437798,
                                   17506997,
                                   17580674,
                                   70893996,
                                   70894304 ],
                     errors:     false,
                     max:        10,
                     msec:       100,
                     more:       3,
                     scream:     false,
                     server:     "api/rest_v1/",
                     site:       false,
                     solver:     false,
                     summary:    "page/summary",
                     $ajax:      false },
       BABEL     = { dict:       false,
                     dictionary: false,
                     lower:      false,
                     maxDays:    30,
                     translate:  false },
       HTML      = { badge:      { src: "OOjs UI icon ribbonPrize.svg",
                                   sub: "d3" },
                     codepages:  { "css":         "CSS",
                                   "javascript":  "JavaScript",
                                   "json":        "JSON",
                                   "scribunto":   "Lua" },
                     columns:    { allpages:    ".mw-allpages-body",
                                   category:    ".mw-category",
                                   prefixindex: ".mw-prefixindex-body" },
                     css:        { box:  { "border":         "2px "
                                                             + "solid "
                                                             + "#808080",
                                           "padding-left":   "0.5em",
                                           "padding-right":  "0.5em",
                                           "padding-bottom": "3px" },
                                   extr: { "display":        "block",
                                           "max-height":     "15em",
                                           "overflow":       "auto" },
                                   prvw: { "border":         "1px "
                                                             + "solid "
                                                             + "#808080",
                                           "border-radius":  "0.5em",
                                           "display":        "table",
                                           "margin-top":     "3px",
                                           "margin-bottom":  "3px",
                                           "padding-left":   "0.5em",
                                           "padding-right":  "0.5em" } },
                     d:          [ "redir",
                                   "shorty",
                                   "wikidata",
                                   "extract",
                                   "var" ],
                     disambig:   { "ltr": { src: "Disambig-dark.svg",
                                            sub: "ea" },
                                   "rtl": { src: "Disambig arabic.svg",
                                            sub: "17" }
                                 },

                     e:          [ "item",
                                   "story",
                                   "info",
                                   "stamp",
                                   "size",
                                   "disambig",
                                   "merits",
                                   "protected",
                                   "watching" ],
                     info:       { src: "OOjs UI icon "
                                                + "info-progressive.svg",
                                   sub: "5f" },
                     less:       false,
                     list:       false,
                     mag:        22,
                     protect:    { src: "OOjs UI icon unLock-ltr.svg",
                                   sub: "ab" },
                     redir:      { "ltr": { src: "OOjs UI icon "
                                                 + "newline-rtl.svg",
                                            sub: "5d" },
                                   "rtl": { src: "OOjs UI icon "
                                                 + "newline-ltr.svg",
                                            sub: "3c" }
                                 },
                     sysop:      { src: "OOjs UI icon lock-ltr-"
                                                     + "destructive.svg",
                                   sub: "e6" },
                     wikidata:   { src: "Wikidata.svg",
                                   sub: "71" }
                   },
       QUEUE     = { lonely: true,
                     mode:   0 },
       REPOS;



   function fired ( apply ) {
      // Application requested execution, initialize now and run
      // Precondition:
      //    apply  -- application object
      // Uses:
      //    >  Signature
      //    >< PTHC
      //     < REPOS
      //    mw.hook()
      //    mw.config.get()
      //    BABEL.fire()
      //    QUEUE.fire()
      //    (BABEL.flat)
      // 2020-12-27 PerfektesChaos@de.wikipedia
      var heritage = [ "doc",
                       "$file",
                       "furnish",
                       "got",
                       "page",
                       "re",
                       "scope",
                       "selector",
                       "$widget" ],
          cnf, i, s, sign;
      if ( typeof apply  ===  "object"
           &&     apply   &&
           typeof apply.scope  ===  "string"
           &&     apply.scope ) {
         mw.hook( Signature + ".init" ).remove( fired );
         for ( i = 0;  i < heritage.length;  i++ ) {
            sign = heritage[ i ];
            cnf  = apply[ sign ];
            if ( cnf ) {
               s = typeof cnf;
               if ( s !== "function" ) {
                  if ( s  !==  ( sign.substr( 0, 1 )  ===  "s"
                                 ?  "string"
                                 :  "object" ) ) {
                     s = false;
                  }
               }
               if ( s ) {
                  PTHC[ sign ] = cnf;
               }
            }
         }   // for i
         if ( typeof apply.$file  ===  "function" ) {
            PTHC.$file = apply.$file;
         } else {
            PTHC.$file = function () { };
         }
         if ( typeof apply.pub  ===  "object"
              &&     apply.pub ) {
            heritage = apply.pub;
            if ( typeof heritage.type  ===  "string" ) {
               PTHC.pub.typeParent = heritage.type;
            }
            if ( typeof heritage.vsn  ===  "number" ) {
               PTHC.pub.vsnParent = heritage.vsn;
            }
            if ( typeof heritage.doc  ===  "string" ) {
               PTHC.doc = heritage.doc;
            }
         }
         if ( typeof apply.REPOS  ===  "object"
              &&     apply.REPOS ) {
            REPOS = apply.REPOS;
         }
         if ( typeof apply.ltr  ===  "boolean" ) {
            PTHC.ltr = apply.ltr;
         } else {
            PTHC.ltr = true;
         }
         cnf = mw.config.get( [ "wgUserLanguage",
                                "wgUserName" ] );
         PTHC.slang  = cnf.wgUserLanguage.toLowerCase();
         PTHC.listen = cnf.wgUserName;
         BABEL.fire();
         mw.hook( Signature + ".clear" ).add( BABEL.flat );
         QUEUE.fire();
      }
   }   // fired()



   function first () {
      // Autorun on loading
      // Uses:
      //    >  Signature
      //    >  Sub
      //    >  Version
      //     < PTHC.signature
      //     < PTHC.pub
      //    mw.loader.getState()
      //    mw.loader.state()
      //    mw.hook()
      //    (fired)
      // 2020-12-27 PerfektesChaos@de.wikipedia
      var signature = Signature + "/" + Sub,
          rls;
      PTHC.signature = "ext.gadget." + signature;
      if ( mw.loader.getState( PTHC.signature )  !==  "ready" ) {
         rls = { };
         rls[ PTHC.signature ] = "ready";
         mw.loader.state( rls );
         PTHC.pub = { type: signature,
                      vsn:  Version };
         mw.hook( signature + ".ready" ).fire( PTHC.pub );
         mw.hook( Signature + ".init" ).add( fired );
      }
   }   // first()



   API.fault = function ( jqXHR, textStatus, errorThrown ) {
      // API failure
      // Precondition:
      //    Common failure call
      // Uses:
      //    >  Signature
      //    >< API.more
      //     < API.scream
      //     < API.errors
      //    API.fetch()
      //    (API.finish)
      // 2020-12-27 PerfektesChaos@de.wikipedia
      API.more = API.more - 1;
      if ( textStatus ) {
         switch ( typeof textStatus ) {
            case "object":
               if ( typeof textStatus.textStatus  ===  "string" ) {
                  API.scream = textStatus.textStatus;
               } else {
                  API.scream = "";
               }
               if ( typeof textStatus.exception  ===  "string"
                    &&     textStatus.exception ) {
                  API.scream = API.scream + " ("
                               + textStatus.exception + ")";
               }
               break;
            case "string":
               API.scream = textStatus;
               break;
         }   // switch typeof textStatus
      }
      if ( errorThrown ) {
         if ( API.scream ) {
            API.scream = API.scream + "  -- Error: ";
         }
         API.scream = API.scream + errorThrown;
      }
      if ( ! API.scream ) {
         API.scream = "???";
      }
      if ( typeof window.console  ===  "object"   &&
           typeof window.console.log  ===  "function" ) {
         window.console.log( Signature + " * " + API.scream );
         if ( typeof textStatus  ===  "object"
              &&     textStatus   &&
              typeof window.console.dir  ===  "function" ) {
            window.console.dir( textStatus );
         }
      }
      API.errors = false;
      if ( API.multi > 0 ) {
         API.finish();
      } else {
         API.fetch();
      }
   };   // API.fault()



   API.fetch = function () {
      // Receive page metadata by REST API
      // Uses:
      //    >  PTHC.re.usc
      //    >  API.solver
      //    >  API.page
      //    >< API.n
      //    API.fetch()
      //    (API.finish)
      //    (API.found)
      //    (API.fault)
      //    (API.finish)
      // 2020-12-27 PerfektesChaos@de.wikipedia
      var got, s;
      if ( API.n > 0 ) {
         API.n--;
         s   = API.requests[ API.n ];
         got = PTHC.got[ s ];
         if ( s.indexOf( " " )  >  0 ) {
            s = s.replace( PTHC.re.usc, "_" );
         }
         API.page.url = API.solver + encodeURIComponent( s );
         $.ajax( API.page ).done( API.found )
                           .fail( API.fault );
      } else {
         API.page     = false;
         API.requests = false;
         API.finish();
      }
   };   // API.fetch()



   API.find = function ( ask, another ) {
      // Receive page metadata by API
      // Precondition:
      //    ask      -- Array of page names
      //    another  -- continue, or not
      // Uses:
      //    >  API.query
      //    >  API.Api
      //    (API.found)
      //    (API.fault)
      // 2020-12-27 PerfektesChaos@de.wikipedia
      if ( another ) {
         API.query[ "continue" ] = another;
      }
      API.query.titles = ask;
      API.Api.get( API.query ).done( API.found )
                              .fail( API.fault );
   };   // API.find()



   API.fire = function ( all, action, after ) {
      // Start API retrieval
      // Precondition:
      //    all     -- Array with page names
      //    action  -- mode
      //    after   -- function to be called finally
      // Uses:
      //    >  API.max
      //    >  API.server
      //    >  API.summary
      //    >< API.Api
      //    >< API.badges
      //    >< API.site
      //     < API.requests
      //     < API.finish
      //     < API.n
      //     < API.i
      //     < API.scope
      //     < API.multi
      //     < API.query
      //     < API.solver
      //     < API.page
      //    API.fetch()
      //    API.follower()
      // 2020-12-27 PerfektesChaos@de.wikipedia
      var i;
      API.requests = all;
      API.finish   = after;
      API.n        = API.requests.length;
      if ( API.n > 0 ) {
         if ( ! API.Api ) {
            API.Api = new mw.Api();
         }
         API.scope = action;
         API.i     = 0;
         switch ( API.scope ) {
            case "info":
               API.multi = API.max;
               API.query = { action:     "query",
                             "continue": "",
                             prop:       "info",
                             inprop:     "protection|watched"
                           };
               break;
            case "pageprops":
               for ( i = 0;  i < API.badges.length;  i++ ) {
                  API.badges[ i ] = "wikibase-badge-Q" + API.badges[ i ];
               }   // for i
               API.multi = API.max;
               API.query = { action:     "query",
                             "continue": "",
                             prop:       "pageprops",
                             redirects:  "",
                             ppprop:     "disambiguation"
                                         + "|displaytitle"
                             //          + "|page_image"
                                         + "|wikibase_item"
                                         + "|wikibase-shortdesc"
                           };
               for ( i = 0;  i < API.badges.length;  i++ ) {
                  API.query.ppprop = API.query.ppprop + "|"
                                     + API.badges[ i ];
               }   // for i
               break;
            case "summary":
               API.multi = -1;
               if ( typeof API.solver  !==  "string" ) {
                  if ( typeof API.site  !==  "string" ) {
                     API.site  = window.location.protocol + "//" +
                                 window.location.hostname + "/";
                  }
                  API.solver = API.site + API.server + API.summary + "/";
                  API.page   = { /* beforeSend: f,   */
                                 dataType: "json"
                                           // No "Intelligent Guess"
                               };
               }
               break;
         }   // switch action
         if ( API.multi < 0 ) {
            API.fetch();
         } else {
            API.follower();
         }
      } else {
         API.finish();
      }
   };   // API.fire()



   API.follower = function ( another ) {
      // Request block of page metadata by API
      // Precondition:
      //    another  -- continue, or not
      // Uses:
      //    >  API.multi
      //    >  API.finish
      //    >< API.n
      //    >< API.requests
      //    (API.finish)
      // 2020-12-27 PerfektesChaos@de.wikipedia
      var i, k, n, requests;
      if ( API.n > 0 ) {
         n = API.n - API.multi;
         k = ( n < 0  ?  0  :  n );
         requests = [ ];
         for ( i = k;  i < API.n;  i++ ) {
            requests.push( API.requests[ i ] );
         }   // for i
         API.n = n;
         API.find( requests, another );
      } else {
         API.requests = false;
         API.finish();
      }
   };   // API.follower()



   API.foreign = function ( array, after ) {
      // Update message set for current language
      // Precondition:
      //    array  -- array of message ID
      //    after  -- function to be executed after completion
      // Uses:
      //    >< API.Api
      //    (API.fault)
      // 2020-12-27 PerfektesChaos@de.wikipedia
      if ( ! API.Api ) {
         API.Api = new mw.Api();
      }
      API.Api.getMessages( array ).done( after )
                                  .fail( API.fault );
   };   // API.foreign()



   API.found = function ( arrived ) {
      // Answer arrived
      // Precondition:
      //    arrived  -- JSON result
      // Uses:
      //    >  API.multi
      //    >  PTHC.got
      //    >  API.scope
      //    >< API.n
      //    >< API.requests
      //     < QUEUE.lonely
      //     < API.scream
      //    HTML.follow()
      //    API.follower()
      // 2020-12-27 PerfektesChaos@de.wikipedia
      var got, i, id, page, query, redir, s, sign;
      if ( typeof arrived  ===  "object"
           &&     arrived ) {
         if ( API.multi < 0 ) {
            if ( typeof arrived.title  ===  "string"  &&
                 typeof PTHC.got[ arrived.title ]  ===  "object" ) {
               got = PTHC.got[ arrived.title ];
               if ( typeof arrived.description  ===  "string" ) {
                  s  = "story";
                  if ( typeof arrived.description_source  ===  "string"
                       &&     arrived.description_source
                                                       !==  "central" ) {
                     s  = "shorty";                    //   "local"
                  }
                  got[ s ] = arrived.description;
               }
               if ( typeof arrived.displaytitle  ===  "string" ) {
                  got.show = arrived.displaytitle;
               }
               if ( typeof arrived.extract_html  ===  "string"
                    &&     arrived.extract_html ) {
                  got.extract = { ltr:     null,
                                  summary: arrived.extract_html };
                  if ( typeof arrived.lang  ===  "string"
                       &&     arrived.lang ) {
                     got.extract.slang = arrived.lang;
                     if ( typeof arrived.dir  ===  "string"
                          &&     arrived.dir ) {
                        got.extract.ltr = ( arrived.dir !== "rtl" );
                     }
                  }
               }
               if ( typeof arrived.thumbnail  ===  "object" ) {
                  got.thumb = arrived.thumbnail;
                  QUEUE.lonely  = false;
               }
               if ( typeof arrived.timestamp  ===  "string" ) {
                  got.stamp = arrived.timestamp;
               }
            }
            window.setTimeout( API.fetch, API.msec );
         } else {
            if ( typeof arrived.query  ===  "object" ) {
               query = arrived.query;
               if ( typeof query.pages  ===  "object" ) {
                  for ( id in query.pages ) {
                     page = query.pages[ id ];
                     sign = page.title;
                     if ( API.scope === "pageprops"   &&
                          typeof page[ API.scope ]  ===  "object" ) {
                        page = page[ API.scope ];
                     }
                     if ( typeof PTHC.got[ sign ]  ===  "object" ) {
                        got = PTHC.got[ sign ];
                        if ( typeof page.displaytitle  ===  "string" ) {
                           got.show = page.displaytitle;
                        }
                        if ( typeof page.contentmodel  ===  "string"
                             &&     page.contentmodel  !==  "wikitext"
                           ) {
                           got.stuff = page.contentmodel;
                        }
                        if ( typeof page.disambiguation
                                                        ===  "string" ) {
                           got.linked = true;
                        }
                        if ( typeof page.length  ===  "number" ) {
                           got.kBytes = Math.ceil( page.length * 0.001 );
                        }
                        if ( typeof page.pagelanguage  ===  "string" ) {
                           got.slang = page.pagelanguage;
                           if ( typeof page.pagelanguagedir
                                                            ===  "string"
                                &&     page.pagelanguagedir  ===  "rtl" )
                                                                        {
                              got.ltr = false;
                           }
                        }
                        if ( typeof page.protection  ===  "object"   &&
                             typeof page.protection.length  ===  "number"
                             &&     page.protection.length ) {
                              got.protection = page.protection;
                        }
                        if ( PTHC.listen  &&  API.scope ===  "info" ) {
                           got.listen =
                                  ( typeof page.watched  ===  "string" );
                        }
                        if ( typeof page.wikibase_item  ===  "string" ) {
                           s        = page.wikibase_item.substr( 1 );
                           got.item = parseInt( s, 10 );
                        }
                        if ( typeof page[ "wikibase-shortdesc" ]
                                                        ===  "string" ) {
                           got.shorty = page[ "wikibase-shortdesc" ];
                        }
                        if ( API.scope === "pageprops" ) {
                           for ( i = 0;  i < API.badges.length;  i++ ) {
                              s = API.badges[ i ];
                              if ( typeof page[ s ]  ===  "string" ) {
                                 got.merits = true;
                                 break;
                                 /*
                                 got.merits = got.merits
                                              + parseInt( page[ s ],
                                                          10 );
                                 */
                              }
                           }   // for i
                        }
                        HTML.follow( sign, got, API.scope );
                     }
                  }   // for id in query.pages
                  if ( typeof query.redirects  ===  "object" ) {
                     for ( i = 0;  i < query.redirects.length;  i++ ) {
                        redir = query.redirects[ i ];
                        sign  = redir.from;
                        if ( typeof PTHC.got[ sign ]  ===  "object" ) {
                           got       = PTHC.got[ sign ];
                           got.shift = redir.to;
                           HTML.follow( sign, got, API.scope );
                        }
                     }   // for i
                  }
               }
            }
            API.follower();
         }
      }
      API.scream = false;
   };   // API.found()



   BABEL.def = {
      "author":                   "protect-level-author",
      "autoconfirmed":            "protect-level-autoconfirmed",
      "badge":                    "Wikibase-pageswithbadges-badge",
      "banner-protect":           "protect-level-banner-protect",
      "centralnotice-admin":      "protect-level-centralnotice-admin",
      "create":                   "restriction-create",
      "disambig":                 "Visualeditor-dialog-"
                                  + "meta-settings-disambiguation-label",
      "edit":                     "restriction-edit",
      "editautopatrolprotected":  "protect-level-"
                                  + "editautopatrolprotected",
      "editeditorprotected":      "protect-level-editeditorprotected",
      "editor":                   "protect-level-editor",
      "editextendedsemiprotected":"protect-level-"
                                  + "editextendedsemiprotected",
      "extendedconfirmed":        "protect-level-extendedconfirmed",
      "images":                   "coll-images-title",
                                  // Mobile-frontend-enable-images-prefix
      "infinity":                 "infiniteblock",
      "kilobyte":                 "Kilobytes",
      "megabyte":                 "Megabytes",
      "move":                     "restriction-move",
      "pageinfo":                 "pageinfo",
      "redirect":                 "redirectpagesub",
      "sysop":                    "protect-level-sysop",
      "templateeditor":           "protect-level-templateeditor",
      "unwatch":                  "unwatch",
      "watch":                    "watch",
      "wikidata":                 "project-localized-name-wikidatawiki"
   };   // BABEL.translate



   BABEL.fair = function ( at ) {
      // Convert ISO UTC timestamp into browser local date
      // Precondition:
      //    at  -- ISO UTC timestamp
      //           2020-12-27_21:09:34    +00:00
      // Postcondition:
      //    Returns string, with browser local date and time
      // 2020-12-27 PerfektesChaos@de.wikipedia
      var iY   = at.substr(  0, 4 ),
          iM   = at.substr(  5, 2 ),
          iD   = at.substr(  8, 2 ),
          ih   = at.substr( 11, 2 ),
          im   = at.substr( 14, 2 ),
          is   = at.substr( 17, 2 ),
          date = new Date( iY,  iM - 1,  iD, ih, im, is );
      date.setMinutes( date.getMinutes()
                       - date.getTimezoneOffset() );
      return date.toLocaleString();
   };   // BABEL.fair()



   BABEL.fire = function () {
      // Initialize messages storage
      // Uses:
      //    >  PTHC.slang
      //    >  BABEL.def
      //    >  BABEL.lower
      //    >< BABEL.translate
      //    >< BABEL.dict
      //    >< BABEL.lower
      //     < BABEL.slang
      // 2020-12-27 PerfektesChaos@de.wikipedia
      var date, less, load, repo, s, stored;
      if ( typeof mw.storage  ===  "object"
           &&     mw.storage   &&
           typeof mw.storage.get  ===  "function"   &&
           typeof mw.storage.remove  ===  "function"   &&
           typeof mw.storage.set  ===  "function" ) {
         if ( ! BABEL.translate ) {
            BABEL.slang     = PTHC.slang.toLowerCase();
            BABEL.translate =  { };
            for ( s in BABEL.def ) {
               stored = BABEL.def[ s ];
               BABEL.translate[ s ] = stored;
            }   // for s in BABEL.def
         }
         if ( typeof BABEL.dict  !==  "object" ) {
            stored = mw.storage.get( Signature );
            if ( stored ) {
               try {
                  repo = JSON.parse( stored );
                  if ( typeof repo  ===  "object"
                       &&     repo ) {
                     BABEL.dictionary = repo;
                     if ( typeof repo.next  ===  "number" ) {
                        date = new Date();
                        if ( repo.next < date.getTime() ) {
                           load = true;
                        }
                     }
                     if ( typeof BABEL.dictionary[ BABEL.slang ]
                                                        ===  "object" ) {
                        BABEL.dict = BABEL.dictionary[ BABEL.slang ];
                     } else {
                        load = true;
                     }
                  } else {
                     less = true;
                  }
               } catch( ex ) {
                  less = true;
               }
            } else {
               load = true;
            }
         }
         if ( less || BABEL.lower ) {
            mw.storage.remove( Signature );
            BABEL.lower = false;
            load        = true;
         }
         if ( load ) {
            BABEL.fresh();
         }
      }
   };   // BABEL.fire()



   BABEL.flat = function () {
      // Clear messages storage
      // Uses:
      //     < BABEL.lower
      //    BABEL.fire()
      // 2020-12-27 PerfektesChaos@de.wikipedia
      BABEL.lower = true;
      BABEL.fire();
   };   // BABEL.flat()



   BABEL.fresh = function () {
      // Update messages storage
      // Uses:
      //    >< BABEL.translate
      //    API.foreign()
      // 2020-12-27 PerfektesChaos@de.wikipedia
      var q = [ ],
          s;
      for ( s in BABEL.translate ) {
         q.push( BABEL.translate[ s ] );
      }   // for s in BABEL.translate
      API.foreign( q, BABEL.freshed );
   };   // BABEL.fresh()



   BABEL.freshed = function ( arrived ) {
      // Messages arrived
      // Precondition:
      //    arrived  -- JSON result
      // Uses:
      //    >  BABEL.maxDays
      //    >  BABEL.slang
      //    >  Signature
      //     < BABEL.dict
      //    mw.storage.set()
      // 2020-12-27 PerfektesChaos@de.wikipedia
      var date = new Date(),
          s;
      if ( typeof BABEL.dictionary  !==  "object" ) {
         BABEL.dictionary = { };
      }
      BABEL.dictionary.next = date.getTime()
                              + BABEL.maxDays * 86400000;
      if ( typeof BABEL.dictionary[ BABEL.slang ]  !==  "object" ) {
         BABEL.dictionary[ BABEL.slang ] = { };
      }
      BABEL.dict = BABEL.dictionary[ BABEL.slang ];
      for ( s in arrived ) {
         if ( arrived[ s ] ) {
            BABEL.dict[ s ] = arrived[ s ];
         }
      }   // for s in arrived
      BABEL.dictionary[ BABEL.slang ] = BABEL.dict;
      mw.storage.set( Signature, JSON.stringify( BABEL.dictionary ) );
   };   // BABEL.freshed()



   BABEL.from = function ( alien ) {
      // Translate a message
      // Precondition:
      //    alien  -- ID
      // Postcondition:
      //    Returns string, which ever
      // Uses:
      //    >  BABEL.translate
      //    >  BABEL.dict
      //    BABEL.fetch()
      // 2020-12-27 PerfektesChaos@de.wikipedia
      var r, s;
      if ( BABEL.translate   &&
           typeof BABEL.translate[ alien ]  ===  "string" ) {
         s = BABEL.translate[ alien ];
         if ( s   &&
              BABEL.dict   &&
              typeof BABEL.dict[ s ]  ===  "string" ) {
            r = BABEL.dict[ s ];
         }
      }
      return r || s || alien;
   };   // BABEL.from()



   HTML.face = function ( $area, add ) {
      // Ensure text properties
      // Precondition:
      //    $area   -- jquery object to be populated
      //    add     -- generating data
      // Uses:
      //    >  PTHC.ltr
      // 2020-12-27 PerfektesChaos@de.wikipedia
      if ( add.slang ) {
         $area.attr( "lang", add.slang );
         if ( add.ltr !== PTHC.ltr ) {
            $area.attr( "dir",  ( add.ltr ? "ltr" : "rtl" ) );
         }
      }
   };   // HTML.face()



   HTML.$factory = function ( $area, at, add ) {
      // Create single element
      // Precondition:
      //    $area   -- jquery object to be populated
      //    at      -- element name
      //    add     -- generating data
      // Uses:
      //    >  PTHC.ltr
      //    >  HTML.redir
      //    >  HTML.mag
      //    >  HTML.wikidata
      //    >  PTHC.selector
      //    >  PTHC.scope
      //    >  HTML.css.prvw
      //    >  HTML.info
      //    >  HTML.disambig
      //    >  HTML.badge
      //    >  HTML.sysop
      //    >  HTML.protect
      //    >< PTHC.re.eol
      //    mw.util.getUrl()
      //    PTHC.$file()
      //    HTML.face()
      //    BABEL.from()
      //    BABEL.fair()
      // 2020-12-27 PerfektesChaos@de.wikipedia
      var e, i, s, s2, $e, $img;
      switch ( at ) {
         case "redir":
            s    = ( PTHC.ltr ? "margin-right" : "margin-left" );
            $img = PTHC.$file( HTML.redir, HTML.mag );
            $img.attr( { "title":  BABEL.from( "redirect" ) } )
                .css( s, "0.5em" );
            $area.prepend( $img );
            $e = $( "<a>" );
            $e.attr( { "href": mw.util.getUrl( add,
                                               { action: "view" } ) } )
              .text( add );
            $area.append( $e );
            break;
         case "shorty":
            $area.text( add.shorty );
            HTML.face( $area, add );
            break;
         case "item":
            s    = ( PTHC.ltr ? "margin-right" : "margin-left" );
            $img = PTHC.$file( HTML.wikidata, HTML.mag );
            $e   = $( "<a>" );
            $e.append( $img )
              .attr( { "href":  "https://www.wikidata.org/wiki/Q"
                                + add,
                      "title":  BABEL.from( "wikidata" )
                                + " Q" + add } );
            $area.prepend( $e );
            break;
         case "story":
            s  = ( PTHC.ltr ? "margin-left" : "margin-right" );
            $e = $( "<span>" );
            $e.css( s, "2em" )
              .text( add.story );
            HTML.face( $e, add );
            $area.append( $e );
            break;
         case "extract":
            s = add.summary;
            if ( s.indexOf( "\n" )  >  0 ) {
               if ( typeof PTHC.re.eol ) {
                  PTHC.re.eol = new RegExp( "\n(</?u?li?>)", "g" );
               }
               s = s.replace( PTHC.re.eol, "$1" );
            }
            $e = $( "<div>" );
            $e.addClass( PTHC.selector + "extracted" )
              .html( s );
            if ( PTHC.scope !== "search" ) {
            }
            HTML.face( $e, add );
            $area.css( HTML.css.prvw )
                 .append( $e );
            break;
         case "info":
            s  = ( PTHC.ltr ? "margin-right" : "margin-left" );
            $e = $( "<a>" );
            $e.attr( { "href":  mw.util.getUrl( add,
                                                { action: "info" } ),
                       "title": BABEL.from( "pageinfo" ) } )
              .css( s, "1em" );
            $img = PTHC.$file( HTML.info, HTML.mag );
            $e.append( $img );
            $area.prepend( $e );
            break;
         case "stamp":
            $e = $( "<span>" );
            $e.attr( { "title":  BABEL.fair( add ) } )
              .css( { "margin-left":   "1em",
                      "margin-right":  "1em",
                      "white-space":   "nowrap" } )
              .text( add.substr( 0, 10 )  +  " "
                     +  add.substr( 11, 5 ) );
            $area.append( $e );
            break;
         case "size":
            if ( add > 1077 ) {
               i  = Math.floor( add * 0.00097 );
               s  = "MB";
               s2 = "megabyte";
            } else {
               i  = add;
               s  = "kB";
               s2 = "kilobyte";
            }
            $e = $( "<span>" );
            $e.attr( { "title":  BABEL.from( s2 ) } )
              .css( { "margin-left":   "1em",
                      "margin-right":  "1em",
                      "white-space":   "nowrap" } )
              .text( i + " " + s );
            $area.append( $e );
            break;
         case "disambig":
            $img = PTHC.$file( HTML.disambig, HTML.mag );
            $img.attr( { "title":  BABEL.from( "disambig" ) } )
                .css( { "margin-left":   "1em",
                        "margin-right":  "1em" } );
            $area.append( $img );
            break;
         case "model":
            $e = $( "<span>" );
            s  = add.toLowerCase();
            if ( typeof HTML.codepages[ s ]  ===  "string" ) {
               s = HTML.codepages[ s ];
            }
            $e.text( s )
              .css( { "margin-left":   "1em",
                      "margin-right":  "1em" } );
            $area.append( $e );
            break;
         case "merits":
            $e   = $( "<span>" );
            $img = PTHC.$file( HTML.badge, HTML.mag );
            $e.append( $img )
              .css( { "margin-left":   "1em",
                      "margin-right":  "1em" } );
            $area.append( $e );
            break;
         case "protected":
            if ( add.length > 1   &&
                 add[ 0 ].type  === "edit"    &&
                 add[ 0 ].level === "sysop"   &&
                 add[ 1 ].type  === "move"    &&
                 add[ 1 ].level === "sysop" ) {
               s  = "sysop";
            } else {
               s  = "protect";
            }
            $img = PTHC.$file( HTML[ s ],  HTML.mag );
            s    = "";
            for ( i = 0;  i < add.length;  i++ ) {
               e = add[ i ];
               if ( typeof e.type  ===  "string"   &&
                    typeof e.level  ===  "string" ) {
                  if ( s ) {
                     s = s
                         + String.fromCharCode( 0xA0, 0x7C, 0x20, 0x0A );
                  }
                  s = s + BABEL.from( e.type )
                        + String.fromCharCode( 0xA0, 0x2013, 0x20 )
                        + BABEL.from( e.level );
                  if ( typeof e.expiry  ===  "string"
                       &&     e.expiry  ===  "infinity" ) {
                     s = s + String.fromCharCode( 0xA0, 0x2F, 0x20 )
                           + BABEL.from( e.expiry );
                  }
               }
            }   // for i
            if ( s ) {
               $img.attr( { "title":  s } );
            }
            $img.css( { "margin-left":   "1em",
                        "margin-right":  "1em" } );
            $area.append( $img );
            break;
         case "watching":
            s  = ( add.listen ? "un" : "" )  +  "watch";
            i  = ( add.listen ? 0x2605 : 0x2606 );
            $e = $( "<a>" );
            $e.attr( { href:  mw.util.getUrl( add.slot,
                                              { action: s } ),
                       title: BABEL.from( s ) } )
              .css( "padding-"  +  ( PTHC.ltr ? "left" : "right" ),
                    "1em" )
              .text( String.fromCharCode( i ) );
            $area.append( $e );
            break;
      }   // switch at
   };   // HTML.$factory()



   HTML.fiat = function ( about, $area, at, append, add ) {
      // Create element content
      // Precondition:
      //    about   -- entry object
      //    $area   -- jquery object to be populated
      //    at      -- section name
      //    append  -- sub-section name
      //    add     -- generating data
      // Uses:
      //    HTML.$factory()
      // 2020-12-27 PerfektesChaos@de.wikipedia
      switch ( at ) {
         case "redir":
            $area.append( HTML.$factory( $area, "redir", add ) );
            break;
         case "shorty":
            $area.append( HTML.$factory( $area, "shorty", add ) );
            break;
         case "wikidata":
            if ( append ) {
               $area.append( HTML.$factory( $area, "story", add ) );
            } else {
               $area.prepend( HTML.$factory( $area, "item", add ) );
            }
            break;
         case "extract":
            $area.append( HTML.$factory( $area, "extract", add ) );
            break;
         case "var":
            $area.append( HTML.$factory( $area, append, add ) );
            break;
      }   // switch at
   };   // HTML.fiat()



   HTML.fill = function ( about, at, append, add ) {
      // Create list entry segment
      // Precondition:
      //    about   -- entry object
      //    at      -- section name
      //    append  -- sub-section name
      //    add     -- generating data
      // Uses:
      //    >  HTML.d
      //    >  PTHC.selector
      //    HTML.fiat()
      // 2020-12-27 PerfektesChaos@de.wikipedia
      var i, live, s, $d, $previous;
      if ( about[ at ] ) {
         $d   = about[ at ];
         live = true;
      } else {
         for ( i = 0;  i < HTML.d.length;  i++ ) {
            s = HTML.d[ i ];
            if ( s === at ) {
               break;   // for i
            }
            if ( about[ s ] ) {
               $previous = about[ s ];
            }
         }   // for i
         s  = ( HTML.list ? "<dd>" : "<div>" );
         $d = $( s );
         $d.addClass( PTHC.selector + at );
         if ( $previous ) {
            $previous.after( $d );
         } else if ( ! HTML.list ) {
            about.$box.append( $d );
         }
         about[ at ] = $d;
      }
      if ( append  &&  ! about[ append ] ) {
         live = false;
      }
      if ( ! live ) {
         HTML.fiat( about, $d, at, append, add );
         about[ append ] = true;
      }
   };   // HTML.fill()



   HTML.finesse = function () {
      // Equip &action=info page
      // Uses:
      //    >  PTHC.got
      //    >  PTHC.$widget
      //    HTML.$factory()
      // 2020-12-27 PerfektesChaos@de.wikipedia
      var got, s, $div;
      for ( s in PTHC.got ) {
         got = PTHC.got[ s ];
         break;   // for s
      }   // for s in PTHC.got
      if ( got && got.extract ) {
         $div = $( "<div>" );
         HTML.$factory( $div, "extract", got.extract );
         PTHC.$widget.before( $div );
      }
   };   // HTML.finesse()



   HTML.first = function ( at, assigned, $a ) {
      // Initialize page metadata for entry
      // Precondition:
      //    at        -- page name
      //    assigned  -- entry object
      //    $a        -- jquery <a> of entry
      // Postcondition:
      //    Returns entry object
      // Uses:
      //    >  HTML.d
      //    >  HTML.e
      //    >  HTML.list
      //    >  PTHC.selector
      //    >  HTML.css.box
      //    mw.util.getUrl()
      //    HTML.full()
      // 2020-12-27 PerfektesChaos@de.wikipedia
      var r = { $a: $a },
          i, s, $parent;
      for ( i = 0;  i < HTML.d.length;  i++ ) {
         r[ HTML.d[ i ] ] = false;
      }   // for i
      for ( i = 0;  i < HTML.e.length;  i++ ) {
         r[ HTML.e[ i ] ] = false;
      }   // for i
      if ( HTML.list ) {
         r.dt = $a.parents( "dt" );
         if ( assigned.shift ) {
            s = mw.util.getUrl( at,  { redirect: "no" } );
         } else {
            s = mw.util.getUrl( at,  { action: "view" } );
         }
         $a.attr( { "href": s } )
           .css( { "font-weight": "bold" } );
      } else {
         r.$box = $( "<div>" );
         r.$box.addClass( PTHC.selector + "box" )
               .css( HTML.css.box );
         $parent = $a.parents( "li.mw-search-result" );
         $parent.append( r.$box )
                .css( { "clear": "both" } );
         s = mw.util.getUrl( at,  { action: "view" } );
         $a.attr( { "href": s } );
      }
      HTML.full( assigned, r, at );
      return r;
   };   // HTML.first()



   HTML.flat = function ( $area ) {
      // Remove multiplicity of columns
      // Precondition:
      //    $area  -- jquery object
      // 2020-12-27 PerfektesChaos@de.wikipedia
      $area.css( { "columns":         "1",
                   "-khtml-columns":  "1",
                   "-moz-columns":    "1",
                   "-ms-columns":     "1",
                   "-webkit-columns": "1" } );
   };   // HTML.flat()



   HTML.flip = function () {
      // Conversion of <ul> elements into <dl>
      // Uses:
      //    >  PTHC.page.$container
      //    >  PTHC.scope
      //    >< HTML.d
      //     < HTML.less
      //     < HTML.list
      //    HTML.flat()
      // 2020-12-27 PerfektesChaos@de.wikipedia
      var i, k, $cont, $dl, $dt, $exclude, $li, $lis, $ul, $uls, $up;
      if ( PTHC.scope !== "user" ) {
         $exclude = PTHC.page.$container.find( ".mw-parser-output ul" );
      }
      HTML.d.unshift( "dt" );
      HTML.less = ( PTHC.scope === "contributions" );
      HTML.list = true;
      HTML.flat( PTHC.page.$container );
      if ( typeof HTML.columns[ PTHC.scope ]  ===  "string" ) {
         $cont = PTHC.page.$container.find( HTML.columns[ PTHC.scope ] );
         HTML.flat( $cont );
      }
      $uls = PTHC.page.$container.find( "ul > li > ul" );
      if ( $uls.length ) {
         if ( $exclude ) {
            $uls = $uls.not( $exclude );
         }
         for ( i = 0;  i < $uls.length;  i++ ) {
            $ul  = $uls.eq( i );
            $up  = $ul.parent();
            $lis = $ul.children( "li" );
            for ( k = 0;  k < $lis.length;  k++ ) {
               $li = $lis.eq( k );
               $li.detach();
               $up.before( $li );
            }   // for k
            $up.remove();
         }   // for i
      }
      $uls = PTHC.page.$container.find( "ul" );
      if ( $uls.length ) {
         if ( $exclude ) {
            $uls = $uls.not( $exclude );
         }
         for ( i = 0;  i < $uls.length;  i++ ) {
            $ul = $uls.eq( i );
            $lis = $ul.children( "li" );
            if ( $lis.length ) {
               $dl = $( "<dl>" );
               for ( k = 0;  k < $lis.length;  k++ ) {
                  $li = $lis.eq( k );
                  $dt = $( "<dt>" );
                  $cont = $li.contents();
                  $cont.detach();
                  $dt.append( $cont )
                     .css( { "font-weight": "normal" } );
                  $dl.append( $dt );
                  $li.remove();
               }   // for k
               $ul.before( $dl );
            }
            $ul.remove();
         }   // for i
      }
   };   // HTML.flip()



   HTML.floats = function () {
      // Equip all entries with images if known
      // Uses:
      //    >  PTHC.got
      //    >  PTHC.ltr
      //    >  HTML.list
      // 2020-12-27 PerfektesChaos@de.wikipedia
      var got, i, s, $div, $dt, $img;
      for ( s in PTHC.got ) {
         got = PTHC.got[ s ];
         if ( got.thumb ) {
            $div = $( "<div>" );
            if ( PTHC.ltr ) {
               $div.css( { "float":        "right",
                           "margin-left":  "1em" } );
            } else {
               $div.css( { "float":        "left",
                           "margin-right": "1em" } );
            }
            $div.css( { "margin-bottom": "0.5em",
                        "margin-top":    "0.5em" } );
            $img = $( "<img>" );
            $img.attr( { src:     got.thumb.source,
                         height:  got.thumb.height,
                         width:   got.thumb.width } )
                .css( { "display": "inline" } );
            $div.append( $img );
            if ( HTML.list ) {
               for ( i = 0;  i < got.dl.length;  i++ ) {
                  $dt = got.dl[ i ].dt;
                  $dt.css( { "clear": "both" } )
                     .append( $div );
               }   // for i
            } else {
               got.div.$box.prepend( $div );
            }
         }
      }   // for s in PTHC.got
   };   // HTML.floats()



   HTML.flop = function () {
      // Ensure list styles on search results
      // Uses:
      //    >  PTHC.selector
      //    >  HTML.css.extr
      //     < HTML.less
      //    mw.util.addCSS()
      // 2020-12-27 PerfektesChaos@de.wikipedia
      var css = { ol: "decimal",
                  ul: "disc" },
          sel = "." + PTHC.selector + "extracted",
          set = sel + "{",
          s;
      for ( s in HTML.css.extr ) {
         set = set + s + ":" + HTML.css.extr[ s ] + ";";
      }   // for s in HTML.css.extr
      set = set + "}";
      for ( s in css ) {
         set = set + sel + " " + s + " li{"
                   + "list-style:" + css[ s ] + " none outside;"
                   + "padding-bottom:0;}";
      }   // for s in css
      mw.util.addCSS( set );
      HTML.less = true;
   };   // HTML.flop()



   HTML.follow = function ( at, assigned, about ) {
      // Process API return
      // Precondition:
      //    at        -- page name
      //    assigned  -- page object
      //    about     -- kind of API request
      // Postcondition:
      //    Page has been modified
      // Uses:
      //    >  PTHC.scope
      //    HTML.first()
      // 2020-12-27 PerfektesChaos@de.wikipedia
      var i;
      switch ( about ) {
         case "pageprops":
            if ( typeof assigned.ul  ===  "object"   &&
                 typeof assigned.ul.length  ===  "number" ) {
               if ( PTHC.scope === "search" ) {
                  assigned.div = HTML.first( at,
                                             assigned,
                                             assigned.ul[ 0 ] );
               } else {
                  assigned.dl = [ ];
                  for ( i = 0;  i < assigned.ul.length;  i++ ) {
                     assigned.dl[ i ] = HTML.first( at,
                                                    assigned,
                                                    assigned.ul[ i ] );
                  }   // for i
               }
               delete assigned.ul;
            }
            break;
         case "summary":
            switch ( PTHC.scope ) {
               case "info":
                  break;
               case "search":
                  HTML.full( assigned, assigned.div, at );
                  break;
               default:
                  if ( typeof assigned.dl  ===  "object" ) {
                     for ( i = 0;  i < assigned.dl.length;  i++ ) {
                        HTML.full( assigned,  assigned.dl[ i ],  at );
                     }   // for i
                  }
            }   // switch PTHC.scope
            break;
         case "info":
            if ( PTHC.scope === "search" ) {
               HTML.full( assigned, assigned.div, at );
            } else if ( typeof assigned.dl  ===  "object" ) {
               for ( i = 0;  i < assigned.dl.length;  i++ ) {
                  HTML.full( assigned,  assigned.dl[ i ],  at );
               }   // for i
            }
            break;
      }   // switch about
   };   // HTML.follow()



   HTML.follower = function () {
      // Finalize presentation for anonymous users
      // Uses:
      //    >  PTHC.got
      //    HTML.follow()
      // 2020-12-27 PerfektesChaos@de.wikipedia
      var s;
      for ( s in PTHC.got ) {
         HTML.follow( s,  PTHC.got[ s ],  "info" );
      }   // for s in PTHC.got
   };   // HTML.follower()



   HTML.full = function ( assigned, about, at ) {
      // Complete page metadata for list entry
      // Precondition:
      //    assigned  -- page object
      //    about     -- entry object
      //    at        -- page name
      // Uses:
      //    >  PTHC.listen
      //    >  HTML.less
      //    HTML.fill()
      // 2020-12-27 PerfektesChaos@de.wikipedia
      about.$a.html( assigned.show );
      if ( assigned.linked ) {
         about.$a.addClass( "mw-disambig" );
      }
      if ( assigned.shift ) {
         HTML.fill( about, "redir", false, assigned.shift );
      }
      if ( assigned.shorty ) {
         HTML.fill( about, "shorty", false, assigned );
      }
      if ( assigned.item ) {
         HTML.fill( about, "wikidata", false, assigned.item );
      }
      if ( assigned.story ) {
         HTML.fill( about, "wikidata", "story", assigned );
      }
      if ( assigned.extract ) {
         HTML.fill( about, "extract", false, assigned.extract );
      }
      HTML.fill( about, "var", "info", at );
      if ( ! HTML.less ) {
         if ( assigned.stamp ) {
            HTML.fill( about, "var", "stamp", assigned.stamp );
         }
         if ( assigned.kBytes > 0 ) {
            HTML.fill( about, "var", "size", assigned.kBytes );
         }
      }
      if ( assigned.linked ) {
         HTML.fill( about, "var", "disambig" );
      }
      if ( assigned.stuff   &&  API.scope === "info" ) {
         HTML.fill( about, "var", "model", assigned.stuff );
      }
      if ( assigned.merits   &&  API.scope === "info" ) {
         HTML.fill( about, "var", "merits", assigned.merits );
      }
      if ( assigned.protection ) {
         HTML.fill( about, "var", "protected", assigned.protection );
      }
      if ( PTHC.listen   &&
           typeof assigned.listen  ===  "boolean" ) {
         HTML.fill( about,
                    "var",
                    "watching",
                    { listen: assigned.listen,
                      slot:   at } );
      }
   };   // HTML.full()



   QUEUE.fire = function () {
      // Start execution loop
      // Uses:
      //    >  PTHC.scope
      //    >  PTHC.got
      //    >  PTHC.ltr
      //    >  PTHC.listen
      //    >  PTHC.$widget
      //    >  QUEUE.lonely
      //    >< QUEUE.mode
      //    >< QUEUE.got
      //    HTML.flop()
      //    HTML.flip()
      //    API.fire()
      //    HTML.finesse()
      //    HTML.follower()
      //    QUEUE.floats()
      // 2020-12-27 PerfektesChaos@de.wikipedia
      var s, got;
      if ( ! QUEUE.mode ) {
         switch ( PTHC.scope ) {
            case "info":
               QUEUE.mode = 2;
               break;
            case "search":
               QUEUE.mode = 1;
               HTML.flop();
               break;
            default:
               QUEUE.mode = 1;
               HTML.flip();
         }   // switch PTHC.scope
         QUEUE.got = [ ];
         for ( s in PTHC.got ) {
            got = PTHC.got[ s ];
            QUEUE.got.push( s );
            got.extract = false;
            got.item    = 0;
            got.kBytes  = -1;
            got.merits  = 0;
            got.linked  = false;
            got.listen  = null;
            got.ltr     = PTHC.ltr;
            got.shift   = false;
            got.shorty  = false;
            got.slang   = false;
            got.source  = false;
            got.stamp   = false;
            got.story   = false;
            got.stuff   = false;
            got.thumb   = false;
         }   // for s in PTHC.got
      }
      switch ( QUEUE.mode ) {
         case 1:
            API.fire( QUEUE.got, "pageprops", QUEUE.fire );
            break;
         case 2:
            API.fire( QUEUE.got, "summary", QUEUE.fire );
            break;
         case 3:
            if ( PTHC.scope === "info" ) {
               QUEUE.mode++;
               HTML.finesse();
            } else if ( PTHC.listen ) {
               API.fire( QUEUE.got, "info", QUEUE.fire );
               break;   // switch QUEUE.mode
            } else {
               HTML.follower();
            }
         default:   // fall through
            PTHC.$widget.empty();
            if ( ! QUEUE.lonely  &&  PTHC.scope !== "info" ) {
               QUEUE.lonely = true;
               QUEUE.floats();
            }
      }   // switch QUEUE.mode
      QUEUE.mode++;
   };   // QUEUE.fire()



   QUEUE.floats = function ( ask ) {
      // Handle image request
      // Precondition:
      //    ask  -- object: click event
      // Uses:
      //    >< PTHC.trigger
      //    >< QUEUE.lonely
      //    BABEL.from()
      //    PTHC.furnish()
      //    QUEUE.fire()
      //    HTML.floats()
      //    (QUEUE.floats)
      // 2020-12-27 PerfektesChaos@de.wikipedia
      if ( ask ) {
         QUEUE.fire();
         HTML.floats();
      } else {
         PTHC.trigger.fiat    = QUEUE.floats;
         PTHC.trigger.fetch   = BABEL.from;
         PTHC.trigger.support = BABEL.from( "images" );
         PTHC.furnish( PTHC.trigger );
      }
   };   // QUEUE.floats()



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



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

/// EOF </nowiki>   pageTeaserHint/core/d.js