class MicroMicro::Property

Constants

PROPERTY_PARSERS_MAP

Attributes

name[R]
node[R]
prefix[R]

Public Class Methods

new(node, name:, prefix:) click to toggle source

@param node [Nokogiri::XML::Element] @param name [String] @param prefix [String<dt, e, p, u>]

# File lib/micro_micro/property.rb, line 17
def initialize(node, name:, prefix:)
  @node = node
  @name = name
  @prefix = prefix
end
nodes_from(context, node_set = Nokogiri::XML::NodeSet.new(context.document, [])) click to toggle source

@param context [Nokogiri::XML::NodeSet, Nokogiri::XML::Element] @param node_set [Nokogiri::XML::NodeSet] @return [Nokogiri::XML::NodeSet]

# File lib/micro_micro/property.rb, line 67
def self.nodes_from(context, node_set = Nokogiri::XML::NodeSet.new(context.document, []))
  context.each { |node| nodes_from(node, node_set) } if context.is_a?(Nokogiri::XML::NodeSet)

  if context.is_a?(Nokogiri::XML::Element) && !Document.ignore_node?(context)
    node_set << context if property_node?(context)

    nodes_from(context.element_children, node_set) unless Item.item_node?(context)
  end

  node_set
end
properties_from(context) click to toggle source

@param context [Nokogiri::XML::NodeSet, Nokogiri::XML::Element] @return [Array<MicroMicro::Property>]

# File lib/micro_micro/property.rb, line 81
def self.properties_from(context)
  nodes_from(context).map do |node|
    types_from(node).map { |prefix, name| new(node, name: name, prefix: prefix) }
  end.flatten
end
property_node?(node) click to toggle source

@param node [Nokogiri::XML::Element] @return [Boolean]

# File lib/micro_micro/property.rb, line 89
def self.property_node?(node)
  types_from(node).any?
end
types_from(node) click to toggle source

@param node [Nokogiri::XML::Element] @return [Array<Array(String, String)>]

@example

node = Nokogiri::HTML('<a href="https://sixtwothree.org" class="p-name u-url">Jason Garber</a>').at_css('a')
MicroMicro::Property.types_from(node) #=> [['p', 'name'], ['u', 'url']]
# File lib/micro_micro/property.rb, line 99
def self.types_from(node)
  node.classes.select { |token| token.match?(/^(?:dt|e|p|u)(?:-[0-9a-z]+)?(?:-[a-z]+)+$/) }.map { |token| token.split(/-/, 2) }.uniq
end

Public Instance Methods

implied?() click to toggle source

@return [Boolean]

# File lib/micro_micro/property.rb, line 24
def implied?
  false
end
inspect() click to toggle source

@return [String]

# File lib/micro_micro/property.rb, line 29
def inspect
  format(%(#<#{self.class.name}:%#0x name: #{name.inspect}, prefix: #{prefix.inspect}, value: #{value.inspect}>), object_id)
end
item() click to toggle source

@return [MicroMicro::Item, nil]

# File lib/micro_micro/property.rb, line 34
def item
  @item ||= Item.new(node) if item_node?
end
item_node?() click to toggle source

@return [Boolean]

# File lib/micro_micro/property.rb, line 39
def item_node?
  @item_node ||= Item.item_node?(node)
end
value() click to toggle source

@return [String, Hash]

# File lib/micro_micro/property.rb, line 44
def value
  @value ||= begin
    return parser.value unless item_node?

    hash = item.to_h

    return hash.merge(parser.value) if prefix == 'e'

    p_property = item.properties.find { |property| property.name == 'name' } if prefix == 'p'
    u_property = item.properties.find { |property| property.name == 'url' } if prefix == 'u'

    hash.merge(value: (p_property || u_property || parser).value)
  end
end
value?() click to toggle source

@return [Boolean]

# File lib/micro_micro/property.rb, line 60
def value?
  value.present?
end

Private Instance Methods

parser() click to toggle source
# File lib/micro_micro/property.rb, line 105
def parser
  @parser ||= PROPERTY_PARSERS_MAP[prefix].new(self)
end