'lang' => true,
'xml:lang' => true,
),
+ 'audio' => array(
+ 'autoplay' => true,
+ 'controls' => true,
+ 'loop' => true,
+ 'muted' => true,
+ 'preload' => true,
+ 'src' => true,
+ ),
'b' => array(),
'big' => array(),
'blockquote' => array(
'valign' => true,
'width' => true,
),
+ 'colgroup' => array(
+ 'align' => true,
+ 'char' => true,
+ 'charoff' => true,
+ 'span' => true,
+ 'valign' => true,
+ 'width' => true,
+ ),
'del' => array(
'datetime' => true,
),
'charoff' => true,
'valign' => true,
),
+ 'track' => array(
+ 'default' => true,
+ 'kind' => true,
+ 'label' => true,
+ 'src' => true,
+ 'srclang' => true,
+ ),
'tt' => array(),
'u' => array(),
'ul' => array(
'type' => true,
),
'var' => array(),
+ 'video' => array(
+ 'autoplay' => true,
+ 'controls' => true,
+ 'height' => true,
+ 'loop' => true,
+ 'muted' => true,
+ 'poster' => true,
+ 'preload' => true,
+ 'src' => true,
+ 'width' => true,
+ ),
);
/**
'q' => array(
'cite' => true,
),
+ 's' => array(),
'strike' => array(),
'strong' => array(),
);
case 'post':
/** This filter is documented in wp-includes/kses.php */
return apply_filters( 'wp_kses_allowed_html', $allowedposttags, $context );
- break;
+
case 'user_description':
case 'pre_user_description':
$tags = $allowedtags;
$tags['a']['rel'] = true;
/** This filter is documented in wp-includes/kses.php */
return apply_filters( 'wp_kses_allowed_html', $tags, $context );
- break;
+
case 'strip':
/** This filter is documented in wp-includes/kses.php */
return apply_filters( 'wp_kses_allowed_html', array(), $context );
- break;
+
case 'entities':
/** This filter is documented in wp-includes/kses.php */
return apply_filters( 'wp_kses_allowed_html', $allowedentitynames, $context);
- break;
+
case 'data':
default:
/** This filter is documented in wp-includes/kses.php */
*
* @access private
* @since 1.0.0
- * @uses wp_kses_attr()
*
* @param string $string Content to filter
* @param array $allowed_html Allowed HTML elements
if (substr($string, 0, 1) != '<')
return '>';
- # It matched a ">" character
+ // It matched a ">" character
if ( '<!--' == substr( $string, 0, 4 ) ) {
$string = str_replace( array('<!--', '-->'), '', $string );
$string = preg_replace('/-$/', '', $string);
return "<!--{$string}-->";
}
- # Allow HTML comments
+ // Allow HTML comments
if (!preg_match('%^<\s*(/\s*)?([a-zA-Z0-9]+)([^>]*)>?$%', $string, $matches))
return '';
- # It's seriously malformed
+ // It's seriously malformed
$slash = trim($matches[1]);
$elem = $matches[2];
if ( ! isset($allowed_html[strtolower($elem)]) )
return '';
- # They are using a not allowed HTML element
+ // They are using a not allowed HTML element
if ($slash != '')
return "</$elem>";
- # No attributes are allowed for closing elements
+ // No attributes are allowed for closing elements
return wp_kses_attr( $elem, $attrlist, $allowed_html, $allowed_protocols );
}
* @return string Sanitized HTML element
*/
function wp_kses_attr($element, $attr, $allowed_html, $allowed_protocols) {
- # Is there a closing XHTML slash at the end of the attributes?
+ // Is there a closing XHTML slash at the end of the attributes?
if ( ! is_array( $allowed_html ) )
$allowed_html = wp_kses_allowed_html( $allowed_html );
if (preg_match('%\s*/\s*$%', $attr))
$xhtml_slash = ' /';
- # Are any attributes allowed at all for this element?
+ // Are any attributes allowed at all for this element?
if ( ! isset($allowed_html[strtolower($element)]) || count($allowed_html[strtolower($element)]) == 0 )
return "<$element$xhtml_slash>";
- # Split it
+ // Split it
$attrarr = wp_kses_hair($attr, $allowed_protocols);
- # Go through $attrarr, and save the allowed attributes for this element
- # in $attr2
+ // Go through $attrarr, and save the allowed attributes for this element
+ // in $attr2
$attr2 = '';
$allowed_attr = $allowed_html[strtolower($element)];
foreach ($attrarr as $arreach) {
if ( ! isset( $allowed_attr[strtolower($arreach['name'])] ) )
- continue; # the attribute is not allowed
+ continue; // the attribute is not allowed
$current = $allowed_attr[strtolower($arreach['name'])];
if ( $current == '' )
- continue; # the attribute is not allowed
+ continue; // the attribute is not allowed
if ( strtolower( $arreach['name'] ) == 'style' ) {
$orig_value = $arreach['value'];
if ( ! is_array($current) ) {
$attr2 .= ' '.$arreach['whole'];
- # there are no checks
+ // there are no checks
} else {
- # there are some checks
+ // there are some checks
$ok = true;
foreach ($current as $currkey => $currval) {
if ( ! wp_kses_check_attr_val($arreach['value'], $arreach['vless'], $currkey, $currval) ) {
}
if ( $ok )
- $attr2 .= ' '.$arreach['whole']; # it passed them
- } # if !is_array($current)
- } # foreach
+ $attr2 .= ' '.$arreach['whole']; // it passed them
+ } // if !is_array($current)
+ } // foreach
- # Remove any "<" or ">" characters
+ // Remove any "<" or ">" characters
$attr2 = preg_replace('/[<>]/', '', $attr2);
return "<$element$attr2$xhtml_slash>";
$attrname = '';
$uris = array('xmlns', 'profile', 'href', 'src', 'cite', 'classid', 'codebase', 'data', 'usemap', 'longdesc', 'action');
- # Loop through the whole attribute list
+ // Loop through the whole attribute list
while (strlen($attr) != 0) {
- $working = 0; # Was the last operation successful?
+ $working = 0; // Was the last operation successful?
switch ($mode) {
- case 0 : # attribute name, href for instance
+ case 0 : // attribute name, href for instance
if ( preg_match('/^([-a-zA-Z:]+)/', $attr, $match ) ) {
$attrname = $match[1];
break;
- case 1 : # equals sign or valueless ("selected")
+ case 1 : // equals sign or valueless ("selected")
- if (preg_match('/^\s*=\s*/', $attr)) # equals sign
+ if (preg_match('/^\s*=\s*/', $attr)) // equals sign
{
$working = 1;
$mode = 2;
break;
}
- if (preg_match('/^\s+/', $attr)) # valueless
+ if (preg_match('/^\s+/', $attr)) // valueless
{
$working = 1;
$mode = 0;
break;
- case 2 : # attribute value, a URL after href= for instance
+ case 2 : // attribute value, a URL after href= for instance
if (preg_match('%^"([^"]*)"(\s+|/?$)%', $attr, $match))
- # "value"
+ // "value"
{
$thisval = $match[1];
if ( in_array(strtolower($attrname), $uris) )
}
if (preg_match("%^'([^']*)'(\s+|/?$)%", $attr, $match))
- # 'value'
+ // 'value'
{
$thisval = $match[1];
if ( in_array(strtolower($attrname), $uris) )
}
if (preg_match("%^([^\s\"']+)(\s+|/?$)%", $attr, $match))
- # value
+ // value
{
$thisval = $match[1];
if ( in_array(strtolower($attrname), $uris) )
if(false === array_key_exists($attrname, $attrarr)) {
$attrarr[$attrname] = array ('name' => $attrname, 'value' => $thisval, 'whole' => "$attrname=\"$thisval\"", 'vless' => 'n');
}
- # We add quotes to conform to W3C's HTML spec.
+ // We add quotes to conform to W3C's HTML spec.
$working = 1;
$mode = 0;
$attr = preg_replace("%^[^\s\"']+(\s+|$)%", '', $attr);
}
break;
- } # switch
+ } // switch
- if ($working == 0) # not well formed, remove and try again
+ if ($working == 0) // not well formed, remove and try again
{
$attr = wp_kses_html_error($attr);
$mode = 0;
}
- } # while
+ } // while
if ($mode == 1 && false === array_key_exists($attrname, $attrarr))
- # special case, for when the attribute list ends with a valueless
- # attribute like "selected"
+ // special case, for when the attribute list ends with a valueless
+ // attribute like "selected"
$attrarr[$attrname] = array ('name' => $attrname, 'value' => '', 'whole' => $attrname, 'vless' => 'y');
return $attrarr;
switch (strtolower($checkname)) {
case 'maxlen' :
- # The maxlen check makes sure that the attribute value has a length not
- # greater than the given value. This can be used to avoid Buffer Overflows
- # in WWW clients and various Internet servers.
+ // The maxlen check makes sure that the attribute value has a length not
+ // greater than the given value. This can be used to avoid Buffer Overflows
+ // in WWW clients and various Internet servers.
if (strlen($value) > $checkvalue)
$ok = false;
break;
case 'minlen' :
- # The minlen check makes sure that the attribute value has a length not
- # smaller than the given value.
+ // The minlen check makes sure that the attribute value has a length not
+ // smaller than the given value.
if (strlen($value) < $checkvalue)
$ok = false;
break;
case 'maxval' :
- # The maxval check does two things: it checks that the attribute value is
- # an integer from 0 and up, without an excessive amount of zeroes or
- # whitespace (to avoid Buffer Overflows). It also checks that the attribute
- # value is not greater than the given value.
- # This check can be used to avoid Denial of Service attacks.
+ // The maxval check does two things: it checks that the attribute value is
+ // an integer from 0 and up, without an excessive amount of zeroes or
+ // whitespace (to avoid Buffer Overflows). It also checks that the attribute
+ // value is not greater than the given value.
+ // This check can be used to avoid Denial of Service attacks.
if (!preg_match('/^\s{0,6}[0-9]{1,6}\s{0,6}$/', $value))
$ok = false;
break;
case 'minval' :
- # The minval check makes sure that the attribute value is a positive integer,
- # and that it is not smaller than the given value.
+ // The minval check makes sure that the attribute value is a positive integer,
+ // and that it is not smaller than the given value.
if (!preg_match('/^\s{0,6}[0-9]{1,6}\s{0,6}$/', $value))
$ok = false;
break;
case 'valueless' :
- # The valueless check makes sure if the attribute has a value
- # (like <a href="blah">) or not (<option selected>). If the given value
- # is a "y" or a "Y", the attribute must not have a value.
- # If the given value is an "n" or an "N", the attribute must have one.
+ // The valueless check makes sure if the attribute has a value
+ // (like <a href="blah">) or not (<option selected>). If the given value
+ // is a "y" or a "Y", the attribute must not have a value.
+ // If the given value is an "n" or an "N", the attribute must have one.
if (strtolower($checkvalue) != $vless)
$ok = false;
break;
- } # switch
+ } // switch
return $ok;
}
foreach ( (array) $inval as $inkey2 => $inval2) {
$outkey2 = strtolower($inkey2);
$outarray[$outkey][$outkey2] = $inval2;
- } # foreach $inval
- } # foreach $inarray
+ } // foreach $inval
+ } // foreach $inarray
return $outarray;
}
/**
* Converts and fixes HTML entities.
*
- * This function normalizes HTML entities. It will convert "AT&T" to the correct
- * "AT&T", ":" to ":", "&#XYZZY;" to "&#XYZZY;" and so on.
+ * This function normalizes HTML entities. It will convert `AT&T` to the correct
+ * `AT&T`, `:` to `:`, `&#XYZZY;` to `&#XYZZY;` and so on.
*
* @since 1.0.0
*
* @return string Content with normalized entities
*/
function wp_kses_normalize_entities($string) {
- # Disarm all entities by converting & to &
+ // Disarm all entities by converting & to &
$string = str_replace('&', '&', $string);
- # Change back the allowed entities in our entity whitelist
+ // Change back the allowed entities in our entity whitelist
$string = preg_replace_callback('/&([A-Za-z]{2,8}[0-9]{0,2});/', 'wp_kses_named_entities', $string);
$string = preg_replace_callback('/&#(0*[0-9]{1,7});/', 'wp_kses_normalize_entities2', $string);
/**
* Callback for wp_kses_normalize_entities() regular expression.
*
- * This function helps wp_kses_normalize_entities() to only accept 16-bit values
- * and nothing more for &#number; entities.
+ * This function helps {@see wp_kses_normalize_entities()} to only accept 16-bit
+ * values and nothing more for `&#number;` entities.
*
* @access private
* @since 1.0.0
/**
* Convert all entities to their character counterparts.
*
- * This function decodes numeric HTML entities (A and A). It doesn't do
- * anything with other entities like ä, but we don't need them in the URL
- * protocol whitelisting system anyway.
+ * This function decodes numeric HTML entities (`A` and `A`).
+ * It doesn't do anything with other entities like ä, but we don't
+ * need them in the URL protocol whitelisting system anyway.
*
* @since 1.0.0
*
* Sanitize content with allowed HTML Kses rules.
*
* @since 1.0.0
- * @uses $allowedtags
*
* @param string $data Content to filter, expected to be escaped with slashes
* @return string Filtered content
* Sanitize content with allowed HTML Kses rules.
*
* @since 2.9.0
- * @uses $allowedtags
*
* @param string $data Content to filter, expected to not be escaped
* @return string Filtered content
* 'excerpt_save_pre', and 'content_filtered_save_pre' hooks.
*
* @since 2.0.0
- * @uses add_filter() See description for what functions are added to what hooks.
*/
function kses_init_filters() {
// Normal filtering
* to have Kses filter the content. If the user does not have unfiltered_html
* capability, then Kses filters are added.
*
- * @uses kses_remove_filters() Removes the Kses filters
- * @uses kses_init_filters() Adds the Kses filters back if the user
- * does not have unfiltered HTML capability.
* @since 2.0.0
*/
function kses_init() {
kses_init_filters();
}
-add_action('init', 'kses_init');
-add_action('set_current_user', 'kses_init');
-
/**
* Inline CSS filter
*