X-Git-Url: https://scripts.mit.edu/gitweb/autoinstallsdev/mediawiki.git/blobdiff_plain/19e297c21b10b1b8a3acad5e73fc71dcb35db44a..6932310fd58ebef145fa01eb76edf7150284d8ea:/includes/parser/MWTidy.php diff --git a/includes/parser/MWTidy.php b/includes/parser/MWTidy.php new file mode 100644 index 00000000..ffc884eb --- /dev/null +++ b/includes/parser/MWTidy.php @@ -0,0 +1,166 @@ + or tag. + * @return string Corrected HTML output + * @throws MWException + */ + public static function tidy( $text ) { + $driver = self::singleton(); + if ( !$driver ) { + throw new MWException( __METHOD__ . + ': tidy is disabled, caller should have checked MWTidy::isEnabled()' ); + } + return $driver->tidy( $text ); + } + + /** + * Check HTML for errors, used if $wgValidateAllHtml = true. + * + * @param string $text + * @param string &$errorStr Return the error string + * @return bool Whether the HTML is valid + * @throws MWException + */ + public static function checkErrors( $text, &$errorStr = null ) { + $driver = self::singleton(); + if ( !$driver ) { + throw new MWException( __METHOD__ . + ': tidy is disabled, caller should have checked MWTidy::isEnabled()' ); + } + if ( $driver->supportsValidate() ) { + return $driver->validate( $text, $errorStr ); + } else { + throw new MWException( __METHOD__ . ": error text return from HHVM tidy is not supported" ); + } + } + + /** + * @return bool + */ + public static function isEnabled() { + return self::singleton() !== false; + } + + /** + * @return bool|\MediaWiki\Tidy\TidyDriverBase + */ + public static function singleton() { + global $wgUseTidy, $wgTidyInternal, $wgTidyConf, $wgDebugTidy, $wgTidyConfig, + $wgTidyBin, $wgTidyOpts; + + if ( self::$instance === null ) { + if ( $wgTidyConfig !== null ) { + $config = $wgTidyConfig; + } elseif ( $wgUseTidy ) { + // b/c configuration + $config = [ + 'tidyConfigFile' => $wgTidyConf, + 'debugComment' => $wgDebugTidy, + 'tidyBin' => $wgTidyBin, + 'tidyCommandLine' => $wgTidyOpts ]; + if ( $wgTidyInternal ) { + if ( wfIsHHVM() ) { + $config['driver'] = 'RaggettInternalHHVM'; + } else { + $config['driver'] = 'RaggettInternalPHP'; + } + } else { + $config['driver'] = 'RaggettExternal'; + } + } else { + return false; + } + self::$instance = self::factory( $config ); + } + return self::$instance; + } + + /** + * Create a new Tidy driver object from configuration. + * @see $wgTidyConfig + * @param array $config + * @return bool|\MediaWiki\Tidy\TidyDriverBase + * @throws MWException + */ + public static function factory( array $config ) { + switch ( $config['driver'] ) { + case 'RaggettInternalHHVM': + $instance = new MediaWiki\Tidy\RaggettInternalHHVM( $config ); + break; + case 'RaggettInternalPHP': + $instance = new MediaWiki\Tidy\RaggettInternalPHP( $config ); + break; + case 'RaggettExternal': + $instance = new MediaWiki\Tidy\RaggettExternal( $config ); + break; + case 'Html5Depurate': + $instance = new MediaWiki\Tidy\Html5Depurate( $config ); + break; + case 'Html5Internal': + $instance = new MediaWiki\Tidy\Html5Internal( $config ); + break; + case 'RemexHtml': + $instance = new MediaWiki\Tidy\RemexDriver( $config ); + break; + case 'disabled': + return false; + default: + throw new MWException( "Invalid tidy driver: \"{$config['driver']}\"" ); + } + return $instance; + } + + /** + * Set the driver to be used. This is for testing. + * @param MediaWiki\Tidy\TidyDriverBase|false|null $instance + */ + public static function setInstance( $instance ) { + self::$instance = $instance; + } + + /** + * Destroy the current singleton instance + */ + public static function destroySingleton() { + self::$instance = null; + } +}