Example #1
0
 /**
  * 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;
 }
Example #2
0
 /**
  * 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)
 {
     $index = $reader->position();
     $char = $reader->readChar($index, false);
     if ($char == $this->quotation) {
         $lookahead = $index + 1;
         $length = $reader->length() - 1;
         while ($lookahead <= $length) {
             if ($reader->readChar($lookahead, false) == $this->quotation) {
                 if ($lookahead == $length || $reader->readChar($lookahead + 1, false) != $this->quotation) {
                     $lookahead++;
                     break;
                 }
                 $lookahead++;
             }
             $lookahead++;
         }
         $token = $reader->readRange($index, $lookahead);
         $tuple = new Lexer\Scanner\Tuple(Lexer\Scanner\TokenType::literal(), new Common\String($token));
         return $tuple;
     }
     return null;
 }