edwindj / whisker

{{mustache}} for R

Home Page:https://mustache.github.io

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

whisker does not support #sections with non empty lists

ctbrown opened this issue · comments

While whisker supports sections, it does not appear to support sections with non-empty lists as described in https://mustache.github.io/mustache.5.html:

Template:

{{#repo}}
  <b>{{name}}</b>
{{/repo}}

Hash:

{
  "repo": [
    { "name": "resque" },
    { "name": "hub" },
    { "name": "rip" }
  ]
}

Output:

<b>resque</b>
<b>hub</b>
<b>rip</b>

Using JSON

This closely follows the mustache documentation by usingjsonlite to convert the hash to an R object. The R object is a list with a data frame of 3 rows.

library(jsonlite)
library(whisker)

tmpl <- 
  "{{#repo}}
  <b>{{name}}</b>
  {{/repo}}"

hash <- 
  '{
    "repo": [
      { "name": "resque" },
      { "name": "hub" },
      { "name": "rip" }
    ]
  }'

data <- fromJSON(hash)  # list of data.frame not list of list


whisker.render(tmpl,data)   

This does not conform to the specification is not correct as in collapses the name column rather than returning three results. According to the specification, I would expect this result:

c("<b>resque</b>","<b>hub</b>","<b>rip</b>")

Using list-of-lists

Using a list of lists does not work either:

data <- list( repo = list( name="resque", name="hub", name="rip") )
whisker.render(tmpl,data) 
# [1] "<b>resque</b>"

You need one more level of nesting.
data <- list(repo = list(list(name = "resque"), list(name = "hub"), list (name = "rip")))

The fromJSON call returns the correct format as long as simplifyVector is FALSE i.e.
data <- fromJSON(hash, simplifyVector = FALSE)