MediaWiki  master
StripState.php
Go to the documentation of this file.
1 <?php
28 class StripState {
29  protected $data;
30  protected $regex;
31 
32  protected $parser;
33 
34  protected $circularRefGuard;
35  protected $depth = 0;
36  protected $highestDepth = 0;
37  protected $expandSize = 0;
38 
39  protected $depthLimit = 20;
40  protected $sizeLimit = 5000000;
41 
46  public function __construct( Parser $parser = null, $options = [] ) {
47  $this->data = [
48  'nowiki' => [],
49  'general' => []
50  ];
51  $this->regex = '/' . Parser::MARKER_PREFIX . "([^\x7f<>&'\"]+)" . Parser::MARKER_SUFFIX . '/';
52  $this->circularRefGuard = [];
53  $this->parser = $parser;
54 
55  if ( isset( $options['depthLimit'] ) ) {
56  $this->depthLimit = $options['depthLimit'];
57  }
58  if ( isset( $options['sizeLimit'] ) ) {
59  $this->sizeLimit = $options['sizeLimit'];
60  }
61  }
62 
68  public function addNoWiki( $marker, $value ) {
69  $this->addItem( 'nowiki', $marker, $value );
70  }
71 
76  public function addGeneral( $marker, $value ) {
77  $this->addItem( 'general', $marker, $value );
78  }
79 
86  protected function addItem( $type, $marker, $value ) {
87  if ( !preg_match( $this->regex, $marker, $m ) ) {
88  throw new MWException( "Invalid marker: $marker" );
89  }
90 
91  $this->data[$type][$m[1]] = $value;
92  }
93 
98  public function unstripGeneral( $text ) {
99  return $this->unstripType( 'general', $text );
100  }
101 
106  public function unstripNoWiki( $text ) {
107  return $this->unstripType( 'nowiki', $text );
108  }
109 
114  public function unstripBoth( $text ) {
115  $text = $this->unstripType( 'general', $text );
116  $text = $this->unstripType( 'nowiki', $text );
117  return $text;
118  }
119 
125  protected function unstripType( $type, $text ) {
126  // Shortcut
127  if ( !count( $this->data[$type] ) ) {
128  return $text;
129  }
130 
131  $callback = function ( $m ) use ( $type ) {
132  $marker = $m[1];
133  if ( isset( $this->data[$type][$marker] ) ) {
134  if ( isset( $this->circularRefGuard[$marker] ) ) {
135  return $this->getWarning( 'parser-unstrip-loop-warning' );
136  }
137 
138  if ( $this->depth > $this->highestDepth ) {
139  $this->highestDepth = $this->depth;
140  }
141  if ( $this->depth >= $this->depthLimit ) {
142  return $this->getLimitationWarning( 'unstrip-depth', $this->depthLimit );
143  }
144 
145  $value = $this->data[$type][$marker];
146  if ( $value instanceof Closure ) {
147  $value = $value();
148  }
149 
150  $this->expandSize += strlen( $value );
151  if ( $this->expandSize > $this->sizeLimit ) {
152  return $this->getLimitationWarning( 'unstrip-size', $this->sizeLimit );
153  }
154 
155  $this->circularRefGuard[$marker] = true;
156  $this->depth++;
157  $ret = $this->unstripType( $type, $value );
158  $this->depth--;
159  unset( $this->circularRefGuard[$marker] );
160 
161  return $ret;
162  } else {
163  return $m[0];
164  }
165  };
166 
167  $text = preg_replace_callback( $this->regex, $callback, $text );
168  return $text;
169  }
170 
178  private function getLimitationWarning( $type, $max = '' ) {
179  if ( $this->parser ) {
180  $this->parser->limitationWarn( $type, $max );
181  }
182  return $this->getWarning( "$type-warning", $max );
183  }
184 
192  private function getWarning( $message, $max = '' ) {
193  return '<span class="error">' .
194  wfMessage( $message )
195  ->numParams( $max )->inContentLanguage()->text() .
196  '</span>';
197  }
198 
205  public function getLimitReport() {
206  return [
207  [ 'limitreport-unstrip-depth',
208  [
211  ],
212  ],
213  [ 'limitreport-unstrip-size',
214  [
217  ],
218  ]
219  ];
220  }
221 
228  public function killMarkers( $text ) {
229  return preg_replace( $this->regex, '', $text );
230  }
231 }
const MARKER_PREFIX
Definition: Parser.php:133
getLimitReport()
Get an array of parameters to pass to ParserOutput::setLimitReportData()
Definition: StripState.php:205
__construct(Parser $parser=null, $options=[])
Definition: StripState.php:46
addGeneral( $marker, $value)
Definition: StripState.php:76
unstripType( $type, $text)
Definition: StripState.php:125
unstripBoth( $text)
Definition: StripState.php:114
addItem( $type, $marker, $value)
Definition: StripState.php:86
getWarning( $message, $max='')
Get warning HTML.
Definition: StripState.php:192
killMarkers( $text)
Remove any strip markers found in the given text.
Definition: StripState.php:228
unstripGeneral( $text)
Definition: StripState.php:98
unstripNoWiki( $text)
Definition: StripState.php:106
getLimitationWarning( $type, $max='')
Get warning HTML and register a limitation warning with the parser.
Definition: StripState.php:178
addNoWiki( $marker, $value)
Add a nowiki strip item.
Definition: StripState.php:68
wfMessage( $key,... $params)
This is the function for getting translated interface messages.