edwindj / whisker

{{mustache}} for R
https://mustache.github.io
213 stars 19 forks source link

whisker does not support #sections with non empty lists #22

Open ctbrown opened 8 years ago

ctbrown commented 8 years ago

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>"
pmarchand1 commented 8 years ago

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)