mustache / spec

The Mustache spec.
MIT License
364 stars 71 forks source link

Feature Request: Variable Defaults #64

Closed spudly closed 11 years ago

spudly commented 11 years ago

Right now if you tell mustache to output a variable, it defaults to empty string if the variable has no value. I'd like to be able to specify a default string to output in this case. For example:

Data:

{
  people: [
    {name: "Bob", fav_food: "Pizza"},
    {name: "Joe", fav_color: "Orange"}
  ]
}

With the current spec, I would have to write this:

{{#people}}
  <h1>{{name}}</h1>
  <dl>
    <dt>Favorite Color:</dt><dd>{{#fav_color}}{{fav_color}}{{/fav_color}}{{^fav_color}}None{{/fav_color}}</dd>
    <dt>Favorite Food:</dt><dd>{{#fav_food}}{{fav_food}}{{/fav_food}}{{^fav_food}}None{{/fav_food}}</dd>
  </dl>
{{/people}}

If some sort of default syntax were added, I could write this instead:

{{#people}}
  <h1>{{name}}</h1>
  <dl>
    <dt>Favorite Color:</dt><dd>{{fav_color || "None"}}</dd>
    <dt>Favorite Food:</dt><dd>{{fav_food || "None"}}</dd>
  </dl>
{{/people}}
groue commented 11 years ago

Sure. Check the template delegate guide, linked from the README. It covers exactly this use case.

spudly commented 11 years ago

Maybe I'm missing something but I wasn't able to find it. Are you referring to the mustache spec README.md?

groue commented 11 years ago

Nope. Sorry I'm on a mobile phone and copy pasting a link is not so easy : look for "tag delegate" in the GRMustache home page on github. Follow the link. There is the solution to your issue.

Tell me if it works as I expect.

groue commented 11 years ago

Oops, sorry, wrong repo. My mistake. Mustache has no such feature. Some implementations do, such as GRMustache. I advise you to check with your current Mustache implementation.

spudly commented 11 years ago

Unfortunately, the templates I write need to work under multiple implementations, so I can't rely on implementation-specific code.

groue commented 11 years ago

Yes. But you can open issues in each of these implementation repositories.

Before making the exact same suggestion, please open your eyes, and see that your suggestion:

Some implementations provide with the feature you are looking for in a much more general way. Please, please, please, don't suggest JS/PHP implementations to implement your || syntax.

spudly commented 11 years ago

I understand your concerns. If mustache doesn't currently parse literal values this would indeed be a much larger undertaking than simply adding a new operator. The || syntax I suggested may not be the best way to implement this. I'm certainly open to doing it in other ways, perhaps as a callback function that could generate a default value. Or maybe if the spec had a filter syntax as is being discussed in #41 no changes would be necessary as you could use a filter to do it ({{foo | defaultToNone}}).

groue commented 11 years ago

Yes @spudly, I agree filters could do that as well.

In GRMustache, you have two ways to provide default values:

This issue is typical of an use case that does not deserve a specific solution. It needs (#41), or has (GRMustache delegate and filters) more general mechanisms that include a solution for it.

spudly commented 11 years ago

Closing in favor of #41.