class MicroMicro::Item

Attributes

node[R]

Public Class Methods

item_node?(node) click to toggle source

Does this node's `class` attribute contain root class names?

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

# File lib/micro_micro/item.rb, line 86
def self.item_node?(node)
  types_from(node).any?
end
items_from(context) click to toggle source

Extract items from a context.

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

# File lib/micro_micro/item.rb, line 94
def self.items_from(context)
  nodes_from(context).map { |node| new(node) }
end
new(node) click to toggle source

Parse a node for microformats2-encoded data.

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

# File lib/micro_micro/item.rb, line 8
def initialize(node)
  @node = node

  properties << implied_name if implied_name?
  properties << implied_photo if implied_photo?
  properties << implied_url if implied_url?
end
nodes_from(context, node_set = Nokogiri::XML::NodeSet.new(context.document, [])) click to toggle source

Extract item nodes from a context.

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

# File lib/micro_micro/item.rb, line 103
def self.nodes_from(context, node_set = Nokogiri::XML::NodeSet.new(context.document, []))
  return nodes_from(context.element_children, node_set) if context.is_a?(Nokogiri::HTML::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)
    if item_node?(context)
      node_set << context unless Property.property_node?(context)
    else
      nodes_from(context.element_children, node_set)
    end
  end

  node_set
end
types_from(node) click to toggle source

Extract root class names from a node.

node = Nokogiri::HTML('<div class="h-card">Jason Garber</div>').at_css('div')
MicroMicro::Item.types_from(node) #=> ['h-card']

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

# File lib/micro_micro/item.rb, line 126
def self.types_from(node)
  node.classes.select { |token| token.match?(/^h(?:-[0-9a-z]+)?(?:-[a-z]+)+$/) }.uniq.sort
end

Public Instance Methods

children() click to toggle source

A collection of child items parsed from the node.

@see microformats.org/wiki/microformats2-parsing#parse_an_element_for_class_microformats

@return [MicroMicro::Collections::ItemsCollection]

# File lib/micro_micro/item.rb, line 21
def children
  @children ||= Collections::ItemsCollection.new(Item.items_from(node.element_children))
end
id() click to toggle source

The value of the node's `id` attribute, if present.

@return [String, nil]

# File lib/micro_micro/item.rb, line 28
def id
  @id ||= node['id']&.strip
end
inspect() click to toggle source

@return [String]

# File lib/micro_micro/item.rb, line 33
def inspect
  format(%(#<#{self.class.name}:%#0x types: #{types.inspect}, properties: #{properties.count}, children: #{children.count}>), object_id)
end
plain_text_properties() click to toggle source

A collection of plain text properties parsed from the node.

@return [MicroMicro::Collections::PropertiesCollection]

# File lib/micro_micro/item.rb, line 40
def plain_text_properties
  @plain_text_properties ||= Collections::PropertiesCollection.new(properties.select { |property| property.prefix == 'p' })
end
properties() click to toggle source

A collection of properties parsed from the node.

@return [MicroMicro::Collections::PropertiesCollection]

# File lib/micro_micro/item.rb, line 47
def properties
  @properties ||= Collections::PropertiesCollection.new(Property.properties_from(node.element_children))
end
to_h() click to toggle source

Return the parsed item as a Hash.

@see microformats.org/wiki/microformats2-parsing#parse_an_element_for_class_microformats

@return [Hash]

# File lib/micro_micro/item.rb, line 56
def to_h
  hash = {
    type: types,
    properties: properties.to_h
  }

  hash[:id] = id if id.present?
  hash[:children] = children.to_a if children.any?

  hash
end
types() click to toggle source

An array of root class names parsed from the node's `class` attribute.

@return [Array<String>]

# File lib/micro_micro/item.rb, line 71
def types
  @types ||= self.class.types_from(node)
end
url_properties() click to toggle source

A collection of url properties parsed from the node.

@return [MicroMicro::Collections::PropertiesCollection]

# File lib/micro_micro/item.rb, line 78
def url_properties
  @url_properties ||= Collections::PropertiesCollection.new(properties.select { |property| property.prefix == 'u' })
end

Private Instance Methods

implied_name() click to toggle source

@return [MicroMicro::ImpliedProperty]

# File lib/micro_micro/item.rb, line 135
def implied_name
  @implied_name ||= ImpliedProperty.new(node, name: 'name', prefix: 'p')
end
implied_name?() click to toggle source

@return [Boolean]

# File lib/micro_micro/item.rb, line 140
def implied_name?
  imply_name? && implied_name.value?
end
implied_photo() click to toggle source

@return [MicroMicro::ImpliedProperty]

# File lib/micro_micro/item.rb, line 145
def implied_photo
  @implied_photo ||= ImpliedProperty.new(node, name: 'photo', prefix: 'u')
end
implied_photo?() click to toggle source

@return [Boolean]

# File lib/micro_micro/item.rb, line 150
def implied_photo?
  imply_photo? && implied_photo.value?
end
implied_url() click to toggle source

@return [MicroMicro::ImpliedProperty]

# File lib/micro_micro/item.rb, line 155
def implied_url
  @implied_url ||= ImpliedProperty.new(node, name: 'url', prefix: 'u')
end
implied_url?() click to toggle source

@return [Boolean]

# File lib/micro_micro/item.rb, line 160
def implied_url?
  imply_url? && implied_url.value?
end
imply_name?() click to toggle source

@return [Boolean]

# File lib/micro_micro/item.rb, line 165
def imply_name?
  properties.none? { |prop| prop.name == 'name' } && properties.none? { |prop| %w[e p].include?(prop.prefix) } && !nested_items?
end
imply_photo?() click to toggle source

@return [Boolean]

# File lib/micro_micro/item.rb, line 170
def imply_photo?
  properties.none? { |prop| prop.name == 'photo' } && properties.reject(&:implied?).none? { |prop| prop.prefix == 'u' } && !nested_items?
end
imply_url?() click to toggle source

@return [Boolean]

# File lib/micro_micro/item.rb, line 175
def imply_url?
  properties.none? { |prop| prop.name == 'url' } && properties.reject(&:implied?).none? { |prop| prop.prefix == 'u' } && !nested_items?
end
nested_items?() click to toggle source

@return [Boolean]

# File lib/micro_micro/item.rb, line 180
def nested_items?
  @nested_items ||= properties.find(&:item_node?) || children.any?
end