/// Gadget/logidTooltip/d.js
// Pop up logid link on certain special pages
/// 2020-08-01 PerfektesChaos@de.wikipedia
// ResourceLoader: compatible;
// dependencies: oojs, oojs-ui-core, oojs-ui-widgets
/// Fingerprint: #0#0#
/// Documentation: [[w:en:User:PerfektesChaos/js/logidTooltip]]
/// @license: CC-by-sa/4.0 GPLv3
/// <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.3,
LIT = { signature: "logidTooltip",
source: "0f/Arrow Blue UpperRight 001.svg",
search: "&action=edit&redlink=1",
selector: "data-mw-logid",
npx: 16,
$body: false,
$img: false
},
OO;
// -------------------------------------------------------------------
function filepath( assign ) {
// Configure icon file ID
// Precondition:
// assign -- string with file upload path
// Uses:
// >< LIT.reFile
// < LIT.source
// 2019-10-01 PerfektesChaos@de.wikipedia
var s = "[a-z0-9]";
if ( typeof assign === "string" ) {
if ( typeof LIT.reFile !== "object" ) {
LIT.reFile = new RegExp( "^" + s + s +
"/[^a-z][^/#<>{}]+\\.[a-zA-Z]*$" );
}
if ( LIT.reFile.test( assign ) ) {
LIT.source = assign;
}
}
} // filepath()
function fire() {
// Initialize
// Uses:
// > LIT.signature
// > Version
// > LIT.search
// < LIT.vsn
// < LIT.doc
// < LIT.signed
// < LIT.special
// mw.loader.getState()
// mw.config.get()
// mw.hook()
// (filepath)
// (LIT.furnish)
// 2020-08-01 PerfektesChaos@de.wikipedia
var signature = "ext.gadget." + LIT.signature,
env, launch, rls;
if ( mw.loader.getState( signature ) !== "ready" ) {
rls = { };
rls[ signature ] = "ready";
mw.loader.state( rls );
LIT.vsn = Version;
LIT.doc = "w:en:User:PerfektesChaos/js/" + LIT.signature;
LIT.doc = "[[" + LIT.doc + "]]";
env = mw.config.get( [ "wgCanonicalSpecialPageName",
"wgFormattedNamespaces" ] );
switch ( env.wgCanonicalSpecialPageName ) {
case "Log":
case "Recentchanges":
case "Watchlist":
launch = true;
break;
default:
launch = ( window.location.search.indexOf( LIT.search )
>= 0 );
} // switch wgCanonicalSpecialPageName
if ( launch ) {
LIT.signed = LIT.signature + "-handle";
LIT.special = env.wgFormattedNamespaces[ "-1" ];
mw.hook( LIT.signature + "-icon" ).add( filepath );
mw.hook( "wikipage.content" ).add( LIT.furnish );
}
}
} // fire()
LIT.$factory = function( assigned, $anchor ) {
// Create popup
// Precondition:
// assigned -- string, with logid
// $anchor -- element to be attached to
// OOjs-ui ready
// Postcondition:
// Return popup
// Uses:
// > LIT.special
// > LIT.signature
// > OO
// > .$body
// OO.ui.PopupWidget()
// 2019-10-01 PerfektesChaos@de.wikipedia
var illusive = 0.75,
// margin = 10,
offset = $anchor.offset(),
options = { anchor: true,
padded: true,
position: "below",
verticalPosition: "below",
$floatableContainer: $anchor },
shift = LIT.special + ":Redirect/logid/" + assigned,
$a = $( "<a>" ),
r;
options.width = ( 12 + assigned.length * 0.7 ) + "em";
if ( offset.left < 0.5 * window.innerWidth ) {
options.align = "forwards";
options.horizontalPosition = "start";
} else {
options.align = "backwards";
options.horizontalPosition = "end";
}
$a.addClass( LIT.signature + "-text plainlinks" )
.attr( { "dir": "ltr",
"href": "/wiki/" + shift,
"id": LIT.signature + "-text-" + assigned,
"lang": "en" } )
.css( { "font-family": "sans-serif",
"font-size": "medium",
"font-style": "normal",
"font-variant": "normal",
"font-weight": "normal",
"white-space": "nowrap" } )
.text( "[[" + shift + "]]" );
options.$content = $a;
r = new OO.ui.PopupWidget( options );
r.$floatable.attr( { "role": "tooltip" } )
.css( { "opacity": illusive,
"padding": "2px",
"text-align": "center" } );
LIT.$body.append( r.$floatable );
return r;
}; // .$factory()
LIT.fiat = function() {
// Deal with log entry
// Precondition:
// this -- LI DOM element
// Uses:
// > LIT.signed
// > LIT.selector
// > LIT.ltr
// > LIT.source
// > LIT.npx
// >< LIT.$img
// (LIT.fired)
// 2019-10-01 PerfektesChaos@de.wikipedia
var $li = $( this ),
id, re, src, $e;
if ( ! $li.find( "." + LIT.signed ).length ) {
id = $li.attr( LIT.selector );
if ( id ) {
if ( ! LIT.$img ) {
re = new RegExp( " +", "g" );
LIT.source = LIT.source.substr( 0, 1 ) + "/"
+ LIT.source.replace( re, "_" );
src = "https://upload.wikimedia.org/"
+ "wikipedia/commons/thumb/"
+ LIT.source + "/"
+ LIT.npx + "px-"
+ LIT.source.substr( 5 ) + ".png";
LIT.$img = $( "<img>" ).attr( { src: src,
height: LIT.npx + "px",
width: LIT.npx + "px" }
);
}
$e = LIT.$img.clone()
.addClass( LIT.signed )
.attr( "title", "logidTooltip " + id )
.css( "padding-"
+ ( LIT.ltr ? "left" : "right" ),
"6px" )
.click( function () { LIT.fired( id, $e );
} );
$li.append( $e );
}
}
}; // .fiat()
LIT.fired = function( assigned, $anchor ) {
// Icon has been clicked
// Precondition:
// assigned -- logid
// $anchor -- element to be attached to
// Uses:
// >< .$body
// LIT.flip()
// mw.loader.using()
// (LIT.flip)
// 2019-10-01 PerfektesChaos@de.wikipedia
if ( LIT.$body ) {
LIT.flip( assigned, $anchor );
} else {
LIT.$body = $( "body" );
mw.loader.using( [ "oojs",
"oojs-ui-core",
"oojs-ui-widgets" ],
function () {
LIT.flip( assigned, $anchor );
}
);
}
}; // .fired()
LIT.flip = function( assigned, $anchor ) {
// Process icon click
// Precondition:
// assigned -- logid
// $anchor -- element to be attached to
// OOjs-ui ready
// Uses:
// >< OO
// < LIT.popups
// LIT.$factory()
// 2019-10-01 PerfektesChaos@de.wikipedia
var entry, popup;
if ( ! OO ) {
OO = window.OO;
LIT.popups = { };
}
if ( typeof LIT.popups[ assigned ] === "object" ) {
entry = LIT.popups[ assigned ];
popup = entry[ 0 ];
} else {
popup = LIT.$factory( assigned, $anchor );
entry = [ popup, false ];
LIT.popups[ assigned ] = entry;
}
entry[ 1 ] = ! entry[ 1 ];
popup.toggle( entry[ 1 ] );
}; // .flip()
LIT.furnish = function( $area ) {
// Content area arrived
// Precondition:
// $area -- jQuery content area
// Uses:
// > LIT.selector
// >< LIT.ltr
// mw.hook()
// (LIT.fiat)
// 2020-01-01 PerfektesChaos@de.wikipedia
var $entries = $area.find( "li[" + LIT.selector + "]" );
if ( $entries.length ) {
if ( typeof LIT.ltr !== "boolean" ) {
LIT.ltr = ( $( "html" ).attr( "dir" ) !== "rtl" );
}
$entries.each( LIT.fiat );
}
}; // .furnish()
// -------------------------------------------------------------------
fire();
}( window.mediaWiki, window.jQuery ) );
/// EOF </nowiki> logidTooltip/d.js