summaryrefslogtreecommitdiff
path: root/vendor/theseer/tokenizer/src/XMLSerializer.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/theseer/tokenizer/src/XMLSerializer.php')
-rw-r--r--vendor/theseer/tokenizer/src/XMLSerializer.php79
1 files changed, 79 insertions, 0 deletions
diff --git a/vendor/theseer/tokenizer/src/XMLSerializer.php b/vendor/theseer/tokenizer/src/XMLSerializer.php
new file mode 100644
index 000000000..e67a7fe8b
--- /dev/null
+++ b/vendor/theseer/tokenizer/src/XMLSerializer.php
@@ -0,0 +1,79 @@
+<?php declare(strict_types = 1);
+namespace TheSeer\Tokenizer;
+
+use DOMDocument;
+
+class XMLSerializer {
+
+ /** @var \XMLWriter */
+ private $writer;
+
+ /** @var Token */
+ private $previousToken;
+
+ /** @var NamespaceUri */
+ private $xmlns;
+
+ /**
+ * XMLSerializer constructor.
+ *
+ * @param NamespaceUri $xmlns
+ */
+ public function __construct(NamespaceUri $xmlns = null) {
+ if ($xmlns === null) {
+ $xmlns = new NamespaceUri('https://github.com/theseer/tokenizer');
+ }
+ $this->xmlns = $xmlns;
+ }
+
+ public function toDom(TokenCollection $tokens): DOMDocument {
+ $dom = new DOMDocument();
+ $dom->preserveWhiteSpace = false;
+ $dom->loadXML($this->toXML($tokens));
+
+ return $dom;
+ }
+
+ public function toXML(TokenCollection $tokens): string {
+ $this->writer = new \XMLWriter();
+ $this->writer->openMemory();
+ $this->writer->setIndent(true);
+ $this->writer->startDocument();
+ $this->writer->startElement('source');
+ $this->writer->writeAttribute('xmlns', $this->xmlns->asString());
+
+ if (\count($tokens) > 0) {
+ $this->writer->startElement('line');
+ $this->writer->writeAttribute('no', '1');
+
+ $this->previousToken = $tokens[0];
+
+ foreach ($tokens as $token) {
+ $this->addToken($token);
+ }
+ }
+
+ $this->writer->endElement();
+ $this->writer->endElement();
+ $this->writer->endDocument();
+
+ return $this->writer->outputMemory();
+ }
+
+ private function addToken(Token $token): void {
+ if ($this->previousToken->getLine() < $token->getLine()) {
+ $this->writer->endElement();
+
+ $this->writer->startElement('line');
+ $this->writer->writeAttribute('no', (string)$token->getLine());
+ $this->previousToken = $token;
+ }
+
+ if ($token->getValue() !== '') {
+ $this->writer->startElement('token');
+ $this->writer->writeAttribute('name', $token->getName());
+ $this->writer->writeRaw(\htmlspecialchars($token->getValue(), \ENT_NOQUOTES | \ENT_DISALLOWED | \ENT_XML1));
+ $this->writer->endElement();
+ }
+ }
+}