An open API service indexing awesome lists of open source software.

https://github.com/mrhdias/tera-shortcodes

Tera Shortcodes in Rust: A WordPress-Like Implementation
https://github.com/mrhdias/tera-shortcodes

rust template-engine tera

Last synced: 5 months ago
JSON representation

Tera Shortcodes in Rust: A WordPress-Like Implementation

Awesome Lists containing this project

README

          

# tera-shortcodes
Tera Shortcodes in Rust: A WordPress-Like Implementation

The goal of this library is to bring WordPress-style shortcodes to the Tera template engine, enabling their use in templates to display dynamic content or functionality. Two methods are available for rendering shortcode content: a slower one that utilizes Tokio's `block_in_place` function, and a faster one that leverages an auxiliary JavaScript function.

[![Rust](https://github.com/mrhdias/tera-shortcodes/actions/workflows/rust.yml/badge.svg)](https://github.com/mrhdias/tera-shortcodes/actions/workflows/rust.yml)

```html
{{ shortcode(display="myshortcode", foo="bar", bar="bing", jscaller="true") | safe }}
```

## How to perform a test?

An example is provided to demonstrate how a shortcode is implemented.
Clone the repository and edit the test template if you wish. In the products shortcode, you can change the limit and order.

```sh
git clone https://github.com/mrhdias/tera-shortcodes
cd tera-shortcodes
cargo build
nano -w examples/templates/test_shortcode.html
cargo run --example app
curl http://127.0.0.1:8080/test
```

## Usage

An example of shortcode:
```html
{{ shortcode(display="my_shortcode", foo="bar", bar="bing", jscaller="true") | safe }}
```

```rust
use tera_shortcodes;

let shortcodes = tera_shortcodes::Shortcodes::new()
.register("my_shortcode", |args| -> String {

let js_caller = match args.get("jscaller") {
Some(value) => value
.as_str()
.unwrap()
.trim_matches(|c| c == '"' || c == '\'')
.parse()
.unwrap_or(false),
None => false,
};

let foo = match args.get("foo") {
Some(value) => value.as_str().unwrap()
.trim_matches(|c| c == '"' || c == '\''),
None => "no foo",
};

let bar = match args.get("bar") {
Some(value) => value.as_str().unwrap()
.trim_matches(|c| c == '"' || c == '\''),
None => "no bar",
};

let json_body = serde_json::to_string(&DataTest {
foo: foo.to_string(),
bar: bar.to_string(),
}).unwrap();

// axum route that receives the data from the shortcode
let url = format!("http://{}/data", ADDRESS);

if js_caller {
tera_shortcodes::fetch_shortcode_js(
&url,
Some("post"),
Some(&json_body),
None,
)
} else {
tera_shortcodes::fetch_shortcode(
&url,
Some("post"),
Some(&json_body),
)
}
})
.register("another_shortcode", another_shortcode_fn);

let mut tera = Tera::new("templates/**/*").unwrap();

// Register the custom function
tera.register_function("shortcode", shortcodes);
```

## Benchemarks

Fetch shortcode in Rust with `block_in_place` to run the async function.
```sh
Running 30s test @ http://127.0.0.1:8080/test
12 threads and 400 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 250.98ms 60.48ms 528.39ms 68.72%
Req/Sec 131.94 31.32 260.00 68.57%
47193 requests in 30.10s, 84.30MB read
Requests/sec: 1567.81
Transfer/sec: 2.80MB
```
Fetch a shortcode using an `auxiliary function` in JavaScript.
```sh
Running 30s test @ http://127.0.0.1:8080/test
12 threads and 400 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 57.46ms 22.86ms 162.02ms 69.30%
Req/Sec 577.12 48.80 1.43k 73.41%
207147 requests in 30.10s, 437.77MB read
Requests/sec: 6882.17
Transfer/sec: 14.54MB
```