Merge "API: Handle "special" options in action=options"
[lhc/web/wiklou.git] / includes / libs / XmlTypeCheck.php
index 92ca7d8..eb98a4a 100644 (file)
@@ -39,6 +39,13 @@ class XmlTypeCheck {
         */
        public $rootElement = '';
 
+       /**
+        * Additional parsing options
+        */
+       private $parserOptions = array(
+               'processing_instruction_handler' => '',
+       );
+
        /**
         * @param string $input a filename or string containing the XML element
         * @param callable $filterCallback (optional)
@@ -48,9 +55,13 @@ class XmlTypeCheck {
         *        Filter should return 'true' to toggle on $this->filterMatch
         * @param boolean $isFile (optional) indicates if the first parameter is a
         *        filename (default, true) or if it is a string (false)
+        * @param array $options list of additional parsing options:
+        *        processing_instruction_handler: Callback for xml_set_processing_instruction_handler
         */
-       function __construct( $input, $filterCallback = null, $isFile = true ) {
+       function __construct( $input, $filterCallback = null, $isFile = true, $options = array() ) {
                $this->filterCallback = $filterCallback;
+               $this->parserOptions = array_merge( $this->parserOptions, $options );
+
                if ( $isFile ) {
                        $this->validateFromFile( $input );
                } else {
@@ -107,6 +118,12 @@ class XmlTypeCheck {
                // case folding violates XML standard, turn it off
                xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, false );
                xml_set_element_handler( $parser, array( $this, 'rootElementOpen' ), false );
+               if ( $this->parserOptions['processing_instruction_handler'] ) {
+                       xml_set_processing_instruction_handler(
+                               $parser,
+                               array( $this, 'processingInstructionHandler' )
+                       );
+               }
                return $parser;
        }
 
@@ -181,4 +198,16 @@ class XmlTypeCheck {
                        $this->filterMatch = true;
                }
        }
+
+       /**
+        * @param $parser
+        * @param $target
+        * @param $data
+        */
+       private function processingInstructionHandler( $parser, $target, $data ) {
+               if ( call_user_func( $this->parserOptions['processing_instruction_handler'], $target, $data ) ) {
+                       // Filter hit!
+                       $this->filterMatch = true;
+               }
+       }
 }