🏡 index : github.com/captn3m0/cosmere-books.git

# Example: basic usage

require "../src/lexbor"

puts Lexbor.version

page = "<html><div class=aaa>bla</div></html>"
lexbor = Lexbor::Parser.new(page)

# html node
lexbor.root  # (.html) Lexbor::Node?
lexbor.root! # (.html!) Lexbor::Node

# body node
lexbor.body  # Lexbor::Node?
lexbor.body! # Lexbor::Node

# head node
lexbor.head  # Lexbor::Node?
lexbor.head! # Lexbor::Node

# iterator over all div nodes from root scope
# equal with lexbor.root!.scope.nodes(:div)
lexbor.nodes(Lexbor::Lib::TagIdT::LXB_TAG_DIV) # Iterator::Collection(Lexbor::Node)
lexbor.nodes(:div)                             # Iterator::Collection(Lexbor::Node)
lexbor.nodes("div")                            # Iterator::Collection(Lexbor::Node)

node = lexbor.nodes(:div).first # Lexbor::Node

# methods:
pp node.tag_id                # => LXB_TAG_DIV
pp node.tag_sym               # => :div
pp node.tag_name              # => "div"
pp node.is_tag_div?           # => true
pp node.attribute_by("class") # => "aaa"
pp node.attributes            # => {"class" => "aaa"}

pp node.to_html    # => "<div class=\"aaa\">bla</div>"
pp node.inner_text # => "bla"
pp node            # => Lexbor::Node(:div, {"class" => "aaa"})

# tree navigate methods (methods with !, returns not_nil! node):
node.child      # Lexbor::Node?, first child of node
node.next       # Lexbor::Node?, next node in the parent scope
node.parent     # Lexbor::Node?, parent node
node.prev       # Lexbor::Node?, previous node in the parent scope
node.left       # Lexbor::Node?, left node, in the html, from current
node.right      # Lexbor::Node?, right node, in the html, from current
node.flat_right # Lexbor::Node?, right node, in the html, from current, without node.children

# iterators:
node.children        # Iterator::Collection(Lexbor::Node), iterate over all direct node children
node.parents         # Iterator::Collection(Lexbor::Node), iterate over all node parents from current to root! node
node.scope           # Iterator::Collection(Lexbor::Node), iterate over all inner nodes (children and deeper)
node.right_iterator  # Iterator::Collection(Lexbor::Node), iterate from current node to right (to the end of document)
node.left_iterator   # Iterator::Collection(Lexbor::Node), iterate from current node to left (to the root! node)
node.scope.nodes(:a) # Iterator::Collection(Lexbor::Node), select :a nodes in scope of `node`

# free lexbor c object,
# not really needed to call manyally, because called auto from GC finalize, when object not used anymore
# use it only if need to free memory fast
# after free any other child object like Lexbor::Node or Iterator::Collection(Lexbor::Node) not valid anymore and can lead to segfault
lexbor.free