X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/72836ec95a52eacbda4dc5aa296b7dd6de08bd3b..refs/tags/wordpress-3.9.2-scripts:/wp-includes/formatting.php diff --git a/wp-includes/formatting.php b/wp-includes/formatting.php index 904c99b1..5efe0cda 100644 --- a/wp-includes/formatting.php +++ b/wp-includes/formatting.php @@ -73,27 +73,58 @@ function wptexturize($text) { $static_characters = array_merge( array( '---', ' -- ', '--', ' - ', 'xn–', '...', '``', '\'\'', ' (tm)' ), $cockney ); $static_replacements = array_merge( array( $em_dash, ' ' . $em_dash . ' ', $en_dash, ' ' . $en_dash . ' ', 'xn--', '…', $opening_quote, $closing_quote, ' ™' ), $cockneyreplace ); + /* + * Regex for common whitespace characters. + * + * By default, spaces include new lines, tabs, nbsp entities, and the UTF-8 nbsp. + * This is designed to replace the PCRE \s sequence. In #WP22692, that sequence + * was found to be unreliable due to random inclusion of the A0 byte. + */ + $spaces = '[\r\n\t ]|\xC2\xA0| '; + + + // Pattern-based replacements of characters. $dynamic = array(); - if ( "'" != $apos ) { - $dynamic[ '/\'(\d\d(?:’|\')?s)/' ] = $apos . '$1'; // '99's - $dynamic[ '/\'(\d)/' ] = $apos . '$1'; // '99 + + // '99 '99s '99's (apostrophe) + if ( "'" !== $apos ) { + $dynamic[ '/\'(?=\d)/' ] = $apos; + } + + // Single quote at start, or preceded by (, {, <, [, ", or spaces. + if ( "'" !== $opening_single_quote ) { + $dynamic[ '/(?<=\A|[([{<"]|' . $spaces . ')\'/' ] = $opening_single_quote; + } + + // 9" (double prime) + if ( '"' !== $double_prime ) { + $dynamic[ '/(?<=\d)"/' ] = $double_prime; + } + + // 9' (prime) + if ( "'" !== $prime ) { + $dynamic[ '/(?<=\d)\'/' ] = $prime; + } + + // Apostrophe in a word. No spaces or double primes. + if ( "'" !== $apos ) { + $dynamic[ '/(?|\[.*\])/Us', $text, -1, PREG_SPLIT_DELIM_CAPTURE); foreach ( $textarr as &$curl ) { - if ( empty( $curl ) ) + if ( empty( $curl ) ) { continue; + } // Only call _wptexturize_pushpop_element if first char is correct tag opening $first = $curl[0]; @@ -120,11 +166,21 @@ function wptexturize($text) { } elseif ( '[' === $first ) { _wptexturize_pushpop_element($curl, $no_texturize_shortcodes_stack, $no_texturize_shortcodes, '[', ']'); } elseif ( empty($no_texturize_shortcodes_stack) && empty($no_texturize_tags_stack) ) { + // This is not a tag, nor is the texturization disabled static strings $curl = str_replace($static_characters, $static_replacements, $curl); + // regular expressions $curl = preg_replace($dynamic_characters, $dynamic_replacements, $curl); + + // 9x9 (times) + if ( 1 === preg_match( '/(?<=\d)x\d/', $text ) ) { + // Searching for a digit is 10 times more expensive than for the x, so we avoid doing this one! + $curl = preg_replace( '/\b(\d+)x(\d+)\b/', '$1×$2', $curl ); + } } + + // Replace each & with & unless it already looks like an entity. $curl = preg_replace('/&([^#])(?![a-zA-Z1-4]{1,8};)/', '&$1', $curl); } return implode( '', $textarr ); @@ -165,8 +221,9 @@ function _wptexturize_pushpop_element($text, &$stack, $disabled_elements, $openi $last = array_pop($stack); // Make sure it matches the opening tag - if ($last != $matches[1]) - array_push($stack, $last); + if ( $last != $matches[1] ) { + array_push( $stack, $last ); + } } } } @@ -220,20 +277,34 @@ function wpautop($pee, $br = true) { $pee = preg_replace('|
\s*
|', "\n\n", $pee); // Space things out a little - $allblocks = '(?:table|thead|tfoot|caption|col|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|option|form|map|area|blockquote|address|math|style|p|h[1-6]|hr|fieldset|noscript|legend|section|article|aside|hgroup|header|footer|nav|figure|figcaption|details|menu|summary)'; + $allblocks = '(?:table|thead|tfoot|caption|col|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|form|map|area|blockquote|address|math|style|p|h[1-6]|hr|fieldset|noscript|legend|section|article|aside|hgroup|header|footer|nav|figure|details|menu|summary)'; $pee = preg_replace('!(<' . $allblocks . '[^>]*>)!', "\n$1", $pee); $pee = preg_replace('!()!', "$1\n\n", $pee); $pee = str_replace(array("\r\n", "\r"), "\n", $pee); // cross-platform newlines - if ( strpos($pee, ']*)>\s*|', "", $pee); // no pee inside object/embed - $pee = preg_replace('|\s*\s*|', '', $pee); + + if ( strpos( $pee, '' ) !== false ) { + // no P/BR around param and embed + $pee = preg_replace( '|(]*>)\s*|', '$1', $pee ); + $pee = preg_replace( '|\s*|', '', $pee ); + $pee = preg_replace( '%\s*(]*>)\s*%', '$1', $pee ); } + + if ( strpos( $pee, '\]]*[>\]])\s*%', '$1', $pee ); + $pee = preg_replace( '%\s*([<\[]/(?:audio|video)[>\]])%', '$1', $pee ); + $pee = preg_replace( '%\s*(<(?:source|track)[^>]*>)\s*%', '$1', $pee ); + } + $pee = preg_replace("/\n\n+/", "\n\n", $pee); // take care of duplicates // make paragraphs, including one at the end $pees = preg_split('/\n\s*\n/', $pee, -1, PREG_SPLIT_NO_EMPTY); $pee = ''; - foreach ( $pees as $tinkle ) + + foreach ( $pees as $tinkle ) { $pee .= '

