whisker icon indicating copy to clipboard operation
whisker copied to clipboard

whisker does not support #sections with non empty lists

Open ctbrown opened this issue 8 years ago • 1 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>"

ctbrown avatar Mar 31 '16 13:03 ctbrown

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)

pmarchand1 avatar May 19 '16 20:05 pmarchand1