/** * This method return a tuple representing the token discovered. * * @access public * @param \Unicity\IO\Reader $reader the reader to be used * @return \Unicity\Lexer\Scanner\Tuple a tuple representing the token * discovered */ public function process(IO\Reader $reader) { $char = $reader->readChar($reader->position(), false); if ($char !== null && $char == $this->symbol) { $tuple = new Lexer\Scanner\Tuple(Lexer\Scanner\TokenType::symbol(), new Common\String($char)); $reader->skip(1); return $tuple; } return null; }
/** * This method returns the specified processing instruction. * * @access public * @param string $target the target name of the processing * instruction * @param integer $index the index of the processing instruction * @return array the data associated with the target * @throws Throwable\Parse\Exception indicates that an invalid token was * encountered * * @see http://msdn.microsoft.com/en-us/library/ms256173%28v=vs.110%29.aspx * @see http://www.w3schools.com/xsl/el_processing-instruction.asp * @see http://pastebin.com/x25seJPS * @see https://github.com/petertornstrand/tornstrand.com/blob/master/_posts/2008-10-21-reading-xml-processing-instruction-with-php.html * @see http://java2s.com/Tutorials/PHP/XML_Functions/PHP_xml_set_processing_instruction_handler_Function.htm * @see http://www.xml.com/pub/a/2000/09/13/xslt/ */ public function getProcessingInstruction($target, $index = 1) { $document = dom_import_simplexml($this)->ownerDocument; $xpath = new \DOMXPath($document); $instruction = trim($xpath->evaluate("string(//processing-instruction(\"{$target}\")[{$index}])")); $directives = array(); $scanner = new Lexer\Scanner(new IO\StringReader($instruction)); $scanner->addRule(new Lexer\Scanner\TokenRule\Symbol('=')); $scanner->addRule(new Lexer\Scanner\TokenRule\Keyword()); $scanner->addRule(new Lexer\Scanner\TokenRule\Literal('"')); $scanner->addRule(new Lexer\Scanner\TokenRule\Whitespace()); $state = 0; $key = null; while ($scanner->next()) { $tuple = $scanner->current(); if (Lexer\Scanner\TokenType::identifier()->__equals($tuple->type) && $state == 0) { $state = 1; $key = $tuple->token->__toString(); } else { if (Lexer\Scanner\TokenType::symbol()->__equals($tuple->type) && $state == 1) { $state = 2; } else { if (Lexer\Scanner\TokenType::literal()->__equals($tuple->type) && $state == 2) { $state = 3; $directives[$key] = $tuple->token->substring(1, $tuple->token->length() - 1)->__toString(); } else { if (Lexer\Scanner\TokenType::whitespace()->__equals($tuple->type)) { $state = 0; } else { throw new Throwable\Parse\Exception('Unable to parse processing instruction. Invalid token ":token" encountered with type ":type".', array(':token' => $tuple->token, ':type' => $tuple->type)); } } } } } return $directives; }