diff --git a/.github/workflows/arduino_lint.yml b/.github/workflows/arduino_lint.yml new file mode 100644 index 0000000..2dd07de --- /dev/null +++ b/.github/workflows/arduino_lint.yml @@ -0,0 +1,24 @@ +name: Arduino Lint + +on: + push: + branches: + - main + pull_request: + +# The concurrency spec means that we'll only run one set of jobs per pull request or push to main. +# If a new push or pull request comes in while a job is running, all jobs in the concurrency group will be cancelled. +concurrency: + group: arduino-lint-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: arduino/arduino-lint-action@v1 + with: + compliance: strict + library-manager: submit + project-type: library \ No newline at end of file diff --git a/README.md b/README.md index 351b337..9b1555e 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ +[![.github/workflows/arduino_lint.yml](https://github.com/floatplane/ministache/actions/workflows/arduino_lint.yml/badge.svg)](https://github.com/floatplane/ministache/actions/workflows/arduino_lint.yml) [![.github/workflows/build.yml](https://github.com/floatplane/ministache/actions/workflows/build.yml/badge.svg)](https://github.com/floatplane/ministache/actions/workflows/build.yml) [![.github/workflows/test.yml](https://github.com/floatplane/ministache/actions/workflows/test.yml/badge.svg)](https://github.com/floatplane/ministache/actions/workflows/test.yml) [![.github/workflows/static_analysis.yml](https://github.com/floatplane/ministache/actions/workflows/static_analysis.yml/badge.svg)](https://github.com/floatplane/ministache/actions/workflows/static_analysis.yml) @@ -5,7 +6,7 @@ # Ministache -A spec-complete implementation of the [Mustache](https://mustache.github.io/) templating language for Arduino. +A spec-complete implementation of the [Mustache](https://mustache.github.io/) templating language for Arduino. A sane alternative to building up complex strings via concatenation and custom code. Very useful for embedded web servers! ## Features @@ -20,7 +21,7 @@ Complete support for all elements of the [Mustache core specification](https://g See the [mustache documentation](https://mustache.github.io/mustache.5.html) for more details on these features. -## Example +## Basics ```c++ ArduinoJson::JsonDocument data; @@ -28,3 +29,13 @@ data[F("subject")] = F("world"); const String output = ministache::render(F("Hello, {{subject}}!"), data); Serial.println(output); // Hello, world! ``` + +See [basic.ino](examples/basic/basic.ino) for a sketch demonstrating basic Ministache usage. + +## Partials + +Partials are a powerful Mustache feature allow you to define a chunk of template code and use it in a loop. See [partials.ino](examples/partials/partials.ino) for a sketch demonstrating how to use partials with Ministache. + +## Projects using Ministache + +- [floatplane/mitsubishi2MQTT](https://github.com/floatplane/mitsubishi2MQTT) \ No newline at end of file diff --git a/examples/basic/basic.ino b/examples/basic/basic.ino new file mode 100644 index 0000000..238c439 --- /dev/null +++ b/examples/basic/basic.ino @@ -0,0 +1,37 @@ +#include + +/*************************************************** + This is a very basic example for the ministache library + (https://github.com/floatplane/ministache). + + It shows how the library can be used to render a Mustache template with a JSON object. + + For more details on Mustache syntax, see http://mustache.github.io/mustache.5.html + ****************************************************/ + +void setup() { + Serial.begin(115200); + Serial.println(""); + + // Create a JsonDocument instance to hold the data that we'll use in our template + JsonDocument data; + data["name"] = "World"; + data["value"] = 42; + + // Create a template string + String templateString = "Hello, {{name}}! The answer is {{value}}."; + + // Render the template with the data + String output = ministache::render(templateString, data); + + // Print the result + Serial.println(output); + + // Expected output: + // + // Hello, World! The answer is 42. +} + +void loop() { + delay(500); +} diff --git a/examples/partials/partials.ino b/examples/partials/partials.ino new file mode 100644 index 0000000..7a3c612 --- /dev/null +++ b/examples/partials/partials.ino @@ -0,0 +1,57 @@ +#include + +/*************************************************** + This is an example of how to use Mustache partials with the Ministache library + (https://github.com/floatplane/ministache). + + For more details on Mustache syntax, see http://mustache.github.io/mustache.5.html + ****************************************************/ + +void setup() { + Serial.begin(115200); + Serial.println(""); + + // Create a JsonDocument instance to hold the data that we'll use in our template + const char* json = R"""( + { + "people": [ + { + "name": "Alice", + "role": "Engineer" + }, + { + "name": "Bob", + "role": "Intern" + } + ] + } + )"""; + JsonDocument data; + deserializeJson(data, json); + + // Create a template string that renders the data for a single person. This is a *partial*. + String personString = "Name: {{name}}\tRole: {{role}}\n"; + + // Create a template string that renders the data for all people. This is the main template. + // Note that it loops over a field called "people" and includes the partial "person" for each of + // them. + String reportString = "People report:\n{{#people}}{{> person}}{{/people}}"; + + // Render the template with the data. The third argument is the partials list. This + // defines how to map a partial reference like "person" to a particular template + // ("personString"). + String output = ministache::render(reportString, data, {{"person", personString}}); + + // Print the result + Serial.println(output); + + // Expected output: + // + // People report: + // Name: Alice Role: Engineer + // Name: Bob Role: Intern +} + +void loop() { + delay(500); +} diff --git a/keywords.txt b/keywords.txt new file mode 100644 index 0000000..8c1abab --- /dev/null +++ b/keywords.txt @@ -0,0 +1,2 @@ +ministache KEYWORD1 +render KEYWORD2 diff --git a/library.json b/library.json new file mode 100644 index 0000000..b9d2912 --- /dev/null +++ b/library.json @@ -0,0 +1,39 @@ +{ + "name": "Ministache", + "version": "1.0.0", + "description": "Ministache is a small, fast and spec-complete implementation of the Mustache templating language for Arduino. All core Mustache tags are supported: interpolation, partials, sections, inverted sections, custom delimiters, and comments.", + "keywords": ["mustache", "moustache", "text", "text processor", "template", "logic-less", "html"], + "repository": { + "type": "git", + "url": "https://github.com/floatplane/ministache" + }, + "authors": [ + { + "name": "Brian Sharon", + "url": "https://github.com/floatplane", + "maintainer": true + } + ], + "license": "MIT", + "platforms": "*", + "headers": "Ministache.h", + "examples": [ + { + "name": "Basic", + "base": "examples/basic", + "files": ["basic.ino"] + }, + { + "name": "Partials", + "base": "examples/partials", + "files": ["partials.ino"] + } + ], + "dependencies": { + "bblanchon/ArduinoJson": "^7.0.0" + }, + "build": { + "unflags": "-std=gnu++11", + "flags": "-std=gnu++17" + } +} \ No newline at end of file diff --git a/library.properties b/library.properties new file mode 100644 index 0000000..cda687d --- /dev/null +++ b/library.properties @@ -0,0 +1,12 @@ +name=Ministache +version=1.0.0 +author=Brian Sharon +maintainer=Brian Sharon +sentence=Implementation of the Mustache templating language for Arduino +paragraph=Ministache is a small, fast and spec-complete implementation of the Mustache templating language for Arduino. +category=Data Processing +url=https://github.com/floatplane/ministache +architectures=* +includes=Ministache.h +depends=ArduinoJson (>=7.0.0) + diff --git a/src/ministache.cpp b/src/Ministache.cpp similarity index 99% rename from src/ministache.cpp rename to src/Ministache.cpp index caae55b..49ae0cd 100644 --- a/src/ministache.cpp +++ b/src/Ministache.cpp @@ -1,5 +1,5 @@ -#include "ministache.hpp" +#include "Ministache.h" #include #include diff --git a/src/ministache.hpp b/src/Ministache.h similarity index 100% rename from src/ministache.hpp rename to src/Ministache.h diff --git a/test/ministache.cpp b/test/ministache.cpp index 0b3909c..43d3bdf 100644 --- a/test/ministache.cpp +++ b/test/ministache.cpp @@ -1,6 +1,6 @@ #define DOCTEST_CONFIG_IMPLEMENT // REQUIRED: Enable custom main() -#include "ministache.hpp" +#include "Ministache.h" #include #include