From 4760b0b4c01cdf9c2be5a6494c8cc10df1101185 Mon Sep 17 00:00:00 2001 From: kamchatka-volcano Date: Wed, 2 Oct 2024 23:42:01 +0500 Subject: [PATCH] -updated readme; -set version to v1.2.0 --- CMakeLists.txt | 2 +- README.md | 95 ++++++++++++++------------------- doc/logo.png | Bin 6398 -> 14043 bytes shared_template/CMakeLists.txt | 17 ------ 4 files changed, 42 insertions(+), 72 deletions(-) delete mode 100644 shared_template/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 28c6377..97d24d5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.18) -project(hypertextcpp VERSION 1.1.0 DESCRIPTION "hypertextcpp") +project(hypertextcpp VERSION 1.2.0 DESCRIPTION "hypertextcpp") include(external/seal_lake) diff --git a/README.md b/README.md index 12414d1..52fcacd 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@

- +

-**hypertextcpp** - is a hyperfast HTML templating system for C++ applications. -It provides a highly readable `.htcpp` template file format and a command line utility that transpiles it to C++ HTML rendering code. Include a generated C++ header file in your project, then setup a build system to update it when necessary, and you're all set. +**hypertextcpp** is an HTML templating system for C++ applications. +It provides an .htcpp template file format and a command-line utility that transpiles it to C++ HTML rendering code. Include the generated C++ header file in your project, set up a build system to update it when necessary, and you're all set. A quick example: @@ -50,7 +50,7 @@ int main() ``` -Compile it with your preferred method, launch it, and you will get this output: + Compile it with your preferred method, launch it, and you will get this output: ```console kamchatka-volcano@home:~$ ./todolist_printer @@ -85,26 +85,25 @@ kamchatka-volcano@home:~$ ./todolist_printer ## Template file syntax ### Expressions -**$(**`c++ expression`**)** -Expressions are used to add application's data to the template. It can be any valid C++ expression, with only condition, that its result must be streamable to the default output stream `std::ostream`. Expressions can be placed anywhere in the HTML template, besides the tag names. -In our todolist example, `$(cfg.name)` is an expression adding template config variable `name` to the result page. +**$(**`c++ expression`**)** +Expressions are used to add the application's data to the template. It can be any valid C++ expression, with the only condition that its result must be streamable to the default output stream `std::ostream`. Expressions can be placed anywhere in the HTML template, except in tag names. +In our todolist example, `$(cfg.name)` is an expression that adds the template config variable `name` to the result page. ### Statements -**${**`c++ statement(s)`**}** -Statements are used to add any valid C++ code to the template rendering function. For example, you can add variables, classes declarations or lambdas. Let's say that you don't like the default name `cfg` used for passing data to the template. You can create a reference to it with any name you like and use it later: +**${**`c++ statement(s)`**}** +Statements are used to add any valid C++ code to the template rendering function. For example, you can add variables, class declarations, or lambdas. Let's say you don't like the default name `cfg` used for passing data to the template. You can create a reference to it with any name you like and use it later: ```html ${ auto& param = cfg;}

$(param.name)'s todo list:

