User:PerfektesChaos/js/pageTeaserHint/core/d.js

/// 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 /// /* 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 = $( "" ); $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  = $( "" ); $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 = $( " " ); $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()", "g" ); }              s = s.replace( PTHC.re.eol, "$1" ); }           $e = $( " " ); $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 = $( "" ); $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 = $( " " ); $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 = $( " " ); $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 = $( " " ); 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  = $( " " ); $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 = $( "" ); $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 ? "" : " " ); $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 = $( " " ); 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  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 = $( " " ); 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  elements into  // 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 = $( "" ); for ( k = 0; k < $lis.length;  k++ ) { $li = $lis.eq( k ); $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 = $( " " ); 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.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  pageTeaserHint/core/d.js