Module: Infoboxer::Navigation::Lookup::Node
- Included in:
- Tree::Node
- Defined in:
- lib/infoboxer/navigation/lookup.rb
Overview
Lookup::Node
module provides methods for navigating through
page tree in XPath-like manner.
What you need to know about it:
Selectors
Each lookup_*
method (and others similar) receive
list of selectors. Examples of acceptable selectors:
# 1. Node class:
document.lookup(Bold) # all Bolds
# 2. Class symbol
document.lookup(:Bold)
# same as above, useful if you don't want to include Infoboxer::Tree
# in all of your code or write things like lookup(Infoboxer::Tree::Bold)
# 3. Getter/pattern:
document.lookup(text: /something/)
# finds all nodes where result of getter matches pattern
# Checks against patterns are performed with `===`, so you can
# use regexps to find by text, or ranges to find by number, like
document.lookup(:Heading, level: (3..4))
# Nodes where method is not defined are ignored, so you can
# rewrite above example as just
document.lookup(level: 3..4)
# ...and receive meaningful result without any NoMethodError
# 4. Check symbol
document.lookup(:bold?)
# finds all nodes for which `:bold?` is defined and returns
# truthy value;
# 5. Code block
document.lookup{|node| node.params.has_key?(:class)}
You also can use any of those method without any selector, thus receiving ALL parents, ALL children, ALL siblings and so on.
Chainable navigation
Each lookup_*
method returns an instance of Tree::Nodes class,
which behaves like an Array, but also defines similar set of
lookup_*
methods, so, you can brainlessly do the things like
document.
lookup(:Paragraph){|p| p.text.length > 100}.
lookup(:Wikilink, text: /^List of/).
select(&:bold?)
Underscored methods
For all methods of this module you can notice "underscored" version
(lookup_children
vs _lookup_children
and so on). Basically,
underscored versions accept instance of Selector, which
is already preprocessed version of all selectors. It is kinda
internal thing, though can be useful if you store selectors in
variables -- it is easier to have and use just one instance of
Selector, than list of arguments and blocks.
Instance Method Summary collapse
-
#_lookup(selector) ⇒ Object
Underscored version of #lookup.
-
#_lookup_children(selector) ⇒ Object
Underscored version of #lookup_children.
-
#_lookup_next_siblings(selector) ⇒ Object
Underscored version of #lookup_next_siblings.
-
#_lookup_parents(selector) ⇒ Object
Underscored version of #lookup_parents.
-
#_lookup_prev_sibling(selector) ⇒ Object
Underscored version of #lookup_prev_sibling.
-
#_lookup_prev_siblings(selector) ⇒ Object
Underscored version of #lookup_prev_siblings.
-
#_lookup_siblings(selector) ⇒ Object
Underscored version of #lookup_siblings.
-
#_matches?(selector) ⇒ Boolean
Underscored version of #matches?.
-
#lookup(*selectors, &block) ⇒ Object
Selects matching nodes from entire subtree inside current node.
-
#lookup_children(*selectors, &block) ⇒ Object
Selects nodes only from this node's direct children.
-
#lookup_next_siblings(*selectors, &block) ⇒ Object
Selects matching nodes from current node's siblings, which are below current node in parents children list.
-
#lookup_parents(*selectors, &block) ⇒ Object
Selects matching nodes of this node's parents chain, up to entire Document.
-
#lookup_prev_sibling(*selectors, &block) ⇒ Object
Selects first matching nodes from current node's siblings, which are above current node in parents children list.
-
#lookup_prev_siblings(*selectors, &block) ⇒ Object
Selects matching nodes from current node's siblings, which are above current node in parents children list.
-
#lookup_siblings(*selectors, &block) ⇒ Object
Selects matching nodes from current node's siblings.
-
#matches?(*selectors, &block) ⇒ Object
Checks if current node matches selectors.
-
#parent?(*selectors, &block) ⇒ Boolean
Checks if node has any parent matching selectors.
Instance Method Details
#_lookup(selector) ⇒ Object
Underscored version of #lookup
111 112 113 114 |
# File 'lib/infoboxer/navigation/lookup.rb', line 111 def _lookup(selector) Tree::Nodes[_matches?(selector) ? self : nil, *children._lookup(selector)] .flatten.compact end |
#_lookup_children(selector) ⇒ Object
Underscored version of #lookup_children
117 118 119 |
# File 'lib/infoboxer/navigation/lookup.rb', line 117 def _lookup_children(selector) @children._find(selector) end |
#_lookup_next_siblings(selector) ⇒ Object
Underscored version of #lookup_next_siblings
149 150 151 |
# File 'lib/infoboxer/navigation/lookup.rb', line 149 def _lookup_next_siblings(selector) next_siblings._find(selector) end |
#_lookup_parents(selector) ⇒ Object
Underscored version of #lookup_parents
122 123 124 125 126 127 128 129 130 131 |
# File 'lib/infoboxer/navigation/lookup.rb', line 122 def _lookup_parents(selector) case when !parent Tree::Nodes[] when parent._matches?(selector) Tree::Nodes[parent, *parent._lookup_parents(selector)] else parent._lookup_parents(selector) end end |
#_lookup_prev_sibling(selector) ⇒ Object
Underscored version of #lookup_prev_sibling
144 145 146 |
# File 'lib/infoboxer/navigation/lookup.rb', line 144 def _lookup_prev_sibling(selector) prev_siblings.reverse.detect { |n| selector === n } end |
#_lookup_prev_siblings(selector) ⇒ Object
Underscored version of #lookup_prev_siblings
139 140 141 |
# File 'lib/infoboxer/navigation/lookup.rb', line 139 def _lookup_prev_siblings(selector) prev_siblings._find(selector) end |
#_lookup_siblings(selector) ⇒ Object
Underscored version of #lookup_siblings
134 135 136 |
# File 'lib/infoboxer/navigation/lookup.rb', line 134 def _lookup_siblings(selector) siblings._find(selector) end |
#_matches?(selector) ⇒ Boolean
Underscored version of #matches?
106 107 108 |
# File 'lib/infoboxer/navigation/lookup.rb', line 106 def _matches?(selector) selector === self end |
#lookup(*selectors, &block) ⇒ Object
Selects matching nodes from entire subtree inside current node.
|
# File 'lib/infoboxer/navigation/lookup.rb', line 80
|
#lookup_children(*selectors, &block) ⇒ Object
Selects nodes only from this node's direct children.
|
# File 'lib/infoboxer/navigation/lookup.rb', line 83
|
#lookup_next_siblings(*selectors, &block) ⇒ Object
Selects matching nodes from current node's siblings, which are below current node in parents children list.
|
# File 'lib/infoboxer/navigation/lookup.rb', line 93
|
#lookup_parents(*selectors, &block) ⇒ Object
Selects matching nodes of this node's parents chain, up to entire Document.
|
# File 'lib/infoboxer/navigation/lookup.rb', line 86
|
#lookup_prev_sibling(*selectors, &block) ⇒ Object
Selects first matching nodes from current node's siblings, which are above current node in parents children list.
|
# File 'lib/infoboxer/navigation/lookup.rb', line 101
|
#lookup_prev_siblings(*selectors, &block) ⇒ Object
Selects matching nodes from current node's siblings, which are above current node in parents children list.
|
# File 'lib/infoboxer/navigation/lookup.rb', line 97
|
#lookup_siblings(*selectors, &block) ⇒ Object
Selects matching nodes from current node's siblings.
|
# File 'lib/infoboxer/navigation/lookup.rb', line 90
|
#matches?(*selectors, &block) ⇒ Object
Checks if current node matches selectors.
|
# File 'lib/infoboxer/navigation/lookup.rb', line 77
|
#parent?(*selectors, &block) ⇒ Boolean
Checks if node has any parent matching selectors.
168 169 170 |
# File 'lib/infoboxer/navigation/lookup.rb', line 168 def parent?(*selectors, &block) !lookup_parents(*selectors, &block).empty? end |