Seditio Source
Root |
./othercms/croogo-4.0.7/vendor/theseer/tokenizer/src/XMLSerializer.php
<?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();
        }
    }
}