ginger icon indicating copy to clipboard operation
ginger copied to clipboard

C++ Template Engine for HTML/CSS/JavaScript

====== ginger

Template is here

.. sourcecode:: html

${title}

List of values:

    $for x in xs {{ $if x.enable {{
  • ${x.value}
  • }} }}

Source code is here

.. sourcecode:: cpp

#include "ginger.h" #include #include #include #include #include

int main() { std::vector<std::map<std::string, ginger::object>> xs; xs.push_back({ { "enable", true }, { "url", "http://example.com" }, { "value", "Example" }, }); xs.push_back({ { "enable", false }, { "url", "undefined" }, { "value", "Test" }, }); xs.push_back({ { "enable", true }, { "url", "http://google.com" }, { "value", "Google" }, });

  std::map<std::string, ginger::object> t;
  t["title"] = "Sample Site";
  t["xs"] = xs;

  std::stringstream ss;
  ss << std::cin.rdbuf();
  try {
      ginger::parse(ss.str(), t);
  } catch (ginger::parse_error& error) {
      std::cerr << error.long_error() << std::endl;
  }

}

Result

.. sourcecode:: html

Sample Site

List of values:

        <li><a href="http://example.com">Example</a></li>
      
    
      
    
      
        <li><a href="http://google.com">Google</a></li>
      
    
  </ul>
</body>

Requirements

Input

  • below expression should be valid

    .. sourcecode:: cpp

    auto first = std::begin(input); auto last = std::end(input);

  • first, last should be ForwardIterator.

Dictionary

  • Below expressions should be valid

    .. sourcecode:: cpp

    std::string var; auto it = dic.find(var); it != dic.end();

  • Type of it->second should be object.

Output

  • Below expression should be valid

    .. sourcecode:: cpp

    // Output output; // default constructible is not required. // For any ForwardIterator first, last output.put(first, last); output.flush();

Reference

object

Class object can construct from any value.

.. sourcecode:: cpp

class object { public: object() = default; object(const object&) = default; object(object&&) = default; object& operator=(const object&) = default; object& operator=(object&&) = default;

  template<class T> object(T v);
  template<class T> void operator=(T v);

};

parse

.. sourcecode:: cpp

template<class Input, class Dictionary> void parse(Input&& input, Dictionary&& t); template<class Input, class Dictionary, class Output> void parse(Input&& input, Dictionary&& t, Output&& out);

template<class Dictionary> void parse(const char* input, Dictionary&& t); template<class Dictionary, class Output> void parse(const char* input, Dictionary&& t, Output&& out);

Template Syntax Specification

::

= = ( | <$comment> | <$for> | <$if> | <$variable> | $$ | ${{ | $}}) | = any character without '$' <$comment> = $#* = any character without '\n' and <$for> = $for in {{ }} <$if> = $if {{ }} ($elseif {{ }})? ($else {{ }})? <$variable> = ${} = (.)* = + = any character without , '.', '{' or '}' = c <= 32 where c is character