Ruby Reference 
The Herb module exposes a few methods for you to lex, extract and parse HTML+ERB source code.
Ruby API 
Herb provides the following key methods:
Herb.lex(source)Herb.lex_file(path)Herb.parse(source)Herb.parse_file(path)Herb.extract_ruby(source)Herb.extract_html(source)Herb.version
Lexing 
The Herb.lex and Herb.lex_file methods allow you to tokenize an HTML document with embedded Ruby.
Herb.lex(source) 
source = %(<p>Hello <%= user.name %></p>)
Herb.lex(source).value
# [
#   <Herb::Token type="TOKEN_HTML_TAG_START" value="<" ... >,
#   <Herb::Token type="TOKEN_IDENTIFIER" value="h1"... >,
#   ...
#   <Herb::Token type="TOKEN_EOF" value=""... >,
# ]Herb.lex_file(path) 
Herb.lex_file("./index.html.erb").value
# [
#   <Herb::Token type="TOKEN_HTML_TAG_START" value="<" ... >,
#   <Herb::Token type="TOKEN_IDENTIFIER" value="h1"... >,
#   ...
#   <Herb::Token type="TOKEN_EOF" value=""... >,
# ]<h1><%= "Hello World" %></h1>Parsing 
The Herb.parse and Herb.parse_file methods allow you to parse an HTML document with embedded Ruby and returns you a parsed result of your document containing an Abstract Syntax Tree (AST) that you can use to structurally traverse the parsed document.
Herb.parse(source) 
source = %(<p>Hello <%= user.name %></p>)
Herb.parse(source).value
# =>
# @ DocumentNode (location: (1:0)-(1:29))
# └── children: (1 item)
#     └── @ HTMLElementNode (location: (1:0)-(1:29))
#         ├── open_tag:
#         │   └── @ HTMLOpenTagNode (location: (1:0)-(1:3))
#         │       ├── tag_opening: "<" (location: (1:0)-(1:1))
#         │       ├── tag_name: "p" (location: (1:1)-(1:2))
#         │       ├── attributes: []
#         │       ├── tag_closing: ">" (location: (1:2)-(1:3))
#         │       ├── children: []
#         │       └── is_void: false
#         │
#         ├── tag_name: "p" (location: (1:1)-(1:2))
#         ├── body: (2 items)
#         │   ├── @ HTMLTextNode (location: (1:3)-(1:9))
#         │   │   └── content: "Hello "
#         │   │
#         │   └── @ ERBContentNode (location: (1:9)-(1:25))
#         │       ├── tag_opening: "<%=" (location: (1:9)-(1:12))
#         │       ├── content: " user.name " (location: (1:12)-(1:23))
#         │       └── tag_closing: "%>" (location: (1:23)-(1:25))
#         │
#         ├── close_tag:
#         │   └── @ HTMLCloseTagNode (location: (1:25)-(1:29))
#         │       ├── tag_opening: "</" (location: (1:25)-(1:27))
#         │       ├── tag_name: "p" (location: (1:27)-(1:28))
#         │       └── tag_closing: ">" (location: (1:28)-(1:29))
#         │
#         └── is_void: falseHerb.parse_file(path) 
Herb.parse_file("./index.html.erb").value
# =>
# @ DocumentNode (location: (1:0)-(1:29))
# └── children: (1 item)
#     └── [...]<h1><%= "Hello World" %></h1>Extracting Code 
Herb.extract_ruby(source) 
The Herb.extract_ruby method allows you to extract only the Ruby parts of an HTML document with embedded Ruby.
source = %(<p>Hello <%= user.name %></p>)
Herb.extract_ruby(source)
# => "             user.name       "Herb.extract_html(source) 
The Herb.extract_html method allows you to extract only the HTML parts of an HTML document with embedded Ruby.
source = %(<p>Hello <%= user.name %></p>)
Herb.extract_html(source)
# => "<p>Hello                 </p>"AST Traversal 
Visitors 
Herb supports AST traversal using visitors.
class TextNodeVisitor < Herb::Visitor
  def visit_html_text_node(node)
    puts "HTML TextNode #{node.content}"
  end
end
visitor = TextNodeVisitor.new
result = Herb.parse("<p>Hello <%= user.name %></p>")
result.visit(visitor)This allows you to analyze the parsed HTML+ERB programmatically.
Metadata 
Herb.version 
Herb.version
# => "herb gem v0.0.1, libherb v0.0.1 (Ruby C native extension)"