ngtemplate
文件大小: unknow
源码售价: 5 个金币 积分规则     积分充值
资源说明:ngtemplate - A template engine written in C designed to be syntax-compatible with Google CTemplate
# ngtemplate 

A template engine written in C designed to be syntax-compatible with Google CTemplate, released under the MIT license

**Version 0.1, so there's plenty more work to do.  Please feel free to submit an issue or a pull request for bug fixes or more features.**

Introduction
------------

ngtemplate is a small, fast template engine written in C.  Like Google's CTemplate, it
strives to be as simple as possible to shield developers from the temptation of embedding
logic inside their templates.  An example of an ngtemplate would be:

    Hello, {{Name}}.  You have read {{NumPosts}} posts on our blog today.  Thank you for visiting!

When combined with the following dictionary:

    Name=John
    NumPosts=7

The engine will emit the following string as output:

    Hello, John.  You have read 7 posts on our blog today.  Thank you for visiting!

To get a better idea of what you can do with ngtemplate, see [Google's CTemplate howto](http://google-ctemplate.googlecode.com/svn/trunk/doc/howto.html)

Installing
----------

To use ngtemplate:

- Install CMake if you don't have it
- Clone the git repository
- cd ngtemplate
- git submodule init
- git submodule update
- mkdir build
- cd build
- cmake ../src
- make
- make test
    
If all went well you should have `libngtemplate.a` and `libuseful.a` in your build directory

NOTE: CMake-less compilation and binary distributions will come eventually

Usage
-----

In a nutshell: 

    char* output;
    const char* tplstring = "Here, have a {{Template}}!";
    
    /* Init some structs */
    ngt_template* template = ngt_new();
    ngt_dictionary* dictionary = ngt_dictionary_new();
        
    /* Set some stuff in the dictionary */
    ngt_set_string(dictionary, "Template", "Beer");
    
    /* Associate the template with the dictionary and template string and expand the template */
    template->template = tplstring;
    ngt_set_dictionary(template, dictionary);
    ngt_expand(tpl, &output);
    
    /* Should be "The template is: Here, have a Beer!" */
    fprintf(stdout, "The template is: %s\n", output);
    
    /* Clean stuff up */
    free(output);
    ngt_destroy(template);
    ngt_dictionary_destroy(dictionary);

Differences from CTemplate
--------------------------

- ngtemplate is a little more dynamic than CTemplate.  You are allowed to set `variable_missing` and 
      `modifier_missing` callbacks to populate templates dynamically rather than stuffing variable
      values in a data dictionary ahead of time (or some combination of the two approaches).  This
      allows neat tricks similar to the magic you can pull off with Ruby's `method_missing`
- Unlike in CTemplate, you can have as many `FOO_separator` sections as you like inside a template 
      and they will all be expanded in the order in which the separators are placed
- Block scope for marker identifiers works even for template includes.  In other words, if an
      included template references a marker not in the include template's dictionary, it will be found
      if the including template has a dictionary entry with that name
- Includes a built-in modifier called `:cstring_escape` that turns newlines into \n, tabs into \t, 
      quotes into \", and so forth
- Modifier semantics are a little different than they are in CTemplate:
    - Custom modifiers don't require an `x-` prefix
    - You can override the built-in modifiers
    - Syntax for modifier arguments are more consistent: for all modifiers you must start an 
          arg list with `=`'.  In CTemplate the semantics for custom modifiers are different than
          built-ins.  For backward compatibility with CTemplate, modifiers that start with `x-` treat
          the first thing following the next colon as modifier arguments, just like in CTemplate
    - You can chain custom modifiers together just like built-in modifiers

Known Issues and Limitations
----------------------------

- You cannot currently specify search directories for templates.  Calls to `template_set_filename()` need to have absolute or resolvable relative paths to the template file
- Probably not UTF-8/Unicode compatible
- Probably susceptible to buffer overruns.  Haven't done a threat analysis yet.
- `AUTOESCAPE` is not supported, and probably won't be unless someone sends me a patch for it
- `json_escape` and `javascript_escape` modifiers are not supported
- Modifiers are not yet supported on includes
- Per-expand-data and custom emitters are not currently supported
- Custom delimiters are supported (via `{{= =}}`), but they cannot be more than 8 characters long
- Repeatedly generating output from the same template is slower than it needs to be, because we do not parse the source template into an internal data structure before processing

本源码包内暂不包含可直接显示的源代码文件,请下载源码包。