diff --git a/Thanks.php b/Thanks.php index 7db58aea..23ed7f79 100644 --- a/Thanks.php +++ b/Thanks.php @@ -129,6 +129,13 @@ $wgResourceModules['ext.thanks.mobilediff'] = array( 'localBasePath' => __DIR__ . '/modules', 'remoteExtPath' => 'Thanks/modules', ); +$wgResourceModules['ext.thanks.jquery.findWithParent'] = array( + 'scripts' => array( + 'jquery.findWithParent.js', + ), + 'localBasePath' => __DIR__ . '/modules', + 'remoteExtPath' => 'Thanks/modules', +); $wgResourceModules['ext.thanks.flowthank'] = array( 'scripts' => array( 'ext.thanks.flowthank.js', @@ -141,6 +148,7 @@ $wgResourceModules['ext.thanks.flowthank'] = array( 'dependencies' => array( 'mediawiki.jqueryMsg', 'mediawiki.api', + 'ext.thanks.jquery.findWithParent', 'ext.thanks', ), 'localBasePath' => __DIR__ . '/modules', diff --git a/modules/jquery.findWithParent.js b/modules/jquery.findWithParent.js new file mode 100644 index 00000000..99011a81 --- /dev/null +++ b/modules/jquery.findWithParent.js @@ -0,0 +1,57 @@ +( function ( $ ) { + /** @class jQuery */ + + /** + * Gives support to find parent elements using .closest with less-than selector syntax. + * + * $.findWithParent( $div, "< html div < body" ); // find closest parent of $div "html", find child "div" of it, find closest parent "body" of that, return "body" + * $( '#foo' ).findWithParent( '.bar < .baz' ); // find child ".bar" of "#foo", return closest parent ".baz" from there + * + * @method findWithParent + * @param {jQuery|HTMLElement|string} $context + * @param {string} selector + * @return {jQuery} + */ + function jQueryFindWithParent( $context, selector ) { + var matches; + + $context = $( $context ); + selector = $.trim( selector ); + + while ( selector && ( matches = selector.match( /(.*?(?:^|[>\s+~]))(<\s*[^>\s+~]+)(.*?)$/ ) ) ) { + if ( $.trim( matches[ 1 ] ) ) { + $context = $context.find( matches[ 1 ] ); + } + if ( $.trim( matches[ 2 ] ) ) { + $context = $context.closest( matches[ 2 ].substr( 1 ) ); + } + selector = $.trim( matches[ 3 ] ); + } + + if ( selector ) { + $context = $context.find( selector ); + } + + return $context; + } + + $.findWithParent = jQueryFindWithParent; + + /** @class jQuery.fn */ + /** + * @param {string} selector + * @return {jQuery} + * @see jQuery#findWithParent + */ + $.fn.findWithParent = function ( selector ) { + var selectors = selector.split( ',' ), + $elements = $(), + self = this; + + $.each( selectors, function ( i, selector ) { + $elements = $elements.add( jQueryFindWithParent( self, selector ) ); + } ); + + return $elements; + }; +}( jQuery ) );