GRMustache
GRMustache is a flexible and production-ready implementation of Mustache templates for MacOS Cocoa and iOS.
GRMustache targets iOS down to version 4.3, MacOS down to 10.6 Snow Leopard (with or without garbage collection), and only depends on the Foundation framework.
October 19, 2013: GRMustache 6.8.3 is out. Release notes
Get release announcements and usage tips: follow @GRMustache on Twitter.
How To
1. Setup your Xcode project
You have three options, from the simplest to the hairiest:
2. Start rendering templates
#import "GRMustache.h"
One-liners:
// Renders "Hello Arthur!"
NSString *rendering = [GRMustacheTemplate renderObject:@{ @"name": @"Arthur" } fromString:@"Hello {{name}}!" error:NULL];
// Renders the `Profile.mustache` resource of the main bundle
NSString *rendering = [GRMustacheTemplate renderObject:user fromResource:@"Profile" bundle:nil error:NULL];
Reuse templates in order to avoid parsing the same template several times:
GRMustacheTemplate *template = [GRMustacheTemplate templateFromResource:@"Profile" bundle:nil error:nil];
rendering = [template renderObject:arthur error:NULL];
rendering = [template renderObject:barbara error:NULL];
rendering = ...
GRMustachio by Jonathan Mitchell is "A super simple, interactive GRMustache based application". It can help you design and test your templates.
Documentation
Mustache syntax
Reference
- Reference: the GRMustache reference, automatically generated from inline documentation, for fun and profit, by appledoc.
Guides
Introduction:
- Introduction: a tour of the library features, and most common use cases.
Basics:
- Templates: how to load templates.
- Partials: decompose your templates into components named "partials".
- Templates Repositories: manage groups of templates.
- Runtime: how GRMustache renders your data.
- ViewModel: an overview of various techniques to feed templates.
Services:
- Configuration
- HTML vs. Text templates
- Standard Library: built-in candy, for your convenience.
- NSFormatter, NSNumberFormatter, NSDateFormatter, etc. Use them.
Hooks:
- Filters:
{{ uppercase(name) }}
et al. - Rendering Objects: "Mustache lambdas", and more.
- Tag Delegates: observe and alter template rendering.
- Protected Contexts: protect some keys so that they always evaluate to the same value.
Mustache, and beyond:
- Compatibility: compatibility with other Mustache implementations, in details.
Sample code
Check the FAQ right below.
FAQ
-
Q: I get "unrecognized selector sent to instance" errors.
A: Check that you have added the
-ObjC
option in the "Other Linker Flags" of your target (how to). -
Q: Is it possible to render array indexes? Customize first and last elements? Distinguish odd and even items, play fizzbuzz?
-
Q: Is it possible to format numbers and dates?
A: Yes. Use NSNumberFormatter and NSDateFormatter.
-
Q: Is it possible to pluralize/singularize strings?
A: Yes. You have some sample code in issue #50. You may check @mattt's InflectorKit for actual inflection methods.
-
Q: Is it possible to write Handlebars-like helpers?
A: Yes
-
Q: Is it possible to localize templates?
A: Yes
-
Q: Is it possible to embed partial templates whose name is only known at runtime?
A: Yes
-
Q: Does GRMustache provide any layout or template inheritance facility?
A: Yes
-
Q: Is it possible to render a default value for missing keys?
A: Yes.
-
Q: Is it possible to disable HTML escaping?
A: Yes
-
Q: What is this NSUndefinedKeyException stuff?
A: When GRMustache has to try several objects until it finds the one that provides a
{{key}}
, several NSUndefinedKeyException may be raised and caught. It's likely that you wish Xcode would stop breaking on those exceptions: see the Runtime Guide. -
Q: Why does GRMustache need JRSwizzle?
A: GRMustache does not need it, and does not swizzle anything unless you explicitly ask for it.
[GRMustache preventNSUndefinedKeyExceptionAttack]
swizzles NSObject'svalueForUndefinedKey:
in order to prevent NSUndefinedKeyException during template rendering.You will debug your application without Xcode's exception breakpoint disturbing you. You may even improve rendering performances. See the Runtime Guide.
What other people say
I'm loving grmustache
Oh man GRMustache saved my ass once again. Awesome lib.
GRMustache filters extension saved us from great escaping PITAs. Thanks @groue.
@orj:
Thank fucking christ for decent iOS developers who ship .lib files in their Github repos. #GRMustache
@issya should see the HTML template I built, pretty wicked. GRMustache is the best.
Using GRMustache (Cocoa) for template processing. Looks like a top quality library. Good developer and good units tests. Get it on GitHub.
okay GRMustache is the fucking daddy
GRMustache is teh awesome. Nice to find an open-source library that is more pleasant to use than expected.
Who's using GRMustache
- tomaz/appledoc: Objective-c code Apple style documentation set generator.
- mapbox/mapbox-ios-sdk: MapBox iOS SDK, an open source alternative to MapKit.
- CarterA/Tribo: Extremely fast static site generator written in Objective-C.
- AutoLib uses GRMustache and spullara/mustache.java for rendering an identical set of Mustache templates on iOS and Android.
- Bee: Bee is a desktop bug tracker for the Mac. It currently syncs with GitHub Issues, JIRA and FogBugz.
- CinéObs uses GRMustache for RSS feeds rendering.
- Fotopedia, the first collaborative photo encyclopedia.
- FunGolf GPS, a golf app with 3D maps.
- KosmicTask, an integrated scripting environment for OS X that supports more than 20 scripting languages.
- MyInvoice, an invoicing iOS app.
- Servus can turn any file on your computer into a branded download page hosted on Dropbox.
Do you use GRMustache? Tweet me your story and your link.
Contribution wish-list
Please look for an open issue that smiles at you!
... And I wish somebody would review the non-native English of the documentation and guides.
Forking
Please fork. You'll learn useful information in the Forking Guide.
License
Released under the MIT License.