/** * Passes any unlinked URLs that are on their own line to {@link WP_Embed::shortcode()} for potential embedding. * * @uses WP_Embed::autoembed_callback() * * @param string $content The content to be searched. * @return string Potentially modified $content. */ public function autoembed($content) { // Replace line breaks from all HTML elements with placeholders. $content = wp_replace_in_html_tags($content, array("\n" => '<!-- wp-line-break -->')); // Find URLs that are on their own line. $content = preg_replace_callback('|^(\\s*)(https?://[^\\s"]+)(\\s*)$|im', array($this, 'autoembed_callback'), $content); // Put the line breaks back. return str_replace('<!-- wp-line-break -->', "\n", $content); }
/** * Replaces double line-breaks with paragraph elements. * * A group of regex replaces used to identify text formatted with newlines and * replace double line-breaks with HTML paragraph tags. The remaining line-breaks * after conversion become <<br />> tags, unless $br is set to '0' or 'false'. * * @since 0.71 * * @param string $pee The text which has to be formatted. * @param bool $br Optional. If set, this will convert all remaining line-breaks * after paragraphing. Default true. * @return string Text which has been converted into correct paragraph tags. */ function wpautop($pee, $br = true) { $pre_tags = array(); if (trim($pee) === '') { return ''; } // Just to make things a little easier, pad the end. $pee = $pee . "\n"; /* * Pre tags shouldn't be touched by autop. * Replace pre tags with placeholders and bring them back after autop. */ if (strpos($pee, '<pre') !== false) { $pee_parts = explode('</pre>', $pee); $last_pee = array_pop($pee_parts); $pee = ''; $i = 0; foreach ($pee_parts as $pee_part) { $start = strpos($pee_part, '<pre'); // Malformed html? if ($start === false) { $pee .= $pee_part; continue; } $name = "<pre wp-pre-tag-{$i}></pre>"; $pre_tags[$name] = substr($pee_part, $start) . '</pre>'; $pee .= substr($pee_part, 0, $start) . $name; $i++; } $pee .= $last_pee; } // Change multiple <br>s into two line breaks, which will turn into paragraphs. $pee = preg_replace('|<br\\s*/?>\\s*<br\\s*/?>|', "\n\n", $pee); $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|legend|section|article|aside|hgroup|header|footer|nav|figure|figcaption|details|menu|summary)'; // Add a single line break above block-level opening tags. $pee = preg_replace('!(<' . $allblocks . '[\\s/>])!', "\n\$1", $pee); // Add a double line break below block-level closing tags. $pee = preg_replace('!(</' . $allblocks . '>)!', "\$1\n\n", $pee); // Standardize newline characters to "\n". $pee = str_replace(array("\r\n", "\r"), "\n", $pee); // Find newlines in all elements and add placeholders. $pee = wp_replace_in_html_tags($pee, array("\n" => " <!-- wpnl --> ")); // Collapse line breaks before and after <option> elements so they don't get autop'd. if (strpos($pee, '<option') !== false) { $pee = preg_replace('|\\s*<option|', '<option', $pee); $pee = preg_replace('|</option>\\s*|', '</option>', $pee); } /* * Collapse line breaks inside <object> elements, before <param> and <embed> elements * so they don't get autop'd. */ if (strpos($pee, '</object>') !== false) { $pee = preg_replace('|(<object[^>]*>)\\s*|', '$1', $pee); $pee = preg_replace('|\\s*</object>|', '</object>', $pee); $pee = preg_replace('%\\s*(</?(?:param|embed)[^>]*>)\\s*%', '$1', $pee); } /* * Collapse line breaks inside <audio> and <video> elements, * before and after <source> and <track> elements. */ if (strpos($pee, '<source') !== false || strpos($pee, '<track') !== false) { $pee = preg_replace('%([<\\[](?:audio|video)[^>\\]]*[>\\]])\\s*%', '$1', $pee); $pee = preg_replace('%\\s*([<\\[]/(?:audio|video)[>\\]])%', '$1', $pee); $pee = preg_replace('%\\s*(<(?:source|track)[^>]*>)\\s*%', '$1', $pee); } // Remove more than two contiguous line breaks. $pee = preg_replace("/\n\n+/", "\n\n", $pee); // Split up the contents into an array of strings, separated by double line breaks. $pees = preg_split('/\\n\\s*\\n/', $pee, -1, PREG_SPLIT_NO_EMPTY); // Reset $pee prior to rebuilding. $pee = ''; // Rebuild the content as a string, wrapping every bit with a <p>. foreach ($pees as $tinkle) { $pee .= '<p>' . trim($tinkle, "\n") . "</p>\n"; } // Under certain strange conditions it could create a P of entirely whitespace. $pee = preg_replace('|<p>\\s*</p>|', '', $pee); // Add a closing <p> inside <div>, <address>, or <form> tag if missing. $pee = preg_replace('!<p>([^<]+)</(div|address|form)>!', "<p>\$1</p></\$2>", $pee); // If an opening or closing block element tag is wrapped in a <p>, unwrap it. $pee = preg_replace('!<p>\\s*(</?' . $allblocks . '[^>]*>)\\s*</p>!', "\$1", $pee); // In some cases <li> may get wrapped in <p>, fix them. $pee = preg_replace("|<p>(<li.+?)</p>|", "\$1", $pee); // If a <blockquote> is wrapped with a <p>, move it inside the <blockquote>. $pee = preg_replace('|<p><blockquote([^>]*)>|i', "<blockquote\$1><p>", $pee); $pee = str_replace('</blockquote></p>', '</p></blockquote>', $pee); // If an opening or closing block element tag is preceded by an opening <p> tag, remove it. $pee = preg_replace('!<p>\\s*(</?' . $allblocks . '[^>]*>)!', "\$1", $pee); // If an opening or closing block element tag is followed by a closing <p> tag, remove it. $pee = preg_replace('!(</?' . $allblocks . '[^>]*>)\\s*</p>!', "\$1", $pee); // Optionally insert line breaks. if ($br) { // Replace newlines that shouldn't be touched with a placeholder. $pee = preg_replace_callback('/<(script|style).*?<\\/\\1>/s', '_autop_newline_preservation_helper', $pee); // Normalize <br> $pee = str_replace(array('<br>', '<br/>'), '<br />', $pee); // Replace any new line characters that aren't preceded by a <br /> with a <br />. $pee = preg_replace('|(?<!<br />)\\s*\\n|', "<br />\n", $pee); // Replace newline placeholders with newlines. $pee = str_replace('<WPPreserveNewline />', "\n", $pee); } // If a <br /> tag is after an opening or closing block tag, remove it. $pee = preg_replace('!(</?' . $allblocks . '[^>]*>)\\s*<br />!', "\$1", $pee); // If a <br /> tag is before a subset of opening or closing block tags, remove it. $pee = preg_replace('!<br />(\\s*</?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)[^>]*>)!', '$1', $pee); $pee = preg_replace("|\n</p>\$|", '</p>', $pee); // Replace placeholder <pre> tags with their original content. if (!empty($pre_tags)) { $pee = str_replace(array_keys($pre_tags), array_values($pre_tags), $pee); } // Restore newlines in all elements. if (false !== strpos($pee, '<!-- wpnl -->')) { $pee = str_replace(array(' <!-- wpnl --> ', '<!-- wpnl -->'), "\n", $pee); } return $pee; }
/** * Replaces double line-breaks with paragraph elements. * * A group of regex replaces used to identify text formatted with newlines and * replace double line-breaks with HTML paragraph tags. The remaining * line-breaks after conversion become <<br />> tags, unless $br is set to '0' * or 'false'. * * @since 0.71 * * @param string $pee The text which has to be formatted. * @param bool $br Optional. If set, this will convert all remaining line-breaks after paragraphing. Default true. * @return string Text which has been converted into correct paragraph tags. */ function wpautop($pee, $br = true) { $pre_tags = array(); if ( trim($pee) === '' ) return ''; $pee = $pee . "\n"; // just to make things a little easier, pad the end if ( strpos($pee, '<pre') !== false ) { $pee_parts = explode( '</pre>', $pee ); $last_pee = array_pop($pee_parts); $pee = ''; $i = 0; foreach ( $pee_parts as $pee_part ) { $start = strpos($pee_part, '<pre'); // Malformed html? if ( $start === false ) { $pee .= $pee_part; continue; } $name = "<pre wp-pre-tag-$i></pre>"; $pre_tags[$name] = substr( $pee_part, $start ) . '</pre>'; $pee .= substr( $pee_part, 0, $start ) . $name; $i++; } $pee .= $last_pee; } $pee = preg_replace('|<br />\s*<br />|', "\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)'; $pee = preg_replace('!(<' . $allblocks . '[^>]*>)!', "\n$1", $pee); $pee = preg_replace('!(</' . $allblocks . '>)!', "$1\n\n", $pee); $pee = str_replace(array("\r\n", "\r"), "\n", $pee); // cross-platform newlines // Strip newlines from all elements. $pee = wp_replace_in_html_tags( $pee, array( "\n" => " " ) ); if ( strpos($pee, '<object') !== false ) { $pee = preg_replace('|\s*<param([^>]*)>\s*|', "<param$1>", $pee); // no pee inside object/embed $pee = preg_replace('|\s*</embed>\s*|', '</embed>', $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 ) $pee .= '<p>' . trim($tinkle, "\n") . "</p>\n"; $pee = preg_replace('|<p>\s*</p>|', '', $pee); // under certain strange conditions it could create a P of entirely whitespace $pee = preg_replace('!<p>([^<]+)</(div|address|form)>!', "<p>$1</p></$2>", $pee); $pee = preg_replace('!<p>\s*(</?' . $allblocks . '[^>]*>)\s*</p>!', "$1", $pee); // don't pee all over a tag $pee = preg_replace("|<p>(<li.+?)</p>|", "$1", $pee); // problem with nested lists $pee = preg_replace('|<p><blockquote([^>]*)>|i', "<blockquote$1><p>", $pee); $pee = str_replace('</blockquote></p>', '</p></blockquote>', $pee); $pee = preg_replace('!<p>\s*(</?' . $allblocks . '[^>]*>)!', "$1", $pee); $pee = preg_replace('!(</?' . $allblocks . '[^>]*>)\s*</p>!', "$1", $pee); if ( $br ) { $pee = preg_replace_callback('/<(script|style).*?<\/\\1>/s', '_autop_newline_preservation_helper', $pee); $pee = preg_replace('|(?<!<br />)\s*\n|', "<br />\n", $pee); // optionally make line breaks $pee = str_replace('<WPPreserveNewline />', "\n", $pee); } $pee = preg_replace('!(</?' . $allblocks . '[^>]*>)\s*<br />!', "$1", $pee); $pee = preg_replace('!<br />(\s*</?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)[^>]*>)!', '$1', $pee); $pee = preg_replace( "|\n</p>$|", '</p>', $pee ); if ( !empty($pre_tags) ) $pee = str_replace(array_keys($pre_tags), array_values($pre_tags), $pee); return $pee; }
/** * Passes any unlinked URLs that are on their own line to WP_Embed::shortcode() for potential embedding. * * @see WP_Embed::autoembed_callback() * * @param string $content The content to be searched. * @return string Potentially modified $content. */ public function autoembed($content) { // Replace line breaks from all HTML elements with placeholders. $content = wp_replace_in_html_tags($content, array("\n" => '<!-- wp-line-break -->')); if (preg_match('#(^|\\s|>)https?://#i', $content)) { // Find URLs on their own line. $content = preg_replace_callback('|^(\\s*)(https?://[^\\s<>"]+)(\\s*)$|im', array($this, 'autoembed_callback'), $content); // Find URLs in their own paragraph. $content = preg_replace_callback('|(<p(?: [^>]*)?>\\s*)(https?://[^\\s<>"]+)(\\s*<\\/p>)|i', array($this, 'autoembed_callback'), $content); } // Put the line breaks back. return str_replace('<!-- wp-line-break -->', "\n", $content); }
public function convert_urls_omnyapp_to_shortcode_omny($post_id, $post, $update) { $content = wp_replace_in_html_tags($post->post_content, array("\n" => '<!-- wp-line-break -->')); // Find the Omny URLs within the post_content $omny_urls = array(); $has_omny_urls = preg_match_all(self::$embed_handlers['omnyapp']['regex'], $content, $omny_urls); if (count($omny_urls) > 0 && $this->get_option('hooksavepost') == 'shortcode_omny') { // Replace all the omnyapp.com URLs with [omny] shortcode text $content = preg_replace_callback('|^(\\s*)(https?://[^\\s"]+)(\\s*)$|im', array($this, 'callback_omnyapp_to_shortcode_omny'), $content); // Restore the linebreaks $content = str_replace('<!-- wp-line-break -->', "\n", $content); // unhook this function so it doesn't loop infinitely remove_action('save_post', array($this, 'convert_urls_omnyapp_to_shortcode_omny'), 13, 3); // update the post, which calls save_post again wp_update_post(array('ID' => $post_id, 'post_content' => $content)); // re-hook this function add_action('save_post', array($this, 'convert_urls_omnyapp_to_shortcode_omny'), 13, 3); } }
/** * Passes any unlinked URLs that are on their own line to {@link WP_Embed::shortcode()} for potential embedding. * * @uses WP_Embed::autoembed_callback() * * @param string $content The content to be searched. * @return string Potentially modified $content. */ public function autoembed($content) { // Strip newlines from all elements. $content = wp_replace_in_html_tags($content, array("\n" => " ")); // Find URLs that are on their own line. return preg_replace_callback('|^\\s*(https?://[^\\s"]+)\\s*$|im', array($this, 'autoembed_callback'), $content); }
/** * Check for expected behavior of new function wp_replace_in_html_tags(). * * @dataProvider data_wp_replace_in_html_tags */ function test_wp_replace_in_html_tags($input, $output) { return $this->assertEquals($output, wp_replace_in_html_tags($input, array("\n" => " "))); }