diff options
author | Pierre Schmitz <pierre@archlinux.de> | 2013-01-18 16:46:04 +0100 |
---|---|---|
committer | Pierre Schmitz <pierre@archlinux.de> | 2013-01-18 16:46:04 +0100 |
commit | 63601400e476c6cf43d985f3e7b9864681695ed4 (patch) | |
tree | f7846203a952e38aaf66989d0a4702779f549962 /includes/Html.php | |
parent | 8ff01378c9e0207f9169b81966a51def645b6a51 (diff) |
Update to MediaWiki 1.20.2
this update includes:
* adjusted Arch Linux skin
* updated FluxBBAuthPlugin
* patch for https://bugzilla.wikimedia.org/show_bug.cgi?id=44024
Diffstat (limited to 'includes/Html.php')
-rw-r--r-- | includes/Html.php | 133 |
1 files changed, 99 insertions, 34 deletions
diff --git a/includes/Html.php b/includes/Html.php index c61a1baf..83af24af 100644 --- a/includes/Html.php +++ b/includes/Html.php @@ -211,6 +211,23 @@ class Html { 'search', ); + if( $wgHtml5 ) { + $validTypes = array_merge( $validTypes, array( + 'datetime', + 'datetime-local', + 'date', + 'month', + 'time', + 'week', + 'number', + 'range', + 'email', + 'url', + 'search', + 'tel', + 'color', + ) ); + } if ( isset( $attribs['type'] ) && !in_array( $attribs['type'], $validTypes ) ) { unset( $attribs['type'] ); @@ -286,6 +303,8 @@ class Html { return $attribs; } + # Whenever altering this array, please provide a covering test case + # in HtmlTest::provideElementsWithAttributesHavingDefaultValues static $attribDefaults = array( 'area' => array( 'shape' => 'rect' ), 'button' => array( @@ -306,7 +325,6 @@ class Html { 'input' => array( 'formaction' => 'GET', 'type' => 'text', - 'value' => '', ), 'keygen' => array( 'keytype' => 'rsa' ), 'link' => array( 'media' => 'all' ), @@ -325,7 +343,11 @@ class Html { foreach ( $attribs as $attrib => $value ) { $lcattrib = strtolower( $attrib ); - $value = strval( $value ); + if( is_array( $value ) ) { + $value = implode( ' ', $value ); + } else { + $value = strval( $value ); + } # Simple checks using $attribDefaults if ( isset( $attribDefaults[$element][$lcattrib] ) && @@ -343,6 +365,29 @@ class Html { && strval( $attribs['type'] ) == 'text/css' ) { unset( $attribs['type'] ); } + if ( $element === 'input' ) { + $type = isset( $attribs['type'] ) ? $attribs['type'] : null; + $value = isset( $attribs['value'] ) ? $attribs['value'] : null; + if ( $type === 'checkbox' || $type === 'radio' ) { + // The default value for checkboxes and radio buttons is 'on' + // not ''. By stripping value="" we break radio boxes that + // actually wants empty values. + if ( $value === 'on' ) { + unset( $attribs['value'] ); + } + } elseif ( $type === 'submit' ) { + // The default value for submit appears to be "Submit" but + // let's not bother stripping out localized text that matches + // that. + } else { + // The default value for nearly every other field type is '' + // The 'range' and 'color' types use different defaults but + // stripping a value="" does not hurt them. + if ( $value === '' ) { + unset( $attribs['value'] ); + } + } + } if ( $element === 'select' && isset( $attribs['size'] ) ) { if ( in_array( 'multiple', $attribs ) || ( isset( $attribs['multiple'] ) && $attribs['multiple'] !== false ) @@ -548,9 +593,10 @@ class Html { } /** - * Output a <script> tag with the given contents. TODO: do some useful - * escaping as well, like if $contents contains literal '</script>' or (for - * XML) literal "]]>". + * Output a "<script>" tag with the given contents. + * + * @todo do some useful escaping as well, like if $contents contains + * literal "</script>" or (for XML) literal "]]>". * * @param $contents string JavaScript * @return string Raw HTML @@ -572,8 +618,8 @@ class Html { } /** - * Output a <script> tag linking to the given URL, e.g., - * <script src=foo.js></script>. + * Output a "<script>" tag linking to the given URL, e.g., + * "<script src=foo.js></script>". * * @param $url string * @return string Raw HTML @@ -591,9 +637,9 @@ class Html { } /** - * Output a <style> tag with the given contents for the given media type + * Output a "<style>" tag with the given contents for the given media type * (if any). TODO: do some useful escaping as well, like if $contents - * contains literal '</style>' (admittedly unlikely). + * contains literal "</style>" (admittedly unlikely). * * @param $contents string CSS * @param $media mixed A media type string, like 'screen' @@ -613,7 +659,7 @@ class Html { } /** - * Output a <link rel=stylesheet> linking to the given URL for the given + * Output a "<link rel=stylesheet>" linking to the given URL for the given * media type (if any). * * @param $url string @@ -630,7 +676,7 @@ class Html { } /** - * Convenience function to produce an <input> element. This supports the + * Convenience function to produce an "<input>" element. This supports the * new HTML5 input types and attributes, and will silently strip them if * $wgHtml5 is false. * @@ -663,11 +709,12 @@ class Html { } /** - * Convenience function to produce an <input> element. This supports leaving - * out the cols= and rows= which Xml requires and are required by HTML4/XHTML - * but not required by HTML5 and will silently set cols="" and rows="" if - * $wgHtml5 is false and cols and rows are omitted (HTML4 validates present - * but empty cols="" and rows="" as valid). + * Convenience function to produce an "<input>" element. + * + * This supports leaving out the cols= and rows= which Xml requires and are + * required by HTML4/XHTML but not required by HTML5 and will silently set + * cols="" and rows="" if $wgHtml5 is false and cols and rows are omitted + * (HTML4 validates present but empty cols="" and rows="" as valid). * * @param $name string name attribute * @param $value string value attribute @@ -706,8 +753,10 @@ class Html { * * @param $params array: * - selected: [optional] Id of namespace which should be pre-selected - * - all: [optional] Value of item for "all namespaces". If null or unset, no <option> is generated to select all namespaces + * - all: [optional] Value of item for "all namespaces". If null or unset, no "<option>" is generated to select all namespaces * - label: text for label to add before the field + * - exclude: [optional] Array of namespace ids to exclude + * - disable: [optional] Array of namespace ids for which the option should be disabled in the selector * @param $selectAttribs array HTML attributes for the generated select element. * - id: [optional], default: 'namespace' * - name: [optional], default: 'namespace' @@ -716,11 +765,6 @@ class Html { public static function namespaceSelector( Array $params = array(), Array $selectAttribs = array() ) { global $wgContLang; - // Default 'id' & 'name' <select> attributes - $selectAttribs = $selectAttribs + array( - 'id' => 'namespace', - 'name' => 'namespace', - ); ksort( $selectAttribs ); // Is a namespace selected? @@ -737,39 +781,60 @@ class Html { $params['selected'] = ''; } - // Array holding the <option> elements + if ( !isset( $params['exclude'] ) || !is_array( $params['exclude'] ) ) { + $params['exclude'] = array(); + } + if ( !isset( $params['disable'] ) || !is_array( $params['disable'] ) ) { + $params['disable'] = array(); + } + + // Associative array between option-values and option-labels $options = array(); if ( isset( $params['all'] ) ) { - // add an <option> that would let the user select all namespaces. - // Value is provided by user, the name shown is localized. - $options[$params['all']] = wfMsg( 'namespacesall' ); + // add an option that would let the user select all namespaces. + // Value is provided by user, the name shown is localized for the user. + $options[$params['all']] = wfMessage( 'namespacesall' )->text(); } - // Add defaults <option> according to content language + // Add all namespaces as options (in the content langauge) $options += $wgContLang->getFormattedNamespaces(); - // Convert $options to HTML + // Convert $options to HTML and filter out namespaces below 0 $optionsHtml = array(); foreach ( $options as $nsId => $nsName ) { - if ( $nsId < NS_MAIN ) { + if ( $nsId < NS_MAIN || in_array( $nsId, $params['exclude'] ) ) { continue; } if ( $nsId === 0 ) { - $nsName = wfMsg( 'blanknamespace' ); + // For other namespaces use use the namespace prefix as label, but for + // main we don't use "" but the user message descripting it (e.g. "(Main)" or "(Article)") + $nsName = wfMessage( 'blanknamespace' )->text(); } - $optionsHtml[] = Xml::option( $nsName, $nsId, $nsId === $params['selected'] ); + $optionsHtml[] = Html::element( + 'option', array( + 'disabled' => in_array( $nsId, $params['disable'] ), + 'value' => $nsId, + 'selected' => $nsId === $params['selected'], + ), $nsName + ); } - // Forge a <select> element and returns it $ret = ''; if ( isset( $params['label'] ) ) { - $ret .= Xml::label( $params['label'], $selectAttribs['id'] ) . ' '; + $ret .= Html::element( + 'label', array( + 'for' => isset( $selectAttribs['id'] ) ? $selectAttribs['id'] : null, + ), $params['label'] + ) . ' '; } + + // Wrap options in a <select> $ret .= Html::openElement( 'select', $selectAttribs ) . "\n" . implode( "\n", $optionsHtml ) . "\n" . Html::closeElement( 'select' ); + return $ret; } @@ -839,7 +904,7 @@ class Html { /** * Get HTML for an info box with an icon. * - * @param $text String: wikitext, get this with wfMsgNoTrans() + * @param $text String: wikitext, get this with wfMessage()->plain() * @param $icon String: icon name, file in skins/common/images * @param $alt String: alternate text for the icon * @param $class String: additional class name to add to the wrapper div |