'\\u005c', '--' => '\\u002d\\u002d', '<' => '\\u003c', '>' => '\\u003e', '&' => '\\u0026', '\\"' => '\\u0022', ]; public static function document(Document $document): string { return self::parts($document->parts()); } public static function block(Block $block): string { $open = $block->rawOpen() ?? self::opener($block); if ($block->isVoid()) { return $open; } return $open . self::parts($block->parts()) . ($block->rawClose() ?? self::closer($block)); } /** @param array $attrs */ public static function attributes(array $attrs): string { return strtr(Json::encode($attrs), self::ESCAPES); } private static function opener(Block $block): string { $attrs = $block->attrs() === [] ? '' : self::attributes($block->attrs()) . ' '; return '' : '-->'); } private static function closer(Block $block): string { return ''; } private static function serializedName(string $name): string { return str_starts_with($name, 'core/') ? substr($name, 5) : $name; } /** @param list $parts */ private static function parts(array $parts): string { $out = ''; foreach ($parts as $part) { $out .= $part instanceof Block ? self::block($part) : $part; } return $out; } }