WP_Token_Map::precomputed_php_source_table()publicWP 6.6.0

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

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( "😯", "🙂", "🙁", "😕" )
	)
);

Method of the class: WP_Token_Map{}

No Hooks.

Return

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

Usage

$WP_Token_Map = new WP_Token_Map();
$WP_Token_Map->precomputed_php_source_table( $indent ): string;
$indent(string)
Use this string for indentation, or rely on the default horizontal tab character.
Default: "\t"

Changelog

Since 6.6.0 Introduced.

WP_Token_Map::precomputed_php_source_table() code WP 6.7.1

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 .= ')';

	return $output;
}