* (don't call before document ready)
*/
init: function () {
- /* Fill $content var */
util.$content = ( function () {
- var i, l, $content, selectors;
+ var i, l, $node, selectors;
+
selectors = [
- // The preferred standard for setting $content (class="mw-body")
- // You may also use (class="mw-body mw-body-primary") if you use
- // mw-body in multiple locations.
- // Or class="mw-body-primary" if you want $content to be deeper
- // in the dom than mw-body
+ // The preferred standard is class "mw-body".
+ // You may also use class "mw-body mw-body-primary" if you use
+ // mw-body in multiple locations. Or class "mw-body-primary" if
+ // you use mw-body deeper in the DOM.
'.mw-body-primary',
'.mw-body',
- /* Legacy fallbacks for setting the content */
- // Vector, Monobook, Chick, etc... based skins
- '#bodyContent',
-
- // Modern based skins
- '#mw_contentholder',
-
- // Standard, CologneBlue
- '#article',
-
- // #content is present on almost all if not all skins. Most skins (the above cases)
- // have #content too, but as an outer wrapper instead of the article text container.
- // The skins that don't have an outer wrapper do have #content for everything
- // so it's a good fallback
- '#content',
-
- // If nothing better is found fall back to our bodytext div that is guaranteed to be here
+ // If the skin has no such class, fall back to the parser output
'#mw-content-text',
- // Should never happen... well, it could if someone is not finished writing a skin and has
- // not inserted bodytext yet. But in any case <body> should always exist
+ // Should never happen... well, it could if someone is not finished writing a
+ // skin and has not yet inserted bodytext yet.
'body'
];
+
for ( i = 0, l = selectors.length; i < l; i++ ) {
- $content = $( selectors[i] ).first();
- if ( $content.length ) {
- return $content;
+ $node = $( selectors[i] );
+ if ( $node.length ) {
+ return $node.first();
}
}
- // Make sure we don't unset util.$content if it was preset and we don't find anything
+ // Preserve existing customized value in case it was preset
return util.$content;
- } )();
+ }() );
},
/* Main body */
return s.sheet || s.styleSheet || s;
},
- /**
- * Hide/show the table of contents element
- *
- * @param {jQuery} $toggleLink A jQuery object of the toggle link.
- * @param {Function} [callback] Function to be called after the toggle is
- * completed (including the animation).
- * @return {Mixed} Boolean visibility of the toc (true if it's visible)
- * or Null if there was no table of contents.
- * @deprecated since 1.23 Use jQuery
- */
- toggleToc: function ( $toggleLink, callback ) {
- var ret, $tocList = $( '#toc ul:first' );
-
- // This function shouldn't be called if there's no TOC,
- // but just in case...
- if ( !$tocList.length ) {
- return null;
- }
- ret = $tocList.is( ':hidden' );
- $toggleLink.click();
- $tocList.promise().done( callback );
- return ret;
- },
-
/**
* Grab the URL parameter value for the given parameter.
* Returns null if not found.
return null;
},
- /**
- * @property {string}
- * Access key prefix.
- */
- tooltipAccessKeyPrefix: ( function () {
- var profile = $.client.profile();
-
- // Opera on any platform
- if ( profile.name === 'opera' ) {
- return 'shift-esc-';
- }
-
- // Chrome on any platform
- if ( profile.name === 'chrome' ) {
- if ( profile.platform === 'mac' ) {
- // Chrome on Mac
- return 'ctrl-option-';
- }
- // Chrome on Windows or Linux
- // (both alt- and alt-shift work, but alt with E, D, F etc does not
- // work since they are browser shortcuts)
- return 'alt-shift-';
- }
-
- // Non-Windows Safari with webkit_version > 526
- if ( profile.platform !== 'win'
- && profile.name === 'safari'
- && profile.layoutVersion > 526
- ) {
- return 'ctrl-alt-';
- }
-
- // Firefox 14+ on Mac
- if ( profile.platform === 'mac'
- && profile.name === 'firefox'
- && profile.versionNumber >= 14
- ) {
- return 'ctrl-option-';
- }
-
- // Safari/Konqueror on any platform, or any browser on Mac
- // (but not Safari on Windows)
- if ( !( profile.platform === 'win' && profile.name === 'safari' )
- && ( profile.name === 'safari'
- || profile.platform === 'mac'
- || profile.name === 'konqueror' )
- ) {
- return 'ctrl-';
- }
-
- // Firefox/Iceweasel 2.x and later
- if ( ( profile.name === 'firefox' || profile.name === 'iceweasel' )
- && profile.versionBase > '1' ) {
- return 'alt-shift-';
- }
-
- return 'alt-';
- } )(),
-
- /**
- * @property {RegExp}
- * Regex to match accesskey tooltips.
- *
- * Should match:
- *
- * - "ctrl-option-"
- * - "alt-shift-"
- * - "ctrl-alt-"
- * - "ctrl-"
- *
- * The accesskey is matched in group $6.
- */
- tooltipAccessKeyRegexp: /\[(ctrl-)?(option-)?(alt-)?(shift-)?(esc-)?(.)\]$/,
-
/**
* Add the appropriate prefix to the accesskey shown in the tooltip.
*
$nodes = $( $nodes );
}
- $nodes.attr( 'title', function ( i, val ) {
- if ( val && util.tooltipAccessKeyRegexp.test( val ) ) {
- return val.replace( util.tooltipAccessKeyRegexp,
- '[' + util.tooltipAccessKeyPrefix + '$6]' );
- }
- return val;
- } );
+ $nodes.updateTooltipAccessKeys();
},
- /*
+ /**
+ * The content wrapper of the skin (e.g. `.mw-body`).
+ *
+ * Populated on document ready by #init. To use this property,
+ * wait for `$.ready` and be sure to have a module depedendency on
+ * `mediawiki.util` and `mediawiki.page.startup` which will ensure
+ * your document ready handler fires after #init.
+ *
+ * Because of the lazy-initialised nature of this property,
+ * you're discouraged from using it.
+ *
+ * If you need just the wikipage content (not any of the
+ * extra elements output by the skin), use `$( '#mw-content-text' )`
+ * instead. Or listen to mw.hook#wikipage_content which will
+ * allow your code to re-run when the page changes (e.g. live preview
+ * or re-render after ajax save).
+ *
* @property {jQuery}
- * A jQuery object that refers to the content area element.
- * Populated by #init.
*/
$content: null,
$item.attr( 'id', id );
}
- if ( tooltip ) {
- // Trim any existing accesskey hint and the trailing space
- tooltip = $.trim( tooltip.replace( util.tooltipAccessKeyRegexp, '' ) );
- if ( accesskey ) {
- tooltip += ' [' + accesskey + ']';
- }
- $link.attr( 'title', tooltip );
- if ( accesskey ) {
- util.updateTooltipAccessKeys( $link );
- }
- }
-
if ( accesskey ) {
$link.attr( 'accesskey', accesskey );
}
+ if ( tooltip ) {
+ $link.attr( 'title', tooltip ).updateTooltipAccessKeys();
+ }
+
if ( nextnode ) {
if ( nextnode.nodeType || typeof nextnode === 'string' ) {
// nextnode is a DOM element (was the only option before MW 1.17, in wikibits.js)
},
- /**
- * Add a little box at the top of the screen to inform the user of
- * something, replacing any previous message.
- * Calling with no arguments, with an empty string or null will hide the message
- *
- * @param {Mixed} message The DOM-element, jQuery object or HTML-string to be put inside the message box.
- * to allow CSS/JS to hide different boxes. null = no class used.
- * @deprecated since 1.20 Use mw#notify
- */
- jsMessage: function ( message ) {
- if ( !arguments.length || message === '' || message === null ) {
- return true;
- }
- if ( typeof message !== 'object' ) {
- message = $.parseHTML( message );
- }
- mw.notify( message, { autoHide: true, tag: 'legacy' } );
- return true;
- },
-
/**
* Validate a string as representing a valid e-mail address
* according to HTML5 specification. Please note the specification
*/
mw.log.deprecate( util, 'wikiGetlink', util.getUrl, 'Use mw.util.getUrl instead.' );
+ /**
+ * Access key prefix. Might be wrong for browsers implementing the accessKeyLabel property.
+ * @property {string} tooltipAccessKeyPrefix
+ * @deprecated since 1.24 Use the module jquery.accessKeyLabel instead.
+ */
+ mw.log.deprecate( util, 'tooltipAccessKeyPrefix', $.fn.updateTooltipAccessKeys.getAccessKeyPrefix(), 'Use jquery.accessKeyLabel instead.' );
+
+ /**
+ * Regex to match accesskey tooltips.
+ *
+ * Should match:
+ *
+ * - "ctrl-option-"
+ * - "alt-shift-"
+ * - "ctrl-alt-"
+ * - "ctrl-"
+ *
+ * The accesskey is matched in group $6.
+ *
+ * Will probably not work for browsers implementing the accessKeyLabel property.
+ *
+ * @property {RegExp} tooltipAccessKeyRegexp
+ * @deprecated since 1.24 Use the module jquery.accessKeyLabel instead.
+ */
+ mw.log.deprecate( util, 'tooltipAccessKeyRegexp', /\[(ctrl-)?(option-)?(alt-)?(shift-)?(esc-)?(.)\]$/, 'Use jquery.accessKeyLabel instead.' );
+
+ /**
+ * Add a little box at the top of the screen to inform the user of
+ * something, replacing any previous message.
+ * Calling with no arguments, with an empty string or null will hide the message
+ *
+ * @method jsMessage
+ * @deprecated since 1.20 Use mw#notify
+ * @param {Mixed} message The DOM-element, jQuery object or HTML-string to be put inside the message box.
+ * to allow CSS/JS to hide different boxes. null = no class used.
+ */
+ mw.log.deprecate( util, 'jsMessage', function ( message ) {
+ if ( !arguments.length || message === '' || message === null ) {
+ return true;
+ }
+ if ( typeof message !== 'object' ) {
+ message = $.parseHTML( message );
+ }
+ mw.notify( message, { autoHide: true, tag: 'legacy' } );
+ return true;
+ }, 'Use mw.notify instead.' );
+
mw.util = util;
}( mediaWiki, jQuery ) );