From 9f446ad024bcdb15262bd8f2c1fccaad70420603 Mon Sep 17 00:00:00 2001 From: jaswrks Date: Thu, 3 Aug 2017 06:06:35 -0800 Subject: [PATCH 1/2] Support `{{-` and `-}}` for whitespace control. With this PR it now matches the intended functionality; i.e., https://github.com/harttle/liquidjs/wiki/Whitespace-Control --- src/tokenizer.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/tokenizer.js b/src/tokenizer.js index e443ee0a9..7142f8317 100644 --- a/src/tokenizer.js +++ b/src/tokenizer.js @@ -9,7 +9,7 @@ function parse (html, filepath, options) { html = whiteSpaceCtrl(html, options) var tokens = [] - var syntax = /({%-?([\s\S]*?)-?%})|({{([\s\S]*?)}})/g + var syntax = /({%-?([\s\S]*?)-?%})|({{-?([\s\S]*?)-?}})/g var result, htmlFragment, token var lastMatchEnd = 0 var lastMatchBegin = -1 @@ -82,13 +82,13 @@ function parse (html, filepath, options) { function whiteSpaceCtrl (html, options) { options = options || {} if (options.trim_left) { - html = html.replace(/{%-?/g, '{%-') + html = html.replace(/({[{%])-?/g, '$1-') } if (options.trim_right) { - html = html.replace(/-?%}/g, '-%}') + html = html.replace(/-?([%}]})/g, '-$1') } - var rLeft = options.greedy ? /\s+({%-)/g : /[\t\r ]*({%-)/g - var rRight = options.greedy ? /(-%})\s+/g : /(-%})[\t\r ]*\n?/g + var rLeft = options.greedy ? /\s+({[{%]-)/g : /[\t\r ]*({[{%]-)/g + var rRight = options.greedy ? /(-[%}]})\s+/g : /(-[%}]})[\t\r ]*\n?/g return html.replace(rLeft, '$1').replace(rRight, '$1') } From 4ae63b2899fa8fb13a44f772add2e8f1ef3bbf48 Mon Sep 17 00:00:00 2001 From: harttle Date: Fri, 4 Aug 2017 11:27:12 +0800 Subject: [PATCH 2/2] test cases for #36 --- test/tokenizer.js | 63 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 54 insertions(+), 9 deletions(-) diff --git a/test/tokenizer.js b/test/tokenizer.js index 2a80c6303..b3c6846f3 100644 --- a/test/tokenizer.js +++ b/test/tokenizer.js @@ -71,44 +71,89 @@ describe('tokenizer', function () { }) }) describe('whitespace control', function () { - it('should not strip by default', function () { + it('should not strip by default (tag)', function () { expect(whiteSpaceCtrl('\n {%foo%} \n')).to.equal('\n {%foo%} \n') }) - it('should strip all blank characters before and after', function () { + it('should strip all blank characters before and after (tag)', function () { expect(whiteSpaceCtrl(' \t\r{%-foo-%} \t\n')).to.equal('{%-foo-%}') }) - it('should not trim previous/next lines', function () { + it('should not trim previous/next lines (tag)', function () { expect(whiteSpaceCtrl(' \t\n {%-foo-%}')).to.equal(' \t\n{%-foo-%}') expect(whiteSpaceCtrl('{%-foo-%} \n \tfoo')).to.equal('{%-foo-%} \tfoo') }) - it('should trim exactly one trailing CR', function () { + it('should trim exactly one trailing CR (tag)', function () { expect(whiteSpaceCtrl('{%-foo-%} \n\n')).to.equal('{%-foo-%}\n') }) - it('should trim all leading/trailing blanks when options.greedy set', function () { + it('should trim exactly one trailing CR (tag)', function () { + expect(whiteSpaceCtrl('{%-foo-%} \n\n')).to.equal('{%-foo-%}\n') + }) + it('should trim all leading/trailing blanks when options.greedy set (tag)', function () { expect(whiteSpaceCtrl(' \n \n\t\r{%-foo-%}\n \n', { greedy: true })).to.equal('{%-foo-%}') }) - it('should strip whitespaces when set trim_left', function () { + it('should strip whitespaces when set trim_left (tag)', function () { expect(whiteSpaceCtrl('\n {%foo%} \n', { trim_left: true })).to.equal('\n{%-foo%} \n') }) - it('should strip whitespaces when set trim_right', function () { + it('should strip whitespaces when set trim_right (tag)', function () { expect(whiteSpaceCtrl('\n {%foo%} \n', { trim_right: true })).to.equal('\n {%foo-%}') }) - it('markup should has priority over options', function () { + it('markup should has priority over options (tag)', function () { expect(whiteSpaceCtrl('\n {%-foo%} \n', { trim_left: false })).to.equal('\n{%-foo%} \n') }) - it('should support a mix of markup and options', function () { + it('should support a mix of markup and options (tag)', function () { expect(whiteSpaceCtrl(' {%-foo%} \n', { trim_left: true, trim_right: true })).to.equal('{%-foo-%}') }) + it('should not strip by default (value)', function () { + expect(whiteSpaceCtrl('\n {{foo}} \n')).to.equal('\n {{foo}} \n') + }) + it('should strip all blank characters before and after (value)', function () { + expect(whiteSpaceCtrl(' \t\r{{-foo-}} \t\n')).to.equal('{{-foo-}}') + }) + it('should not trim previous/next lines (value)', function () { + expect(whiteSpaceCtrl(' \t\n {{-foo-}}')).to.equal(' \t\n{{-foo-}}') + expect(whiteSpaceCtrl('{{-foo-}} \n \tfoo')).to.equal('{{-foo-}} \tfoo') + }) + it('should trim exactly one trailing CR (value)', function () { + expect(whiteSpaceCtrl('{{-foo-}} \n\n')).to.equal('{{-foo-}}\n') + }) + it('should trim exactly one trailing CR (value)', function () { + expect(whiteSpaceCtrl('{{-foo-}} \n\n')).to.equal('{{-foo-}}\n') + }) + it('should trim all leading/trailing blanks when options.greedy set (value)', function () { + expect(whiteSpaceCtrl(' \n \n\t\r{{-foo-}}\n \n', { + greedy: true + })).to.equal('{{-foo-}}') + }) + it('should strip whitespaces when set trim_left (value)', function () { + expect(whiteSpaceCtrl('\n {{foo}} \n', { + trim_left: true + })).to.equal('\n{{-foo}} \n') + }) + it('should strip whitespaces when set trim_right (value)', function () { + expect(whiteSpaceCtrl('\n {{foo}} \n', { + trim_right: true + })).to.equal('\n {{foo-}}') + }) + it('markup should has priority over options (value)', function () { + expect(whiteSpaceCtrl('\n {{-foo}} \n', { + trim_left: false + })).to.equal('\n{{-foo}} \n') + }) + it('should support a mix of markup and options (value)', function () { + expect(whiteSpaceCtrl(' {{-foo}} \n', { + trim_left: true, + trim_right: true + })).to.equal('{{-foo-}}') + }) }) })