51 $this->regex =
'/' . Parser::MARKER_PREFIX .
"([^\x7f<>&'\"]+)" . Parser::MARKER_SUFFIX .
'/';
52 $this->circularRefGuard = [];
55 if ( isset( $options[
'depthLimit'] ) ) {
56 $this->depthLimit = $options[
'depthLimit'];
58 if ( isset( $options[
'sizeLimit'] ) ) {
59 $this->sizeLimit = $options[
'sizeLimit'];
69 $this->
addItem(
'nowiki', $marker, $value );
77 $this->
addItem(
'general', $marker, $value );
87 if ( !preg_match( $this->regex, $marker, $m ) ) {
91 $this->data[
$type][$m[1]] = $value;
127 if ( !count( $this->data[
$type] ) ) {
131 $callback =
function ( $m ) use (
$type ) {
133 if ( isset( $this->data[
$type][$marker] ) ) {
134 if ( isset( $this->circularRefGuard[$marker] ) ) {
135 return $this->
getWarning(
'parser-unstrip-loop-warning' );
138 if ( $this->depth > $this->highestDepth ) {
141 if ( $this->depth >= $this->depthLimit ) {
145 $value = $this->data[
$type][$marker];
146 if ( $value instanceof Closure ) {
150 $this->expandSize += strlen( $value );
151 if ( $this->expandSize > $this->sizeLimit ) {
155 $this->circularRefGuard[$marker] =
true;
159 unset( $this->circularRefGuard[$marker] );
167 $text = preg_replace_callback( $this->regex, $callback, $text );
179 if ( $this->parser ) {
180 $this->parser->limitationWarn(
$type, $max );
182 return $this->
getWarning(
"$type-warning", $max );
193 return '<span class="error">' .
195 ->numParams( $max )->inContentLanguage()->text() .
207 [
'limitreport-unstrip-depth',
213 [
'limitreport-unstrip-size',
236 $startPos = strpos( $text, Parser::MARKER_PREFIX, $pos );
237 $endPos = strpos( $text, Parser::MARKER_SUFFIX, $pos );
238 if ( $startPos ===
false || $endPos ===
false ) {
242 $endPos += strlen( Parser::MARKER_SUFFIX );
243 $marker = substr( $text, $startPos, $endPos - $startPos );
244 if ( !preg_match( $this->regex, $marker, $m ) ) {
249 if ( isset( $this->data[
'nowiki'][$key] ) ) {
250 $subState->data[
'nowiki'][$key] = $this->data[
'nowiki'][$key];
251 } elseif ( isset( $this->data[
'general'][$key] ) ) {
252 $subState->data[
'general'][$key] = $this->data[
'general'][$key];
269 public function merge( $otherState, $texts ) {
274 foreach ( $otherState->data as
$type => $items ) {
275 foreach ( $items as $key => $value ) {
276 $this->data[
$type][
"$mergePrefix-$key"] = $value;
280 $callback =
function ( $m ) use ( $mergePrefix ) {
282 return Parser::MARKER_PREFIX . $mergePrefix .
'-' . $key . Parser::MARKER_SUFFIX;
284 $texts = preg_replace_callback( $otherState->regex, $callback, $texts );
295 return preg_replace( $this->regex,
'', $text );