Module: OM::XML::Document

Included in:
Samples::ModsArticle
Defined in:
lib/om/xml/document.rb

Defined Under Namespace

Modules: ClassMethods

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *args) ⇒ Object



48
49
50
51
52
53
54
55
# File 'lib/om/xml/document.rb', line 48

def method_missing(name, *args)
  term = self.class.terminology.retrieve_term(name)
  if (term)
    OM::XML::DynamicNode.new(name, args.first, self, term)
  else
    super
  end
end

Instance Attribute Details

#ox_namespacesObject

Returns a hash combining the current documents namespaces (provided by nokogiri) and any namespaces that have been set up by your Terminology. Most importantly, this matches the ‘oxns’ namespace to the namespace you provided in your Terminology’s root term config



38
39
40
# File 'lib/om/xml/document.rb', line 38

def ox_namespaces
  @ox_namespaces
end

Class Method Details

.included(klass) ⇒ Object



40
41
42
43
44
45
46
# File 'lib/om/xml/document.rb', line 40

def self.included(klass)
  klass.extend(ClassMethods)

  klass.send(:include, OM::XML::Container)
  klass.send(:include, OM::XML::TermValueOperators)
  klass.send(:include, OM::XML::Validation)
end

Instance Method Details

#add_child_node(target_node, node_type, *args, &block) ⇒ Object

Instantiate a node_type template and add it as a child of target_node, where target_node is one of:

  • a Nokogiri::XML::Node

  • a single-element Nokogiri::XML::NodeSet

  • a term_pointer array resolving to a single-element Nokogiri::XML::NodeSet

Additional arguments will be passed to the template unaltered.

Returns the new Nokogiri::XML::Node.



103
104
105
# File 'lib/om/xml/document.rb', line 103

def add_child_node(target_node, node_type, *args, &block)
  manipulate_node(:add_child, target_node, node_type, *args, &block)
end

#add_next_sibling_node(target_node, node_type, *args, &block) ⇒ Object

Instantiate a node_type template and insert it as the following sibling of target_node. Returns the new Nokogiri::XML::Node.



109
110
111
# File 'lib/om/xml/document.rb', line 109

def add_next_sibling_node(target_node, node_type, *args, &block)
  manipulate_node(:add_next_sibling, target_node, node_type, *args, &block)
end

#add_previous_sibling_node(target_node, node_type, *args, &block) ⇒ Object

Instantiate a node_type template and insert it as the preceding sibling of target_node. Returns the new Nokogiri::XML::Node.



115
116
117
# File 'lib/om/xml/document.rb', line 115

def add_previous_sibling_node(target_node, node_type, *args, &block)
  manipulate_node(:add_previous_sibling, target_node, node_type, *args, &block)
end

#after_node(target_node, node_type, *args, &block) ⇒ Object

Instantiate a node_type template and insert it as the following sibling of target_node. Returns target_node.



121
122
123
# File 'lib/om/xml/document.rb', line 121

def after_node(target_node, node_type, *args, &block)
  manipulate_node(:after, target_node, node_type, *args, &block)
end

#before_node(target_node, node_type, *args, &block) ⇒ Object

Instantiate a node_type template and insert it as the preceding sibling of target_node. Returns target_node.



127
128
129
# File 'lib/om/xml/document.rb', line 127

def before_node(target_node, node_type, *args, &block)
  manipulate_node(:before, target_node, node_type, *args, &block)
end

#find_by_terms(*term_pointer) ⇒ Object

term_pointer Variable length array of values in format [:accessor_name, :accessor_name …] or [:accessor_name=>index, :accessor_name …] @example:

find_by_terms( {:person => 1}, :first_name )

Currently, indexes must be integers.

Examples:

find_by_terms( [:person, 1, :first_name] )


76
77
78
79
# File 'lib/om/xml/document.rb', line 76

def find_by_terms(*term_pointer)
  xpath = self.class.terminology.xpath_with_indexes(*term_pointer)   
  find_by_xpath(xpath) unless xpath.nil?
end

#find_by_terms_and_value(*term_pointer) ⇒ Object

Applies the property’s corresponding xpath query, returning the result Nokogiri::XML::NodeSet



64
65
66
67
# File 'lib/om/xml/document.rb', line 64

def find_by_terms_and_value(*term_pointer)
  xpath = self.class.terminology.xpath_for(*term_pointer)    
  find_by_xpath(xpath) unless xpath.nil?
end

#find_by_xpath(xpath) ⇒ Object



58
59
60
# File 'lib/om/xml/document.rb', line 58

def find_by_xpath(xpath)
  ng_xml.xpath(xpath, ox_namespaces) 
end

#node_exists?(*term_pointer) ⇒ Boolean

Test whether the document has a node corresponding to the given term_pointer

Parameters:

  • term_pointer (Array)

    to test

Returns:

  • (Boolean)


83
84
85
# File 'lib/om/xml/document.rb', line 83

def node_exists?(*term_pointer)
  !find_by_terms(*term_pointer).empty?
end

#replace_node(target_node, node_type, *args, &block) ⇒ Object

Instantiate a node_type template and replace target_node with it. Returns the new Nokogiri::XML::Node.



133
134
135
# File 'lib/om/xml/document.rb', line 133

def replace_node(target_node, node_type, *args, &block)
  manipulate_node(:replace, target_node, node_type, *args, &block)
end

#swap_node(target_node, node_type, *args, &block) ⇒ Object

Instantiate a node_type template and replace target_node with it. Returns target_node.



139
140
141
# File 'lib/om/xml/document.rb', line 139

def swap_node(target_node, node_type, *args, &block)
  manipulate_node(:swap, target_node, node_type, *args, &block)
end

#template(node_type, *args) ⇒ Object



92
93
94
# File 'lib/om/xml/document.rb', line 92

def template(node_type, *args)
  template_registry.instantiate(node_type, *args)
end

#template_registryObject

Access the class’s template registry



88
89
90
# File 'lib/om/xml/document.rb', line 88

def template_registry
  self.class.template_registry
end