Today: Tuesday 3 August 2021 , 7:34 am


advertisment
search


' ).append(
$( '


MediaWiki Gadget-ReferenceTooltips.js

Last updated 7 Giorno , 14 ora 11 Visualizzazioni

Advertisement
In this page talks about ( MediaWiki Gadget-ReferenceTooltips.js ) It was sent to us on 26/07/2021 and was presented on 26/07/2021 and the last update on this page on 26/07/2021

Il tuo commento


Inserisci il codice
  // NOTA: Preso da enwiki, fonte sotto. Unica differenza sono le traduzioni (mw.messages.set...).
// --> Tenere sincronizzato con l'originale!!!
// See mw:Reference Tooltips
// Source https://en.wikipedia.org/wiki/MediaWiki:Gadget-ReferenceTooltips.js
( function () {
// enwiki settings
var REF_LINK_SELECTOR = '.reference, ahref^="#CITEREF"',
COMMENTED_TEXT_CLASS = ,
COMMENTED_TEXT_SELECTOR = ( COMMENTED_TEXT_CLASS ? '.' + COMMENTED_TEXT_CLASS + ', ' :
) +
'abbrtitle';
mw.messages.set( {
'rt-settings': 'Impostazioni di Reference Tooltips',
'rt-enable-footer': 'Abilita Reference Tooltips',
'rt-settings-title': 'Reference Tooltips',
'rt-save': 'Salva',
'rt-cancel': 'Annulla',
'rt-enable': 'Abilita',
'rt-disable': 'Disabilita',
'rt-activationMethod': 'I tooltip compaiono tramite',
'rt-hovering': 'sosta del cursore sulla nota',
'rt-clicking': 'click sulla nota',
'rt-delay': 'Tempo prima dell\'apparizione del tooltip (in millisecondi)',
'rt-tooltipsForComments': 'Mostra i tooltip su
testo con sottolineatura a puntini
nello stile di Reference Tooltips (permette di visualizzare i tooltip su dispositivi senza mouse)',
'rt-disabledNote': 'Puoi riattivare Reference Tooltips usando il link in fondo alla pagina.',
'rt-done': 'Fatto',
'rt-enabled': 'Reference Tooltips è abilitato'
);
// "Global" variables
var SECONDS_IN_A_DAY = 60 * 60 * 24,
CLASSES = {
FADE_IN_DOWN: 'rt-fade-in-down',
FADE_IN_UP: 'rt-fade-in-up',
FADE_OUT_DOWN: 'rt-fade-out-down',
FADE_OUT_UP: 'rt-fade-out-up'
,
IS_TOUCHSCREEN = 'ontouchstart' in document.documentElement,
// Quite a rough check for mobile browsers, a mix of what is advised at
// https://stackoverflow.com/a/24600597 (sends to
// https://developer.mozilla.org/en-US/docs/Browser_detection_using_the_user_agent)
// and https://stackoverflow.com/a/14301832
IS_MOBILE = /MobiAndroid/i.test( navigator.userAgent )
typeof window.orientation !== 'undefined',
CLIENT_NAME = $.client.profile().name,
settingsString, settings, enabled, delay, activatedByClick, tooltipsForComments, cursorWaitCss,
windowManager,
$body = $( document.body ),
$window = $( window );
function rt( $content ) {
// Popups gadget
if ( window.pg ) {
return;
var teSelector,
settingsDialogOpening = false;
function setSettingsCookie() {
mw.cookie.set(
'RTsettings',
Number( enabled ) + '' + delay + '' + Number( activatedByClick ) + '' +
Number( tooltipsForComments ),
{ path: '/', expires: 90 * SECONDS_IN_A_DAY, prefix:
);
function enableRt() {
enabled = true;
setSettingsCookie();
$( '.rt-enableItem' ).remove();
rt( $content );
mw.notify( mw.msg( 'rt-enabled' ) );
function disableRt() {
$content.find( teSelector ).removeClass( 'rt-commentedText' ).off( '.rt' );
$body.off( '.rt' );
$window.off( '.rt' );
function addEnableLink() {
// #footer-places – Vector
// #f-list – Timeless, Monobook, Modern
// parent of #footer li – Cologne Blue
var $footer = $( '#footer-places, #f-list' );
if ( !$footer.length ) {
$footer = $( '#footer li' ).parent();
$footer.append(
$( '
  • ' )
    .addClass( 'rt-enableItem' )
    .append(
    $( '' )
    .text( mw.msg( 'rt-enable-footer' ) )
    .attr( 'href', 'javascript:' )
    .click( function ( e ) {
    e.preventDefault();
    enableRt();
    )
    )
    );
    function TooltippedElement( $element ) {
    var tooltip,
    te = this;
    function onStartEvent( e ) {
    var showRefArgs;
    if ( activatedByClick ) {
    e.preventDefault();
    if ( !te.noRef ) {
    showRefArgs = $( this ) ;
    if ( te.type !== 'supRef' ) {
    showRefArgs.push( e.pageX, e.pageY );
    te.showRef.apply( te, showRefArgs );
    function onEndEvent() {
    if ( !te.noRef ) {
    te.hideRef();
    if ( !$element ) {
    return;
    // TooltippedElement.$element and TooltippedElement.$originalElement will be different when
    // the first is changed after its cloned version is hovered in a tooltip
    this.$element = $element;
    this.$originalElement = $element;
    if ( this.$element.is( REF_LINK_SELECTOR ) ) {
    if ( this.$element.prop( 'tagName' ) === 'SUP' ) {
    this.type = 'supRef';
    else {
    this.type = 'harvardRef';
    else {
    this.type = 'commentedText';
    this.comment = this.$element.attr( 'title' );
    if ( !this.comment ) {
    return;
    this.$element.addClass('rt-commentedText');
    this.$element.on( activatedByClick ?
    { 'click.rt': onStartEvent :
    { 'mouseenter.rt': onStartEvent, 'mouseleave.rt': onEndEvent
    );
    this.hideRef = function ( immediately ) {
    clearTimeout( te.showTimer );
    if ( this.type === 'commentedText' ) {
    this.$element.attr( 'title', this.comment );
    if ( this.tooltip && this.tooltip.isPresent ) {
    if ( activatedByClick immediately ) {
    this.tooltip.hide();
    else {
    this.hideTimer = setTimeout( function () {
    te.tooltip.hide();
    , 200 );
    else if ( this.$ref && this.$ref.hasClass( 'rt-target' ) ) {
    this.$ref.removeClass( 'rt-target' );
    if ( activatedByClick ) {
    $body.off( 'click.rt touchstart.rt', this.onBodyClick );
    ;
    this.showRef = function ( $element, ePageX, ePageY ) {
    // Popups gadget
    if ( window.pg ) {
    disableRt();
    return;
    var tooltipInitiallyPresent = this.tooltip && this.tooltip.isPresent;
    function reallyShow() {
    var viewportTop, refOffsetTop, teHref;
    if ( !te.$ref && !te.comment ) {
    teHref = te.type === 'supRef' ?
    te.$element.find( 'a' ).attr( 'href' ) :
    te.$element.attr( 'href' ); // harvardRef
    te.$ref = teHref &&
    $( '#' + $.escapeSelector( teHref.slice( 1 ) ) );
    if ( !te.$ref !te.$ref.length !te.$ref.text() ) {
    te.noRef = true;
    return;
    if ( !tooltipInitiallyPresent && !te.comment ) {
    viewportTop = $window.scrollTop();
    refOffsetTop = te.$ref.offset().top;
    if ( !activatedByClick &&
    viewportTop < refOffsetTop &&
    viewportTop + $window.height() > refOffsetTop + te.$ref.height() &&
    // There can be gadgets/scripts that make references horizontally scrollable.
    $window.width() > te.$ref.offset().left + te.$ref.width()
    ) {
    // Highlight the reference itself
    te.$ref.addClass( 'rt-target' );
    return;
    if ( !te.tooltip ) {
    te.tooltip = new Tooltip( te );
    if ( !te.tooltip.$content.length ) {
    return;
    // If this tooltip is called from inside another tooltip. We can't define it
    // in the constructor since a ref can be cloned but have the same Tooltip object;
    // so, Tooltip.parent is a floating value.
    te.tooltip.parent = te.$element.closest( '.rt-tooltip' ).data( 'tooltip' );
    if ( te.tooltip.parent && te.tooltip.parent.disappearing ) {
    return;
    te.tooltip.show();
    if ( tooltipInitiallyPresent ) {
    if ( te.tooltip.$element.hasClass( 'rt-tooltip-above' ) ) {
    te.tooltip.$element.addClass( CLASSES.FADE_IN_DOWN );
    else {
    te.tooltip.$element.addClass( CLASSES.FADE_IN_UP );
    return;
    te.tooltip.calculatePosition( ePageX, ePageY );
    $window.on( 'resize.rt', te.onWindowResize );
    // We redefine this.$element here because e.target can be a reference link inside
    // a reference tooltip, not a link that was initially assigned to this.$element
    this.$element = $element;
    if ( this.type === 'commentedText' ) {
    this.$element.attr( 'title',
    );
    if ( activatedByClick ) {
    if ( tooltipInitiallyPresent
    ( this.$ref && this.$ref.hasClass( 'rt-target' ) )
    ) {
    return;
    else {
    setTimeout( function () {
    $body.on( 'click.rt touchstart.rt', te.onBodyClick );
    , 0 );
    if ( activatedByClick tooltipInitiallyPresent ) {
    reallyShow();
    else {
    this.showTimer = setTimeout( reallyShow, delay );
    ;
    this.onBodyClick = function ( e ) {
    if ( !te.tooltip && !te.$ref.hasClass( 'rt-target' ) ) {
    return;
    var $current = $( e.target );
    function contextMatchesParameter( parameter ) {
    return this === parameter;
    // The last condition is used to determine cases when a clicked tooltip is the current
    // element's tooltip or one of its descendants
    while ( $current.length &&
    ( !$current.hasClass( 'rt-tooltip' )
    !$current.data( 'tooltip' )
    !$current.data( 'tooltip' ).upToTopParent(
    contextMatchesParameter, te.tooltip ,
    true
    )
    )
    ) {
    $current = $current.parent();
    if ( !$current.length ) {
    te.hideRef();
    ;
    this.onWindowResize = function () {
    te.tooltip.calculatePosition();
    ;
    function Tooltip( te ) {
    function openSettingsDialog() {
    var settingsDialog, settingsWindow;
    if ( cursorWaitCss ) {
    cursorWaitCss.disabled = true;
    function SettingsDialog() {
    SettingsDialog.parent.call( this );
    OO.inheritClass( SettingsDialog, OO.ui.ProcessDialog );
    SettingsDialog.static.name = 'settingsDialog';
    SettingsDialog.static.title = mw.msg( 'rt-settings-title' );
    SettingsDialog.static.actions =
    {
    modes: 'basic',
    action: 'save',
    label: mw.msg( 'rt-save' ),
    flags: 'primary', 'progressive'
    ,
    {
    modes: 'basic',
    label: mw.msg( 'rt-cancel' ),
    flags: 'safe'
    ,
    {
    modes: 'disabled',
    action: 'deactivated',
    label: mw.msg( 'rt-done' ),
    flags: 'primary', 'progressive'
    ;
    SettingsDialog.prototype.initialize = function () {
    var dialog = this;
    SettingsDialog.parent.prototype.initialize.apply( this, arguments );
    this.enableOption = new OO.ui.RadioOptionWidget( {
    label: mw.msg( 'rt-enable' )
    );
    this.disableOption = new OO.ui.RadioOptionWidget( {
    label: mw.msg( 'rt-disable' )
    );
    this.enableSelect = new OO.ui.RadioSelectWidget( {
    items: this.enableOption, this.disableOption ,
    classes: 'rt-enableSelect'
    );
    this.enableSelect.selectItem( this.enableOption );
    this.enableSelect.on( 'choose', function ( item ) {
    if ( item === dialog.disableOption ) {
    dialog.activationMethodSelect.setDisabled( true );
    dialog.delayInput.setDisabled( true );
    dialog.tooltipsForCommentsCheckbox.setDisabled( true );
    else {
    dialog.activationMethodSelect.setDisabled( false );
    dialog.delayInput.setDisabled( dialog.clickOption.isSelected() );
    dialog.tooltipsForCommentsCheckbox.setDisabled( false );
    );
    this.hoverOption = new OO.ui.RadioOptionWidget( {
    label: mw.msg( 'rt-hovering' )
    );
    this.clickOption = new OO.ui.RadioOptionWidget( {
    label: mw.msg( 'rt-clicking' )
    );
    this.activationMethodSelect = new OO.ui.RadioSelectWidget( {
    items: this.hoverOption, this.clickOption
    );
    this.activationMethodSelect.selectItem( activatedByClick ?
    this.clickOption :
    this.hoverOption
    );
    this.activationMethodSelect.on( 'choose', function ( item ) {
    if ( item === dialog.clickOption ) {
    dialog.delayInput.setDisabled( true );
    else {
    dialog.delayInput.setDisabled( dialog.clickOption.isSelected() );
    );
    this.activationMethodField = new OO.ui.FieldLayout( this.activationMethodSelect, {
    label: mw.msg( 'rt-activationMethod' ),
    align: 'top'
    );
    this.delayInput = new OO.ui.NumberInputWidget( {
    input: { value: delay ,
    step: 50,
    min: 0,
    max: 5000,
    disabled: activatedByClick,
    classes: 'rt-numberInput'
    );
    this.delayField = new OO.ui.FieldLayout( this.delayInput, {
    label: mw.msg( 'rt-delay' ),
    align: 'top'
    );
    this.tooltipsForCommentsCheckbox = new OO.ui.CheckboxInputWidget( {
    selected: tooltipsForComments
    );
    this.tooltipsForCommentsField = new OO.ui.FieldLayout(
    this.tooltipsForCommentsCheckbox,
    {
    label: new OO.ui.HtmlSnippet( mw.msg( 'rt-tooltipsForComments' ) ),
    align: 'inline',
    classes: 'rt-tooltipsForCommentsField'
    );
    new TooltippedElement(
    this.tooltipsForCommentsField.$element.find(
    '.' + ( COMMENTED_TEXT_CLASS 'rt-commentedText' )
    )
    );
    this.fieldset = new OO.ui.FieldsetLayout();
    this.fieldset.addItems(
    this.activationMethodField,
    this.delayField,
    this.tooltipsForCommentsField
    );
    this.panelSettings = new OO.ui.PanelLayout( {
    padded: true,
    expanded: false
    );
    this.panelSettings.$element.append(
    this.enableSelect.$element,
    $( '' ).addClass( 'rt-settingsFormSeparator' ),
    this.fieldset.$element
    );
    this.panelDisabled = new OO.ui.PanelLayout( {
    padded: true,
    expanded: false
    );
    this.panelDisabled.$element.append(
    $( '' )
    .addClass( 'rt-disabledHelp' )
    .append(
    $( '
  • ' ).append(
    $( '' ).attr( 'src', 'https://en.wikipedia.org/w/load.php?modules=ext.popups.images&image=footer&format=rasterized&lang=ru&skin=vector&version=0uotisb' )
    ),
    $( '
    ' )
    .addClass( 'rt-disabledNote' )
    .text( mw.msg( 'rt-disabledNote' ) )
    )
    )
    );
    this.stackLayout = new OO.ui.StackLayout( {
    items: this.panelSettings, this.panelDisabled
    );
    this.$body.append( this.stackLayout.$element );
    ;
    SettingsDialog.prototype.getSetupProcess = function ( data ) {
    return SettingsDialog.parent.prototype.getSetupProcess.call( this, data )
    .next( function () {
    this.stackLayout.setItem( this.panelSettings );
    this.actions.setMode( 'basic' );
    , this );
    ;
    SettingsDialog.prototype.getActionProcess = function ( action ) {
    var dialog = this;
    if ( action === 'save' ) {
    return new OO.ui.Process( function () {
    var newDelay = Number( dialog.delayInput.getValue() );
    enabled = dialog.enableOption.isSelected();
    if ( newDelay >= 0 && newDelay 50
    )
    ) {
    tooltip.upToTopParent( function () {
    this.te.hideRef();
    );
    )
    .click( function () {
    tooltip.clickedTime = $.now();
    );
    if ( !this.insideWindow ) {
    $( '
    ' )
    .addClass( 'rt-settingsLink' )
    .attr( 'title', mw.msg( 'rt-settings' ) )
    .click( function () {
    if ( settingsDialogOpening ) {
    return;
    settingsDialogOpening = true;
    if ( mw.loader.getState( 'oojs-ui' ) !== 'ready' ) {
    if ( cursorWaitCss ) {
    cursorWaitCss.disabled = false;
    else {
    cursorWaitCss = mw.util.addCSS( 'body { cursor: wait; ' );
    mw.loader.using( 'oojs', 'oojs-ui' , openSettingsDialog );
    )
    .prependTo( this.$content );
    // Tooltip tail element is inside tooltip content element in order for the tooltip
    // not to disappear when the mouse is above the tail
    this.$tail = $( '
    ' )
    .addClass( 'rt-tooltipTail' )
    .prependTo( this.$element );
    this.disappearing = false;
    this.show = function () {
    this.disappearing = false;
    clearTimeout( this.te.hideTimer );
    clearTimeout( this.te.removeTimer );
    this.$element
    .removeClass( CLASSES.FADE_OUT_DOWN )
    .removeClass( CLASSES.FADE_OUT_UP );
    if ( !this.isPresent ) {
    $body.append( this.$element );
    this.isPresent = true;
    ;
    this.hide = function () {
    var tooltip = this;
    tooltip.disappearing = true;
    if ( tooltip.$element.hasClass( 'rt-tooltip-above' ) ) {
    tooltip.$element
    .removeClass( CLASSES.FADE_IN_DOWN )
    .addClass( CLASSES.FADE_OUT_UP );
    else {
    tooltip.$element
    .removeClass( CLASSES.FADE_IN_UP )
    .addClass( CLASSES.FADE_OUT_DOWN );
    tooltip.te.removeTimer = setTimeout( function () {
    if ( tooltip.isPresent ) {
    tooltip.$element.detach();
    tooltip.$tail.css( 'left', );
    if ( activatedByClick ) {
    $body.off( 'click.rt touchstart.rt', tooltip.te.onBodyClick );
    $window.off( 'resize.rt', tooltip.te.onWindowResize );
    tooltip.isPresent = false;
    , 200 );
    ;
    this.calculatePosition = function ( ePageX, ePageY ) {
    var teElement, teOffsets, teOffset, tooltipTailOffsetX, tooltipTailLeft,
    offsetYCorrection = 0;
    this.$tail.css( 'left',
    );
    teElement = this.te.$element.get( 0 );
    if ( ePageX !== undefined ) {
    tooltipTailOffsetX = ePageX;
    teOffsets = teElement.getClientRects &&
    teElement.getClientRects()
    teElement.getBoundingClientRect();
    if ( teOffsets.length > 1 ) {
    for (var i = teOffsets.length - 1; i >= 0; i--) {
    if ( ePageY >= Math.round( $window.scrollTop() + teOffsetsi.top ) &&
    ePageY $window.width() - 1 ) {
    this.$element.css( {
    left: ,
    right: 0
    );
    tooltipTailLeft = tooltipTailOffsetX - this.$element.offset().left - 5;
    // Is a part of it above the top of the screen?
    if ( teOffset.top < this.$element.outerHeight() + $window.scrollTop() + 6 ) {
    this.$element
    .removeClass( 'rt-tooltip-above' )
    .addClass( 'rt-tooltip-below' )
    .addClass( CLASSES.FADE_IN_UP )
    .css( {
    top: teOffset.top + teOffset.height + 9 + offsetYCorrection
    );
    if ( tooltipTailLeft ) {
    this.$tail.css( 'left', ( tooltipTailLeft + 12 ) + 'px' );
    else {
    this.$element
    .removeClass( 'rt-tooltip-below' )
    .addClass( 'rt-tooltip-above' )
    .addClass( CLASSES.FADE_IN_DOWN )
    // A fix for cases when a tooltip shown once is then wrongly positioned when it
    // is shown again after a window resize. We just repeat what is above.
    .css( {
    top: teOffset.top - this.$element.outerHeight() - 7 + offsetYCorrection
    );
    if ( tooltipTailLeft ) {
    // 12 is the tail element width/height
    this.$tail.css( 'left', tooltipTailLeft + 'px' );
    ;
    // Run some function for all the tooltips up to the top one in a tree. Its context will be
    // the tooltip, while its parameters may be passed to Tooltip.upToTopParent as an array
    // in the second parameter. If the third parameter passed to ToolTip.upToTopParent is true,
    // the execution stops when the function in question returns true for the first time,
    // and ToolTip.upToTopParent returns true as well.
    this.upToTopParent = function ( func, parameters, stopAtTrue ) {
    var returnValue,
    currentTooltip = this;
    do {
    returnValue = func.apply( currentTooltip, parameters );
    if ( stopAtTrue && returnValue ) {
    break;
    while ( currentTooltip = currentTooltip.parent );
    if ( stopAtTrue ) {
    return returnValue;
    ;
    if ( !enabled ) {
    addEnableLink();
    return;
    teSelector = REF_LINK_SELECTOR;
    if ( tooltipsForComments ) {
    teSelector += ', ' + COMMENTED_TEXT_SELECTOR;
    $content.find( teSelector ).each( function () {
    new TooltippedElement( $( this ) );
    );
    settingsString = mw.cookie.get( 'RTsettings',
    );
    if ( settingsString ) {
    settings = settingsString.split( '' );
    enabled = Boolean( Number( settings 0 ) );
    delay = Number( settings 1 );
    activatedByClick = Boolean( Number( settings 2 ) );
    // The forth value was added later, so we provide for a default value. See comments below
    // for why we use "IS_TOUCHSCREEN && IS_MOBILE".
    tooltipsForComments = settings 3 === undefined ?
    IS_TOUCHSCREEN && IS_MOBILE :
    Boolean( Number( settings 3 ) );
    else {
    enabled = true;
    delay = 200;
    // Since the mobile browser check is error-prone, adding IS_MOBILE condition here would probably
    // leave cases where a user interacting with the browser using touches doesn't know how to call
    // a tooltip in order to switch to activation by click. Some touch-supporting laptop users
    // interacting by touch (though probably not the most popular use case) would not be happy too.
    activatedByClick = IS_TOUCHSCREEN;
    // Arguably we shouldn't convert native tooltips into gadget tooltips for devices that have
    // mouse support, even if they have touchscreens (there are laptops with touchscreens).
    // IS_TOUCHSCREEN check here is for reliability, since the mobile check is prone to false
    // positives.
    tooltipsForComments = IS_TOUCHSCREEN && IS_MOBILE;
    mw.hook( 'wikipage.content' ).add( rt );
    () );
     
    Commenti

    Non ci sono ancora commenti

    ultima visualizzazione
    la maggior parte delle visite