fix(glimmer): preserve leading/trailing spaces in text nodes undernea… (#4288)

* fix(glimmer): preserve leading/trailing spaces in text nodes underneath attribute nodes when next to mustache statements.

* fix(glimmer): format printer-glimmer.js

* fix(glimmer): lint fix

* fix(glimmer): removed decomposition assignments to be compatible with Node 4

* fix(glimmer): Array.includes() -> indexOf() for Node 4
master
Nate Pendleton 2018-04-27 13:20:10 -07:00 committed by Suchipi
parent 2ad7576d3a
commit 91c701886d
3 changed files with 68 additions and 3 deletions

View File

@ -193,7 +193,37 @@ function print(path, options, print) {
return concat([n.key, "=", path.call(print, "value")]);
}
case "TextNode": {
return n.chars.replace(/^\s+/, "").replace(/\s+$/, "");
let leadingSpace = "";
let trailingSpace = "";
// preserve a space inside of an attribute node where whitespace present, when next to mustache statement.
const inAttrNode = path.stack.indexOf("attributes") >= 0;
if (inAttrNode) {
const parentNode = path.getParentNode(0);
const isConcat = parentNode.type === "ConcatStatement";
if (isConcat) {
const parts = parentNode.parts;
const partIndex = parts.indexOf(n);
if (partIndex > 0) {
const partType = parts[partIndex - 1].type;
const isMustache = partType === "MustacheStatement";
if (isMustache) {
leadingSpace = " ";
}
}
if (partIndex < parts.length - 1) {
const partType = parts[partIndex + 1].type;
const isMustache = partType === "MustacheStatement";
if (isMustache) {
trailingSpace = " ";
}
}
}
}
return n.chars
.replace(/^\s+/, leadingSpace)
.replace(/\s+$/, trailingSpace);
}
case "MustacheCommentStatement": {
const dashes = n.value.indexOf("}}") > -1 ? "--" : "";

View File

@ -118,21 +118,45 @@ exports[`concat-statement.hbs 1`] = `
</div>
<a href="/{{url}}/{{url}}"></a>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<div class="hello{{if goodbye true}}">
<div class=" class-a{{myClass}}"></div>
<div class=" class-b {{myClass}}"></div>
<div class=" {{myClass}}class-c"></div>
<div class=" {{myClass}} class-d"></div>
<div class=" class-e{{myClass}} class-f"></div>
<div class=" class-g{{myClass}}class-h "></div>
<div class=" class-i {{myClass}}class-j"></div>
<div class="class-k {{myClass}} class-l"></div>
<div class=" class-m {{myClass}} class-n {{myClass}}class-o "></div>
<div class=" class-p class-q"></div>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<div class="hello {{if goodbye true}}">
Hello
</div>
<div
class="hello
{{if goodbye true}}
{{if goodbye false}}
{{if goodbye true}}
{{if goodbye false}}
{{if goodbye true}}"
>
Hello
</div>
<a href="/{{url}}/{{url}}"></a>
<div class="class-a{{myClass}}"></div>
<div class="class-b {{myClass}}"></div>
<div class="{{myClass}}class-c"></div>
<div class="{{myClass}} class-d"></div>
<div class="class-e{{myClass}} class-f"></div>
<div class="class-g{{myClass}}class-h"></div>
<div class="class-i {{myClass}}class-j"></div>
<div class="class-k {{myClass}} class-l"></div>
<div class="class-m {{myClass}} class-n {{myClass}}class-o"></div>
<div class="class-p class-q"></div>
`;
exports[`element-modifier-statement.hbs 1`] = `

View File

@ -7,3 +7,14 @@
</div>
<a href="/{{url}}/{{url}}"></a>
<div class=" class-a{{myClass}}"></div>
<div class=" class-b {{myClass}}"></div>
<div class=" {{myClass}}class-c"></div>
<div class=" {{myClass}} class-d"></div>
<div class=" class-e{{myClass}} class-f"></div>
<div class=" class-g{{myClass}}class-h "></div>
<div class=" class-i {{myClass}}class-j"></div>
<div class="class-k {{myClass}} class-l"></div>
<div class=" class-m {{myClass}} class-n {{myClass}}class-o "></div>
<div class=" class-p class-q"></div>