nginxsonarrradarrplexorganizrdashboardapplication-dashboardmuximuxlandingpagestartpagelandinghtpcserverhomepagesabnzbdheimdallembycouchpotatonzbgetbookmark
		
		
		
		
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							94 lines
						
					
					
						
							2.4 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							94 lines
						
					
					
						
							2.4 KiB
						
					
					
				
								<?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;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @param TokenCollection $tokens
							 | 
						|
								     *
							 | 
						|
								     * @return DOMDocument
							 | 
						|
								     */
							 | 
						|
								    public function toDom(TokenCollection $tokens): DOMDocument {
							 | 
						|
								        $dom = new DOMDocument();
							 | 
						|
								        $dom->preserveWhiteSpace = false;
							 | 
						|
								        $dom->loadXML($this->toXML($tokens));
							 | 
						|
								
							 | 
						|
								        return $dom;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @param TokenCollection $tokens
							 | 
						|
								     *
							 | 
						|
								     * @return string
							 | 
						|
								     */
							 | 
						|
								    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());
							 | 
						|
								        $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();
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @param Token $token
							 | 
						|
								     */
							 | 
						|
								    private function addToken(Token $token) {
							 | 
						|
								        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();
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								}
							 | 
						|
								
							 |