Emoji: There's a little tear in my eye as I remove DOMDocument from the Emoji staticizer. It was a beautiful dream, but it wasn't to be.

Instead, let's use the tried and trusted smiley replacement algorithm, which has stood the test of time.

See #31242


Built from https://develop.svn.wordpress.org/trunk@31752


git-svn-id: http://core.svn.wordpress.org/trunk@31733 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
Gary Pendergast 2015-03-12 13:17:26 +00:00
parent e8a600ac94
commit 351ea2d6f8
2 changed files with 49 additions and 39 deletions

View File

@ -4106,14 +4106,14 @@ function wp_encode_emoji( $content ) {
* *
* @since 4.2.0 * @since 4.2.0
* *
* @param string $content The content to encode. * @param string $text The content to encode.
* @return string The encoded content. * @return string The encoded content.
*/ */
function wp_staticize_emoji( $content ) { function wp_staticize_emoji( $text ) {
$content = wp_encode_emoji( $content ); $text = wp_encode_emoji( $text );
if ( ! class_exists( 'DOMDocument' ) ) { if ( ! class_exists( 'DOMDocument' ) ) {
return $content; return $text;
} }
/** This filter is documented in wp-includes/script-loader.php */ /** This filter is documented in wp-includes/script-loader.php */
@ -4121,54 +4121,64 @@ function wp_staticize_emoji( $content ) {
/** This filter is documented in wp-includes/script-loader.php */ /** This filter is documented in wp-includes/script-loader.php */
$ext = apply_filters( 'emoji_ext', '.png' ); $ext = apply_filters( 'emoji_ext', '.png' );
$html = '<!DOCTYPE html><html><head></head><body>' . $content . '</body></html>'; $output = '';
// HTML loop taken from smiley function, which was taking from texturize function. It'll never 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
$document = new DOMDocument; // Ignore proessing of specific tags
if ( ! $document->loadHTML( $html ) ) { $tags_to_ignore = 'code|pre|style|script|textarea';
return $content; $ignore_block_element = '';
}
$xpath = new DOMXPath( $document ); for ( $i = 0; $i < $stop; $i++ ) {
$textnodes = $xpath->query( '//text()' ); $content = $textarr[$i];
foreach( $textnodes as $node ) { // If we're in an ignore block, wait until we find its closing tag
$originalText = $text = wp_encode_emoji( $node->nodeValue ); if ( '' == $ignore_block_element && preg_match( '/^<(' . $tags_to_ignore . ')>/', $content, $matches ) ) {
$ignore_block_element = $matches[1];
}
$matches = array(); // If it's not a tag and not in ignore block
if ( preg_match_all( '/(&#x1f1(e[6-9a-f]|f[0-9a-f]);){2}/', $text, $matches ) ) { if ( '' == $ignore_block_element && strlen( $content ) > 0 && '<' != $content[0] ) {
if ( ! empty( $matches[0] ) ) { $matches = array();
foreach ( $matches[0] as $flag ) { if ( preg_match_all( '/(&#x1f1(e[6-9a-f]|f[0-9a-f]);){2}/', $content, $matches ) ) {
$chars = str_replace( array( '&#x', ';'), '', $flag ); if ( ! empty( $matches[0] ) ) {
foreach ( $matches[0] as $flag ) {
$chars = str_replace( array( '&#x', ';'), '', $flag );
list( $char1, $char2 ) = str_split( $chars, 5 ); list( $char1, $char2 ) = str_split( $chars, 5 );
$entity = '<img src="https:' . $cdn_url . $char1 . '-' . $char2 . $ext . '" class="wp-smiley" style="height: 1em;" />'; $entity = '<img src="https:' . $cdn_url . $char1 . '-' . $char2 . $ext . '" class="wp-smiley" style="height: 1em;" />';
$text = str_replace( $flag, $entity, $text ); $content = str_replace( $flag, $entity, $content );
}
}
}
// Loosely match the Emoji Unicode range.
$regex = '/(&#x[2-3][0-9a-f]{3};|&#x1f[1-6][0-9a-f]{2};)/';
$matches = array();
if ( preg_match_all( $regex, $content, $matches ) ) {
if ( ! empty( $matches[1] ) ) {
foreach ( $matches[1] as $emoji ) {
$char = str_replace( array( '&#x', ';'), '', $emoji );
$entity = '<img src="https:' . $cdn_url . $char . $ext . '" class="wp-smiley" style="height: 1em;" />';
$content = str_replace( $emoji, $entity, $content );
}
} }
} }
} }
// Loosely match the Emoji Unicode range. // did we exit ignore block
$regex = '/(&#x[2-3][0-9a-f]{3};|&#x1f[1-6][0-9a-f]{2};)/'; if ( '' != $ignore_block_element && '</' . $ignore_block_element . '>' == $content ) {
$ignore_block_element = '';
$matches = array();
if ( preg_match_all( $regex, $text, $matches ) ) {
if ( ! empty( $matches[1] ) ) {
foreach ( $matches[1] as $emoji ) {
$char = str_replace( array( '&#x', ';'), '', $emoji );
$entity = '<img src="https:' . $cdn_url . $char . $ext . '" class="wp-smiley" style="height: 1em;" />';
$text = str_replace( $emoji, $entity, $text );
}
}
} }
if ( $originalText !== $text ) { $output .= $content;
$content = str_replace( $originalText, $text, $content );
}
} }
return $content; return $output;
} }
/** /**

View File

@ -4,7 +4,7 @@
* *
* @global string $wp_version * @global string $wp_version
*/ */
$wp_version = '4.2-alpha-31751'; $wp_version = '4.2-alpha-31752';
/** /**
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema. * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.