summaryrefslogtreecommitdiff
path: root/includes/Html.php
diff options
context:
space:
mode:
Diffstat (limited to 'includes/Html.php')
-rw-r--r--includes/Html.php133
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'] ) . '&#160;';
+ $ret .= Html::element(
+ 'label', array(
+ 'for' => isset( $selectAttribs['id'] ) ? $selectAttribs['id'] : null,
+ ), $params['label']
+ ) . '&#160;';
}
+
+ // 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