From 7ff286d5d5960511c28abea4b2598b23a6e67ef0 Mon Sep 17 00:00:00 2001 From: Patrick Steele-Idem Date: Wed, 3 Aug 2016 12:13:55 -0600 Subject: [PATCH 1/4] Fixes #345 - Whitespace preservation should apply to all nested nodes --- compiler/CodeGenerator.js | 10 ++++++++++ compiler/CompileContext.js | 14 +++++++++++++- test/autotests/render/bodyText/expected.html | 4 +++- .../render/whitespace-pre-code/expected.html | 3 +++ .../render/whitespace-pre-code/template.marko | 3 +++ test/autotests/render/whitespace-pre-code/test.js | 3 +++ 6 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 test/autotests/render/whitespace-pre-code/expected.html create mode 100644 test/autotests/render/whitespace-pre-code/template.marko create mode 100644 test/autotests/render/whitespace-pre-code/test.js diff --git a/compiler/CodeGenerator.js b/compiler/CodeGenerator.js index c2e437cabf..be8168599f 100644 --- a/compiler/CodeGenerator.js +++ b/compiler/CodeGenerator.js @@ -189,9 +189,15 @@ class Generator { beforeAfterEvent = new GeneratorEvent(node, this); } + var isWhitespacePreserved = node.isPreserveWhitespace(); + if (beforeAfterEvent) { beforeAfterEvent.isBefore = true; beforeAfterEvent.node.emit('beforeGenerateCode', beforeAfterEvent); + + if (isWhitespacePreserved) { + this.context.beginPreserveWhitespace(); + } } if (node.getCodeGenerator) { @@ -268,6 +274,10 @@ class Generator { if (beforeAfterEvent) { beforeAfterEvent.isBefore = false; beforeAfterEvent.node.emit('afterGenerateCode', beforeAfterEvent); + + if (isWhitespacePreserved) { + this.context.endPreserveWhitespace(); + } } this._currentNode = oldCurrentNode; diff --git a/compiler/CompileContext.js b/compiler/CompileContext.js index 46398aae23..bffaf31aa9 100644 --- a/compiler/CompileContext.js +++ b/compiler/CompileContext.js @@ -14,6 +14,8 @@ var macros = require('./util/macros'); var extend = require('raptor-util/extend'); var Walker = require('./Walker'); +const FLAG_PRESERVE_WHITESPACE = 'PRESERVE_WHITESPACE'; + const deresolveOptions = { shouldRemoveExt(ext) { return ext === '.js' || ext === '.json' || ext === '.es6'; @@ -392,8 +394,18 @@ class CompileContext { this._preserveWhitespace = preserveWhitespace; } + beginPreserveWhitespace() { + this.pushFlag(FLAG_PRESERVE_WHITESPACE); + } + + endPreserveWhitespace() { + this.popFlag(FLAG_PRESERVE_WHITESPACE); + } + isPreserveWhitespace() { - return this._preserveWhitespace === true; + if (this.isFlagSet(FLAG_PRESERVE_WHITESPACE) || this._preserveWhitespace === true) { + return true; + } } setPreserveComments(preserveComments) { diff --git a/test/autotests/render/bodyText/expected.html b/test/autotests/render/bodyText/expected.html index 5c2ea02f09..264072b3a0 100644 --- a/test/autotests/render/bodyText/expected.html +++ b/test/autotests/render/bodyText/expected.html @@ -1 +1,3 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/test/autotests/render/whitespace-pre-code/expected.html b/test/autotests/render/whitespace-pre-code/expected.html new file mode 100644 index 0000000000..8e6fc437ed --- /dev/null +++ b/test/autotests/render/whitespace-pre-code/expected.html @@ -0,0 +1,3 @@ +
// Hello World
+
+console.log('Hello World!');
\ No newline at end of file diff --git a/test/autotests/render/whitespace-pre-code/template.marko b/test/autotests/render/whitespace-pre-code/template.marko new file mode 100644 index 0000000000..8e6fc437ed --- /dev/null +++ b/test/autotests/render/whitespace-pre-code/template.marko @@ -0,0 +1,3 @@ +
// Hello World
+
+console.log('Hello World!');
\ No newline at end of file diff --git a/test/autotests/render/whitespace-pre-code/test.js b/test/autotests/render/whitespace-pre-code/test.js new file mode 100644 index 0000000000..27e8344455 --- /dev/null +++ b/test/autotests/render/whitespace-pre-code/test.js @@ -0,0 +1,3 @@ +exports.templateData = { + "name": "World" +}; From 7c7063d5cdd775b64d59fdf8084334ff75cb63e7 Mon Sep 17 00:00:00 2001 From: Patrick Steele-Idem Date: Wed, 3 Aug 2016 12:19:57 -0600 Subject: [PATCH 2/4] Added another test for #345 - marko-preserve-whitespace attr --- .../expected.html | 12 ++++++++++++ .../template.marko | 12 ++++++++++++ .../test.js | 3 +++ 3 files changed, 27 insertions(+) create mode 100644 test/autotests/render/whitespace-marko-preserve-whitespace-attr/expected.html create mode 100644 test/autotests/render/whitespace-marko-preserve-whitespace-attr/template.marko create mode 100644 test/autotests/render/whitespace-marko-preserve-whitespace-attr/test.js diff --git a/test/autotests/render/whitespace-marko-preserve-whitespace-attr/expected.html b/test/autotests/render/whitespace-marko-preserve-whitespace-attr/expected.html new file mode 100644 index 0000000000..757aef9539 --- /dev/null +++ b/test/autotests/render/whitespace-marko-preserve-whitespace-attr/expected.html @@ -0,0 +1,12 @@ +
+ This + whitespace + should be + preserved +
+ This + whitespace + should also be + preserved +
+
\ No newline at end of file diff --git a/test/autotests/render/whitespace-marko-preserve-whitespace-attr/template.marko b/test/autotests/render/whitespace-marko-preserve-whitespace-attr/template.marko new file mode 100644 index 0000000000..0eb1bfc8a0 --- /dev/null +++ b/test/autotests/render/whitespace-marko-preserve-whitespace-attr/template.marko @@ -0,0 +1,12 @@ +
+ This + whitespace + should be + preserved +
+ This + whitespace + should also be + preserved +
+
\ No newline at end of file diff --git a/test/autotests/render/whitespace-marko-preserve-whitespace-attr/test.js b/test/autotests/render/whitespace-marko-preserve-whitespace-attr/test.js new file mode 100644 index 0000000000..27e8344455 --- /dev/null +++ b/test/autotests/render/whitespace-marko-preserve-whitespace-attr/test.js @@ -0,0 +1,3 @@ +exports.templateData = { + "name": "World" +}; From 5a96b1d5d9d843b26e44c21716d1608b3969d30e Mon Sep 17 00:00:00 2001 From: Patrick Steele-Idem Date: Wed, 3 Aug 2016 12:21:49 -0600 Subject: [PATCH 3/4] Added another test for #345 - marko-compiler-options --- .../expected.html | 12 ++++++++++++ .../template.marko | 14 ++++++++++++++ .../test.js | 1 + 3 files changed, 27 insertions(+) create mode 100644 test/autotests/render/marko-compiler-options-preserve-whitespace-nested/expected.html create mode 100644 test/autotests/render/marko-compiler-options-preserve-whitespace-nested/template.marko create mode 100644 test/autotests/render/marko-compiler-options-preserve-whitespace-nested/test.js diff --git a/test/autotests/render/marko-compiler-options-preserve-whitespace-nested/expected.html b/test/autotests/render/marko-compiler-options-preserve-whitespace-nested/expected.html new file mode 100644 index 0000000000..757aef9539 --- /dev/null +++ b/test/autotests/render/marko-compiler-options-preserve-whitespace-nested/expected.html @@ -0,0 +1,12 @@ +
+ This + whitespace + should be + preserved +
+ This + whitespace + should also be + preserved +
+
\ No newline at end of file diff --git a/test/autotests/render/marko-compiler-options-preserve-whitespace-nested/template.marko b/test/autotests/render/marko-compiler-options-preserve-whitespace-nested/template.marko new file mode 100644 index 0000000000..9a4891f520 --- /dev/null +++ b/test/autotests/render/marko-compiler-options-preserve-whitespace-nested/template.marko @@ -0,0 +1,14 @@ + + +
+ This + whitespace + should be + preserved +
+ This + whitespace + should also be + preserved +
+
\ No newline at end of file diff --git a/test/autotests/render/marko-compiler-options-preserve-whitespace-nested/test.js b/test/autotests/render/marko-compiler-options-preserve-whitespace-nested/test.js new file mode 100644 index 0000000000..c4013b3447 --- /dev/null +++ b/test/autotests/render/marko-compiler-options-preserve-whitespace-nested/test.js @@ -0,0 +1 @@ +exports.templateData = {}; From 0521933c99754fe18959f22fc77fe594f35c92d5 Mon Sep 17 00:00:00 2001 From: Patrick Steele-Idem Date: Wed, 3 Aug 2016 12:23:33 -0600 Subject: [PATCH 4/4] Updated docs to clarify whitespace removal for nested text --- docs/language-guide.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/language-guide.md b/docs/language-guide.md index 3e8d9d7986..2aa5028230 100644 --- a/docs/language-guide.md +++ b/docs/language-guide.md @@ -782,6 +782,8 @@ __Option 2)__ Disable whitespace removal using the `marko-preserve-whitespace` a ``` +NOTE: When whitespace preservation is enabled, whitespace will be preserved for text at any level below the tag that the `marko-preserve-whitespace` attribute is attached to. + __Option 3)__ Disable _all_ whitespace removal by changing a compiler option ```javascript @@ -800,6 +802,8 @@ Adding the `"preserve-whitespace": true` property to a tag definition will resul } ``` +NOTE: When whitespace preservation is enabled, whitespace will be preserved for text at any level below the tag. + # Helpers Since Marko template files compile into CommonJS modules, any Node.js module can be "imported" into a template for use as a helper module. For example, given the following helper module: