User:SoledadKabocha/badAnchorWarning.js

// function defaultPref( cfig, dflt ) { return ( typeof cfig == typeof dflt ? cfig : dflt ); }

function showBadAnchorWarning { var zzAction = mw.config.get( 'wgAction' ); var zzNamespaceNumber = mw.config.get( 'wgNamespaceNumber' );

// not useful when editing nor on special pages if ( !window.location.hash || zzAction != 'view' || zzNamespaceNumber < 0 ) return;

// strip the pound sign var myAnchor = window.location.hash.substr( 1 ); if ( !myAnchor || document.getElementById( myAnchor ) ) return;

var warningLink = 'searchInput'; if     ( document.getElementById( 'searchbox' ) ) { warningLink = 'searchbox'; } else if ( document.getElementById( 'toc' ) ) { warningLink = 'toc'; }

if ( window.BAAutofillSearch === true ) { if ( typeof document.getElementById( warningLink ).value == 'string' ) { document.getElementById( warningLink ).value = myAnchor; }   else { var jqWarningLink = $( '#' + warningLink ); var myInput = jqWarningLink.find( 'input' ); if ( myInput ) { // avoid overwriting existing values because doing so would change button labels myInput.val( function( index, oldValue ) { return oldValue ? oldValue : myAnchor } ); }   }  }

window.BAWarnInSiteSub  = defaultPref( window.BAWarnInSiteSub,   true ); window.BAWarnAsJsMessage = defaultPref( window.BAWarnAsJsMessage, true ); if ( window.BAWarnInSiteSub || window.BAWarnAsJsMessage ) { // ensure valid HTML syntax even if bad characters got into the anchor somehow (not a serious security measure) if ( myAnchor.indexOf( '<' ) != -1 || myAnchor.indexOf( '>' ) != -1 || myAnchor.indexOf( '"' ) != -1 )     myAnchor = 'Invalid_anchor_redacted';

var warningText = ' '; warningText += '(The anchor ' + myAnchor + ' was not found; ';   var templateRegex           = /\{\{.+\}\}/g;    var exclPipeTemplateRegex   = /\{\{!\}\}/g; //MW now implements this as a magic word; still needed?    var equalsTemplateRegex     = /\{\{=\}\}/g;    var anchorTemplateRegex     = /\{\{[Aa]nchor\|.+\}\}/g;    var apostropheTemplateRegex = /\{\{(?:\.27|[Aa]postrophe)\}\}/g;    var tlTemplateRegex         = /\{\{[Tt](?:l[pux]?)?\|(.+)\}\}/g;    var noRedirectTemplateRegex = /\{\{(?:[Nn]o_redirect|-r)\|(.+)\}\}/g;    if ( templateRegex.test( myAnchor ) ) {      warningText += 'if you edited a ';      var fixedAnchor =    myAnchor.replace( exclPipeTemplateRegex, '|' ).replace( equalsTemplateRegex, '=' );          fixedAnchor = fixedAnchor.replace( anchorTemplateRegex,  ).replace( apostropheTemplateRegex, '\ ).replace( /^_+|_+$/g, '' );

//Now extract template parameters where needed - XXX this won't work correctly with multiple transclusions of any such template... var tlCall = tlTemplateRegex.exec( fixedAnchor ); var tlParam = ''; if ( tlCall ) tlParam = tlCall[1]; if ( tlParam ) fixedAnchor = fixedAnchor.replace( tlTemplateRegex, '' );

var nrCall = noRedirectTemplateRegex.exec( fixedAnchor ); var nrParam = ''; if ( nrCall ) nrParam = nrCall[1]; if ( nrParam ) fixedAnchor = fixedAnchor.replace( noRedirectTemplateRegex, nrParam );

if ( fixedAnchor && ( fixedAnchor != myAnchor ) && document.getElementById( fixedAnchor ) ) { warningText += 'section'; }     else { // don't attempt to fix the anchor if there are templates we don't recognize warningText += 'section'; }     warningText += ', you have encountered a MediaWiki software issue'; }   else { if ( myAnchor.indexOf( '/media/' ) == 0 ) { warningText += 'if you just closed Media Viewer, there is no problem'; }     /* // probably obsolete? else if ( myAnchor.indexOf( '.5B.5B' ) != -1 && myAnchor.indexOf( '.5D.5D' ) != -1 ) { // Echo (Notifications) fails to strip wikilink markup and unnecessarily percent-encodes some characters. // XXX: This doesn't handle piped links // XXX: There are probably more such characters to deal with...

fixedAnchor = myAnchor.replace( /(\.5[BD]){2}/g, '' ).replace( /%3A/g, ':' );

warningText += 'if you clicked on a notification, you have encountered a MediaWiki software issue'; if ( fixedAnchor && ( fixedAnchor != myAnchor ) && document.getElementById( fixedAnchor ) ) { warningText += '. You were probably looking for '; warningText += ''; warningText += 'this section'; warningText += ''; }     }*/      /* // ditto (needs testing) else if ( /\.7C(_|$)/.test( myAnchor ) && document.getElementById( 'ca-addsection' ) ) { warningText += 'if you used a pipe trick in the title of a ';

var lastHeadline = $( 'h2:last-of-type > .mw-headline' ); var lastHeadlineID = ''; if ( lastHeadline && lastHeadline.length > 0 ) lastHeadlineID = lastHeadline.attr( 'id' ); if ( lastHeadlineID ) { warningText += ''; warningText += 'new section'; warningText += ''; }       else { warningText += 'new section'; }

warningText += ', you have encountered a MediaWiki software issue'; }*/     else { if ( warningLink == 'searchbox' ) { warningText += 'try searching this page\'s archives'; }       else { // TODO: descriptive titles here too, once I rethink whether searchInput is a good default for warningLink warningText += 'please check its spelling and capitalization'; if ( zzNamespaceNumber != 0 ) { warningText += ', or search this page\'s archives if any'; }       }      }    }    warningText += '.)';    warningText += ' ';

if ( window.BAWarnInSiteSub === true ) { // non-WMF wikis hide siteSub by default if ( typeof mw.util.addCSS === 'function' ) { mw.util.addCSS( '#siteSub { display:inline; }' ); }

$( '#siteSub' ).append( warningText ); }   if ( window.BAWarnAsJsMessage === true ) { mw.notify( warningText.replace( / id="badanchorwarn-/g, ' id="badanchorwarn-jsmsg-' ) ); } } }

if ( !window.BAWarnManual ) $( showBadAnchorWarning ); //