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