# mustache# An extension of the mustache text template engine for .NET. Download using NuGet: [mustache#](http://nuget.org/packages/mustache-sharp) ## Overview Generating text has always been a chore. Either you're concatenating strings like a mad man or you're getting fancy with `StringBuilder`. Either way, the logic for conditionally including values or looping over a collection really obscures the intention of the code. A more declarative approach would improve your code big time. Hey, that's why server-side scripting got popular in the first place, right? [mustache](http://mustache.github.com/) is a really simple tool for generating text. .NET developers already had access to `String.Format` to accomplish pretty much the same thing. The only problem was that `String.Format` used indexes for placeholders: `Hello, {0}!!!`. **mustache** let you use meaningful names for placeholders: `Hello, {{name}}!!!`. **mustache** is a logic-less text generator. However, almost every time I've ever needed to generate text I needed to turn some of it on or off depending on a value. Not having the ability to turn things off usually meant going back to building my text in parts. Introducing [handlebars.js](http://handlebarsjs.com/)... If you've needed to generate any HTML templates, **handlebars.js** is a really awesome tool. Not only does it support an `if` and `each` tag, it lets you define your own tags! It also makes it easy to reference nested values `{{Customer.Address.ZipCode}}`. **mustache#** brings the power of **handlebars.js** to .NET and then takes it a little bit further. It is geared towards building ordinary text documents, rather than just HTML. It differs from **handlebars.js** in the way it handles newlines. With **mustache#**, you explicitly indicate when you want newlines - actual newlines are ignored. Hello, {{Customer.Name}} {{#newline}} {{#newline}} {{#with Order}} {{#if LineItems}} Here is a summary of your previous order: {{#newline}} {{#newline}} {{#each LineItems}} {{ProductName}}: {{UnitPrice:C}} x {{Quantity}} {{#newline}} {{/each}} {{#newline}} Your total was {{Total:C}}. {{#else}} You do not have any recent purchases. {{/if}} {{/with}} Most of the lines in the previous example will never appear in the final output. This allows you to use **mustache#** to write templates for normal text, not just HTML/XML. ## Placeholders The placeholders can be any valid identifier. These map to the property names in your classes. ### Formatting Placeholders Each format item takes the following form and consists of the following components: {{identifier[,alignment][:formatString]}} The matching braces are required. Notice that they are double curly braces! The alignment and the format strings are optional and match the syntax accepted by `String.Format`. Refer to [String.Format](http://msdn.microsoft.com/en-us/library/system.string.format.aspx)'s documentation to learn more about the standard and custom format strings. ### Placeholder Scope The identifier is used to find a property with a matching name. If you want to print out the object itself, you can use the special identifier `this`. FormatCompiler compiler = new FormatCompiler(); Generator generator = compiler.Compile("Hello, {{this}}!!!"); string result = generator.Render("Bob"); Console.Out.WriteLine(result); // Hello, Bob!!! Some tags, such as `each` and `with`, change which object the values will be retrieved from. If a property with the placeholder name can't be found at the current scope, the name will be searched for at the next highest level. **mustache#** will automatically detect when an object is a dictionary and search for a matching key. In this case, it still needs to be a valid identifier name. ### Nested Placeholders If you want to grab a nested property, you can separate identifiers using `.`. {{Customer.Address.ZipCode}} ## The 'if' tag The **if** tag allows you to conditionally include a block of text. Hello{{#if Name}}, {{Name}}{{/if}}!!! The block will be printed if: * The value is a non-empty string. * The value is a non-empty collection. * The value isn't the NUL char. * The value is a non-zero number. * The value evaluates to true. The **if** tag has complimentary **elif** and **else** tags. There can be as many **elif** tags as desired but the **else** tag must appear only once and after all other tags. {{#if Male}}Mr.{{#elif Married}}Mrs.{{#else}}Ms.{{/if}} ## The 'eq' tag The **eq** tag allows you to conditionally include a block of text, by comparing if two values are equal. {{#eq Name UserName}}Hello {{Name}} !!!{{/eq}} You can also use specific values as the target value for comparison, rather than values from the model by prefixing the value with the "_" character: Hello {{#eq User.Role _admin}}Maestro!{{#else}}{{Name}}{{/eq}} The block will be printed if: * Both values are null * Both values are strings, and are equal (case insensitive) * Both values are integers or doubles, and are equal * Both values are boolean, and are equal ## The 'lt' tag The **lt** tag allows you to conditionally include a block of text, by comparing if two values are equal. {{Budget}} Again, you can use specific values as the target for the comparison parameter, by prefixing the value with the "_" character: {{Budget}} The block will be printed if: * Both values are integers or doubles, and the first value is less than the second ## The 'lte', 'gt', 'gte' tags These tags work in the same way as the 'lt' tag, ('lte' = less than or equal to). ## The 'each' tag If you need to print out a block of text for each item in a collection, use the **each** tag. {{#each Customers}} Hello, {{Name}}!! {{/each}} Within the context of the **each** block, the scope changes to the current item. So, in the example above, `Name` would refer to a property in the `Customer` class. Additionally, you can access the current index into the collection being enumerated using the **index** tag.