User:SoledadKabocha/badAnchorWarning.js
Appearance
Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. This code will be executed when previewing this page. |
This user script seems to have a documentation page at User:SoledadKabocha/badAnchorWarning. |
// <nowiki>
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 = ' <span id="badanchorwarn-outer-' + myAnchor + '" class="badanchorwarn-outer">';
warningText += '(The anchor <span id="badanchorwarn-inner-' + myAnchor + '" class="badanchorwarn-inner">' + myAnchor + '</span> 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, '{{' + tlParam + '}}' );
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 += '<a href="#' + fixedAnchor + '">section</a>';
}
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 += '<a href="#' + fixedAnchor + '" title="#' + fixedAnchor + '">';
warningText += 'this section';
warningText += '</a>';
}
}*/
/* // 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 += '<a href="#' + lastHeadlineID + '" title="#' + lastHeadlineID + '">';
warningText += 'new section';
warningText += '</a>';
}
else {
warningText += 'new section';
}
warningText += ', you have encountered a MediaWiki software issue';
}*/
else {
if ( warningLink == 'searchbox' ) {
warningText += 'try <a href="#searchbox" title="Go to archive search box">searching this page\'s archives</a>';
}
else {
// TODO: descriptive titles here too, once I rethink whether searchInput is a good default for warningLink
warningText += 'please <a href="#' + warningLink + '" title="#' + warningLink + '">check its spelling and capitalization</a>';
if ( zzNamespaceNumber != 0 ) {
warningText += ', or search this page\'s archives if any';
}
}
}
}
warningText += '.)';
warningText += '</span>';
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 );
// </nowiki>