| Module | OpenWFE::DefParser |
| In: |
lib/openwfe/expool/parser.rb
|
A process definition parser.
Currently supports XML, Ruby process pdefinitions, YAML and JSON.
in : a process pdefinition out : a tree [ name, attributes, children ]
# File lib/openwfe/expool/parser.rb, line 57
57: def self.parse (pdef)
58:
59: return pdef \
60: if pdef.is_a?(Array)
61:
62: return parse_string(pdef) \
63: if pdef.is_a?(String)
64:
65: return pdef.do_make \
66: if pdef.is_a?(ProcessDefinition) or pdef.is_a?(Class)
67:
68: return pdef.to_a \
69: if pdef.is_a?(SimpleExpRepresentation)
70: # for legacy stuff
71:
72: raise "cannot handle pdefinition of class #{pdef.class.name}"
73: end
# File lib/openwfe/expool/parser.rb, line 75
75: def self.parse_string (pdef)
76:
77: pdef = pdef.strip
78:
79: return parse_xml(pdef) \
80: if pdef[0, 1] == "<"
81:
82: return YAML.load(s) \
83: if pdef.match /^--- ./
84:
85: #
86: # else it's some ruby code to eval
87:
88: ProcessDefinition.eval_ruby_process_definition pdef
89: end
The process definition is expressed as XML, turn that into an expression tree.
# File lib/openwfe/expool/parser.rb, line 95
95: def self.parse_xml (xml)
96:
97: xml = REXML::Document.new(xml) \
98: if xml.is_a?(String)
99:
100: xml = xml.root \
101: if xml.is_a?(REXML::Document)
102:
103: if xml.is_a?(REXML::Text)
104:
105: s = xml.to_s.strip
106:
107: return s if s.length > 0
108:
109: return nil
110: end
111:
112: return nil if xml.is_a?(REXML::Comment)
113:
114: # xml element thus...
115:
116: name = xml.name
117:
118: attributes = xml.attributes.inject({}) do |r, (k, v)|
119: r[k] = v
120: r
121: end
122:
123: rep = [ name, attributes, [] ]
124:
125: xml.children.each do |c|
126:
127: #r = if c.is_a?(REXML::Element) and c.prefix != xml.prefix
128: # c
129: #else
130: # parse_xml c
131: #end
132: r = parse_xml c
133:
134: rep.last << r if r
135: end
136:
137: rep
138: end