name mode size
MulleMongoose.h 100644 1.82kB
MulleMongoose.m 100644 6.91kB
MulleMutableLineNumber.h 100644 1.99kB
MulleMutableLineNumber.m 100644 3.48kB
MulleObjCCompilerSettings.h 100644 1.67kB
MulleScion.h 100644 3.94kB
MulleScion.m 100644 8.85kB
MulleScionDataSourceProtocol.h 100644 3.62kB
MulleScionDataSourceProtocol.m 100644 6.23kB
MulleScionNull.h 100644 1.78kB
MulleScionNull.m 100644 1.81kB
MulleScionObjectModel+BlockExpansion.h 100644 2.1kB
MulleScionObjectModel+BlockExpansion.m 100644 4.31kB
MulleScionObjectModel+Description.h 100644 1.93kB
MulleScionObjectModel+Description.m 100644 9.33kB
MulleScionObjectModel+MacroExpansion.h 100644 2.56kB
MulleScionObjectModel+MacroExpansion.m 100644 14.51kB
MulleScionObjectModel+MulleMongoose.h 100644 2.08kB
MulleScionObjectModel+MulleMongoose.m 100644 5.18kB
MulleScionObjectModel+NSCoding.h 100644 1.92kB
MulleScionObjectModel+NSCoding.m 100644 7.28kB
MulleScionObjectModel+Parsing.h 100644 2.07kB
MulleScionObjectModel+Parsing.m 100644 2.61kB
MulleScionObjectModel+Printing.h 100644 2.58kB
MulleScionObjectModel+Printing.m 100644 46.11kB
MulleScionObjectModel+StringReplacement.h 100644 269B
MulleScionObjectModel+StringReplacement.m 100644 3.17kB
MulleScionObjectModel.h 100644 9.65kB
MulleScionObjectModel.m 100644 17.46kB
MulleScionOutputProtocol.h 100644 1.87kB
MulleScionParser+Parsing.h 100644 2.94kB
MulleScionParser+Parsing.m 100644 60.17kB
MulleScionParser.h 100644 2.25kB
MulleScionParser.m 100644 5.78kB
MulleScionPrinter.h 100644 2.22kB
MulleScionPrinter.m 100644 3.14kB
MulleScionPrintingException.h 100644 2.1kB
MulleScionPrintingException.m 100644 3.58kB
MulleScionTemplate+CompressedArchive.h 100644 1.89kB
MulleScionTemplate+CompressedArchive.m 100644 5.89kB
MulleScionTemplates-Info.plist 100644 987B
MulleScionTemplates.c 100644 1.73kB
MulleScionTemplates.h 100644 1.7kB
NSData+ZLib.h 100644 922B
NSData+ZLib.m 100644 2.63kB
NSObject+MulleScionDataSource.h 100644 249B
NSObject+MulleScionDescription.h 100644 2.24kB
NSObject+MulleScionDescription.m 100644 8.47kB
NSString+HTMLEscape.h 100644 1.79kB
NSString+HTMLEscape.m 100644 3.13kB
NSValue+CheatAndHack.m 100644 2.45kB
main.m 100644 7.89kB
mongoose.c 100644 173.99kB
mongoose.h 100644 11.3kB
mulle-scion.1 100644 1.97kB
MulleScionTemplates is a modern template engine for Objective C ============= (written in an oldfashioned way) *** It's **heavily** (very heavily) inspired by [TWIG]("") "The flexible, fast, and secure template engine for PHP" *MulleScionTemplates* is fairly flexible, reasonably fast and can be made as secure as you wish. * **Reasonably Fast** : *MulleScionTemplates* can compile templates into a compressed archive format. Loading such an archive is lots faster than parsing. A compiled template is read-only, you can use it many times to render different output from different input. * **Secure** : *MulleScionTemplates* has hooks so your application can ensure that untrusted template code doesn't have access to all of the applications data. * **Flexible** : There is the possibility of extending KVC and writing your own "builtin" fuctions. A template can (if allowed) execute arbitrary ObjC code. MulleScion has a powerful define like preprocessing capability and macros to expand your template vocabulary. Here is a simple example, where ObjC code is embedded in a template: <html> <!-- rendered by {{ [[NSProcessInfo processInfo] processName] }} on {{ [NSDate date]] }} --> <body> {% for item in [NSTimeZone knownTimeZoneNames] %} {% if item#.isFirst %} <table> <tr><th>TimeZone</th></tr> {% endif %} <tr><td>{{ item }}</td></tr> {% if item#.isLast %} </table> {% endif %} {% else %} Sorry, no timezone info available. {% endfor %} </body> </html> Using the MulleScionTemplates.framework the creation of a string from your object using a template file is as easy as: NSString *output; output = [MulleScionTemplate descriptionWithTemplateFile:@"test.scion" dataSource:self]; This is the general architecture of *MulleScionTemplates* ![](/dox/MulleScionTemplatesDataFlow.png "Data Flow Sketch") ![]( "Data Flow Sketch") *MulleScionTemplates* is a work in progress, it's extremely fresh and little used (yet). DOCUMENTATION ============= Virtually all the documentation is contained in example **.scion** templates in the `dox`folder. For each command or feature there should be a separate template file that documents it. mulle-scion, the command line utility, contains a small quickly hacked together webserver that can present the documentation using *MulleScionTemplates* itself. In Xcode just run `mulle-scion` and it should setup the webserver and open your browser to the right address. MulleScion is very similar to TWIG, so you can glean much of relevance from <>. If you see a feature in TWIG but don't see it in the tests file, it's likely not there (but it's probably easily achieved some other way (define, macro, ObjC category on NSString). LIMITATIONS ============= Because you can execute arbitrary ObjC methods, and have access to Key Value Coding, MulleScion can pretty much do anything. *MulleScionTemplates* use `NSInvocation` for method calls, and that usually can not do variable arguments. So that will be a problem. Be wary of anything using structs and C-Arrays and C-strings, although *MulleScionTemplates* tries to be as helpful as possible. *MulleScionTemplates* do not do arithmetic or bitwise logic, quite on purpose. *MulleScionTemplates* do not support the `@{ }` syntax to create dictionaries. *MulleScionTemplates* `&&` and `||` have no operator precedence, use parentheses *MulleScionTemplates* don't prevent you from trying stupid things. The documentation is not very good, actually it is just more or less a collection of test cases with comments... iOS SUPPORT ============= There is a target that produces a "real framework" that you can add to your iOS projects. See for more details about using "real frameworks" with Xcode. TODO ============= It would be nice to have delayed evaluation for render results. Get rid of MulleScionNull except for printing a nil value. AUTHOR ============= Coded by Nat! 2013 Mulle kybernetiK Mongoose Webserver by Sergey Lyubka