WP_Token_Map::precomputed_php_source_table( string $indent = "t" ): string

In this article

Export the token map for quick loading in PHP source code.

Description

This function has a specific purpose, to make loading of static token maps fast.
It’s used to ensure that the HTML character reference lookups add a minimal cost to initializing the PHP process.

Example:

echo $smilies->precomputed_php_source_table();

// Output.
WP_Token_Map::from_precomputed_table(
    array(
        "storage_version" => "6.6.0",
        "key_length" => 2,
        "groups" => "",
        "long_words" => array(),
        "small_words" => "8O\x00:)\x00:(\x00:?\x00",
        "small_mappings" => array( "😯", "🙂", "🙁", "😕" )
    )
);

Parameters

$indentstringoptional
Use this string for indentation, or rely on the default horizontal tab character.

Default:"t"

Return

string Value which can be pasted into a PHP source file for quick loading of table.

Source

 * @return string Value which can be pasted into a PHP source file for quick loading of table.
 */
public function precomputed_php_source_table( string $indent = "\t" ): string {
	$i1 = $indent;
	$i2 = $i1 . $indent;
	$i3 = $i2 . $indent;

	$class_version = self::STORAGE_VERSION;

	$output  = self::class . "::from_precomputed_table(\n";
	$output .= "{$i1}array(\n";
	$output .= "{$i2}\"storage_version\" => \"{$class_version}\",\n";
	$output .= "{$i2}\"key_length\" => {$this->key_length},\n";

	$group_line = str_replace( "\x00", "\\x00", $this->groups );
	$output    .= "{$i2}\"groups\" => \"{$group_line}\",\n";

	$output .= "{$i2}\"large_words\" => array(\n";

	$prefixes = explode( "\x00", $this->groups );
	foreach ( $prefixes as $index => $prefix ) {
		if ( '' === $prefix ) {
			break;
		}
		$group        = $this->large_words[ $index ];
		$group_length = strlen( $group );
		$comment_line = "{$i3}//";
		$data_line    = "{$i3}\"";
		$at           = 0;
		while ( $at < $group_length ) {
			$token_length   = unpack( 'C', $group[ $at++ ] )[1];
			$token          = substr( $group, $at, $token_length );
			$at            += $token_length;
			$mapping_length = unpack( 'C', $group[ $at++ ] )[1];
			$mapping        = substr( $group, $at, $mapping_length );
			$at            += $mapping_length;

			$token_digits   = str_pad( dechex( $token_length ), 2, '0', STR_PAD_LEFT );
			$mapping_digits = str_pad( dechex( $mapping_length ), 2, '0', STR_PAD_LEFT );

			$mapping = preg_replace_callback(
				"~[\\x00-\\x1f\\x22\\x5c]~",
				static function ( $match_result ) {
					switch ( $match_result[0] ) {
						case '"':
							return '\\"';

						case '\\':
							return '\\\\';

						default:
							$hex = dechex( ord( $match_result[0] ) );
							return "\\x{$hex}";
					}
				},
				$mapping
			);

			$comment_line .= " {$prefix}{$token}[{$mapping}]";
			$data_line    .= "\\x{$token_digits}{$token}\\x{$mapping_digits}{$mapping}";
		}
		$comment_line .= ".\n";
		$data_line    .= "\",\n";

		$output .= $comment_line;
		$output .= $data_line;
	}

	$output .= "{$i2}),\n";

	$small_words  = array();
	$small_length = strlen( $this->small_words );
	$at           = 0;
	while ( $at < $small_length ) {
		$small_words[] = substr( $this->small_words, $at, $this->key_length + 1 );
		$at           += $this->key_length + 1;
	}

	$small_text = str_replace( "\x00", '\x00', implode( '', $small_words ) );
	$output    .= "{$i2}\"small_words\" => \"{$small_text}\",\n";

	$output .= "{$i2}\"small_mappings\" => array(\n";
	foreach ( $this->small_mappings as $mapping ) {
		$output .= "{$i3}\"{$mapping}\",\n";
	}
	$output .= "{$i2})\n";
	$output .= "{$i1})\n";
	$output .= ')';

Changelog

VersionDescription
6.6.0Introduced.

User Contributed Notes

You must log in before being able to contribute a note or feedback.