Move FSFile classes to /fsfile
[mediawiki.git] / includes / tidy / RaggettExternal.php
blobb59423ab3a9b33b9a4c597641f1b2c04b7c46236
1 <?php
3 namespace MediaWiki\Tidy;
5 class RaggettExternal extends RaggettBase {
6 /**
7 * Spawn an external HTML tidy process and get corrected markup back from it.
8 * Also called in OutputHandler.php for full page validation
10 * @param string $text HTML to check
11 * @param bool $stderr Whether to read result from STDERR rather than STDOUT
12 * @param int &$retval Exit code (-1 on internal error)
13 * @return string|null
15 protected function cleanWrapped( $text, $stderr = false, &$retval = null ) {
16 $cleansource = '';
17 $opts = ' -utf8';
19 if ( $stderr ) {
20 $descriptorspec = [
21 0 => [ 'pipe', 'r' ],
22 1 => [ 'file', wfGetNull(), 'a' ],
23 2 => [ 'pipe', 'w' ]
25 } else {
26 $descriptorspec = [
27 0 => [ 'pipe', 'r' ],
28 1 => [ 'pipe', 'w' ],
29 2 => [ 'file', wfGetNull(), 'a' ]
33 $readpipe = $stderr ? 2 : 1;
34 $pipes = [];
36 $process = proc_open(
37 "{$this->config['tidyBin']} -config {$this->config['tidyConfigFile']} " .
38 $this->config['tidyCommandLine'] . $opts, $descriptorspec, $pipes );
40 // NOTE: At least on linux, the process will be created even if tidy is not installed.
41 // This means that missing tidy will be treated as a validation failure.
43 if ( is_resource( $process ) ) {
44 // Theoretically, this style of communication could cause a deadlock
45 // here. If the stdout buffer fills up, then writes to stdin could
46 // block. This doesn't appear to happen with tidy, because tidy only
47 // writes to stdout after it's finished reading from stdin. Search
48 // for tidyParseStdin and tidySaveStdout in console/tidy.c
49 fwrite( $pipes[0], $text );
50 fclose( $pipes[0] );
51 while ( !feof( $pipes[$readpipe] ) ) {
52 $cleansource .= fgets( $pipes[$readpipe], 1024 );
54 fclose( $pipes[$readpipe] );
55 $retval = proc_close( $process );
56 } else {
57 wfWarn( "Unable to start external tidy process" );
58 $retval = -1;
61 if ( !$stderr && $cleansource == '' && $text != '' ) {
62 // Some kind of error happened, so we couldn't get the corrected text.
63 // Just give up; we'll use the source text and append a warning.
64 $cleansource = null;
67 return $cleansource;
70 public function supportsValidate() {
71 return true;