fix #61: static filename not parsed for subdirectories

This commit is contained in:
Jun Yang
2018-03-05 00:58:26 +08:00
parent 78b6e35fbf
commit 4326c223f3
4 changed files with 90 additions and 30 deletions
+14 -7
View File
@@ -1,14 +1,21 @@
const Liquid = require('..')
const lexical = Liquid.lexical
const withRE = new RegExp(`with\\s+(${lexical.value.source})`)
const staticFileRE = /\S+/
const assert = require('../src/util/assert.js')
module.exports = function (liquid) {
liquid.registerTag('include', {
parse: function (token) {
var match = lexical.value.exec(token.args)
assert(match, `illegal token ${token.raw}`)
this.value = match[0]
var match = staticFileRE.exec(token.args)
if (match) {
this.staticValue = match[0]
}
match = lexical.value.exec(token.args)
if (match) {
this.value = match[0]
}
match = withRE.exec(token.args)
if (match) {
@@ -16,10 +23,10 @@ module.exports = function (liquid) {
}
},
render: function (scope, hash) {
var filepath = this.value
if (scope.opts.dynamicPartials) {
filepath = Liquid.evalValue(this.value, scope)
}
var filepath = scope.opts.dynamicPartials
? Liquid.evalValue(this.value, scope)
: this.staticValue
assert(filepath, `cannot include with empty filename`)
var originBlocks = scope.opts.blocks
var originBlockMode = scope.opts.blockMode
+12 -4
View File
@@ -2,6 +2,7 @@ const Liquid = require('..')
const Promise = require('any-promise')
const lexical = Liquid.lexical
const assert = require('../src/util/assert.js')
const staticFileRE = /\S+/
/*
* blockMode:
@@ -12,14 +13,21 @@ const assert = require('../src/util/assert.js')
module.exports = function (liquid) {
liquid.registerTag('layout', {
parse: function (token, remainTokens) {
var match = lexical.value.exec(token.args)
assert(match, `illegal token ${token.raw}`)
var match = staticFileRE.exec(token.args)
if (match) {
this.staticLayout = match[0]
}
match = lexical.value.exec(token.args)
if (match) {
this.layout = match[0]
}
this.layout = match[0]
this.tpls = liquid.parser.parse(remainTokens)
},
render: function (scope, hash) {
var layout = scope.opts.dynamicPartials ? Liquid.evalValue(this.layout, scope) : this.layout
var layout = scope.opts.dynamicPartials ? Liquid.evalValue(this.layout, scope) : this.staticLayout
assert(layout, `cannot apply layout with empty filename`)
// render the remaining tokens immediately
scope.opts.blockMode = 'store'
+34 -12
View File
@@ -24,13 +24,13 @@ describe('tags/include', function () {
.eventually.equal('barfoobar')
})
it('should throw when illegal', function () {
it('should throw when not exist', function () {
mock({
'/illegal.html': '{%include%}'
'/parent.html': '{%include not-exist%}'
})
return liquid.renderFile('/illegal.html').catch(function (e) {
expect(e.name).to.equal('ParseError')
expect(e.message).to.match(/illegal token {%include%}/)
return liquid.renderFile('/parent.html').catch(function (e) {
expect(e.name).to.equal('RenderError')
expect(e.message).to.match(/cannot include with empty filename/)
})
})
@@ -89,13 +89,35 @@ describe('tags/include', function () {
.eventually.equal('This is a person <p>Joe Shmoe<br/>City: Dallas</p>')
})
it('should support static filename', function () {
var staticLiquid = new Liquid({dynamicPartials: false, root: '/'})
mock({
'/with.html': 'X{% include color.html shape: "rect" %}Y',
'/color.html': 'shape:{{shape}}'
describe('static partial', function () {
it('should support filename with extention', function () {
mock({
'/parent.html': 'X{% include child.html color:"red" %}Y',
'/child.html': 'child with {{color}}'
})
var staticLiquid = new Liquid({dynamicPartials: false, root: '/'})
return expect(staticLiquid.renderFile('parent.html')).to
.eventually.equal('Xchild with redY')
})
it('should support parent paths', function () {
mock({
'/parent.html': 'X{% include bar/./../foo/child.html %}Y',
'/foo/child.html': 'child'
})
var staticLiquid = new Liquid({dynamicPartials: false, root: '/'})
return expect(staticLiquid.renderFile('parent.html')).to
.eventually.equal('XchildY')
})
it('should support subpaths', function () {
mock({
'/parent.html': 'X{% include foo/child.html %}Y',
'/foo/child.html': 'child'
})
var staticLiquid = new Liquid({dynamicPartials: false, root: '/'})
return expect(staticLiquid.renderFile('parent.html')).to
.eventually.equal('XchildY')
})
return expect(staticLiquid.renderFile('with.html')).to
.eventually.equal('Xshape:rectY')
})
})
+30 -7
View File
@@ -96,13 +96,36 @@ describe('tags/layout', function () {
return expect(liquid.renderFile('/main.html')).to
.eventually.equal('blackredA')
})
it('should support static filename', function () {
mock({
'/parent.html': '{{color}}{%block%}{%endblock%}',
'/main.html': '{% layout parent.html color:"black"%}{%block%}A{%endblock%}'
describe('static partial', function () {
it('should support filename with extention', function () {
mock({
'/parent.html': '{{color}}{%block%}{%endblock%}',
'/main.html': '{% layout parent.html color:"black"%}{%block%}A{%endblock%}'
})
var staticLiquid = Liquid({ root: '/', dynamicPartials: false })
return expect(staticLiquid.renderFile('/main.html')).to
.eventually.equal('blackA')
})
it('should support parent paths', function () {
mock({
'/foo/parent.html': '{{color}}{%block%}{%endblock%}',
'/main.html': '{% layout bar/../foo/parent.html color:"black"%}{%block%}A{%endblock%}'
})
var staticLiquid = Liquid({ root: '/', dynamicPartials: false })
return expect(staticLiquid.renderFile('/main.html')).to
.eventually.equal('blackA')
})
it('should support subpaths', function () {
mock({
'/foo/parent.html': '{{color}}{%block%}{%endblock%}',
'/main.html': '{% layout foo/parent.html color:"black"%}{%block%}A{%endblock%}'
})
var staticLiquid = Liquid({ root: '/', dynamicPartials: false })
return expect(staticLiquid.renderFile('/main.html')).to
.eventually.equal('blackA')
})
var staticLiquid = Liquid({ root: '/', dynamicPartials: false })
return expect(staticLiquid.renderFile('/main.html')).to
.eventually.equal('blackA')
})
})