summaryrefslogtreecommitdiff
path: root/vendor/theseer/tokenizer/src/XMLSerializer.php
diff options
context:
space:
mode:
authorAndrew Dolgov <[email protected]>2022-03-22 12:24:31 +0300
committerAndrew Dolgov <[email protected]>2022-03-22 12:24:31 +0300
commit1c4f7ab3b838b23afb2ee4dab14acbf75956e952 (patch)
tree0a19274107d717efe92d2c0376cd3105fead5a11 /vendor/theseer/tokenizer/src/XMLSerializer.php
parent711662948768492e8d05b778a7d80eacaec368d2 (diff)
* add phpunit as a dev dependency
* add some basic tests for UrlHelper::rewrite_relative() * fix UrlHelper::rewrite_relative() to work better on non-absolute relative URL paths
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();
+ }
+ }
+}