class. If you extend this class please be sure to override all its methods
or extend RevisionSearchResult.
* Skin::getSkinNameMessages() is deprecated and no longer used.
+* The mediawiki.RegExp module is deprecated; use mw.util.escapeRegExp() instead.
=== Other changes in 1.34 ===
* …
"classes": [
"mw.Title",
"mw.Uri",
- "mw.RegExp",
"mw.String",
"mw.messagePoster.*",
"mw.notification",
'jquery.highlightText' => [
'scripts' => 'resources/src/jquery/jquery.highlightText.js',
'dependencies' => [
- 'mediawiki.RegExp',
+ 'mediawiki.util',
],
'targets' => [ 'desktop', 'mobile' ],
],
'messages' => [ 'sort-descending', 'sort-ascending' ],
'dependencies' => [
'jquery.tablesorter.styles',
- 'mediawiki.RegExp',
+ 'mediawiki.util',
'mediawiki.language.months',
],
],
],
'dependencies' => [
'mediawiki.language',
- 'mediawiki.RegExp',
+ 'mediawiki.util',
],
'targets' => [ 'desktop', 'mobile' ],
],
'resources/src/mediawiki.htmlform/selectorother.js',
],
'dependencies' => [
- 'mediawiki.RegExp',
+ 'mediawiki.util',
'jquery.lengthLimit',
],
'messages' => [
'scripts' => 'resources/src/mediawiki.inspect.js',
'dependencies' => [
'mediawiki.String',
- 'mediawiki.RegExp',
+ 'mediawiki.util',
],
'targets' => [ 'desktop', 'mobile' ],
],
'targets' => [ 'desktop', 'mobile' ],
],
'mediawiki.RegExp' => [
+ 'deprecated' => 'Please use mw.util.escapeRegExp() instead.',
'scripts' => 'resources/src/mediawiki.RegExp.js',
'targets' => [ 'desktop', 'mobile' ],
+ 'dependencies' => [
+ 'mediawiki.util',
+ ],
],
'mediawiki.String' => [
'scripts' => 'resources/src/mediawiki.String.js',
],
'dependencies' => [
'jquery.client',
- 'mediawiki.RegExp',
],
'messages' => [ 'brackets', 'word-separator' ],
'targets' => [ 'desktop', 'mobile' ],
'mediawiki.util',
'mediawiki.Title',
'mediawiki.jqueryMsg',
- 'mediawiki.RegExp',
+ 'mediawiki.util',
],
'messages' => [
'watch',
'period-pm',
],
'dependencies' => [
- 'mediawiki.RegExp',
+ 'mediawiki.util',
'oojs-ui-core',
'oojs-ui.styles.icons-moderation',
'oojs-ui.styles.icons-movement',
// Construct regexes for number identification
for ( i = 0; i < ascii.length; i++ ) {
ts.transformTable[ localised[ i ] ] = ascii[ i ];
- digits.push( mw.RegExp.escape( localised[ i ] ) );
+ digits.push( mw.util.escapeRegExp( localised[ i ] ) );
}
}
digitClass = '[' + digits.join( '', digits ) + ']';
for ( i = 0; i < 12; i++ ) {
name = mw.language.months.names[ i ].toLowerCase();
ts.monthNames[ name ] = i + 1;
- regex.push( mw.RegExp.escape( name ) );
+ regex.push( mw.util.escapeRegExp( name ) );
name = mw.language.months.genitive[ i ].toLowerCase();
ts.monthNames[ name ] = i + 1;
- regex.push( mw.RegExp.escape( name ) );
+ regex.push( mw.util.escapeRegExp( name ) );
name = mw.language.months.abbrev[ i ].toLowerCase().replace( '.', '' );
ts.monthNames[ name ] = i + 1;
- regex.push( mw.RegExp.escape( name ) );
+ regex.push( mw.util.escapeRegExp( name ) );
}
// Build piped string
if ( ts.collationTable ) {
// Build array of key names
for ( key in ts.collationTable ) {
- keys.push( mw.RegExp.escape( key ) );
+ keys.push( mw.util.escapeRegExp( key ) );
}
if ( keys.length ) {
ts.collationRegex = new RegExp( keys.join( '|' ), 'ig' );
}
$.highlightText.innerHighlight(
node,
- new RegExp( '(^|\\s)' + mw.RegExp.escape( words[ i ] ), 'i' )
+ new RegExp( '(^|\\s)' + mw.util.escapeRegExp( words[ i ] ), 'i' )
);
}
return node;
prefixHighlight: function ( node, prefix ) {
$.highlightText.innerHighlight(
node,
- new RegExp( '(^)' + mw.RegExp.escape( prefix ), 'i' )
+ new RegExp( '(^)' + mw.util.escapeRegExp( prefix ), 'i' )
);
},
$.highlightText.innerHighlight(
node,
- new RegExp( '(^)' + mw.RegExp.escape( prefix ) + comboMarks + '*', 'i' )
+ new RegExp( '(^)' + mw.util.escapeRegExp( prefix ) + comboMarks + '*', 'i' )
);
},
( function () {
- /**
- * @class mw.RegExp
- */
- mw.RegExp = {
- /**
- * Escape string for safe inclusion in regular expression
- *
- * The following characters are escaped:
- *
- * \ { } ( ) | . ? * + - ^ $ [ ]
- *
- * @since 1.26
- * @static
- * @param {string} str String to escape
- * @return {string} Escaped string
- */
- escape: function ( str ) {
- return str.replace( /([\\{}()|.?*+\-^$\[\]])/g, '\\$1' ); // eslint-disable-line no-useless-escape
- }
- };
+ mw.RegExp = {};
+ // Backwards-compatible alias; @deprecated since 1.34
+ mw.log.deprecate( mw.RegExp, 'escape', mw.util.escapeRegExp, 'Use mw.util.escapeRegExp() instead.', 'mw.RegExp.escape' );
}() );
var $li,
$ul = $createButton.prev( 'ul.mw-htmlform-cloner-ul' ),
html = $ul.data( 'template' ).replace(
- new RegExp( mw.RegExp.escape( $ul.data( 'uniqueId' ) ), 'g' ),
+ new RegExp( mw.util.escapeRegExp( $ul.data( 'uniqueId' ) ), 'g' ),
'clone' + ( ++cloneCounter )
);
*/
inspect.grep = function ( pattern ) {
if ( typeof pattern.test !== 'function' ) {
- pattern = new RegExp( mw.RegExp.escape( pattern ), 'g' );
+ pattern = new RegExp( mw.util.escapeRegExp( pattern ), 'g' );
}
return inspect.getLoadedModules().filter( function ( moduleName ) {
actionPaths = mw.config.get( 'wgActionPaths' );
for ( key in actionPaths ) {
parts = actionPaths[ key ].split( '$1' );
- parts = parts.map( mw.RegExp.escape );
+ parts = parts.map( mw.util.escapeRegExp );
m = new RegExp( parts.join( '(.+)' ) ).exec( url );
if ( m && m[ 1 ] ) {
return key;
}
parts = ( separatorMsg + mw.message( 'brackets' ).plain() ).split( '$1' );
- regexp = new RegExp( parts.map( mw.RegExp.escape ).join( '.*?' ) + '$' );
+ regexp = new RegExp( parts.map( mw.util.escapeRegExp ).join( '.*?' ) + '$' );
newTitle = oldTitle.replace( regexp, '' );
accessKeyLabel = getAccessKeyLabel( element );
*/
getParamValue: function ( param, url ) {
// Get last match, stop at hash
- var re = new RegExp( '^[^#]*[&?]' + mw.RegExp.escape( param ) + '=([^&#]*)' ),
+ var re = new RegExp( '^[^#]*[&?]' + util.escapeRegExp( param ) + '=([^&#]*)' ),
m = re.exec( url !== undefined ? url : location.href );
if ( m ) {
isIPAddress: function ( address, allowBlock ) {
return util.isIPv4Address( address, allowBlock ) ||
util.isIPv6Address( address, allowBlock );
+ },
+
+ /**
+ * Escape string for safe inclusion in regular expression
+ *
+ * The following characters are escaped:
+ *
+ * \ { } ( ) | . ? * + - ^ $ [ ]
+ *
+ * @since 1.26; moved to mw.util in 1.34
+ * @param {string} str String to escape
+ * @return {string} Escaped string
+ */
+ escapeRegExp: function ( str ) {
+ // eslint-disable-next-line no-useless-escape
+ return str.replace( /([\\{}()|.?*+\-^$\[\]])/g, '\\$1' );
}
};
// eslint-disable-next-line no-restricted-properties
v = v.normalize();
}
- re = new RegExp( '^\\s*' + mw.RegExp.escape( v ), 'i' );
+ re = new RegExp( '^\\s*' + mw.util.escapeRegExp( v ), 'i' );
for ( k in this.values ) {
k = +k;
if ( !isNaN( k ) && re.test( this.values[ k ] ) ) {
if ( mw.config.get( 'wgTranslateNumerals' ) ) {
for ( i = 0; i < 10; i++ ) {
if ( table[ i ] !== undefined ) {
- s = s.replace( new RegExp( mw.RegExp.escape( table[ i ] ), 'g' ), i );
+ s = s.replace( new RegExp( mw.util.escapeRegExp( table[ i ] ), 'g' ), i );
}
}
}
'tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js',
'tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js',
'tests/qunit/suites/resources/mediawiki/mediawiki.messagePoster.factory.test.js',
- 'tests/qunit/suites/resources/mediawiki/mediawiki.RegExp.test.js',
'tests/qunit/suites/resources/mediawiki/mediawiki.String.byteLength.test.js',
'tests/qunit/suites/resources/mediawiki/mediawiki.String.trimByteLength.test.js',
'tests/qunit/suites/resources/mediawiki/mediawiki.storage.test.js',
'mediawiki.ForeignApi.core',
'mediawiki.jqueryMsg',
'mediawiki.messagePoster',
- 'mediawiki.RegExp',
'mediawiki.String',
'mediawiki.storage',
'mediawiki.Title',
+++ /dev/null
-( function () {
- QUnit.module( 'mediawiki.RegExp' );
-
- QUnit.test( 'escape', function ( assert ) {
- var specials, normal;
-
- specials = [
- '\\',
- '{',
- '}',
- '(',
- ')',
- '[',
- ']',
- '|',
- '.',
- '?',
- '*',
- '+',
- '-',
- '^',
- '$'
- ];
-
- normal = [
- 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
- 'abcdefghijklmnopqrstuvwxyz',
- '0123456789'
- ].join( '' );
-
- specials.forEach( function ( str ) {
- assert.propEqual( str.match( new RegExp( mw.RegExp.escape( str ) ) ), [ str ], 'Match ' + str );
- } );
-
- assert.strictEqual( mw.RegExp.escape( normal ), normal, 'Alphanumerals are left alone' );
- } );
-
-}() );
assert.strictEqual( util.isIPv6Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
} );
} );
+
+ QUnit.test( 'escapeRegExp', function ( assert ) {
+ var specials, normal;
+
+ specials = [
+ '\\',
+ '{',
+ '}',
+ '(',
+ ')',
+ '[',
+ ']',
+ '|',
+ '.',
+ '?',
+ '*',
+ '+',
+ '-',
+ '^',
+ '$'
+ ];
+
+ normal = [
+ 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
+ 'abcdefghijklmnopqrstuvwxyz',
+ '0123456789'
+ ].join( '' );
+
+ specials.forEach( function ( str ) {
+ assert.propEqual( str.match( new RegExp( mw.util.escapeRegExp( str ) ) ), [ str ], 'Match ' + str );
+ } );
+
+ assert.strictEqual( mw.util.escapeRegExp( normal ), normal, 'Alphanumerals are left alone' );
+ } );
}() );