<!--toc--> |
|
## Basic Structure of CppCMS template file |
|
When we build templates, we put their content into their own `skin`. Thus when we build any template, we specify its skin name as the first level command. Each skin is represented by a separate namespace at the C++ level. So the skin name is actually the C++ namespace name. |
|
The second level is view (representing a C++ class). Each view within its skin represents certain pages that should be rendered. Each view should implement the virtual function `render()`, unless it is already implemented in its parent. Each view is represented by a separate class that is derived from `cppcms::base_view` by the topmost parent. |
|
Example: |
|
<% skin purple %> |
<% view master uses data::master %> |
<% template render() %> |
... |
<% end template %> |
<% end view %> |
<% end skin %> |
|
All views may be organized to inheritance hierarchy. For example, we can have the following hierarchy for a typical blog application: |
|
[master] |
/ \ |
[page] [summary] |
/ \ / \ |
[post] [info.] [archive] [recent_posts] |
|
|
Where `master` defines the general appearance of the page --- theme. `page` uses for displaying general page |
in blog that can be `post` or `info` -- information page. On the other hand `summary` represents a list of recent posts or the archive by category. |
|
Each inherited view may redefine its parent templates that are actually virtual functions. |
|
## Syntax |
|
### HTML and Controls separation |
|
The template system of CppCMS is based on HTML pages with injected flow control commands between `<% %>` tags. |
Each template command starts with `<%` and should be closed with `%>` on the same line. |
Each template command should be closed with these "brackets". |
|
For example --- correct code: |
|
<% if not empty Name %> |
Hello <% Name %> |
<% else %> |
Hello Visitor |
<% end %> |
|
It is incorrect to "merge different commands. For example (incorrect): |
|
Hello <% if not empty name ; name ; else %>Visitor<% end %> |
|
You should not split command on different rows as well. The following is incorrect: |
|
<% if not empty |
name %> Not empty <% end %> |
|
Symbols inside commands can not include `%` or `>`. You may include them inside double quotes using C++/C escaping |
rules. For example: |
|
<% number | intf("<%04x>") %> |
|
### Syntax Description Rules |
|
The description of the syntax of template commands is done in the following way: |
|
- All keywords will be shown in small caps in single quotes. For example 'skin' |
- **NAME** is a sequence of Latin letters, digits and underscore starting with a letter. They represent identifiers and can be defined by regular expression such as: `[a-zA-Z][a-zA-Z0-9_]*`. For example `skin_1`. |
- **VARIABLE** is non-empty sequence of NAMES separated by dot "`.`" or "`->`" that may optionally end with `()` or begin with `*` for identification of function call result. No blanks are allowed. For example: `data->point.x`, `something.else()` `*foo.bar`. |
- **STRING** is standard C++/C string with standard escape characters like `"Hello \"World\""`. _Note:_ No string concatenation is allowed like `"Hello " "World" when `"Hello World" is meant`. |
- **NUMBER** is a number -- sequence of digits that may start with `-` and include `.`. It can be defined by the regular expression: `\-?\d+(\.\d*)?` |
- **IDENTIFIER** is a sequence of NAME separated by the symbol `::`. No blanks are allowed. For example: `data::page` |
- All punctuation symbols are enclosed with single quotes. Like `','`. |
- Non-mandatory elements are displayed within square brackets `[]` and mandatory ones within round brackets `()`. Options are separated by the symbol `|`. |
- There is no limit on blanks between the words. |
|
For example: |
|
'view' NAME 'uses' IDENTIFIER ['extends' NAME] |
|
Means that the following definitions are legal: |
|
<% view page uses data::page extends master %> |
<% view test uses data::test %> |
<% view test uses data_test %> |
|
And these are not: |
|
<% view 1page uses data::page extends master %> |
<% view page %> |
<% view page uses data::page extends other::master %> |
|
|
<!--toc-->
|
|
## Basic Structure of a CppCMS template file
|
|
When we build templates, we put their content into their own `skin`. Thus when we build any template, we specify its skin name as the first level command. Each skin is represented by a separate namespace at the C++ level. So the skin name is actually the C++ namespace name.
|
|
The second level is view (representing a C++ class). Each view within its skin represents certain pages that should be rendered. Each view should implement the virtual function `render()`, unless it is already implemented in its parent. Each view is represented by a separate class that is derived from `cppcms::base_view` by the topmost parent.
|
|
Example:
|
|
<% skin purple %>
|
<% view master uses data::master %>
|
<% template render() %>
|
...
|
<% end template %>
|
<% end view %>
|
<% end skin %>
|
|
All views may be organized to inheritance hierarchy. For example, we can have the following hierarchy for a typical blog application:
|
|
[master]
|
/ \
|
[page] [summary]
|
/ \ / \
|
[post] [info.] [archive] [recent_posts]
|
|
|
Where `master` defines the general appearance of the page --- theme. `page` uses for displaying general page
|
in blog that can be `post` or `info` -- information page. On the other hand `summary` represents a list of recent posts or the archive by category.
|
|
Each inherited view may redefine its parent templates that are actually virtual functions.
|
|
## Syntax
|
|
### HTML and Controls separation
|
|
The template system of CppCMS is based on HTML pages with injected flow control commands between `<% %>` tags.
|
Each template command starts with `<%` and should be closed with `%>` on the same line.
|
Each template command should be closed with these "brackets".
|
|
For example --- correct code:
|
|
<% if not empty Name %>
|
Hello <% Name %>
|
<% else %>
|
Hello Visitor
|
<% end %>
|
|
It is incorrect to "merge different commands. For example (incorrect):
|
|
Hello <% if not empty name ; name ; else %>Visitor<% end %>
|
|
You should not split command on different rows as well. The following is incorrect:
|
|
<% if not empty
|
name %> Not empty <% end %>
|
|
Symbols inside commands can not include `%` or `>`. You may include them inside double quotes using C++/C escaping
|
rules. For example:
|
|
<% number | intf("<%04x>") %>
|
|
### Syntax Description Rules
|
|
The description of the syntax of template commands is done in the following way:
|
|
- All keywords will be shown in small caps in single quotes. For example 'skin'
|
- **NAME** is a sequence of Latin letters, digits and underscore starting with a letter. They represent identifiers and can be defined by regular expression such as: `[a-zA-Z][a-zA-Z0-9_]*`. For example `skin_1`.
|
- **VARIABLE** is non-empty sequence of NAMES separated by dot "`.`" or "`->`" that may optionally end with `()` or begin with `*` for identification of function call result. No blanks are allowed. For example: `data->point.x`, `something.else()` `*foo.bar`.
|
- **STRING** is standard C++/C string with standard escape characters like `"Hello \"World\""`. _Note:_ No string concatenation is allowed like `"Hello " "World" when `"Hello World" is meant`.
|
- **NUMBER** is a number -- sequence of digits that may start with `-` and include `.`. It can be defined by the regular expression: `\-?\d+(\.\d*)?`
|
- **IDENTIFIER** is a sequence of NAME separated by the symbol `::`. No blanks are allowed. For example: `data::page`
|
- All punctuation symbols are enclosed with single quotes. Like `','`.
|
- Non-mandatory elements are displayed within square brackets `[]` and mandatory ones within round brackets `()`. Options are separated by the symbol `|`.
|
- There is no limit on blanks between the words.
|
|
For example:
|
|
'view' NAME 'uses' IDENTIFIER ['extends' NAME]
|
|
Means that the following definitions are legal:
|
|
<% view page uses data::page extends master %>
|
<% view test uses data::test %>
|
<% view test uses data_test %>
|
|
And these are not:
|
|
<% view 1page uses data::page extends master %>
|
<% view page %>
|
<% view page uses data::page extends other::master %>
|
|
|
|