Skip to content

Herb::Engine v0.7.0+

Herb::Engine is a drop-in replacement for Erubi::Engine that compiles HTML+ERB templates into Ruby code. It extends Erubi's functionality with HTML-aware parsing, validation, and security checks.

Usage

Basic usage (same as Erubi::Engine):

ruby
engine = Herb::Engine.new(source)
puts engine.src

With options:

ruby
engine = Herb::Engine.new(source,
  filename: "app/views/users/show.html.erb",
  escape: true,
)

Erubi Compatibility

Herb::Engine accepts all the same options as Erubi::Engine:

  • bufvar / outvar — Buffer variable name
  • bufval — Initial buffer value
  • escape / escape_html — Whether <%= %> escapes by default
  • escapefunc — Escape function name
  • filename — Template filename
  • freeze — Add frozen string literal comment
  • freeze_template_literals — Freeze template string literals
  • preamble / postamble — Custom preamble/postamble
  • chain_appends — Chain << calls for performance
  • ensure — Wrap in begin/ensure block
  • src — Initial source string

Herb-Specific Options

In addition to Erubi options, Herb::Engine supports:

OptionDefaultDescription
validation_mode:raiseHow to handle validation errors: :raise, :overlay, or :none
validators{}Per-validator overrides (e.g., { security: false })
stricttrueWhether to use strict parsing mode
visitors[]AST visitors to run before compilation
project_pathDir.pwdProject root for relative path resolution
debugfalseEnable debug mode

Validators

The engine runs validators on parsed templates to catch errors before compilation. Each validator can be enabled or disabled via .herb.yml configuration or per-instance overrides.

ValidatorDescription
SecurityDetects ERB output in unsafe positions (attribute names, attribute positions)
NestingValidates HTML nesting rules (e.g., no <div> inside <p>)
AccessibilityValidates accessibility-related attributes

Disable security validator for this template:

ruby
Herb::Engine.new(source, validators: { security: false })

See Engine Configuration for .herb.yml configuration.

Validation Mode

Controls how the engine presents validation results:

  • :raise — Raises SecurityError or CompilationError (default, used in tests and CLI)
  • :overlay — Renders errors as in-browser overlay (used by ReActionView in development)
  • :none — Skips validation entirely

ReActionView Integration

ReActionView registers Herb::Engine as the template handler for .html.erb and .html.herb files in Rails. It uses validation_mode: :overlay so validation errors appear as in-browser overlays during development instead of raising exceptions.

Validator settings from .herb.yml are respected automatically — no ReActionView-specific configuration needed.

Released under the MIT License.