Example #1
0
 /**
  * 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);
 }
Example #2
0
/**
 * 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;
}
Example #4
0
 /**
  * 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" => " ")));
 }