Much more robust detection of template {{{variables}}}

Variables like {{{foo}}} with 3 brackets typically only appear in
templates. But odd combinations of other features that also start
with 3 brackets are much more common. These should not be detected
as variables.

1. When something starts with 4 or more brackets it's not a variable
but something else. E.g. the start of a template where the template
name is a variable (2 + 3 = 5 brackets).

2. Tables can start with {{{!}}.

Note this doesn't fully solve T292967 but already improves the
situation a lot.

Bug: T108450
Bug: T292967
Change-Id: Id5e50c2bafb35a211d4b63609126c40b32f06a64
This commit is contained in:
thiemowmde 2023-11-20 10:40:23 +01:00
parent 8274034243
commit aa391c1c77
2 changed files with 4 additions and 2 deletions

View file

@ -744,7 +744,9 @@
} }
break; break;
case '{': case '{':
if ( !stream.match( '{{{{', false ) && stream.match( '{{' ) ) { // Template parameter (skip parameters inside a template transclusion, Bug: T108450) // Can't be a variable when it starts with more than 3 brackets (T108450) or
// a single { followed by a template. E.g. {{{!}} starts a table (T292967).
if ( stream.match( /^{{(?!{|[^{}]*}}(?!}))/ ) ) {
stream.eatSpace(); stream.eatSpace();
state.stack.push( state.tokenize ); state.stack.push( state.tokenize );
state.tokenize = inVariable; state.tokenize = inVariable;

View file

@ -83,7 +83,7 @@
{ {
title: 'T292967: table syntax where all | are escaped with the {{!}} parser function', title: 'T292967: table syntax where all | are escaped with the {{!}} parser function',
input: '{{{!}}\n{{!}}-\n{{!}}}', input: '{{{!}}\n{{!}}-\n{{!}}}',
output: '<pre><span><span class="cm-mw-templatevariable-bracket">{{{</span><span class="cm-mw-templatevariable-name">!}}</span></span></pre><pre><span><span class="cm-mw-templatevariable-name">{{!}}-</span></span></pre><pre><span><span class="cm-mw-templatevariable-name">{{!</span><span class="cm-mw-templatevariable-bracket">}}}</span></span></pre>' output: '<pre><span><span class="cm-mw-template-ground cm-mw-template-bracket">{{</span><span class="cm-mw-template-ground cm-mw-template-name cm-mw-pagename">{!</span><span class="cm-mw-template-ground cm-mw-template-bracket">}}</span></span></pre><pre><span><span class="cm-mw-ext-ground cm-mw-parserfunction-bracket">{{</span><span class="cm-mw-ext-ground cm-mw-parserfunction-name">!</span><span class="cm-mw-ext-ground cm-mw-parserfunction-bracket">}}</span>-</span></pre><pre><span><span class="cm-mw-ext-ground cm-mw-parserfunction-bracket">{{</span><span class="cm-mw-ext-ground cm-mw-parserfunction-name">!</span><span class="cm-mw-ext-ground cm-mw-parserfunction-bracket">}}</span>}</span></pre>'
}, },
{ {
title: 'section headings', title: 'section headings',