Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 76 additions & 8 deletions syntaxes/ansible/generated/jinja-braces.tmLanguage
Original file line number Diff line number Diff line change
Expand Up @@ -14,33 +14,69 @@
<key>include</key>
<string>#jinja-expression</string>
</dict>
<dict>
<key>include</key>
<string>#jinja-statement</string>
</dict>
<dict>
<key>include</key>
<string>#jinja-comment</string>
</dict>
</array>
<key>repository</key>
<dict>
<key>jinja-expression</key>
<dict>
<key>comment</key>
<string>The 'name' is used to undo highlighting as string</string>
<key>name</key>
<string>keyword.operator.ansible</string>
<key>begin</key>
<string>\{\{</string>
<string>\{\{-?</string>
<key>end</key>
<string>-?\}\}</string>
<key>beginCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.section.embedded.begin.jinja</string>
</dict>
</dict>
<key>endCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.section.embedded.end.jinja</string>
</dict>
</dict>
<key>contentName</key>
<string>meta.embedded.inline.jinja</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>source.ansible-jinja#expression</string>
</dict>
</array>
</dict>
<key>jinja-statement</key>
<dict>
<key>begin</key>
<string>\{%-?</string>
<key>end</key>
<string>\}\}</string>
<string>-?%\}</string>
<key>beginCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>constant.character.escape.ansible</string>
<string>punctuation.section.embedded.begin.jinja</string>
</dict>
</dict>
<key>endCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>constant.character.escape.ansible</string>
<string>punctuation.section.embedded.end.jinja</string>
</dict>
</dict>
<key>contentName</key>
Expand All @@ -53,6 +89,38 @@
</dict>
</array>
</dict>
<key>jinja-comment</key>
<dict>
<key>begin</key>
<string>\{#-?</string>
<key>end</key>
<string>-?#\}</string>
<key>beginCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.comment.begin.jinja</string>
</dict>
</dict>
<key>endCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.comment.end.jinja</string>
</dict>
</dict>
<key>contentName</key>
<string>comment.block.jinja</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>source.ansible-jinja#comments</string>
</dict>
</array>
</dict>
</dict>
</dict>
</plist>
14 changes: 9 additions & 5 deletions syntaxes/ansible/generated/jinja-conditionals.tmLanguage
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
| failed_when
| when
| check_mode
| until
)\b
\s* (:) # 5
(?=\s) (?!\s*[|&gt;'"]|\s*$|\s*\#.*$) # starting an unquoted flow
Expand Down Expand Up @@ -85,6 +86,7 @@
| failed_when
| when
| check_mode
| until
)\b
\s* (:) # 5
(?=\s) (?!\s*[|&gt;]|\s*$|\s*\#.*$) # not starting a block (scalar or other)
Expand Down Expand Up @@ -143,6 +145,7 @@
| failed_when
| when
| check_mode
| until
)\b
\s* (:) # 5
\s+ (?: (\|) | (&gt;) ) ([1-9])? ([-+])? # 6,7,8,9; starting a scalar block
Expand Down Expand Up @@ -226,6 +229,7 @@
| failed_when
| when
| check_mode
| until
)\b
\s* (:) # 5
(.*$) # comment or illegal
Expand Down Expand Up @@ -398,7 +402,7 @@
^(?!\1\s+) # if the indentation is too small
</string>
<key>contentName</key>
<string>keyword.operator.ansible meta.embedded.inline.jinja</string>
<string>meta.embedded.inline.jinja</string>
<key>patterns</key>
<array>
<dict>
Expand Down Expand Up @@ -445,7 +449,7 @@
</dict>
</dict>
<key>contentName</key>
<string>keyword.operator.ansible meta.embedded.inline.jinja</string>
<string>meta.embedded.inline.jinja</string>
<key>patterns</key>
<array>
<dict>
Expand Down Expand Up @@ -523,7 +527,7 @@
</dict>
</dict>
<key>contentName</key>
<string>keyword.operator.ansible meta.embedded.inline.jinja</string>
<string>meta.embedded.inline.jinja</string>
<key>patterns</key>
<array>
<dict>
Expand Down Expand Up @@ -579,7 +583,7 @@
<key>end</key>
<string>(?!\G)</string>
<key>contentName</key>
<string>keyword.operator.ansible meta.embedded.inline.jinja</string>
<string>meta.embedded.inline.jinja</string>
<key>patterns</key>
<array>
<dict>
Expand Down Expand Up @@ -607,7 +611,7 @@
<string>(?x)
^(?!\1\s*) # if the indentation is too small</string>
<key>contentName</key>
<string>keyword.operator.ansible meta.embedded.inline.jinja</string>
<string>meta.embedded.inline.jinja</string>
<key>patterns</key>
<array>
<dict>
Expand Down
53 changes: 4 additions & 49 deletions syntaxes/ansible/generated/jinja-extras.tmLanguage
Original file line number Diff line number Diff line change
Expand Up @@ -8,56 +8,11 @@
<string>L:meta.embedded.inline.jinja -string.quoted.double.jinja -string.quoted.single.jinja</string>
<key>name</key>
<string>Grammar for Jinja2 syntax highlighting that is not provided out-of-the-box</string>
<key>comment</key>
<string>Literal patterns (booleans, numbers, none) have been moved to the core jinja.tmLanguage.json grammar</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#literals</string>
</dict>
</array>
<array/>
<key>repository</key>
<dict>
<key>literals</key>
<dict>
<key>match</key>
<string>(?x)
(none|None)
| (true|True|false|False)
| (
[-+]? 0b [0-1_]+ # (base 2)
| [-+]? 0x [0-9a-fA-F_]+ # (base 16)
| [-+]? 0 [0-7_]+ # (base 8)
| [-+]? (?: 0|[1-9][0-9_]*) # (base 10)
| [-+]? [1-9] [0-9_]* (?: :[0-5]?[0-9])+ # (base 60)
)
| (
[-+]? (?: [0-9] [0-9_]*)? \. [0-9.]* (?: [eE] [-+] [0-9]+)? # (base 10)
| [-+]? [0-9] [0-9_]* (?: :[0-5]?[0-9])+ \. [0-9_]* # (base 60)
)</string>
<key>captures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>constant.language.none.ansible</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>constant.language.boolean.ansible</string>
</dict>
<key>3</key>
<dict>
<key>name</key>
<string>constant.numeric.integer.ansible</string>
</dict>
<key>4</key>
<dict>
<key>name</key>
<string>constant.numeric.float.ansible</string>
</dict>
</dict>
</dict>
</dict>
<dict/>
</dict>
</plist>
50 changes: 43 additions & 7 deletions syntaxes/ansible/jinja-braces.tmLanguage.plist
Original file line number Diff line number Diff line change
Expand Up @@ -3,28 +3,64 @@
injectionSelector = 'L:string -meta.embedded.inline.jinja';
name = 'Grammar for Jinja2 expressions surrounded by double curly braces';
patterns = (
{ include = '#jinja-expression'; }
{ include = '#jinja-expression'; },
{ include = '#jinja-statement'; },
{ include = '#jinja-comment'; }
Comment on lines +6 to +8
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🌐 Web query:

Does Jinja support raw blocks with whitespace-control delimiters like {%- raw -%}and{%- endraw -%}?

💡 Result:

Yes, Jinja supports raw blocks with whitespace-control delimiters like {%- raw -%} and {%- endraw -%}. The official Jinja documentation explicitly states this feature: "Note Minus sign at the end of {% raw -%} tag cleans all the spaces and newlines preceding the first character of your raw block." This applies to both the opening and closing tags, allowing full whitespace stripping (leading with - at start, trailing with - at end).

Citations:


Add a dedicated raw-block matcher before the generic statement rule.

{% raw %} / {%- raw -%} blocks are currently not matched as a dedicated rule and fall through to #jinja-statement, so the surrounding string continues to be scanned and any inner {{ ... }} still matches #jinja-expression. Jinja supports whitespace-control delimiters on raw blocks (as confirmed by official documentation), so the grammar should prevent content inside raw/endraw from being highlighted as expressions.

Suggested fix
 patterns = (
+        { include = '#jinja-raw-block'; },
         { include = '#jinja-expression'; },
         { include = '#jinja-statement'; },
         { include = '#jinja-comment'; }
 );
 ...
+        jinja-raw-block = {
+            begin = '\{%-?\s*raw\s*-?%\}';
+            end = '\{%-?\s*endraw\s*-?%\}';
+            name = 'comment.block.jinja.raw';
+        };
         jinja-statement = {

Also applies to: 29-46

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@syntaxes/ansible/jinja-braces.tmLanguage.plist` around lines 6 - 8, Add a
dedicated raw-block rule before the generic '#jinja-statement' include so `{%
raw %}` / `{%- raw -%}` (and matching `{% endraw %}` / `{%- endraw -%}`) are
treated as a raw region; implement a rule (e.g. '#jinja-raw') that uses a begin
pattern matching `{%[-\s]*raw[-\s]*%}` allowing optional whitespace-control
dashes and a corresponding end pattern matching `{%[-\s]*endraw[-\s]*%}`, mark
the content as raw (no jinja-expression highlighting) and place this rule above
the '#jinja-statement' include in the list so inner `{{ ... }}` are not
re-scanned; apply the same change to the other occurrences mentioned (lines
29-46) to ensure consistent behavior.

);
repository = {
jinja-expression = {
comment = "The 'name' is used to undo highlighting as string";
name = 'keyword.operator.ansible';
begin = '\{\{';
end = '\}\}';
begin = '\{\{-?';
end = '-?\}\}';
beginCaptures = {
0 = {
name = 'constant.character.escape.ansible';
name = 'punctuation.section.embedded.begin.jinja';
};
};
endCaptures = {
0 = {
name = 'constant.character.escape.ansible';
name = 'punctuation.section.embedded.end.jinja';
};
};
contentName = 'meta.embedded.inline.jinja';
patterns = (
{ include = 'source.ansible-jinja#expression'; }
);
};
jinja-statement = {
begin = '\{%-?';
end = '-?%\}';
beginCaptures = {
0 = {
name = 'punctuation.section.embedded.begin.jinja';
};
};
endCaptures = {
0 = {
name = 'punctuation.section.embedded.end.jinja';
};
};
contentName = 'meta.embedded.inline.jinja';
patterns = (
{ include = 'source.ansible-jinja#expression'; }
);
};
jinja-comment = {
begin = '\{#-?';
end = '-?#\}';
beginCaptures = {
0 = {
name = 'punctuation.definition.comment.begin.jinja';
};
};
endCaptures = {
0 = {
name = 'punctuation.definition.comment.end.jinja';
};
};
contentName = 'comment.block.jinja';
patterns = (
{ include = 'source.ansible-jinja#comments'; }
);
};
};
}
Loading
Loading