wiki.techinc.nl/includes/parser/MWTidy.php
Kunal Mehta 853b8fe34c tidy: Remove obsolete Depurate and Balancer drivers
The Html5Depurate driver was intended to be used with an external Java
service, but it never gained traction due to deployment concerns.

The Html5Internal (Balancer) driver was originally intended for use with
the balanced templates proposal and could also handle tidying. But it was
tightly coupled to MediaWiki, so part of it was used as the basis of the
RemexHtml library. Remex most likely can also implement the balanced
templates proposal, so there isn't any reason to keep the Balancer code
around anymore,

Change-Id: I8542d69e9cdbf0e2fb7ebbb919933a64c1b8c293
2018-05-08 15:32:49 +00:00

139 lines
3.8 KiB
PHP

<?php
/**
* HTML validation and correction
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*
* @file
* @ingroup Parser
*/
/**
* Class to interact with HTML tidy
*
* Either the external tidy program or the in-process tidy extension
* will be used depending on availability. Override the default
* $wgTidyInternal setting to disable the internal if it's not working.
*
* @ingroup Parser
*/
class MWTidy {
private static $instance;
/**
* Interface with html tidy.
* If tidy isn't able to correct the markup, the original will be
* returned in all its glory with a warning comment appended.
*
* @param string $text HTML input fragment. This should not contain a
* <body> or <html> 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 );
}
/**
* @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 '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;
}
}