class Alpinist::Profile
Attributes
root_nodes[R]
url[R]
Public Class Methods
new(document, url)
click to toggle source
# File lib/alpinist/profile.rb, line 8 def initialize(document, url) @document = document @url = url @root_nodes = [] @descriptors = {} @insubstantial_descriptors = [] parse! end
Public Instance Methods
all_descriptors()
click to toggle source
# File lib/alpinist/profile.rb, line 32 def all_descriptors @descriptors.values end
find_descriptor(id)
click to toggle source
# File lib/alpinist/profile.rb, line 23 def find_descriptor(id) id = id.sub(/^#/, '') @descriptors[id] || @insubstantial_descriptors.find { |descriptor| descriptor.id == id } end
find_node(id)
click to toggle source
# File lib/alpinist/profile.rb, line 17 def find_node(id) @root_nodes.inject(nil) do |result, root_node| result || root_node.find { |node| node.name == id && node.content.reference.nil? } end end
root_descriptors()
click to toggle source
# File lib/alpinist/profile.rb, line 28 def root_descriptors @root_nodes.map(&:content) end
Private Instance Methods
define_descriptor(data)
click to toggle source
# File lib/alpinist/profile.rb, line 53 def define_descriptor(data) if data['id'] # substantial id = data['id'] descriptor = Descriptor.new(id: id, name: data['name'], type: data['type'], rt: data['rt'], href: data['href'], doc: data['doc'], ext: data['ext']) @descriptors[id] = descriptor set_reference(id, descriptor) else # insubstantial url, id = data['href'].split('#') reference = @descriptors[id] if url.empty? descriptor = Descriptor.new(id: id, name: data['name'], type: data['type'], rt: data['rt'], href: data['href'], doc: data['doc'], ext: data['ext'], reference: reference) @insubstantial_descriptors << descriptor end node = Tree::TreeNode.new(id, descriptor) # 適切なTreeに取替可能 if data['descriptor'] Array.wrap(data['descriptor']).each do |data_child| node << define_descriptor(data_child) # FIXME: idの重複 end end node end
parse!()
click to toggle source
# File lib/alpinist/profile.rb, line 38 def parse! doc = begin JSON.parse(@document) rescue JSON::ParserError # TODO: improve MultiXml.parse(@document) end alps = doc['alps'] raise unless alps @root_nodes = Array.wrap(alps['descriptor']).map do |data| define_descriptor(data) end end
set_reference(id, descriptor)
click to toggle source
# File lib/alpinist/profile.rb, line 74 def set_reference(id, descriptor) # 必要? @insubstantial_descriptors.each do |insubstantial_descriptor| if insubstantial_descriptor.reference.nil? && insubstantial_descriptor.id == id insubstantial_descriptor.reference = descriptor end end end