From 4ac9fa081a7c045f6a9f1cfc529d82423f485b2e Mon Sep 17 00:00:00 2001 From: Pierre Schmitz Date: Sun, 8 Dec 2013 09:55:49 +0100 Subject: Update to MediaWiki 1.22.0 --- includes/XmlTypeCheck.php | 86 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 72 insertions(+), 14 deletions(-) (limited to 'includes/XmlTypeCheck.php') diff --git a/includes/XmlTypeCheck.php b/includes/XmlTypeCheck.php index 2e184606..92ca7d80 100644 --- a/includes/XmlTypeCheck.php +++ b/includes/XmlTypeCheck.php @@ -40,16 +40,52 @@ class XmlTypeCheck { public $rootElement = ''; /** - * @param string $file filename - * @param $filterCallback callable (optional) + * @param string $input a filename or string containing the XML element + * @param callable $filterCallback (optional) * Function to call to do additional custom validity checks from the * SAX element handler event. This gives you access to the element * namespace, name, and attributes, but not to text contents. * 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) */ - function __construct( $file, $filterCallback=null ) { + function __construct( $input, $filterCallback = null, $isFile = true ) { $this->filterCallback = $filterCallback; - $this->run( $file ); + if ( $isFile ) { + $this->validateFromFile( $input ); + } else { + $this->validateFromString( $input ); + } + } + + /** + * Alternative constructor: from filename + * + * @param string $fname the filename of an XML document + * @param callable $filterCallback (optional) + * Function to call to do additional custom validity checks from the + * SAX element handler event. This gives you access to the element + * namespace, name, and attributes, but not to text contents. + * Filter should return 'true' to toggle on $this->filterMatch + * @return XmlTypeCheck + */ + public static function newFromFilename( $fname, $filterCallback = null ) { + return new self( $fname, $filterCallback, true ); + } + + /** + * Alternative constructor: from string + * + * @param string $string a string containing an XML element + * @param callable $filterCallback (optional) + * Function to call to do additional custom validity checks from the + * SAX element handler event. This gives you access to the element + * namespace, name, and attributes, but not to text contents. + * Filter should return 'true' to toggle on $this->filterMatch + * @return XmlTypeCheck + */ + public static function newFromString( $string, $filterCallback = null ) { + return new self( $string, $filterCallback, false ); } /** @@ -62,15 +98,23 @@ class XmlTypeCheck { } /** - * @param $fname + * Get an XML parser with the root element handler. + * @see XmlTypeCheck::rootElementOpen() + * @return resource a resource handle for the XML parser */ - private function run( $fname ) { + private function getParser() { $parser = xml_parser_create_ns( 'UTF-8' ); - // 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 ); + return $parser; + } + + /** + * @param string $fname the filename + */ + private function validateFromFile( $fname ) { + $parser = $this->getParser(); if ( file_exists( $fname ) ) { $file = fopen( $fname, "rb" ); @@ -78,23 +122,37 @@ class XmlTypeCheck { do { $chunk = fread( $file, 32768 ); $ret = xml_parse( $parser, $chunk, feof( $file ) ); - if( $ret == 0 ) { - // XML isn't well-formed! + if ( $ret == 0 ) { + $this->wellFormed = false; fclose( $file ); xml_parser_free( $parser ); return; } - } while( !feof( $file ) ); + } while ( !feof( $file ) ); fclose( $file ); } } - $this->wellFormed = true; xml_parser_free( $parser ); } + /** + * + * @param string $string the XML-input-string to be checked. + */ + private function validateFromString( $string ) { + $parser = $this->getParser(); + $ret = xml_parse( $parser, $string, true ); + xml_parser_free( $parser ); + if ( $ret == 0 ) { + $this->wellFormed = false; + return; + } + $this->wellFormed = true; + } + /** * @param $parser * @param $name @@ -103,7 +161,7 @@ class XmlTypeCheck { private function rootElementOpen( $parser, $name, $attribs ) { $this->rootElement = $name; - if( is_callable( $this->filterCallback ) ) { + if ( is_callable( $this->filterCallback ) ) { xml_set_element_handler( $parser, array( $this, 'elementOpen' ), false ); $this->elementOpen( $parser, $name, $attribs ); } else { @@ -118,7 +176,7 @@ class XmlTypeCheck { * @param $attribs */ private function elementOpen( $parser, $name, $attribs ) { - if( call_user_func( $this->filterCallback, $name, $attribs ) ) { + if ( call_user_func( $this->filterCallback, $name, $attribs ) ) { // Filter hit! $this->filterMatch = true; } -- cgit v1.2.2