``` -Note, that `cfg` and `out` are reserved names used for parameters in generated +Note, that `cfg` and `out` are reserved names used for parameters in the generated rendering function. Also, don't put anything in the `htcpp` namespace. ### Global statements **#{**`c++ statement(s)`**}** -These statements are used to add any valid C++ code outside the template rendering function. Unlike regular statements, with global ones you can add include directives or functions definitions. Global statements can only be placed in the top level of `htcpp` template, outside any HTML element. Please, don't put anything in the `htcpp` namespace. - +These statements are used to add any valid C++ code outside the template rendering function. Unlike regular statements, with global ones you can add include directives or function definitions. Global statements can only be placed at the top level of the `htcpp` template, outside any HTML element. Please don't put anything in the `htcpp` namespace. ### Control flow extensions If **hypertextcpp** used a common approach for control flow in HTML template engines, our todolist example would look something like this: @@ -125,9 +124,9 @@ If **hypertextcpp** used a common approach for control flow in HTML template eng ``` -In our opinion it significantly hurts readability of document tree and makes it hard to choose indentation and keep it consistent - notice how different approaches are used for `if` and `for` blocks in the example. +In our opinion, it significantly hurts the readability of the document tree and makes it hard to choose indentation and keep it consistent — notice how different approaches are used for if and for blocks in the example. -**hypertextcpp** solves this problem (*and is created mainly for solving this problem*) by applying control flow to the HTML elements itself without adding logic block scopes to the document. It uses just two extensions for tags to make this work: +**hypertextcpp** solves this problem by applying control flow to the HTML elements themselves without adding logic block scopes to the document. It uses just two extensions for tags to make this work: * Conditional extension **?(**`c++ condition`**)** @@ -141,12 +140,12 @@ In our opinion it significantly hurts readability of document tree and makes it **@(**`c++ init-statement; condition; iteration_expression`**)** or **@(**`c++ range_declaration : range_expression`**)** - HTML elements with this extension are added to the document multiple times, on each step of the loop, or for each element of the iterated range. + HTML elements with this extension are added to the document multiple times, on each step of the loop or for each element of the iterated range. Example of usage from our todolist template: ```html
  • $(task.name)
  • @(auto task : cfg.tasks) ``` - Lets add another example for other type of `for` loop: + Let's add another example for another type of `for` loop: ```html
  • Task#$(i)
  • @(auto i = 0 ; i < 3; ++i) ``` @@ -159,7 +158,7 @@ In our opinion it significantly hurts readability of document tree and makes it Both extensions can be added to the opening or closing tag, but each tag and HTML element can only have one extension. -It's recommended to add extension to the opening tag for the multiline HTML elements: +It's recommended to add the extension to the opening tag for multiline HTML elements: ```html
    ?(cfg.greet)

    Hello world!

    @@ -170,7 +169,7 @@ and to the closing tag for the single-line ones:

    Hello world!

    ?(cfg.greet) ``` -Note, that while extensions hide control flow block scopes from the template document, they're still present in the generated C++ code and implemented with regular `if` and `for` control structures. Therefore, template like this: +Note that while extensions hide control flow block scopes from the template document, they're still present in the generated C++ code and implemented with regular `if` and `for` control structures. Therefore, a template like this: ```html
    @(auto i = 0; i<3; ++i) @@ -179,13 +178,13 @@ Note, that while extensions hide control flow block scopes from the template doc

    Last num is $(num)

    ``` -won't compile because the `num` variable isn't visible outside the `for` block scope generated by loop extension on the `div` tag. +won't compile because the `num` variable isn't visible outside the `for` block scope generated by the loop extension on the `div` tag. ### Sections **\[\[** `text, html elements, statements, expressions or other sections` **]]** -Sections can contain a part of template document, and it's possible to attach control flow extensions to them. Their main usage is adding attributes to HTML elements conditionally. +Sections can contain a part of the template document, and it's possible to attach control flow extensions to them. Their main usage is adding attributes to HTML elements conditionally. -Let's update todolist example by adding a line-through text style to completed tasks: +Let's update the todolist example by adding a line-through text style to completed tasks: [`examples/02/todolist.htcpp`](examples/02/todolist.htcpp) ```html @@ -220,9 +219,10 @@ Tip of the day: Keep your template tidy and don't introduce sections when it's p ### Procedures and partial rendering **#**`procedureName`**(){**`html elements, statements, expressions or sections`**}** -Parts of `htccp` template can be placed inside procedures - parameterless functions capturing the `cfg` variable. They are available for call from the C++ application, so if any part of the page needs to be rendered separately from the whole template, procedures are a big help. -Procedures can only be placed in the top level of `htcpp` template, outside any HTML element. -Let's put the list of tasks from the todolist example in the procedure: +Parts of the `htcpp` template can be placed inside procedures—parameterless functions capturing the `cfg` variable. They are available for call from the C++ application, so if any part of the page needs to be rendered separately from the whole template, procedures are a big help. +Procedures can only be placed at the top level of the `htcpp` template, outside any HTML element. +Let's put the list of tasks from the todolist example in the procedure: + [`examples/03/todolist.htcpp`](examples/03/todolist.htcpp) ```html #taskList(){ @@ -239,7 +239,7 @@ Let's put the list of tasks from the todolist example in the procedure: ``` -Now the tasks list can be output to stdout by itself like that: +Now the tasks list can be output to stdout by itself like this: [`examples/03/todolist_printer.cpp`](examples/03/todolist_printer.cpp) ```cpp //... @@ -278,8 +278,8 @@ Process finished with exit code 0 ``` ### Single header renderer -By default, the **hypertextcpp** transpiler works in a single header mode and generates a C++ header file that you're supposed to simply include in your project. A generated renderer class has a name of `.htcpp` template file. You can override the name by using `--class-name` parameter, or you can specify one of the following flags `--class-pascalcase`, `--class-snakecase` or `--class-lowercase` to use `.htcpp` template's filename converted to the corresponding case as a class name. -Converting template to C++ code each time you modify it is a laborious task, so it makes sense to add this step to your build process. Let's demonstrate on how to do it with CMake and at the same time rename the renderer class. +By default, the **hypertextcpp** transpiler works in a single header mode and generates a C++ header file that you're supposed to simply include in your project. A generated renderer class has the name of the `.htcpp` template file. You can override the name by using the `--class-name` parameter, or you can specify one of the following flags: `--class-pascalcase`, `--class-snakecase`, or `--class-lowercase` to use the `.htcpp` template's filename converted to the corresponding case as a class name. +Converting the template to C++ code each time you modify it is a laborious task, so it makes sense to add this step to your build process. Let's demonstrate how to do it with CMake while renaming the renderer class. [`examples/04/CMakeLists.txt`](examples/04/CMakeLists.txt) ``` @@ -301,11 +301,11 @@ target_compile_features(todolist_printer PUBLIC cxx_std_17) set_target_properties(todolist_printer PROPERTIES CXX_EXTENSIONS OFF) ``` -Now, everytime you change the template, the corresponding header will be regenerated on the next build. +Now, every time you change the template, the corresponding header will be regenerated on the next build. ### Shared library renderer -It can feel quite wasteful to rebuild your project each time the template file is changed, so **hypertextcpp** supports generation of C++ source file for building templates in form of shared libraries and linking them dynamically from your application. -It requires to duplicate the config declaration in `.htccp` template, registering it with `HTCPP_CONFIG` macro both in template and in the application source, generate the renderer code with `--shared-lib` command line flag, build the library and load it using the tiny API installed from the `shared_lib_api/` directory. It sounds scarier than it is, so let's quickly update the todolist example to see how it works. +It can feel quite wasteful to rebuild your project each time the template file is changed, so **hypertextcpp** supports the generation of a C++ source file for building templates in the form of shared libraries and linking them dynamically from your application. +It requires duplicating the config declaration in the .htcpp template, registering it with the `HTCPP_CONFIG` macro in both the template and the application source, generating the renderer code with the `--shared-lib` command line flag, building the library, and loading it using the tiny API installed from the `shared_lib_api/` directory. It sounds scarier than it is, so let's quickly update the todolist example to see how it works. First we need to copy the config structure declaration in the template: [`examples/05/todolist.htcpp`](examples/05/todolist.htcpp) @@ -337,35 +337,22 @@ First we need to copy the config structure declaration in the template: ``` -Be sure to use an exact copy, any mismatch of the config structure between template and application can't be handled gracefully, so if you try to load a template library with different structure you'll definitely crash the application and maybe hurt someone as a result. +Be sure to use an exact copy; any mismatch of the config structure between the template and the application can't be handled gracefully. So, if you try to load a template library with a different structure, you'll definitely crash the application and maybe hurt someone as a result. + +Next, we need to build our template renderer as a library. It's not possible to bundle multiple template files in one library, so we can build a library from a single `.htcpp` file by using the `hypertextcpp_BuildSharedTemplate` CMake function from `build_shared_template.cmake`: -Next, we need to build our template renderer as a library. It's not possible to bundle multiple templates file in one library, so we can easily use a generic CMake file, that builds a library from a single `.htcpp` file: -[`shared_template/CMakeLists.txt`](shared_template/CMakeLists.txt) ``` cmake_minimum_required(VERSION 3.18) -option(NAME "Template name") - -project(${NAME}) - -add_custom_command( - OUTPUT ${NAME}.cpp - COMMAND hypertextcpp ${CMAKE_CURRENT_SOURCE_DIR}/${NAME}.htcpp -o ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.cpp -s - DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${NAME}.htcpp +hypertextcpp_BuildSharedTemplate( + NAME todolist + OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR} ) - -add_library(${NAME} SHARED ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.cpp) -target_compile_features(${NAME} PUBLIC cxx_std_17) -set_target_properties(${NAME} PROPERTIES CXX_EXTENSIONS OFF) +add_dependencies(${PROJECT_NAME} todolist) ``` -Copy `todolist.htcpp` in `shared_template/` and execute the following commands: -```console -kamchatka-volcano@home:~/shared_template$ cmake -S . -B build -DNAME=todolist -kamchatka-volcano@home:~/shared_template/build$ cmake --build build -``` -If everything goes right, you'll get the `libtodolist.so` in the build directory. That's our `todolist.htcpp` template compiled as the shared library. -Next, let's modify the `todolist_printer.cpp` to be able to load it: +If everything goes right, you'll get `libtodolist.so` in the build directory. That's our `todolist.htcpp` template compiled as a shared library. +Next, let's modify `todolist_printer.cpp` to be able to load it: [`examples/05/todolist_printer.cpp`](examples/05/todolist_printer.cpp) ```cpp #include @@ -391,8 +378,8 @@ return 0; } ``` -Don't forget to add linking of system library `dl` to the build config - that allows us to link the template library dynamically. -`todolist_printer` should compile and work the same as the previous example using the single header approach. +On Linux, it may be necessary to link the system library `dl` to the build config, as we load the template library dynamically. +`todolist_printer` should compile and work the same as the previous example using the single-header approach. ## Installation diff --git a/doc/logo.png b/doc/logo.png index b8c1fe13541058d401a0bb4f0c7956ba2c213062..05be57171b5182bca7dc88aadb45c4adb429ff7a 100644 GIT binary patch literal 14043 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 diff --git a/shared_template/CMakeLists.txt b/shared_template/CMakeLists.txt deleted file mode 100644 index ae30ca7..0000000 --- a/shared_template/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ -cmake_minimum_required(VERSION 3.18) - -option(NAME "Template name") - -project(${NAME}) - -add_custom_command( - OUTPUT ${NAME}.cpp - COMMAND hypertextcpp ${CMAKE_CURRENT_SOURCE_DIR}/${NAME}.htcpp -o ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.cpp -s - DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${NAME}.htcpp - VERBATIM -) - -add_library(${NAME} SHARED ${CMAKE_CURRENT_BINARY_DIR}/${NAME}.cpp) -target_compile_features(${NAME} PUBLIC cxx_std_11) -target_compile_definitions(${NAME} PUBLIC "HYPERTEXTCPP_EXPORT") -set_target_properties(${NAME} PROPERTIES CXX_EXTENSIONS OFF) \ No newline at end of file