Module: Duxml

Includes:
Saxer
Included in:
ElementGuts, Grammar, History, Pattern, PatternMaker, RelaxNG
Defined in:
lib/duxml.rb,
lib/duxml/doc.rb,
lib/duxml/meta.rb,
lib/duxml/saxer.rb,
lib/duxml/doc/element.rb,
lib/duxml/doc/lazy_ox.rb,
lib/duxml/doc/node_set.rb,
lib/duxml/meta/grammar.rb,
lib/duxml/meta/history.rb,
lib/duxml/meta/history/add.rb,
lib/duxml/meta/grammar/rule.rb,
lib/duxml/meta/history/undo.rb,
lib/duxml/meta/history/error.rb,
lib/duxml/meta/history/change.rb,
lib/duxml/meta/history/remove.rb,
lib/duxml/meta/grammar/pattern.rb,
lib/duxml/meta/grammar/relax_ng.rb,
lib/duxml/meta/history/new_attr.rb,
lib/duxml/meta/history/new_text.rb,
lib/duxml/meta/grammar/spreadsheet.rb,
lib/duxml/meta/history/change_attr.rb,
lib/duxml/meta/history/change_text.rb,
lib/duxml/meta/grammar/pattern_maker.rb,
lib/duxml/meta/history/qualify_error.rb,
lib/duxml/meta/grammar/rule/text_rule.rb,
lib/duxml/meta/history/validate_error.rb,
lib/duxml/meta/grammar/rule/attrs_rule.rb,
lib/duxml/meta/grammar/rule/value_rule.rb,
lib/duxml/meta/grammar/rule/children_rule.rb,
lib/duxml/meta/grammar/relax_ng/attrs_rule.rb,
lib/duxml/meta/grammar/relax_ng/value_rule.rb,
lib/duxml/meta/grammar/pattern/text_pattern.rb,
lib/duxml/meta/grammar/pattern/child_pattern.rb,
lib/duxml/meta/grammar/relax_ng/children_rule.rb,
lib/duxml/meta/grammar/pattern/attr_val_pattern.rb,
lib/duxml/meta/grammar/pattern/attr_name_pattern.rb

Defined Under Namespace

Modules: Add, AttrNamePattern, AttrValPattern, AttrsRule, Change, ChangeAttr, ChangeText, ChildPattern, ChildrenRule, ElementGuts, Error, Grammar, History, LazyOx, Meta, NewAttr, NewText, Pattern, PatternMaker, QualifyError, RelaxNG, Remove, RngAttrsRule, RngChildrenRule, RngValueRule, Rule, Saxer, Spreadsheet, TextPattern, TextRule, Undo, ValidateError, ValueRule Classes: AddClass, AttrNamePatternClass, AttrValPatternClass, AttrsRuleClass, ChangeAttrClass, ChangeClass, ChangeTextClass, ChildPatternClass, ChildrenRuleClass, Doc, Element, ErrorClass, GrammarClass, HistoryClass, MetaClass, NewAttrClass, NewTextClass, NodeSet, NullChildPatternClass, PatternClass, QualifyErrorClass, RemoveClass, RuleClass, TextPatternClass, TextRuleClass, UndoClass, ValidateErrorClass, ValueRuleClass

Instance Attribute Summary collapse

Attributes included from Saxer

#io

Instance Method Summary collapse

Methods included from Saxer

#sax

Instance Attribute Details

#docObject (readonly)

Returns the value of attribute doc.



11
12
13
# File 'lib/duxml.rb', line 11

def doc
  @doc
end

Instance Method Details

#load(_file, grammar_path = nil) ⇒ Doc

Returns XML document as Ruby object.

Parameters:

  • _file (String)

    loads XML file from given path and finds or creates corresponding metadata file e.g. ‘.xml_file.duxml’

  • grammar_path (nil, String, Duxml::Grammar) (defaults to: nil)

    optional - provide an external grammar file or object

Returns:

  • (Doc)

    XML document as Ruby object



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/duxml.rb', line 16

def load(_file, grammar_path=nil)
  meta_path = Meta.meta_path(_file)

  if File.exists?(meta_path)
    meta = Ox.parse_obj(File.read meta_path)
    meta.grammar = grammar_path unless grammar_path.nil? or meta.grammar.defined?
  else
    meta = MetaClass.new(grammar_path)
  end

  if File.exists?(_file)
    @doc = sax(_file, meta.history)
  else
    @doc = Doc.new
    @doc.path = _file

    doc.delete_observers if doc.count_observers > 0 and doc.observer_peers.first.object_id != meta.history.object_id
    doc.add_observer meta.history if doc.count_observers < 1
  end
  doc.set_meta meta
end

#log(file) ⇒ Object

Parameters:

  • file (String)

    output file path for logging human-readable validation error messages



47
48
49
# File 'lib/duxml.rb', line 47

def log(file)
  File.write(file, meta.history.description)
end

#save(file, xml = doc) ⇒ Object

Parameters:

  • file (String)

    saves current content XML to given file path

  • xml (Doc, Element) (defaults to: doc)

    current Doc by default, but can also be unattached XML Element



40
41
42
43
44
# File 'lib/duxml.rb', line 40

def save(file, xml=doc)
  @doc = xml.respond_to?(:root) ? xml : Doc.new << xml
  doc.write_to file
  File.write(Meta.meta_path(file), Ox.dump(doc.meta, circular: true))
end

#validate(path_or_doc, options = {}) ⇒ Boolean

Returns whether file passed validation.

Parameters:

  • *Args (String, Doc)

    if string then path to load Doc, else Doc to validate

  • options (Hash, Symbol) (defaults to: {})

    currently just supports suppression of console output of results with :quiet

Returns:

  • (Boolean)

    whether file passed validation

Raises:

  • (Exception)


54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/duxml.rb', line 54

def validate(path_or_doc, options={})
  doc = path_or_doc.is_a?(Doc) ? path_or_doc : load(path_or_doc)
  unless doc.grammar.defined?
    raise Exception, "grammar not defined!" unless options[:grammar]
    doc.grammar = options[:grammar]
  end
  raise Exception, "XML document has no root element!" unless doc.root
  results = []
  doc.root.traverse do |n| results << doc.grammar.validate(n) unless n.is_a?(String) end
  puts(doc.history.description) unless options[:quiet]
  !results.any? do |r| !r end
end