Merge "SpecialTrackingCategories: Read from the extension registry"
[lhc/web/wiklou.git] / includes / Html.php
index 1e16e39..93a1a04 100644 (file)
@@ -101,6 +101,34 @@ class Html {
                'itemscope',
        );
 
+       /**
+        * Modifies a set of attributes meant for button elements
+        * and apply a set of default attributes when $wgUseMediaWikiUIEverywhere enabled.
+        * @param array $modifiers to add to the button
+        * @see https://tools.wmflabs.org/styleguide/desktop/index.html for guidance on available modifiers
+        * @return array $attrs A modified attribute array
+        */
+       public static function buttonAttributes( $attrs, $modifiers = array() ) {
+               global $wgUseMediaWikiUIEverywhere;
+               if ( $wgUseMediaWikiUIEverywhere ) {
+                       if ( isset( $attrs['class'] ) ) {
+                               if ( is_array( $attrs['class'] ) ) {
+                                       $attrs['class'][] = 'mw-ui-button';
+                                       $attrs = array_merge( $attrs, $modifiers );
+                                       // ensure compatibility with Xml
+                                       $attrs['class'] = implode( ' ', $attrs['class'] );
+                               } else {
+                                       $attrs['class'] .= ' mw-ui-button ' . implode( ' ', $modifiers );
+                               }
+                       } else {
+                               $attrs['class'] = array( 'mw-ui-button' );
+                               // ensure compatibility with Xml
+                               $attrs['class'] = implode( ' ', array_merge( $attrs['class'], $modifiers ) );
+                       }
+               }
+               return $attrs;
+       }
+
        /**
         * Modifies a set of attributes meant for text input elements
         * and apply a set of default attributes.
@@ -130,11 +158,47 @@ class Html {
                return $attrs;
        }
 
+       /**
+        * Returns an HTML link element in a string styled as a button (when $wgUseMediaWikiUIEverywhere is enabled).
+        *
+        * @param string $contents The raw HTML contents of the element: *not*
+        *   escaped!
+        * @param array $attrs Associative array of attributes, e.g., array(
+        *   'href' => 'http://www.mediawiki.org/' ). See expandAttributes() for
+        *   further documentation.
+        * @param array $modifiers to add to the button
+        * @see http://tools.wmflabs.org/styleguide/desktop/index.html for guidance on available modifiers
+        * @return string Raw HTML
+        */
+       public static function linkButton( $contents, $attrs, $modifiers = array() ) {
+               return Html::element( 'a',
+                       self::buttonAttributes( $attrs, $modifiers ),
+                       $contents
+               );
+       }
+
+       /**
+        * Returns an HTML link element in a string styled as a button (when $wgUseMediaWikiUIEverywhere is enabled).
+        *
+        * @param string $contents The raw HTML contents of the element: *not*
+        *   escaped!
+        * @param array $attrs Associative array of attributes, e.g., array(
+        *   'href' => 'http://www.mediawiki.org/' ). See expandAttributes() for
+        *   further documentation.
+        * @param array $modifiers to add to the button
+        * @see http://tools.wmflabs.org/styleguide/desktop/index.html for guidance on available modifiers
+        * @return string Raw HTML
+        */
+       public static function submitButton( $contents, $attrs, $modifiers = array() ) {
+               $attrs['type'] = 'submit';
+               $attrs['value'] = $contents;
+               return Html::element( 'input', self::buttonAttributes( $attrs, $modifiers ) );
+       }
+
        /**
         * Returns an HTML element in a string.  The major advantage here over
         * manually typing out the HTML is that it will escape all attribute
-        * values.  If you're hardcoding all the attributes, or there are none, you
-        * should probably just type out the html element yourself.
+        * values.
         *
         * This is quite similar to Xml::tags(), but it implements some useful
         * HTML-specific logic.  For instance, there is no $allowShortTag
@@ -202,8 +266,7 @@ class Html {
                // In text/html, initial <html> and <head> tags can be omitted under
                // pretty much any sane circumstances, if they have no attributes.  See:
                // <http://www.whatwg.org/html/syntax.html#optional-tags>
-               if ( !$wgWellFormedXml && !$attribs
-               && in_array( $element, array( 'html', 'head' ) ) ) {
+               if ( !$wgWellFormedXml && !$attribs && in_array( $element, array( 'html', 'head' ) ) ) {
                        return '';
                }
 
@@ -236,8 +299,7 @@ class Html {
                                'tel',
                                'color',
                        );
-                       if ( isset( $attribs['type'] )
-                       && !in_array( $attribs['type'], $validTypes ) ) {
+                       if ( isset( $attribs['type'] ) && !in_array( $attribs['type'], $validTypes ) ) {
                                unset( $attribs['type'] );
                        }
                }
@@ -331,8 +393,9 @@ class Html {
                        }
 
                        // Simple checks using $attribDefaults
-                       if ( isset( $attribDefaults[$element][$lcattrib] ) &&
-                       $attribDefaults[$element][$lcattrib] == $value ) {
+                       if ( isset( $attribDefaults[$element][$lcattrib] )
+                               && $attribDefaults[$element][$lcattrib] == $value
+                       ) {
                                unset( $attribs[$attrib] );
                        }
 
@@ -342,8 +405,9 @@ class Html {
                }
 
                // More subtle checks
-               if ( $element === 'link' && isset( $attribs['type'] )
-               && strval( $attribs['type'] ) == 'text/css' ) {
+               if ( $element === 'link'
+                       && isset( $attribs['type'] ) && strval( $attribs['type'] ) == 'text/css'
+               ) {
                        unset( $attribs['type'] );
                }
                if ( $element === 'input' ) {
@@ -442,8 +506,7 @@ class Html {
 
                        // For boolean attributes, support array( 'foo' ) instead of
                        // requiring array( 'foo' => 'meaningless' ).
-                       if ( is_int( $key )
-                       && in_array( strtolower( $value ), self::$boolAttribs ) ) {
+                       if ( is_int( $key ) && in_array( strtolower( $value ), self::$boolAttribs ) ) {
                                $key = $value;
                        }
 
@@ -522,14 +585,13 @@ class Html {
                        // marks omitted, but not all.  (Although a literal " is not
                        // permitted, we don't check for that, since it will be escaped
                        // anyway.)
-                       #
+
                        // See also research done on further characters that need to be
                        // escaped: http://code.google.com/p/html5lib/issues/detail?id=93
                        $badChars = "\\x00- '=<>`/\x{00a0}\x{1680}\x{180e}\x{180F}\x{2000}\x{2001}"
                                . "\x{2002}\x{2003}\x{2004}\x{2005}\x{2006}\x{2007}\x{2008}\x{2009}"
                                . "\x{200A}\x{2028}\x{2029}\x{202F}\x{205F}\x{3000}";
-                       if ( $wgWellFormedXml || $value === ''
-                       || preg_match( "![$badChars]!u", $value ) ) {
+                       if ( $wgWellFormedXml || $value === '' || preg_match( "![$badChars]!u", $value ) ) {
                                $quote = '"';
                        } else {
                                $quote = '';
@@ -830,7 +892,7 @@ class Html {
                                continue;
                        }
                        if ( $nsId === NS_MAIN ) {
-                               // For other namespaces use use the namespace prefix as label, but for
+                               // For other namespaces use the namespace prefix as label, but for
                                // main we don't use "" but the user message describing it (e.g. "(Main)" or "(Article)")
                                $nsName = wfMessage( 'blanknamespace' )->text();
                        } elseif ( is_int( $nsId ) ) {