mirror of
https://github.com/harttle/liquidjs.git
synced 2026-09-16 04:40:39 -07:00
fix #61: static filename not parsed for subdirectories
This commit is contained in:
+14
-7
@@ -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
@@ -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
@@ -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
@@ -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')
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user