Class: Sevgi::Derender::Node
- Inherits:
-
Object
- Object
- Sevgi::Derender::Node
- Defined in:
- lib/sevgi/derender/node.rb
Overview
Node in a derender tree produced from an SVG/XML node.
Constant Summary collapse
- META_NAMESPACE =
Attribute namespace prefix used for Sevgi metadata.
"_:"
Instance Attribute Summary collapse
-
#node ⇒ Nokogiri::XML::Node
readonly
Source XML node.
-
#pres ⇒ Array<String>
readonly
Preamble XML lines carried by the root node.
-
#type ⇒ Object
readonly
Returns the value of attribute type.
Instance Method Summary collapse
-
#_ ⇒ Hash{String => String}
(also: #meta)
Returns Sevgi metadata attributes without the metadata namespace prefix.
-
#attributes ⇒ Hash{String => String}
Returns source XML attributes keyed with namespace prefixes when present.
-
#attributes! ⇒ Hash{String => String}
Returns source XML attributes.
-
#children ⇒ Array<Sevgi::Derender::Node>
Returns non-ignorable child derender nodes.
-
#content ⇒ String
Returns node text content, preserving or stripping whitespace according to xml:space.
-
#derender ⇒ String
Converts this node into formatted Sevgi DSL Ruby source.
-
#element ⇒ String
Returns the Sevgi DSL element name for this node.
-
#evaluate(element, include_current = true) ⇒ Sevgi::Graphics::Element
Evaluates this node under a graphics element.
-
#evaluate!(element) ⇒ Sevgi::Graphics::Element
Evaluates only this node's children under a graphics element.
-
#find(arg, by: "id") ⇒ Sevgi::Derender::Node?
Finds the first descendant whose attribute matches a value.
-
#initialize(node, pres = []) ⇒ void
constructor
Builds a derender node.
-
#name ⇒ String
Returns the source XML node name.
-
#namespaces ⇒ Hash{String => String}
Returns source XML namespaces.
-
#root? ⇒ Boolean
Reports whether this node is the SVG root strategy.
Constructor Details
#initialize(node, pres = []) ⇒ void
Builds a derender node.
19 20 21 22 23 |
# File 'lib/sevgi/derender/node.rb', line 19 def initialize(node, pres = []) @node = node @pres = pres @type = dispatch end |
Instance Attribute Details
#node ⇒ Nokogiri::XML::Node (readonly)
Returns source XML node.
13 14 15 |
# File 'lib/sevgi/derender/node.rb', line 13 def node @node end |
#pres ⇒ Array<String> (readonly)
Returns preamble XML lines carried by the root node.
13 |
# File 'lib/sevgi/derender/node.rb', line 13 attr_reader :node, :pres, :type |
#type ⇒ Object (readonly)
Returns the value of attribute type.
13 |
# File 'lib/sevgi/derender/node.rb', line 13 attr_reader :node, :pres, :type |
Instance Method Details
#_ ⇒ Hash{String => String} Also known as: meta
Returns Sevgi metadata attributes without the metadata namespace prefix.
30 31 32 33 34 35 36 |
# File 'lib/sevgi/derender/node.rb', line 30 def _ @_ ||= attributes .slice( *attributes.keys.select { |key| key.start_with?(META_NAMESPACE) } ) .transform_keys! { |key| key.delete_prefix(META_NAMESPACE) } end |
#attributes ⇒ Hash{String => String}
Returns source XML attributes keyed with namespace prefixes when present.
42 43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/sevgi/derender/node.rb', line 42 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! ⇒ Hash{String => String}
Returns source XML attributes.
58 |
# File 'lib/sevgi/derender/node.rb', line 58 def attributes! = attributes |
#children ⇒ Array<Sevgi::Derender::Node>
Returns non-ignorable child derender nodes.
62 63 64 65 66 67 |
# File 'lib/sevgi/derender/node.rb', line 62 def children @children ||= node .children .map { |child| self.class.new(child) } .reject { |child| ignorable_child?(child) } end |
#content ⇒ String
Returns node text content, preserving or stripping whitespace according to xml:space.
71 |
# File 'lib/sevgi/derender/node.rb', line 71 def content = @content ||= preserve_space? ? node.content : node.content.strip |
#derender ⇒ String
Converts this node into formatted Sevgi DSL Ruby source.
76 |
# File 'lib/sevgi/derender/node.rb', line 76 def derender = Ruby.format(decompile(pres).join("\n")) |
#element ⇒ String
Returns the Sevgi DSL element name for this node.
80 |
# File 'lib/sevgi/derender/node.rb', line 80 def element = name |
#evaluate(element, include_current = true) ⇒ Sevgi::Graphics::Element
Evaluates this node under a graphics element.
87 88 89 90 91 |
# File 'lib/sevgi/derender/node.rb', line 87 def evaluate(element, include_current = true) return element.instance_eval(derender) if include_current children.each { element.instance_eval(it.derender) } end |
#evaluate!(element) ⇒ Sevgi::Graphics::Element
Evaluates only this node's children under a graphics element.
97 |
# File 'lib/sevgi/derender/node.rb', line 97 def evaluate!(element) = evaluate(element, false) |
#find(arg, by: "id") ⇒ Sevgi::Derender::Node?
Finds the first descendant whose attribute matches a value.
103 104 105 106 107 108 109 110 111 112 113 |
# File 'lib/sevgi/derender/node.rb', line 103 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 |
#name ⇒ String
Returns the source XML node name.
117 |
# File 'lib/sevgi/derender/node.rb', line 117 def name = @name ||= node.name |
#namespaces ⇒ Hash{String => String}
Returns source XML namespaces.
121 |
# File 'lib/sevgi/derender/node.rb', line 121 def namespaces = (@namespaces ||= node.namespaces.to_h { |namespace, uri| [namespace, uri] }) |
#root? ⇒ Boolean
Reports whether this node is the SVG root strategy.
125 |
# File 'lib/sevgi/derender/node.rb', line 125 def root? = type == :Root |