class ONIX::SubsetDSL

DSL

Public Class Methods

_ancestor_registered_scopes() click to toggle source
# File lib/onix/subset.rb, line 267
def self._ancestor_registered_scopes
  els = self.registered_scopes
  sup = self
  while sup.respond_to?(:registered_scopes)
    els.merge!(sup.registered_scopes) if sup.registered_scopes
    sup = sup.superclass
  end
  els
end
_ancestors_registered_elements() click to toggle source
# File lib/onix/subset.rb, line 324
def self._ancestors_registered_elements
  els = self.registered_elements
  sup = self
  while sup.respond_to?(:registered_elements)
    els.merge!(sup.registered_elements) if sup.registered_elements
    sup = sup.superclass
  end
  els
end
ancestor_registered_scopes() click to toggle source
# File lib/onix/subset.rb, line 277
def self.ancestor_registered_scopes
  @ancestors_registered_scopes ||= _ancestor_registered_scopes
end
ancestors_registered_elements() click to toggle source
# File lib/onix/subset.rb, line 334
def self.ancestors_registered_elements
  @ancestors_registered_elements ||= _ancestors_registered_elements
end
element(name, type, options = {}) click to toggle source
# File lib/onix/subset.rb, line 285
def self.element(name, type, options = {})
  @elements ||= {}
  @elements[name] = ElementParser.new(name, type, options)
  short_name = self.ref_to_short(name)
  if short_name
    @elements[short_name] = @elements[name].dup
    @elements[short_name].short = true
  end

  attr_accessor @elements[name].to_sym

  alias_method "#{@elements[name].underscore_name}_with_attributes".to_sym, @elements[name].to_sym

  current_element = @elements[name]
  define_method current_element.to_sym do |args = nil|
    val = instance_variable_get(current_element.to_instance)
    if val.respond_to?(:__getobj__)
      val.__getobj__
    else
      if val.is_a?(SubsetArray) and val.first and val.first.is_a?(TextWithAttributes)
        val.map{|v| v.respond_to?(:__getobj__) ? v.__getobj__ : v}
      else
        val
      end
    end
  end

  if @elements[name].shortcut
    current_element = @elements[name]
    alias_method "#{current_element.shortcut.to_s}_with_attributes".to_sym, "#{@elements[name].underscore_name}_with_attributes".to_sym
    alias_method current_element.shortcut, @elements[name].to_sym
  end
end
elements(name, type, options = {}) click to toggle source

shortcut for element :array=>true

# File lib/onix/subset.rb, line 320
def self.elements(name, type, options = {})
  self.element(name, type, options.merge(:array => true))
end
get_class(name) click to toggle source
# File lib/onix/subset.rb, line 371
def self.get_class(name)
  ONIX.const_get(name) if ONIX.const_defined? name
end
n() click to toggle source

infinity constant for cardinality

# File lib/onix/subset.rb, line 376
def self.n
  Float::INFINITY
end
new() click to toggle source
# File lib/onix/subset.rb, line 342
def initialize
  # initialize plural as Array
  self.class.ancestors_registered_elements.each do |k, e|
    if e.is_array?
      # register a contextual SubsetArray object
      subset_array = SubsetArray.new
      subset_klass = self.class.get_class(e.class_name)
      if subset_klass.respond_to? :registered_scopes
        subset_klass.registered_scopes.each do |n, l|
          unless subset_array.respond_to? n.to_s
            subset_array.define_singleton_method(n.to_s) do
              instance_exec(&l)
            end
          end
        end
      end
      instance_variable_set(e.to_instance, subset_array)
    end
  end
end
ref_to_short(name) click to toggle source
# File lib/onix/subset.rb, line 367
def self.ref_to_short(name)
  RefToShort.names[name]
end
registered_elements() click to toggle source
# File lib/onix/subset.rb, line 338
def self.registered_elements
  @elements || {}
end
registered_scopes() click to toggle source
# File lib/onix/subset.rb, line 281
def self.registered_scopes
  @scopes || {}
end
scope(name, lambda) click to toggle source
# File lib/onix/subset.rb, line 262
def self.scope(name, lambda)
  @scopes ||= {}
  @scopes[name] = lambda
end
short_to_ref(name) click to toggle source
# File lib/onix/subset.rb, line 363
def self.short_to_ref(name)
  ShortToRef.names[name]
end

Public Instance Methods

get_class(name) click to toggle source
# File lib/onix/subset.rb, line 384
def get_class(name)
  self.class.get_class(name)
end
get_registered_element(name) click to toggle source
# File lib/onix/subset.rb, line 380
def get_registered_element(name)
  self.class.ancestors_registered_elements[name]
end
parse(n) click to toggle source
# File lib/onix/subset.rb, line 388
def parse(n)
  parse_attributes(n.attributes)
  n.elements.each do |t|
    name = t.name
    e = self.get_registered_element(name)
    if e
      primitive = true
      case e.type
      when :subset
        klass = self.get_class(e.class_name)
        unless klass
          raise UnknownElement, e.class_name
        end
        val = klass.parse(t)
        primitive = false
      when :text
        val = t.text
      when :integer
        val = t.text.to_i
      when :float
        val = t.text.to_f
      when :bool
        val = true
      when :date
        fmt = t["dateformat"] || "00"
        begin
          val = ONIX::Helper.to_date(fmt, t.text)
        rescue
          val = t.text
        end
      when :datestamp
        tm = t.text
        datestamp = DateStamp.new
        datestamp.parse(tm)
        val = datestamp
      when :ignore
        val = nil
      else
        val = t.text
      end

      if val
        if primitive && t.attributes.length > 0
          if t.attributes["textformat"] && t.attributes["textformat"].to_s == "05" # content is XHTML
            val = CGI.unescapeHTML(t.children.map { |x| x.to_s }.join.strip)
          end
          val = TextWithAttributes.new(val)
          val.parse(t.attributes)
        end

        if e.is_array?
          instance_variable_get(e.to_instance).send(:push, val)
        else
          instance_variable_set(e.to_instance, e.parse_lambda(val))
        end
      end

    else
      unsupported(t)
    end
  end
end