Skip to content

Commit

Permalink
handle start and end delimiters as seperate symbols
Browse files Browse the repository at this point in the history
The start delimiter triggers `trim_blocks` and the end delimiter
`lstrip_blocks`.
  • Loading branch information
davidodenwald committed Jun 23, 2024
1 parent de5d77e commit a8d2840
Show file tree
Hide file tree
Showing 6 changed files with 25 additions and 17 deletions.
8 changes: 6 additions & 2 deletions src/jinja.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,17 @@ export interface Node {
nodes: { [id: string]: Node };
}

type DelimiterChr = "" | "-" | "+";
export type Delimiter = {
start: DelimiterChr;
end: DelimiterChr;
};

export interface Expression extends Node {
type: "expression";
delimiter: Delimiter;
}

export type Delimiter = "" | "-" | "+";

export interface Statement extends Node {
type: "statement";
keyword: string;
Expand Down
12 changes: 8 additions & 4 deletions src/parser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,10 @@ export const parse: Parser<Node>["parse"] = (text) => {
}

if (expression != undefined) {
const delimiter = (match.groups.startDelimiterEx ||
match.groups.endDelimiterEx) as Delimiter;
const delimiter = {
start: match.groups.startDelimiterEx,
end: match.groups.endDelimiterEx,
};

root.content = replaceAt(
root.content,
Expand All @@ -108,8 +110,10 @@ export const parse: Parser<Node>["parse"] = (text) => {

if (statement != undefined) {
const keyword = match.groups.keyword;
const delimiter = (match.groups.startDelimiter ||
match.groups.endDelimiter) as Delimiter;
const delimiter = {
start: match.groups.startDelimiter,
end: match.groups.endDelimiter,
};

if (keyword.startsWith("end")) {
let start: Statement | undefined;
Expand Down
12 changes: 6 additions & 6 deletions src/printer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,13 @@ const printExpression = (node: Expression): builders.Doc => {

const expression = builders.group(
builders.join(" ", [
["{{", node.delimiter],
["{{", node.delimiter.start],
multiline
? builders.indent(getMultilineGroup(node.content))
: node.content,
multiline
? [builders.hardline, node.delimiter, "}}"]
: [node.delimiter, "}}"],
? [builders.hardline, node.delimiter.end, "}}"]
: [node.delimiter.end, "}}"],
]),
{
shouldBreak: node.preNewLines > 0,
Expand All @@ -67,13 +67,13 @@ const printStatement = (node: Statement): builders.Doc => {

const statemnt = builders.group(
builders.join(" ", [
["{%", node.delimiter],
["{%", node.delimiter.start],
multiline
? builders.indent(getMultilineGroup(node.content))
: node.content,
multiline
? [builders.hardline, node.delimiter, "%}"]
: [node.delimiter, "%}"],
? [builders.hardline, node.delimiter.end, "%}"]
: [node.delimiter.end, "%}"],
]),
{ shouldBreak: node.preNewLines > 0 },
);
Expand Down
4 changes: 2 additions & 2 deletions test/cases/expression_whitespace/expected.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
{{- some_variable -}}
</div>
<div class="extemely_long__class_name extemely_long__class_name--modifier">
{{- some_variable -}}
{{ some_variable -}}
</div>
<div class="extemely_long__class_name extemely_long__class_name--modifier">
{{- some_variable -}}
{{- some_variable }}
</div>
4 changes: 2 additions & 2 deletions test/cases/statement_whitespace/expected.html
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<ul>
{%+ set seq +%}
{% set seq +%}
{%- for item in seq -%}
<li>{{ item }}</li>
{%- endfor -%}
{%- endfor %}
</ul>
2 changes: 1 addition & 1 deletion test/cases/statement_whitespace/input.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@
{%-for item in seq -%}
<li>{{ item}}</li>
{%- endfor%}
</ul>
</ul>

0 comments on commit a8d2840

Please sign in to comment.