Class: Sevgi::Derender::Node

Inherits:
Object
  • Object
show all
Defined in:
lib/sevgi/derender/node.rb

Constant Summary collapse

META_NAMESPACE =
"_:"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(node, pres = []) ⇒ Node

Returns a new instance of Node.



8
9
10
11
12
# File 'lib/sevgi/derender/node.rb', line 8

def initialize(node, pres = [])
  @node = node
  @pres = pres
  @type = dispatch
end

Instance Attribute Details

#nodeObject (readonly)

Returns the value of attribute node.



6
7
8
# File 'lib/sevgi/derender/node.rb', line 6

def node
  @node
end

#presObject (readonly)

Returns the value of attribute pres.



6
7
8
# File 'lib/sevgi/derender/node.rb', line 6

def pres
  @pres
end

#typeObject (readonly)

Returns the value of attribute type.



6
7
8
# File 'lib/sevgi/derender/node.rb', line 6

def type
  @type
end

Instance Method Details

#_Object Also known as: meta



16
17
18
19
20
21
22
# File 'lib/sevgi/derender/node.rb', line 16

def _
  @_ ||= attributes
    .slice(
      *attributes.keys.select { |key| key.start_with?(META_NAMESPACE) }
    )
    .transform_keys! { |key| key.delete_prefix(META_NAMESPACE) }
end

#attributesObject



26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/sevgi/derender/node.rb', line 26

def attributes
  @attributes ||= node.attribute_nodes.to_h do |attr|
    name, value = attr.name, attr.value

    if attr.respond_to?(:namespace) && (namespace = attr.namespace) && (prefix = namespace.prefix)
      "#{prefix}:#{name}"
    else
      name
    end => key

    [key, value]
  end
end

#attributes!Object



40
# File 'lib/sevgi/derender/node.rb', line 40

def attributes! = attributes

#childrenObject



42
43
44
45
46
# File 'lib/sevgi/derender/node.rb', line 42

def children
  @children ||= node.children.map { |child| self.class.new(child) }.reject do |child|
    (child.node.text? and child.node.text.strip.empty?) or child.type == :Junk
  end
end

#contentObject



48
# File 'lib/sevgi/derender/node.rb', line 48

def content = @content ||= node.content.strip

#derenderObject



50
# File 'lib/sevgi/derender/node.rb', line 50

def derender = Ruby.format(decompile(pres).join("\n"))

#elementObject



52
# File 'lib/sevgi/derender/node.rb', line 52

def element = name

#evaluate(element, include_current = true) ⇒ Object



54
55
56
57
58
# File 'lib/sevgi/derender/node.rb', line 54

def evaluate(element, include_current = true)
  return element.instance_eval(derender) if include_current

  children.each { element.instance_eval(it.derender) }
end

#evaluate!(element) ⇒ Object



60
# File 'lib/sevgi/derender/node.rb', line 60

def evaluate!(element) = evaluate(element, false)

#find(arg, by: "id") ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
# File 'lib/sevgi/derender/node.rb', line 62

def find(arg, by: "id")
  return self if attributes[by] == arg

  children&.each do |child|
    found = child.find(arg, by:)

    return found if found
  end

  nil
end

#nameObject



74
# File 'lib/sevgi/derender/node.rb', line 74

def name = @name ||= node.name

#namespacesObject



76
# File 'lib/sevgi/derender/node.rb', line 76

def namespaces = (@namespaces ||= node.namespaces.to_h { |namespace, uri| [namespace, uri] })

#root?Boolean

Returns:

  • (Boolean)


78
# File 'lib/sevgi/derender/node.rb', line 78

def root? = type == :Root