Skip to content

Commit

Permalink
Fix partials to indent as demanded by the mustache spec
Browse files Browse the repository at this point in the history
The mustache specs [1] and testsuite [2], as well as the lustache README.md [3]
 demand that partials be indented.

[1]: http://mustache.github.io/mustache.5.html
[2]: https://github.com/mustache/spec/blob/v1.1.3/specs/partials.yml#L82-L100
[3]: https://github.com/Olivine-Labs/lustache#partials
  • Loading branch information
Dennis Schridde committed Jan 29, 2017
1 parent c2e7573 commit 341b9db
Showing 1 changed file with 19 additions and 3 deletions.
22 changes: 19 additions & 3 deletions src/lustache/renderer.lua
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ local function compile_tokens(tokens, originalTemplate)
t == "^" and rnd:_inverted(
token.value, ctx, subrender(i, token.tokens)
) or
t == ">" and rnd:_partial(token.value, ctx, originalTemplate) or
t == ">" and rnd:_partial(token.value, ctx, originalTemplate, token.startIndex) or
(t == "{" or t == "&") and rnd:_name(token.value, ctx, false) or
t == "name" and rnd:_name(token.value, ctx, true) or
t == "text" and token.value or ""
Expand Down Expand Up @@ -249,7 +249,7 @@ function renderer:_inverted(name, context, callback)
return ""
end

function renderer:_partial(name, context, originalTemplate)
function renderer:_partial(name, context, originalTemplate, startIndex)
local fn = self.partial_cache[name]

-- check if partial cache exists
Expand All @@ -264,7 +264,23 @@ function renderer:_partial(name, context, originalTemplate)
fn = self:compile(partial, nil, originalTemplate)
self.partial_cache[name] = fn
end
return fn and fn(context, self) or ""

local startOfLineIndex = 1
for i = startIndex, 1, -1 do
if string_sub(originalTemplate, i, i) == "\n" then
startOfLineIndex = i + 1
break
end
end
local indent = string_sub(originalTemplate, startOfLineIndex, startIndex - 1)

local str = fn and fn(context, self) or ""
local buf = {}
for i,line in ipairs(string_split(str, "\n")) do
buf[#buf+1] = (i > 1 and indent or "") .. line .. "\n"
end

return table_concat(buf)
end

function renderer:_name(name, context, escape)
Expand Down

0 comments on commit 341b9db

Please sign in to comment.