55
66class XMLSerializer {
77
8- /** @var \XMLWriter */
9- private $ writer ;
10-
11- /** @var Token */
12- private $ previousToken ;
13-
148 /** @var NamespaceUri */
159 private $ xmlns ;
1610
@@ -35,45 +29,41 @@ public function toDom(TokenCollection $tokens): DOMDocument {
3529 }
3630
3731 public function toXML (TokenCollection $ tokens ): string {
38- $ this -> writer = new \XMLWriter ();
39- $ this -> writer ->openMemory ();
40- $ this -> writer ->setIndent (true );
41- $ this -> writer ->startDocument ();
42- $ this -> writer ->startElement ('source ' );
43- $ this -> writer ->writeAttribute ('xmlns ' , $ this ->xmlns ->asString ());
32+ $ writer = new \XMLWriter ();
33+ $ writer ->openMemory ();
34+ $ writer ->setIndent (true );
35+ $ writer ->startDocument ();
36+ $ writer ->startElement ('source ' );
37+ $ writer ->writeAttribute ('xmlns ' , $ this ->xmlns ->asString ());
4438
4539 if (\count ($ tokens ) > 0 ) {
46- $ this -> writer ->startElement ('line ' );
47- $ this -> writer ->writeAttribute ('no ' , '1 ' );
40+ $ writer ->startElement ('line ' );
41+ $ writer ->writeAttribute ('no ' , '1 ' );
4842
49- $ this -> previousToken = $ tokens [0 ];
43+ $ previousToken = $ tokens [0 ];
5044
5145 foreach ($ tokens as $ token ) {
52- $ this ->addToken ($ token );
46+ if ($ previousToken ->getLine () < $ token ->getLine ()) {
47+ $ writer ->endElement ();
48+
49+ $ writer ->startElement ('line ' );
50+ $ writer ->writeAttribute ('no ' , (string )$ token ->getLine ());
51+ $ previousToken = $ token ;
52+ }
53+
54+ if ($ token ->getValue () !== '' ) {
55+ $ writer ->startElement ('token ' );
56+ $ writer ->writeAttribute ('name ' , $ token ->getName ());
57+ $ writer ->writeRaw (\htmlspecialchars ($ token ->getValue (), \ENT_NOQUOTES | \ENT_DISALLOWED | \ENT_XML1 ));
58+ $ writer ->endElement ();
59+ }
5360 }
5461 }
5562
56- $ this ->writer ->endElement ();
57- $ this ->writer ->endElement ();
58- $ this ->writer ->endDocument ();
59-
60- return $ this ->writer ->outputMemory ();
61- }
62-
63- private function addToken (Token $ token ): void {
64- if ($ this ->previousToken ->getLine () < $ token ->getLine ()) {
65- $ this ->writer ->endElement ();
66-
67- $ this ->writer ->startElement ('line ' );
68- $ this ->writer ->writeAttribute ('no ' , (string )$ token ->getLine ());
69- $ this ->previousToken = $ token ;
70- }
63+ $ writer ->endElement ();
64+ $ writer ->endElement ();
65+ $ writer ->endDocument ();
7166
72- if ($ token ->getValue () !== '' ) {
73- $ this ->writer ->startElement ('token ' );
74- $ this ->writer ->writeAttribute ('name ' , $ token ->getName ());
75- $ this ->writer ->writeRaw (\htmlspecialchars ($ token ->getValue (), \ENT_NOQUOTES | \ENT_DISALLOWED | \ENT_XML1 ));
76- $ this ->writer ->endElement ();
77- }
67+ return $ writer ->outputMemory ();
7868 }
7969}
0 commit comments