keep else inline if there is no newline around

This commit is contained in:
davidodenwald 2023-01-06 17:32:27 +01:00
parent d6ccdfab1f
commit 683901f483
6 changed files with 35 additions and 6 deletions

View file

@ -9,6 +9,8 @@ import {
nonClosingStatements, nonClosingStatements,
} from "./jinja"; } from "./jinja";
const NOT_FOUND = -1;
const regex = const regex =
/(?<pre>(?<newline>\n)?(\s*?))(?<node>{{\s*(?<expression>'([^']|\\')*'|"([^"]|\\")*"|[\S\s]*?)\s*}}|{%(?<startDelimiter>[-+]?)\s*(?<statement>(?<keyword>for|endfor|if|else|elif|endif|macro|endmacro|call|endcall|filter|endfilter|set|endset|include|import|from|extends|block|endblock)('([^']|\\')*'|"([^"]|\\")*"|[\S\s])*?)\s*(?<endDelimiter>[-+]?)%}|(?<comment>{#[\S\s]*?#})|(?<scriptBlock><(script)((?!<)[\s\S])*>((?!<\/script)[\s\S])*?{{[\s\S]*?<\/(script)>)|(?<styleBlock><(style)((?!<)[\s\S])*>((?!<\/style)[\s\S])*?{{[\s\S]*?<\/(style)>)|(?<ignoreBlock><!-- prettier-ignore-start -->[\s\S]*<!-- prettier-ignore-end -->))/; /(?<pre>(?<newline>\n)?(\s*?))(?<node>{{\s*(?<expression>'([^']|\\')*'|"([^"]|\\")*"|[\S\s]*?)\s*}}|{%(?<startDelimiter>[-+]?)\s*(?<statement>(?<keyword>for|endfor|if|else|elif|endif|macro|endmacro|call|endcall|filter|endfilter|set|endset|include|import|from|extends|block|endblock)('([^']|\\')*'|"([^"]|\\")*"|[\S\s])*?)\s*(?<endDelimiter>[-+]?)%}|(?<comment>{#[\S\s]*?#})|(?<scriptBlock><(script)((?!<)[\s\S])*>((?!<\/script)[\s\S])*?{{[\s\S]*?<\/(script)>)|(?<styleBlock><(style)((?!<)[\s\S])*>((?!<\/style)[\s\S])*?{{[\s\S]*?<\/(style)>)|(?<ignoreBlock><!-- prettier-ignore-start -->[\s\S]*<!-- prettier-ignore-end -->))/;
@ -145,14 +147,15 @@ export const parse: Parser<Node>["parse"] = (text) => {
root.content.indexOf(end.originalText) + end.length root.content.indexOf(end.originalText) + end.length
); );
const originalText = text.slice(start.index, end.index + end.length);
const block = { const block = {
id: generatePlaceholder(), id: generatePlaceholder(),
type: "block", type: "block",
start: start, start: start,
end: end, end: end,
content: blockText.slice(start.length, blockText.length - end.length), content: blockText.slice(start.length, blockText.length - end.length),
ownLine: newline, ownLine: originalText.search("\n") !== NOT_FOUND,
originalText: text.slice(start.index, end.index + end.length), originalText,
index: start.index, index: start.index,
length: end.index + end.length - start.index, length: end.index + end.length - start.index,
nodes: root.nodes, nodes: root.nodes,

View file

@ -42,9 +42,13 @@ const printStatement = (node: Statement): builders.Doc => {
{ shouldBreak: node.ownLine } { shouldBreak: node.ownLine }
); );
return ["else", "elif"].includes(node.keyword) if (
? [builders.dedent(builders.hardline), statemnt, builders.hardline] ["else", "elif"].includes(node.keyword) &&
: statemnt; surroundingBlock(node)?.ownLine
) {
return [builders.dedent(builders.hardline), statemnt, builders.hardline];
}
return statemnt;
}; };
const printIgnoreBlock = (node: IgnoreBlock): builders.Doc => { const printIgnoreBlock = (node: IgnoreBlock): builders.Doc => {
@ -182,3 +186,9 @@ export const findPlaceholders = (text: string): [number, number][] => {
} }
return res; return res;
}; };
export const surroundingBlock = (node: Node): Block | undefined => {
return Object.values(node.nodes).find(
(n) => n.type === "block" && n.content.search(node.id) !== NOT_FOUND
) as Block;
};

View file

@ -0,0 +1,7 @@
<body>
{% if href in ['layout.html', 'index.html, 'about.html', 'user.html'] %}
<h1>{{ title }}</h1>
{% else %}
<h2>{{ title }}</h2>
{% endif %}
</body>

View file

@ -0,0 +1,5 @@
<body>
{% if href in ['layout.html', 'index.html, 'about.html', 'user.html'] %}
<h1>{{title}}</h1>{%else%}<h2>{{title}}</h2>
{% endif %}
</body>

View file

@ -1,3 +1,5 @@
<title>{% block title %}{% endblock %}</title> <title>{% block title %}{% endblock %}</title>
<div>class="{% if class %}{{ class }}{% endif %}"</div> <div>class="{% if class %}{{ class }}{% endif %}"</div>
<div>class="{% if class %}{{ class }}{% else %}default{% endif %}"</div>

View file

@ -1,3 +1,5 @@
<title>{%block title%} {%endblock%}</title> <title>{%block title%} {%endblock%}</title>
<div>class="{%if class%}{{class}}{%endif%}"</div> <div>class="{%if class%}{{class}}{%endif%}"</div>
<div>class="{%if class%}{{class}}{%else%}default{%endif%}"</div>