https://github.com/marcoroth/herb
🌿 Powerful and seamless HTML-aware ERB parsing and tooling.
https://github.com/marcoroth/herb
erb html parser ruby
Last synced: 7 months ago
JSON representation
🌿 Powerful and seamless HTML-aware ERB parsing and tooling.
- Host: GitHub
- URL: https://github.com/marcoroth/herb
- Owner: marcoroth
- License: mit
- Created: 2024-05-28T17:44:22.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2025-04-20T02:11:44.000Z (9 months ago)
- Last Synced: 2025-04-24T19:07:36.440Z (9 months ago)
- Topics: erb, html, parser, ruby
- Language: C
- Homepage: https://herb-tools.dev
- Size: 1.74 MB
- Stars: 227
- Watchers: 4
- Forks: 4
- Open Issues: 10
-
Metadata Files:
- Readme: README.md
- License: LICENSE.txt
Awesome Lists containing this project
- stars - marcoroth/herb - 🌿 Powerful and seamless HTML-aware ERB parsing and tooling. (TypeScript)
README
Herb
HTML+ERB (HTML + Embedded Ruby)
Powerful and seamless HTML-aware ERB parsing and tooling.
## Contributing
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.
### Requirements
- [**Check**](https://libcheck.github.io/check/): For unit testing.
- [**Clang 19**](https://clang.llvm.org): The compiler used to build this project.
- [**Clang Format 19**](https://clang.llvm.org/docs/ClangFormat.html): For formatting the project.
- [**Clang Tidy 19**](https://clang.llvm.org/extra/clang-tidy/): For linting the project.
- [**Prism Ruby Parser v1.4.0**](https://github.com/ruby/prism/releases/tag/v1.4.0): We use Prism for Parsing the Ruby Source Code in the HTML+ERB files.
- [**Ruby**](https://www.ruby-lang.org/en/): We need Ruby as a dependency for `bundler`.
- [**Bundler**](https://bundler.io): We are using `bundler` to build [`prism`](https://github.com/ruby/prism) from source so we can build `herb` against it.
- [**Emscripten**](https://emscripten.org): For the WebAssembly build of `libherb` so it can be used in the browser using the [`@herb-tools/browser`](https://github.com/marcoroth/herb/blob/main/javascript/packages/browser) package.
- [**Doxygen**](https://www.doxygen.nl): For building the C-Reference documentation pages.
##### For Linux
```bash
xargs sudo apt-get install < Aptfile
```
or:
```bash
sudo apt-get install check clang-19 clang-tidy-19 clang-format-19 emscripten doxygen
```
##### For macOS (using Homebrew)
```bash
brew bundle
```
or:
```bash
brew install check llvm@19 emscripten doxygen
```
### Building
#### Clone the Repo
Clone the Git Repository:
```
git clone https://github.com/marcoroth/herb && cd herb/
```
#### Build Herb
We can now compile all source files in `src/` and generate the `herb` executable.
```bash
make all
```
> [!NOTE]
For any consecutive builds you can just run `make`/`make all`.
### Run
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
#
#
#
#
#
Finished lexing in:
12 µs
0.012 ms
0.000012 s
```
### Building the Ruby extension
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.
```bash
rake
```
If `rake` was successful you can use `bundle console` to interact with `Herb`:
```bash
bundle console
```
```
irb(main):001> Herb.parse("
")
# => #
```
### Test
Builds the test suite from files in `test/` and creates the `run_herb_tests` executable to run the tests:
#### For the C Tests
```bash
make test && ./run_herb_tests
```
#### For the Ruby Tests
```bash
rake test
```
### Clean
Removes the `herb`, `run_herb_tests`, `prism` installation, and all `.o` files.
```bash
make clean
```
### Local Integration Testing
The `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.
```bash
bin/integration
```
The integration was successful if you see:
```
❯ bin/integration
[...]
Integration successful!
```
## License
This project is licensed under the MIT License - see the [LICENSE](LICENSE.txt) file for details.