mirror of
https://github.com/harttle/liquidjs.git
synced 2026-09-18 05:50:43 -07:00
fix: whiteSpace Ctrl with compliance to shopify/liquid, working on #17
This commit is contained in:
+5
-5
@@ -186,7 +186,7 @@ describe('liquid', function () {
|
||||
trim_left: true
|
||||
})
|
||||
return expect(engine.parseAndRender(' \n \t{%if true%}foo{%endif%} '))
|
||||
.to.eventually.equal(' \nfoo ')
|
||||
.to.eventually.equal('foo ')
|
||||
})
|
||||
it('should trim_right for tags when trim_right=true', function () {
|
||||
engine = Liquid({
|
||||
@@ -210,9 +210,9 @@ describe('liquid', function () {
|
||||
' Wow, {{ username }}, you have a long name!',
|
||||
'{%- else -%}',
|
||||
' Hello there!',
|
||||
'{%- endif -%}\n'
|
||||
'{%- endif -%}'
|
||||
].join('\n')
|
||||
var dst = ' Wow, John G. Chalmers-Smith, you have a long name!\n'
|
||||
var dst = 'Wow, John G. Chalmers-Smith, you have a long name!'
|
||||
return expect(engine.parseAndRender(src)).to.eventually.equal(dst)
|
||||
})
|
||||
it('should not trim when not specified', function () {
|
||||
@@ -223,9 +223,9 @@ describe('liquid', function () {
|
||||
' Wow, {{ username }}, you have a long name!',
|
||||
'{% else %}',
|
||||
' Hello there!',
|
||||
'{% endif %}\n'
|
||||
'{% endif %}'
|
||||
].join('\n')
|
||||
var dst = '\n\n Wow, John G. Chalmers-Smith, you have a long name!\n\n'
|
||||
var dst = '\n\n Wow, John G. Chalmers-Smith, you have a long name!\n'
|
||||
return expect(engine.parseAndRender(src)).to.eventually.equal(dst)
|
||||
})
|
||||
})
|
||||
|
||||
+7
-7
@@ -12,37 +12,37 @@ describe('tags/if', function () {
|
||||
emptyArray: []
|
||||
}
|
||||
|
||||
it('should support if 1', function () {
|
||||
it('should throw if not closed', function () {
|
||||
var src = '{% if false%}yes'
|
||||
return expect(liquid.parseAndRender(src, ctx))
|
||||
.to.be.rejectedWith(/tag {% if false%} not closed/)
|
||||
})
|
||||
it('should support if 2', function () {
|
||||
it('should treat Array truthy', function () {
|
||||
var src = '{%if emptyArray%}a{%endif%}'
|
||||
return expect(liquid.parseAndRender(src, ctx))
|
||||
.to.eventually.equal('a')
|
||||
})
|
||||
it('should support if 3', function () {
|
||||
it('should support ==', function () {
|
||||
var src = '{% if 2==3 %}yes{%else%}no{%endif%}'
|
||||
return expect(liquid.parseAndRender(src, ctx))
|
||||
.to.eventually.equal('no')
|
||||
})
|
||||
it('should support if 4', function () {
|
||||
it('should support >=', function () {
|
||||
var src = '{% if 1>=2 and one<two %}a{%endif%}'
|
||||
return expect(liquid.parseAndRender(src, ctx))
|
||||
.to.eventually.equal('')
|
||||
})
|
||||
it('should support if 5', function () {
|
||||
it('should support !=', function () {
|
||||
var src = '{% if one!=two %}yes{%else%}no{%endif%}'
|
||||
return expect(liquid.parseAndRender(src, ctx))
|
||||
.to.eventually.equal('yes')
|
||||
})
|
||||
it('should support if 6', function () {
|
||||
it('should support boolean', function () {
|
||||
var src = '{% if false %}1{%elsif true%}2{%else%}3{%endif%}'
|
||||
return expect(liquid.parseAndRender(src, ctx))
|
||||
.to.eventually.equal('2')
|
||||
})
|
||||
it('should support if 7', function () {
|
||||
it('should support nested', function () {
|
||||
var src = '{%if false%}{%if true%}{%else%}a{%endif%}{%endif%}'
|
||||
return expect(liquid.parseAndRender(src, ctx))
|
||||
.to.eventually.equal('')
|
||||
|
||||
+1
-88
@@ -1,6 +1,5 @@
|
||||
const chai = require('chai')
|
||||
const parse = require('../src/tokenizer.js').parse
|
||||
const whiteSpaceCtrl = require('../src/tokenizer.js').whiteSpaceCtrl
|
||||
const expect = chai.expect
|
||||
|
||||
describe('tokenizer', function () {
|
||||
@@ -16,7 +15,7 @@ describe('tokenizer', function () {
|
||||
it('should throw when non-string passed in', function () {
|
||||
expect(function () {
|
||||
parse({})
|
||||
}).to.throw('illegal input type')
|
||||
}).to.throw('illegal input')
|
||||
})
|
||||
it('should handle tag syntax', function () {
|
||||
var html = '<p>{% for p in a[1]%}</p>'
|
||||
@@ -70,90 +69,4 @@ describe('tokenizer', function () {
|
||||
expect(tokens[0].raw).to.equal('{{foo\n|date:\n"%Y-%m-%d"\n}}')
|
||||
})
|
||||
})
|
||||
describe('whitespace control', 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 (tag)', function () {
|
||||
expect(whiteSpaceCtrl(' \t\r{%-foo-%} \t\n')).to.equal('{%-foo-%}')
|
||||
})
|
||||
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 (tag)', function () {
|
||||
expect(whiteSpaceCtrl('{%-foo-%} \n\n')).to.equal('{%-foo-%}\n')
|
||||
})
|
||||
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 (tag)', function () {
|
||||
expect(whiteSpaceCtrl('\n {%foo%} \n', {
|
||||
trim_left: true
|
||||
})).to.equal('\n{%-foo%} \n')
|
||||
})
|
||||
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 (tag)', function () {
|
||||
expect(whiteSpaceCtrl('\n {%-foo%} \n', {
|
||||
trim_left: false
|
||||
})).to.equal('\n{%-foo%} \n')
|
||||
})
|
||||
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-}}')
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -62,16 +62,6 @@ describe('util/underscore', function () {
|
||||
expect(spy).to.have.been.calledOnce
|
||||
})
|
||||
})
|
||||
describe('.echo()', function () {
|
||||
it('should be transparent', function () {
|
||||
expect(_.echo('foo')('bar')).to.equal('bar')
|
||||
})
|
||||
it('should log the arguments', function () {
|
||||
var log = sinon.spy(console, 'log')
|
||||
_.echo('foo')('bar')
|
||||
expect(log).to.have.been.calledWith('[foo]', 'bar')
|
||||
})
|
||||
})
|
||||
describe('.range()', function () {
|
||||
it('should return a range of integers', function () {
|
||||
expect(_.range(3, 5)).to.deep.equal([3, 4])
|
||||
|
||||
@@ -0,0 +1,448 @@
|
||||
const chai = require('chai')
|
||||
const expect = chai.expect
|
||||
const Liquid = require('..')
|
||||
const liquid = new Liquid()
|
||||
chai.use(require('chai-as-promised'))
|
||||
|
||||
const cases = [
|
||||
{
|
||||
text: `
|
||||
<div>
|
||||
<p>
|
||||
{{ 'John' }}
|
||||
</p>
|
||||
</div>
|
||||
`,
|
||||
expected: `
|
||||
<div>
|
||||
<p>
|
||||
John
|
||||
</p>
|
||||
</div>
|
||||
`
|
||||
}, {
|
||||
text: `
|
||||
<div>
|
||||
<p>
|
||||
|
||||
|
||||
{{- 'John' -}}
|
||||
|
||||
|
||||
</p>
|
||||
</div>
|
||||
`,
|
||||
expected: `
|
||||
<div>
|
||||
<p>John</p>
|
||||
</div>
|
||||
`
|
||||
}, {
|
||||
text: `
|
||||
<div>
|
||||
<p>
|
||||
|
||||
|
||||
{%- if true -%}
|
||||
yes
|
||||
{%- endif -%}
|
||||
|
||||
|
||||
</p>
|
||||
</div>
|
||||
`,
|
||||
expected: `
|
||||
<div>
|
||||
<p>yes</p>
|
||||
</div>
|
||||
`
|
||||
}, {
|
||||
text: `
|
||||
<div>
|
||||
<p>
|
||||
{% if true %}
|
||||
yes
|
||||
{% endif %}
|
||||
</p>
|
||||
</div>
|
||||
`,
|
||||
expected: `
|
||||
<div>
|
||||
<p>
|
||||
|
||||
yes
|
||||
|
||||
</p>
|
||||
</div>
|
||||
`
|
||||
}, {
|
||||
text: `
|
||||
<div>
|
||||
<p>
|
||||
{% if false %}
|
||||
no
|
||||
{% endif %}
|
||||
</p>
|
||||
</div>
|
||||
`,
|
||||
expected: `
|
||||
<div>
|
||||
<p>
|
||||
|
||||
</p>
|
||||
</div>
|
||||
`
|
||||
}, {
|
||||
text: '<p>{{- \'John\' -}}</p>',
|
||||
expected: '<p>John</p>'
|
||||
}, {
|
||||
text: '<p>{%- if true -%}yes{%- endif -%}</p>',
|
||||
expected: '<p>yes</p>'
|
||||
}, {
|
||||
text: '<p>{%- if false -%}no{%- endif -%}</p>',
|
||||
expected: '<p></p>'
|
||||
}, {
|
||||
text: '<p> {%- if true %} yes {% endif -%} </p>',
|
||||
expected: '<p> yes </p>'
|
||||
}, {
|
||||
text: '<p> {%- if false %} no {% endif -%} </p>',
|
||||
expected: '<p></p>'
|
||||
}, {
|
||||
text: '<p> {% if true -%} yes {%- endif %} </p>',
|
||||
expected: '<p> yes </p>'
|
||||
}, {
|
||||
text: '<p> {% if false -%} no {%- endif %} </p>',
|
||||
expected: '<p> </p>'
|
||||
}, {
|
||||
text: '<p> {% if true -%} yes {% endif -%} </p>',
|
||||
expected: '<p> yes </p>'
|
||||
}, {
|
||||
text: '<p> {% if false -%} no {% endif -%} </p>',
|
||||
expected: '<p> </p>'
|
||||
}, {
|
||||
text: '<p> {%- if true %} yes {%- endif %} </p>',
|
||||
expected: '<p> yes </p>'
|
||||
}, {
|
||||
text: '<p> {%- if false %} no {%- endif %} </p>',
|
||||
expected: '<p> </p>'
|
||||
}, {
|
||||
text: `
|
||||
<div>
|
||||
<p>
|
||||
{{- 'John' }}
|
||||
</p>
|
||||
</div>
|
||||
`,
|
||||
expected: `
|
||||
<div>
|
||||
<p>John
|
||||
</p>
|
||||
</div>
|
||||
`
|
||||
}, {
|
||||
text: `
|
||||
<div>
|
||||
<p>
|
||||
{%- if true %}
|
||||
yes
|
||||
{%- endif %}
|
||||
</p>
|
||||
</div>
|
||||
`,
|
||||
expected: `
|
||||
<div>
|
||||
<p>
|
||||
yes
|
||||
</p>
|
||||
</div>
|
||||
`
|
||||
}, {
|
||||
text: `
|
||||
<div>
|
||||
<p>
|
||||
{%- if false %}
|
||||
no
|
||||
{%- endif %}
|
||||
</p>
|
||||
</div>
|
||||
`,
|
||||
expected: `
|
||||
<div>
|
||||
<p>
|
||||
</p>
|
||||
</div>
|
||||
`
|
||||
}, {
|
||||
text: `
|
||||
<div>
|
||||
<p>
|
||||
{{ 'John' -}}
|
||||
</p>
|
||||
</div>
|
||||
`,
|
||||
expected: `
|
||||
<div>
|
||||
<p>
|
||||
John</p>
|
||||
</div>
|
||||
`
|
||||
}, {
|
||||
text: `
|
||||
<div>
|
||||
<p>
|
||||
{% if true -%}
|
||||
yes
|
||||
{% endif -%}
|
||||
</p>
|
||||
</div>
|
||||
`,
|
||||
expected: `
|
||||
<div>
|
||||
<p>
|
||||
yes
|
||||
</p>
|
||||
</div>
|
||||
`
|
||||
}, {
|
||||
text: `
|
||||
<div>
|
||||
<p>
|
||||
{% if false -%}
|
||||
no
|
||||
{% endif -%}
|
||||
</p>
|
||||
</div>
|
||||
`,
|
||||
expected: `
|
||||
<div>
|
||||
<p>
|
||||
</p>
|
||||
</div>
|
||||
`
|
||||
}, {
|
||||
text: `
|
||||
<div>
|
||||
<p>
|
||||
{%- if true %}
|
||||
yes
|
||||
{% endif -%}
|
||||
</p>
|
||||
</div>
|
||||
`,
|
||||
expected: `
|
||||
<div>
|
||||
<p>
|
||||
yes
|
||||
</p>
|
||||
</div>
|
||||
`
|
||||
}, {
|
||||
text: `
|
||||
<div>
|
||||
<p>
|
||||
{%- if false %}
|
||||
no
|
||||
{% endif -%}
|
||||
</p>
|
||||
</div>
|
||||
`,
|
||||
expected: `
|
||||
<div>
|
||||
<p></p>
|
||||
</div>
|
||||
`
|
||||
}, {
|
||||
text: `
|
||||
<div>
|
||||
<p>
|
||||
{% if true -%}
|
||||
yes
|
||||
{%- endif %}
|
||||
</p>
|
||||
</div>
|
||||
`,
|
||||
expected: `
|
||||
<div>
|
||||
<p>
|
||||
yes
|
||||
</p>
|
||||
</div>
|
||||
`
|
||||
}, {
|
||||
text: `
|
||||
<div>
|
||||
<p>
|
||||
{% if false -%}
|
||||
no
|
||||
{%- endif %}
|
||||
</p>
|
||||
</div>
|
||||
`,
|
||||
expected: `
|
||||
<div>
|
||||
<p>
|
||||
|
||||
</p>
|
||||
</div>
|
||||
`
|
||||
}, {
|
||||
text: `
|
||||
<div>
|
||||
<p>
|
||||
{{- 'John' -}}
|
||||
</p>
|
||||
</div>
|
||||
`,
|
||||
expected: `
|
||||
<div>
|
||||
<p>John</p>
|
||||
</div>
|
||||
`
|
||||
}, {
|
||||
text: `
|
||||
<div>
|
||||
<p>
|
||||
{%- if true -%}
|
||||
yes
|
||||
{%- endif -%}
|
||||
</p>
|
||||
</div>
|
||||
`,
|
||||
expected: `
|
||||
<div>
|
||||
<p>yes</p>
|
||||
</div>
|
||||
`
|
||||
}, {
|
||||
text: `
|
||||
<div>
|
||||
<p>
|
||||
{%- if false -%}
|
||||
no
|
||||
{%- endif -%}
|
||||
</p>
|
||||
</div>
|
||||
`,
|
||||
expected: `
|
||||
<div>
|
||||
<p></p>
|
||||
</div>
|
||||
`
|
||||
}, {
|
||||
text: `
|
||||
<div>
|
||||
<p>
|
||||
{{- 'John' -}},
|
||||
{{- '30' -}}
|
||||
</p>
|
||||
</div>
|
||||
`,
|
||||
expected: `
|
||||
<div>
|
||||
<p>John,30</p>
|
||||
</div>
|
||||
`
|
||||
}, {
|
||||
text: `
|
||||
<div>
|
||||
<p>
|
||||
{%- if true -%}
|
||||
yes
|
||||
{%- endif -%}
|
||||
</p>
|
||||
</div>
|
||||
`,
|
||||
expected: `
|
||||
<div>
|
||||
<p>yes</p>
|
||||
</div>
|
||||
`
|
||||
}, {
|
||||
text: `
|
||||
<div>
|
||||
<p>
|
||||
{%- if false -%}
|
||||
no
|
||||
{%- endif -%}
|
||||
</p>
|
||||
</div>
|
||||
`,
|
||||
expected: `
|
||||
<div>
|
||||
<p></p>
|
||||
</div>
|
||||
`
|
||||
}, {
|
||||
text: `
|
||||
<div>
|
||||
<p>
|
||||
{{- 'John' -}}
|
||||
{{- '30' -}}
|
||||
</p>
|
||||
<b>
|
||||
{{ 'John' -}}
|
||||
{{- '30' }}
|
||||
</b>
|
||||
<i>
|
||||
{{- 'John' }}
|
||||
{{ '30' -}}
|
||||
</i>
|
||||
</div>
|
||||
`,
|
||||
expected: `
|
||||
<div>
|
||||
<p>John30</p>
|
||||
<b>
|
||||
John30
|
||||
</b>
|
||||
<i>John
|
||||
30</i>
|
||||
</div>
|
||||
`
|
||||
}, {
|
||||
text: `
|
||||
<div>
|
||||
{%- if true -%}
|
||||
{%- if true -%}
|
||||
<p>
|
||||
{{- 'John' -}}
|
||||
</p>
|
||||
{%- endif -%}
|
||||
{%- endif -%}
|
||||
</div>
|
||||
`,
|
||||
expected: `
|
||||
<div><p>John</p></div>
|
||||
`
|
||||
}, {
|
||||
text: `
|
||||
<div>
|
||||
{% raw %}
|
||||
{%- if true -%}
|
||||
<p>
|
||||
{{- 'John' -}}
|
||||
</p>
|
||||
{%- endif -%}
|
||||
{% endraw %}
|
||||
</div>
|
||||
`,
|
||||
expected: `
|
||||
<div>
|
||||
|
||||
{%- if true -%}
|
||||
<p>
|
||||
{{- 'John' -}}
|
||||
</p>
|
||||
{%- endif -%}
|
||||
|
||||
</div>
|
||||
`
|
||||
}
|
||||
]
|
||||
|
||||
describe('Whitespace Control', function () {
|
||||
cases.forEach(item => it(
|
||||
item.text,
|
||||
() => expect(liquid.parseAndRender(item.text)).to.eventually.equal(item.expected)
|
||||
))
|
||||
})
|
||||
Reference in New Issue
Block a user