' . trim($tinkle, "\n") . "

\n"; + } + $pee = preg_replace('|

\s*

|', '', $pee); // under certain strange conditions it could create a P of entirely whitespace $pee = preg_replace('!

([^<]+)!', "

$1

", $pee); $pee = preg_replace('!

\s*(]*>)\s*

!', "$1", $pee); // don't pee all over a tag @@ -242,11 +313,13 @@ function wpautop($pee, $br = true) { $pee = str_replace('

', '

', $pee); $pee = preg_replace('!

\s*(]*>)!', "$1", $pee); $pee = preg_replace('!(]*>)\s*

!', "$1", $pee); + if ( $br ) { $pee = preg_replace_callback('/<(script|style).*?<\/\\1>/s', '_autop_newline_preservation_helper', $pee); $pee = preg_replace('|(?)\s*\n|', "
\n", $pee); // optionally make line breaks $pee = str_replace('', "\n", $pee); } + $pee = preg_replace('!(]*>)\s*
!', "$1", $pee); $pee = preg_replace('!
(\s*]*>)!', '$1', $pee); $pee = preg_replace( "|\n

$|", '

', $pee ); @@ -798,6 +871,13 @@ function remove_accents($string) { $chars[ chr(195).chr(156) ] = 'Ue'; $chars[ chr(195).chr(188) ] = 'ue'; $chars[ chr(195).chr(159) ] = 'ss'; + } elseif ( 'da_DK' === $locale ) { + $chars[ chr(195).chr(134) ] = 'Ae'; + $chars[ chr(195).chr(166) ] = 'ae'; + $chars[ chr(195).chr(152) ] = 'Oe'; + $chars[ chr(195).chr(184) ] = 'oe'; + $chars[ chr(195).chr(133) ] = 'Aa'; + $chars[ chr(195).chr(165) ] = 'aa'; } $string = strtr($string, $chars); @@ -842,7 +922,16 @@ function remove_accents($string) { function sanitize_file_name( $filename ) { $filename_raw = $filename; $special_chars = array("?", "[", "]", "/", "\\", "=", "<", ">", ":", ";", ",", "'", "\"", "&", "$", "#", "*", "(", ")", "|", "~", "`", "!", "{", "}", chr(0)); - $special_chars = apply_filters('sanitize_file_name_chars', $special_chars, $filename_raw); + /** + * Filter the list of characters to remove from a filename. + * + * @since 2.8.0 + * + * @param array $special_chars Characters to remove. + * @param string $filename_raw Filename as it was passed into sanitize_file_name(). + */ + $special_chars = apply_filters( 'sanitize_file_name_chars', $special_chars, $filename_raw ); + $filename = preg_replace( "#\x{00a0}#siu", ' ', $filename ); $filename = str_replace($special_chars, '', $filename); $filename = preg_replace('/[\s-]+/', '-', $filename); $filename = trim($filename, '.-_'); @@ -851,16 +940,27 @@ function sanitize_file_name( $filename ) { $parts = explode('.', $filename); // Return if only one extension - if ( count($parts) <= 2 ) - return apply_filters('sanitize_file_name', $filename, $filename_raw); + if ( count( $parts ) <= 2 ) { + /** + * Filter a sanitized filename string. + * + * @since 2.8.0 + * + * @param string $filename Sanitized filename. + * @param string $filename_raw The filename prior to sanitization. + */ + return apply_filters( 'sanitize_file_name', $filename, $filename_raw ); + } // Process multiple extensions $filename = array_shift($parts); $extension = array_pop($parts); $mimes = get_allowed_mime_types(); - // Loop over any intermediate extensions. Munge them with a trailing underscore if they are a 2 - 5 character - // long alpha string not in the extension whitelist. + /* + * Loop over any intermediate extensions. Postfix them with a trailing underscore + * if they are a 2 - 5 character long alpha string not in the extension whitelist. + */ foreach ( (array) $parts as $part) { $filename .= '.' . $part; @@ -878,7 +978,7 @@ function sanitize_file_name( $filename ) { } } $filename .= '.' . $extension; - + /** This filter is documented in wp-includes/formatting.php */ return apply_filters('sanitize_file_name', $filename, $filename_raw); } @@ -891,8 +991,6 @@ function sanitize_file_name( $filename ) { * parameters for the 'sanitize_user' filter. * * @since 2.0.0 - * @uses apply_filters() Calls 'sanitize_user' hook on username, raw username, - * and $strict parameter. * * @param string $username The username to be sanitized. * @param bool $strict If set limits $username to specific characters. Default false. @@ -914,6 +1012,15 @@ function sanitize_user( $username, $strict = false ) { // Consolidate contiguous whitespace $username = preg_replace( '|\s+|', ' ', $username ); + /** + * Filter a sanitized username string. + * + * @since 2.0.1 + * + * @param string $username Sanitized username. + * @param string $raw_username The username prior to sanitization. + * @param bool $strict Whether to limit the sanitization to specific characters. Default false. + */ return apply_filters( 'sanitize_user', $username, $raw_username, $strict ); } @@ -931,6 +1038,15 @@ function sanitize_key( $key ) { $raw_key = $key; $key = strtolower( $key ); $key = preg_replace( '/[^a-z0-9_\-]/', '', $key ); + + /** + * Filter a sanitized key string. + * + * @since 3.0.0 + * + * @param string $key Sanitized key. + * @param string $raw_key The key prior to sanitization. + */ return apply_filters( 'sanitize_key', $key, $raw_key ); } @@ -954,7 +1070,16 @@ function sanitize_title( $title, $fallback_title = '', $context = 'save' ) { if ( 'save' == $context ) $title = remove_accents($title); - $title = apply_filters('sanitize_title', $title, $raw_title, $context); + /** + * Filter a sanitized title string. + * + * @since 1.2.0 + * + * @param string $title Sanitized title. + * @param string $raw_title The title prior to sanitization. + * @param string $context The context for which the title is being sanitized. + */ + $title = apply_filters( 'sanitize_title', $title, $raw_title, $context ); if ( '' === $title || false === $title ) $title = $fallback_title; @@ -1086,6 +1211,15 @@ function sanitize_html_class( $class, $fallback = '' ) { if ( '' == $sanitized ) $sanitized = $fallback; + /** + * Filter a sanitized HTML class string. + * + * @since 2.8.0 + * + * @param string $sanitized The sanitized HTML class. + * @param string $class HTML class before sanitization. + * @param string $fallback The fallback string. + */ return apply_filters( 'sanitize_html_class', $sanitized, $class, $fallback ); } @@ -1169,10 +1303,11 @@ function convert_chars($content, $deprecated = '') { * @return string Balanced text */ function balanceTags( $text, $force = false ) { - if ( $force || get_option('use_balanceTags') == 1 ) + if ( $force || get_option('use_balanceTags') == 1 ) { return force_balance_tags( $text ); - else + } else { return $text; + } } /** @@ -1320,25 +1455,19 @@ function force_balance_tags( $text ) { * @return string The text after the filter (and possibly htmlspecialchars()) has been run. */ function format_to_edit( $content, $richedit = false ) { + /** + * Filter the text to be formatted for editing. + * + * @since 1.2.0 + * + * @param string $content The text, prior to formatting for editing. + */ $content = apply_filters( 'format_to_edit', $content ); if ( ! $richedit ) $content = esc_textarea( $content ); return $content; } -/** - * Holder for the 'format_to_post' filter. - * - * @since 0.71 - * - * @param string $content The text to pass through the filter. - * @return string Text returned from the 'format_to_post' filter. - */ -function format_to_post($content) { - $content = apply_filters('format_to_post', $content); - return $content; -} - /** * Add leading zeros when necessary. * @@ -1377,35 +1506,34 @@ function backslashit($string) { /** * Appends a trailing slash. * - * Will remove trailing slash if it exists already before adding a trailing - * slash. This prevents double slashing a string or path. + * Will remove trailing forward and backslashes if it exists already before adding + * a trailing forward slash. This prevents double slashing a string or path. * * The primary use of this is for paths and thus should be used for paths. It is * not restricted to paths and offers no specific path support. * * @since 1.2.0 - * @uses untrailingslashit() Unslashes string if it was slashed already. * * @param string $string What to add the trailing slash to. * @return string String with trailing slash added. */ -function trailingslashit($string) { - return untrailingslashit($string) . '/'; +function trailingslashit( $string ) { + return untrailingslashit( $string ) . '/'; } /** - * Removes trailing slash if it exists. + * Removes trailing forward slashes and backslashes if they exist. * * The primary use of this is for paths and thus should be used for paths. It is * not restricted to paths and offers no specific path support. * * @since 2.2.0 * - * @param string $string What to remove the trailing slash from. - * @return string String without the trailing slash. + * @param string $string What to remove the trailing slashes from. + * @return string String without the trailing slashes. */ -function untrailingslashit($string) { - return rtrim($string, '/'); +function untrailingslashit( $string ) { + return rtrim( $string, '/\\' ); } /** @@ -1601,8 +1729,15 @@ function _make_email_clickable_cb($matches) { function make_clickable( $text ) { $r = ''; $textarr = preg_split( '/(<[^<>]+>)/', $text, -1, PREG_SPLIT_DELIM_CAPTURE ); // split out HTML tags + $nested_code_pre = 0; // Keep track of how many levels link is nested inside
 or 
 	foreach ( $textarr as $piece ) {
-		if ( empty( $piece ) || ( $piece[0] == '<' && ! preg_match('|^<\s*[\w]{1,20}+://|', $piece) ) ) {
+
+		if ( preg_match( '|^]|i', $piece ) || preg_match( '|^]|i', $piece ) )
+			$nested_code_pre++;
+		elseif ( ( '' === strtolower( $piece ) || '
' === strtolower( $piece ) ) && $nested_code_pre ) + $nested_code_pre--; + + if ( $nested_code_pre || empty( $piece ) || ( $piece[0] === '<' && ! preg_match( '|^<\s*[\w]{1,20}+://|', $piece ) ) ) { $r .= $piece; continue; } @@ -1646,7 +1781,7 @@ function make_clickable( $text ) { } // Cleanup of accidental links within links - $r = preg_replace( '#(]+?>|>))]+?>([^>]+?)#i', "$1$3", $r ); + $r = preg_replace( '#(]+?>|>))]+?>([^>]+?)#i', "$1$3", $r ); return $r; } @@ -1762,11 +1897,19 @@ function translate_smiley( $matches ) { $smiley = trim( reset( $matches ) ); $img = $wpsmiliestrans[ $smiley ]; - $smiley_masked = esc_attr( $smiley ); + /** + * Filter the Smiley image URL before it's used in the image element. + * + * @since 2.9.0 + * + * @param string $smiley_url URL for the smiley image. + * @param string $img Filename for the smiley image. + * @param string $site_url Site URL, as returned by site_url(). + */ $src_url = apply_filters( 'smilies_src', includes_url( "images/smilies/$img" ), $img, site_url() ); - return " $smiley_masked "; + return sprintf( ' %s ', esc_url( $src_url ), esc_attr( $smiley ) ); } /** @@ -1781,18 +1924,36 @@ function translate_smiley( $matches ) { * @param string $text Content to convert smilies from text. * @return string Converted content with text smilies replaced with images. */ -function convert_smilies($text) { +function convert_smilies( $text ) { global $wp_smiliessearch; $output = ''; - if ( get_option('use_smilies') && !empty($wp_smiliessearch) ) { + if ( get_option( 'use_smilies' ) && ! empty( $wp_smiliessearch ) ) { // HTML loop taken from texturize function, could possible be consolidated - $textarr = preg_split("/(<.*>)/U", $text, -1, PREG_SPLIT_DELIM_CAPTURE); // capture the tags as well as in between - $stop = count($textarr);// loop stuff - for ($i = 0; $i < $stop; $i++) { + $textarr = preg_split( '/(<.*>)/U', $text, -1, PREG_SPLIT_DELIM_CAPTURE ); // capture the tags as well as in between + $stop = count( $textarr );// loop stuff + + // Ignore proessing of specific tags + $tags_to_ignore = 'code|pre|style|script|textarea'; + $ignore_block_element = ''; + + for ( $i = 0; $i < $stop; $i++ ) { $content = $textarr[$i]; - if ((strlen($content) > 0) && ('<' != $content[0])) { // If it's not a tag - $content = preg_replace_callback($wp_smiliessearch, 'translate_smiley', $content); + + // If we're in an ignore block, wait until we find its closing tag + if ( '' == $ignore_block_element && preg_match( '/^<(' . $tags_to_ignore . ')>/', $content, $matches ) ) { + $ignore_block_element = $matches[1]; + } + + // If it's not a tag and not in ignore block + if ( '' == $ignore_block_element && strlen( $content ) > 0 && '<' != $content[0] ) { + $content = preg_replace_callback( $wp_smiliessearch, 'translate_smiley', $content ); + } + + // did we exit ignore block + if ( '' != $ignore_block_element && '' == $content ) { + $ignore_block_element = ''; } + $output .= $content; } } else { @@ -1819,11 +1980,26 @@ function is_email( $email, $deprecated = false ) { // Test for the minimum length the email can be if ( strlen( $email ) < 3 ) { + /** + * Filter whether an email address is valid. + * + * This filter is evaluated under several different contexts, such as 'email_too_short', + * 'email_no_at', 'local_invalid_chars', 'domain_period_sequence', 'domain_period_limits', + * 'domain_no_periods', 'sub_hyphen_limits', 'sub_invalid_chars', or no specific context. + * + * @since 2.8.0 + * + * @param bool $is_email Whether the email address has passed the is_email() checks. Default false. + * @param string $email The email address being checked. + * @param string $message An explanatory message to the user. + * @param string $context Context under which the email was tested. + */ return apply_filters( 'is_email', false, $email, 'email_too_short' ); } // Test for an @ character after the first position if ( strpos( $email, '@', 1 ) === false ) { + /** This filter is documented in wp-includes/formatting.php */ return apply_filters( 'is_email', false, $email, 'email_no_at' ); } @@ -1833,17 +2009,20 @@ function is_email( $email, $deprecated = false ) { // LOCAL PART // Test for invalid characters if ( !preg_match( '/^[a-zA-Z0-9!#$%&\'*+\/=?^_`{|}~\.-]+$/', $local ) ) { + /** This filter is documented in wp-includes/formatting.php */ return apply_filters( 'is_email', false, $email, 'local_invalid_chars' ); } // DOMAIN PART // Test for sequences of periods if ( preg_match( '/\.{2,}/', $domain ) ) { + /** This filter is documented in wp-includes/formatting.php */ return apply_filters( 'is_email', false, $email, 'domain_period_sequence' ); } // Test for leading and trailing periods and whitespace if ( trim( $domain, " \t\n\r\0\x0B." ) !== $domain ) { + /** This filter is documented in wp-includes/formatting.php */ return apply_filters( 'is_email', false, $email, 'domain_period_limits' ); } @@ -1852,6 +2031,7 @@ function is_email( $email, $deprecated = false ) { // Assume the domain will have at least two subs if ( 2 > count( $subs ) ) { + /** This filter is documented in wp-includes/formatting.php */ return apply_filters( 'is_email', false, $email, 'domain_no_periods' ); } @@ -1859,16 +2039,19 @@ function is_email( $email, $deprecated = false ) { foreach ( $subs as $sub ) { // Test for leading and trailing hyphens and whitespace if ( trim( $sub, " \t\n\r\0\x0B-" ) !== $sub ) { + /** This filter is documented in wp-includes/formatting.php */ return apply_filters( 'is_email', false, $email, 'sub_hyphen_limits' ); } // Test for invalid characters if ( !preg_match('/^[a-z0-9-]+$/i', $sub ) ) { + /** This filter is documented in wp-includes/formatting.php */ return apply_filters( 'is_email', false, $email, 'sub_invalid_chars' ); } } // Congratulations your email made it! + /** This filter is documented in wp-includes/formatting.php */ return apply_filters( 'is_email', $email, $email, null ); } @@ -2048,11 +2231,25 @@ function popuplinks($text) { function sanitize_email( $email ) { // Test for the minimum length the email can be if ( strlen( $email ) < 3 ) { + /** + * Filter a sanitized email address. + * + * This filter is evaluated under several contexts, including 'email_too_short', + * 'email_no_at', 'local_invalid_chars', 'domain_period_sequence', 'domain_period_limits', + * 'domain_no_periods', 'domain_no_valid_subs', or no context. + * + * @since 2.8.0 + * + * @param string $email The sanitized email address. + * @param string $email The email address, as provided to sanitize_email(). + * @param string $message A message to pass to the user. + */ return apply_filters( 'sanitize_email', '', $email, 'email_too_short' ); } // Test for an @ character after the first position if ( strpos( $email, '@', 1 ) === false ) { + /** This filter is documented in wp-includes/formatting.php */ return apply_filters( 'sanitize_email', '', $email, 'email_no_at' ); } @@ -2063,6 +2260,7 @@ function sanitize_email( $email ) { // Test for invalid characters $local = preg_replace( '/[^a-zA-Z0-9!#$%&\'*+\/=?^_`{|}~\.-]/', '', $local ); if ( '' === $local ) { + /** This filter is documented in wp-includes/formatting.php */ return apply_filters( 'sanitize_email', '', $email, 'local_invalid_chars' ); } @@ -2070,12 +2268,14 @@ function sanitize_email( $email ) { // Test for sequences of periods $domain = preg_replace( '/\.{2,}/', '', $domain ); if ( '' === $domain ) { + /** This filter is documented in wp-includes/formatting.php */ return apply_filters( 'sanitize_email', '', $email, 'domain_period_sequence' ); } // Test for leading and trailing periods and whitespace $domain = trim( $domain, " \t\n\r\0\x0B." ); if ( '' === $domain ) { + /** This filter is documented in wp-includes/formatting.php */ return apply_filters( 'sanitize_email', '', $email, 'domain_period_limits' ); } @@ -2084,6 +2284,7 @@ function sanitize_email( $email ) { // Assume the domain will have at least two subs if ( 2 > count( $subs ) ) { + /** This filter is documented in wp-includes/formatting.php */ return apply_filters( 'sanitize_email', '', $email, 'domain_no_periods' ); } @@ -2106,6 +2307,7 @@ function sanitize_email( $email ) { // If there aren't 2 or more valid subs if ( 2 > count( $new_subs ) ) { + /** This filter is documented in wp-includes/formatting.php */ return apply_filters( 'sanitize_email', '', $email, 'domain_no_valid_subs' ); } @@ -2116,6 +2318,7 @@ function sanitize_email( $email ) { $email = $local . '@' . $domain; // Congratulations your email made it! + /** This filter is documented in wp-includes/formatting.php */ return apply_filters( 'sanitize_email', $email, $email, null ); } @@ -2195,13 +2398,37 @@ function wp_trim_excerpt($text = '') { $text = strip_shortcodes( $text ); - $text = apply_filters('the_content', $text); + /** This filter is documented in wp-includes/post-template.php */ + $text = apply_filters( 'the_content', $text ); $text = str_replace(']]>', ']]>', $text); - $excerpt_length = apply_filters('excerpt_length', 55); - $excerpt_more = apply_filters('excerpt_more', ' ' . '[…]'); + + /** + * Filter the number of words in an excerpt. + * + * @since 2.7.0 + * + * @param int $number The number of words. Default 55. + */ + $excerpt_length = apply_filters( 'excerpt_length', 55 ); + /** + * Filter the string in the "more" link displayed after a trimmed excerpt. + * + * @since 2.9.0 + * + * @param string $more_string The string shown within the more link. + */ + $excerpt_more = apply_filters( 'excerpt_more', ' ' . '[…]' ); $text = wp_trim_words( $text, $excerpt_length, $excerpt_more ); } - return apply_filters('wp_trim_excerpt', $text, $raw_excerpt); + /** + * Filter the trimmed excerpt string. + * + * @since 2.8.0 + * + * @param string $text The trimmed text. + * @param string $raw_excerpt The text prior to trimming. + */ + return apply_filters( 'wp_trim_excerpt', $text, $raw_excerpt ); } /** @@ -2241,6 +2468,16 @@ function wp_trim_words( $text, $num_words = 55, $more = null ) { } else { $text = implode( $sep, $words_array ); } + /** + * Filter the text content after words have been trimmed. + * + * @since 3.3.0 + * + * @param string $text The trimmed text. + * @param int $num_words The number of words to trim the text to. Default 5. + * @param string $more An optional string to append to the end of the trimmed text, e.g. …. + * @param string $original_text The text before it was trimmed. + */ return apply_filters( 'wp_trim_words', $text, $num_words, $more, $original_text ); } @@ -2254,7 +2491,16 @@ function wp_trim_words( $text, $num_words = 55, $more = null ) { */ function ent2ncr($text) { - // Allow a plugin to short-circuit and override the mappings. + /** + * Filter text before named entities are converted into numbered entities. + * + * A non-null string must be returned for the filter to be evaluated. + * + * @since 3.3.0 + * + * @param null $converted_text The text to be converted. Default null. + * @param string $text The text prior to entity conversion. + */ $filtered = apply_filters( 'pre_ent2ncr', null, $text ); if( null !== $filtered ) return $filtered; @@ -2533,14 +2779,30 @@ function ent2ncr($text) { * @return string The formatted text after filter is applied. */ function wp_richedit_pre($text) { - // Filtering a blank results in an annoying
\n - if ( empty($text) ) return apply_filters('richedit_pre', ''); + if ( empty( $text ) ) { + /** + * Filter text returned for the rich text editor. + * + * This filter is first evaluated, and the value returned, if an empty string + * is passed to wp_richedit_pre(). If an empty string is passed, it results + * in a break tag and line feed. + * + * If a non-empty string is passed, the filter is evaluated on the wp_richedit_pre() + * return after being formatted. + * + * @since 2.0.0 + * + * @param string $output Text for the rich text editor. + */ + return apply_filters( 'richedit_pre', '' ); + } $output = convert_chars($text); $output = wpautop($output); $output = htmlspecialchars($output, ENT_NOQUOTES, get_option( 'blog_charset' ) ); - return apply_filters('richedit_pre', $output); + /** This filter is documented in wp-includes/formatting.php */ + return apply_filters( 'richedit_pre', $output ); } /** @@ -2558,7 +2820,14 @@ function wp_htmledit_pre($output) { if ( !empty($output) ) $output = htmlspecialchars($output, ENT_NOQUOTES, get_option( 'blog_charset' ) ); // convert only < > & - return apply_filters('htmledit_pre', $output); + /** + * Filter the text before it is formatted for the HTML editor. + * + * @since 2.5.0 + * + * @param string $output The HTML-formatted text. + */ + return apply_filters( 'htmledit_pre', $output ); } /** @@ -2653,7 +2922,16 @@ function esc_url( $url, $protocols = null, $_context = 'display' ) { return ''; } - return apply_filters('clean_url', $good_protocol_url, $original_url, $_context); + /** + * Filter a string cleaned and escaped for output as a URL. + * + * @since 2.3.0 + * + * @param string $good_protocol_url The cleaned URL to be returned. + * @param string $original_url The URL prior to cleaning. + * @param string $_context If 'display', replace ampersands and single quotes only. + */ + return apply_filters( 'clean_url', $good_protocol_url, $original_url, $_context ); } /** @@ -2704,6 +2982,17 @@ function esc_js( $text ) { $safe_text = preg_replace( '/&#(x)?0*(?(1)27|39);?/i', "'", stripslashes( $safe_text ) ); $safe_text = str_replace( "\r", '', $safe_text ); $safe_text = str_replace( "\n", '\\n', addslashes( $safe_text ) ); + /** + * Filter a string cleaned and escaped for output in JavaScript. + * + * Text passed to esc_js() is stripped of invalid or special characters, + * and properly slashed for output. + * + * @since 2.0.6 + * + * @param string $safe_text The text after it has been escaped. + * @param string $text The text prior to being escaped. + */ return apply_filters( 'js_escape', $safe_text, $text ); } @@ -2718,6 +3007,17 @@ function esc_js( $text ) { function esc_html( $text ) { $safe_text = wp_check_invalid_utf8( $text ); $safe_text = _wp_specialchars( $safe_text, ENT_QUOTES ); + /** + * Filter a string cleaned and escaped for output in HTML. + * + * Text passed to esc_html() is stripped of invalid or special characters + * before output. + * + * @since 2.8.0 + * + * @param string $safe_text The text after it has been escaped. + * @param string $text The text prior to being escaped. + */ return apply_filters( 'esc_html', $safe_text, $text ); } @@ -2732,6 +3032,17 @@ function esc_html( $text ) { function esc_attr( $text ) { $safe_text = wp_check_invalid_utf8( $text ); $safe_text = _wp_specialchars( $safe_text, ENT_QUOTES ); + /** + * Filter a string cleaned and escaped for output in an HTML attribute. + * + * Text passed to esc_attr() is stripped of invalid or special characters + * before output. + * + * @since 2.0.6 + * + * @param string $safe_text The text after it has been escaped. + * @param string $text The text prior to being escaped. + */ return apply_filters( 'attribute_escape', $safe_text, $text ); } @@ -2745,6 +3056,14 @@ function esc_attr( $text ) { */ function esc_textarea( $text ) { $safe_text = htmlspecialchars( $text, ENT_QUOTES, get_option( 'blog_charset' ) ); + /** + * Filter a string cleaned and escaped for output in a textarea element. + * + * @since 3.1.0 + * + * @param string $safe_text The text after it has been escaped. + * @param string $text The text prior to being escaped. + */ return apply_filters( 'esc_textarea', $safe_text, $text ); } @@ -2758,7 +3077,15 @@ function esc_textarea( $text ) { */ function tag_escape($tag_name) { $safe_tag = strtolower( preg_replace('/[^a-zA-Z0-9_:]/', '', $tag_name) ); - return apply_filters('tag_escape', $safe_tag, $tag_name); + /** + * Filter a string cleaned and escaped for output as an HTML tag. + * + * @since 2.8.0 + * + * @param string $safe_tag The tag name after it has been escaped. + * @param string $tag_name The text before it was escaped. + */ + return apply_filters( 'tag_escape', $safe_tag, $tag_name ); } /** @@ -2964,7 +3291,15 @@ function sanitize_option($option, $value) { break; } - $value = apply_filters("sanitize_option_{$option}", $value, $option); + /** + * Filter an option value following sanitization. + * + * @since 2.3.0 + * + * @param string $value The sanitized option value. + * @param string $option The option name. + */ + $value = apply_filters( "sanitize_option_{$option}", $value, $option ); return $value; } @@ -2976,7 +3311,6 @@ function sanitize_option($option, $value) { * {@link http://www.php.net/magic_quotes magic_quotes_gpc} is on. * * @since 2.2.1 - * @uses apply_filters() for the 'wp_parse_str' filter. * * @param string $string The string to be parsed. * @param array $array Variables will be stored in this array. @@ -2985,6 +3319,13 @@ function wp_parse_str( $string, &$array ) { parse_str( $string, $array ); if ( get_magic_quotes_gpc() ) $array = stripslashes_deep( $array ); + /** + * Filter the array of variables derived from a parsed string. + * + * @since 2.3.0 + * + * @param array $array The array populated with variables. + */ $array = apply_filters( 'wp_parse_str', $array ); } @@ -3065,7 +3406,16 @@ function wp_sprintf( $pattern ) { $arg = isset($args[$arg_index]) ? $args[$arg_index] : ''; } - // Apply filters OR sprintf + /** + * Filter a fragment from the pattern passed to wp_sprintf(). + * + * If the fragment is unchanged, then sprintf() will be run on the fragment. + * + * @since 2.5.0 + * + * @param string $fragment A fragment from the pattern. + * @param string $arg The argument. + */ $_fragment = apply_filters( 'wp_sprintf', $fragment, $arg ); if ( $_fragment != $fragment ) $fragment = $_fragment; @@ -3102,15 +3452,25 @@ function wp_sprintf_l($pattern, $args) { if ( empty($args) ) return ''; - // Translate and filter the delimiter set (avoid ampersands and entities here) - $l = apply_filters('wp_sprintf_l', array( - /* translators: used between list items, there is a space after the comma */ - 'between' => __(', '), - /* translators: used between list items, there is a space after the and */ - 'between_last_two' => __(', and '), - /* translators: used between only two list items, there is a space after the and */ - 'between_only_two' => __(' and '), - )); + /** + * Filter the translated delimiters used by wp_sprintf_l(). + * Placeholders (%s) are included to assist translators and then + * removed before the array of strings reaches the filter. + * + * Please note: Ampersands and entities should be avoided here. + * + * @since 2.5.0 + * + * @param array $delimiters An array of translated delimiters. + */ + $l = apply_filters( 'wp_sprintf_l', array( + /* translators: used to join items in a list with more than 2 items */ + 'between' => sprintf( __('%s, %s'), '', '' ), + /* translators: used to join last two items in a list with more than 2 times */ + 'between_last_two' => sprintf( __('%s, and %s'), '', '' ), + /* translators: used to join items in a list with only 2 items */ + 'between_only_two' => sprintf( __('%s and %s'), '', '' ), + ) ); $args = (array) $args; $result = array_shift($args); @@ -3213,7 +3573,7 @@ function links_add_target( $content, $target = '_blank', $tags = array('a') ) { global $_links_add_target; $_links_add_target = $target; $tags = implode('|', (array)$tags); - return preg_replace_callback( "!<($tags)(.+?)>!i", '_links_add_target', $content ); + return preg_replace_callback( "!<($tags)([^>]*)>!i", '_links_add_target', $content ); } /** @@ -3228,7 +3588,7 @@ function links_add_target( $content, $target = '_blank', $tags = array('a') ) { function _links_add_target( $m ) { global $_links_add_target; $tag = $m[1]; - $link = preg_replace('|(target=([\'"])(.*?)\2)|i', '', $m[2]); + $link = preg_replace('|( target=([\'"])(.*?)\2)|i', '', $m[2]); return '<' . $tag . $link . ' target="' . esc_attr( $_links_add_target ) . '">'; } @@ -3250,6 +3610,10 @@ function normalize_whitespace( $str ) { /** * Properly strip all HTML tags including script and style * + * This differs from strip_tags() because it removes the contents of + * the ' ) + * will return 'something'. wp_strip_all_tags will return '' + * * @since 2.9.0 * * @param string $string String containing HTML tags @@ -3302,7 +3666,15 @@ function sanitize_text_field($str) { $filtered = trim( preg_replace('/ +/', ' ', $filtered) ); } - return apply_filters('sanitize_text_field', $filtered, $str); + /** + * Filter a sanitized text field string. + * + * @since 2.9.0 + * + * @param string $filtered The sanitized string. + * @param string $str The string prior to being sanitized. + */ + return apply_filters( 'sanitize_text_field', $filtered, $str ); } /** @@ -3327,7 +3699,8 @@ function wp_basename( $path, $suffix = '' ) { */ function capital_P_dangit( $text ) { // Simple replacement for titles - if ( 'the_title' === current_filter() ) + $current_filter = current_filter(); + if ( 'the_title' === $current_filter || 'wp_title' === $current_filter ) return str_replace( 'Wordpress', 'WordPress', $text ); // Still here? Use the more judicious replacement static $dblq = false; @@ -3350,6 +3723,14 @@ function capital_P_dangit( $text ) { */ function sanitize_mime_type( $mime_type ) { $sani_mime_type = preg_replace( '/[^-+*.a-zA-Z0-9\/]/', '', $mime_type ); + /** + * Filter a mime type following sanitization. + * + * @since 3.1.3 + * + * @param string $sani_mime_type The sanitized mime type. + * @param string $mime_type The mime type prior to sanitization. + */ return apply_filters( 'sanitize_mime_type', $sani_mime_type, $mime_type ); } @@ -3369,6 +3750,17 @@ function sanitize_trackback_urls( $to_ping ) { } $urls_to_ping = array_map( 'esc_url_raw', $urls_to_ping ); $urls_to_ping = implode( "\n", $urls_to_ping ); + /** + * Filter a list of trackback URLs following sanitization. + * + * The string returned here consists of a space or carriage return-delimited list + * of trackback URLs. + * + * @since 3.4.0 + * + * @param string $urls_to_ping Sanitized space or carriage return separated URLs. + * @param string $to_ping Space or carriage return separated URLs before sanitization. + */ return apply_filters( 'sanitize_trackback_urls', $urls_to_ping, $to_ping ); } @@ -3423,11 +3815,13 @@ function wp_unslash( $value ) { * @return string The found URL. */ function get_url_in_content( $content ) { - if ( empty( $content ) ) - return ''; + if ( empty( $content ) ) { + return false; + } - if ( preg_match( '/]*?href=([\'"])(.+?)\1/is', $content, $matches ) ) + if ( preg_match( '/]*?href=([\'"])(.+?)\1/is', $content, $matches ) ) { return esc_url_raw( $matches[2] ); + } return false; }