'itemscope',
);
+ private static $HTMLFiveOnlyAttribs = array(
+ 'autocomplete',
+ 'autofocus',
+ 'max',
+ 'min',
+ 'multiple',
+ 'pattern',
+ 'placeholder',
+ 'required',
+ 'step',
+ 'spellcheck',
+ );
+
/**
* 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 type out the string yourself.
+ * should probably just type out the html element yourself.
*
* This is quite similar to Xml::tags(), but it implements some useful
* HTML-specific logic. For instance, there is no $allowShortTag
*
* @param $element string The element's name, e.g., 'a'
* @param $attribs array Associative array of attributes, e.g., array(
- * 'href' => 'http://www.mediawiki.org/' ). See expandAttributes() for
+ * 'href' => 'http://www.mediawiki.org/' ). See expandAttributes() for
* further documentation.
* @param $contents string The raw HTML contents of the element: *not*
* escaped!
* For instance, it will omit quotation marks if $wgWellFormedXml is false,
* and will treat boolean attributes specially.
*
+ * Attributes that should contain space-separated lists (such as 'class') array
+ * values are allowed as well, which will automagically be normalized
+ * and converted to a space-separated string. In addition to a numerical
+ * array, the attribute value may also be an associative array. See the
+ * example below for how that works.
+ * @example Numerical array
+ * <code>
+ * Html::element( 'em', array(
+ * 'class' => array( 'foo', 'bar' )
+ * ) );
+ * // gives '<em class="foo bar"></em>'
+ * </code>
+ * @example Associative array
+ * <code>
+ * Html::element( 'em', array(
+ * 'class' => array( 'foo', 'bar', 'foo' => false, 'quux' => true )
+ * ) );
+ * // gives '<em class="bar quux"></em>'
+ * </code>
+ *
* @param $attribs array Associative array of attributes, e.g., array(
* 'href' => 'http://www.mediawiki.org/' ). Values will be HTML-escaped.
* A value of false means to omit the attribute. For boolean attributes,
$key = strtolower( $key );
# Here we're blacklisting some HTML5-only attributes...
- if ( !$wgHtml5 && in_array( $key, array(
- 'autocomplete',
- 'autofocus',
- 'max',
- 'min',
- 'multiple',
- 'pattern',
- 'placeholder',
- 'required',
- 'step',
- 'spellcheck',
- ) ) ) {
+ if ( !$wgHtml5 && in_array( $key, self::$HTMLFiveOnlyAttribs )
+ ) {
continue;
}
# @todo FIXME: Is this really true?
$map['<'] = '<';
}
+
$ret .= " $key=$quote" . strtr( $value, $map ) . $quote;
}
}
}
}
- return self::element( 'textarea', $attribs, $value );
+ if (substr($value, 0, 1) == "\n") {
+ // Workaround for bug 12130: browsers eat the initial newline
+ // assuming that it's just for show, but they do keep the later
+ // newlines, which we may want to preserve during editing.
+ // Prepending a single newline
+ $spacedValue = "\n" . $value;
+ } else {
+ $spacedValue = $value;
+ }
+ return self::element( 'textarea', $attribs, $spacedValue );
}
/**