This project builds the Herb program and its associated unit tests using a Makefile for automation. The Makefile provides several useful commands for compiling, running tests, and cleaning the project.
- Check: For unit testing.
- Clang 19: The compiler used to build this project.
- Clang Format 19: For formatting the project.
- Clang Tidy 19: For linting the project.
- Prism Ruby Parser v1.4.0: We use Prism for Parsing the Ruby Source Code in the HTML+ERB files.
- Ruby: We need Ruby as a dependency for
bundler. - Bundler: We are using
bundlerto buildprismfrom source so we can buildherbagainst it. - Emscripten: For the WebAssembly build of
libherbso it can be used in the browser using the@herb-tools/browserpackage. - Doxygen: For building the C-Reference documentation pages.
xargs sudo apt-get install < Aptfileor:
sudo apt-get install check clang-19 clang-tidy-19 clang-format-19 emscripten doxygenbrew bundleor:
brew install check llvm@19 emscripten doxygenClone the Git Repository:
git clone https://github.com/marcoroth/herb && cd herb/
We can now compile all source files in src/ and generate the herb executable.
make allNote
For any consecutive builds you can just run make/make all.
The herb executable exposes a few commands for interacting with .html.erb files:
❯ ./herb
./herb [command] [options]
Herb 🌿 Powerful and seamless HTML-aware ERB parsing and tooling.
./herb lex [file] - Lex a file
./herb lex_json [file] - Lex a file and return the result as json.
./herb parse [file] - Parse a file
./herb ruby [file] - Extract Ruby from a file
./herb html [file] - Extract HTML from a file
./herb prism [file] - Extract Ruby from a file and parse the Ruby source with Prism
Running the executable shows a pretty-printed output for the respective command and the time it took to execute:
❯ ./herb lex examples/simple_erb.html.erb
#<Herb::Token type="TOKEN_ERB_START" value="<%" range=[0, 2] start=(1:0) end=(1:2)>
#<Herb::Token type="TOKEN_ERB_CONTENT" value=" title " range=[2, 9] start=(1:2) end=(1:9)>
#<Herb::Token type="TOKEN_ERB_END" value="%>" range=[9, 11] start=(1:9) end=(1:11)>
#<Herb::Token type="TOKEN_NEWLINE" value="\n" range=[11, 12] start=(1:0) end=(2:1)>
#<Herb::Token type="TOKEN_EOF" value="" range=[12, 12] start=(2:1) end=(2:1)>
Finished lexing in:
12 µs
0.012 ms
0.000012 s
We use rake and rake-compiler to compile the Ruby extension. Running rake will generate the needed templates, run make, build the needed artifacts, and run the Ruby tests.
rakeIf rake was successful you can use bundle console to interact with Herb:
bundle consoleirb(main):001> Herb.parse("<div></div>")
# => #<Herb::ParseResult:0x0000000 ... >
Builds the test suite from files in test/ and creates the run_herb_tests executable to run the tests:
make test && ./run_herb_testsrake testRemoves the herb, run_herb_tests, prism installation, and all .o files.
make cleanThe bin/integration script allows for quick local iteration. On every run it cleans the directory, builds the source from scratch and runs all checks, including the C-Tests, Ruby Tests, Linters, and examples in succession.
bin/integrationThe integration was successful if you see:
❯ bin/integration
[...]
Integration successful!
This project is licensed under the MIT License - see the LICENSE file for details.