ontology_parser.rb revision ae8dcf6d96ecb4adbd0a0ee204d49182c2ecd493
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksamodule OntologyParser
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa
b51057b860560bf3ee454c03a121af3d5d34f482Eugen Kuksa class ParseException < Exception; end
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa # Parses the given string and executes the callback for each symbol
28001d576e67ba46ed481c5695f1e0827ff26007Eugen Kuksa def self.parse(input, callbacks)
b51057b860560bf3ee454c03a121af3d5d34f482Eugen Kuksa # Create a new parser
b51057b860560bf3ee454c03a121af3d5d34f482Eugen Kuksa parser = Nokogiri::XML::SAX::Parser.new(Listener.new(callbacks))
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa
b1fe9054ad7c7192fe4c474363247dad15963e99Eugen Kuksa # Feed the parser some XML
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa parser.parse(input)
5efadb4662f2a63d5f5f1a5b303ab7c3371069a8Eugen Kuksa end
5efadb4662f2a63d5f5f1a5b303ab7c3371069a8Eugen Kuksa
5efadb4662f2a63d5f5f1a5b303ab7c3371069a8Eugen Kuksa # Listener for the SAX Parser
5efadb4662f2a63d5f5f1a5b303ab7c3371069a8Eugen Kuksa class Listener < Nokogiri::XML::SAX::Document
5efadb4662f2a63d5f5f1a5b303ab7c3371069a8Eugen Kuksa
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa ROOT = 'DGraph'
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa ONTOLOGY = 'DGNode'
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa SYMBOL = 'Symbol'
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa AXIOM = 'Axiom'
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa LINK = 'DGLink'
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa TEXT = 'Text'
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa TYPE = 'Type'
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa MORPHISM = 'GMorphism'
366ce8d807067a97613cb23d49105d8a093c5015Eugen Kuksa
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa # the callback function is called for each Symbol tag
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa def initialize(callbacks)
366ce8d807067a97613cb23d49105d8a093c5015Eugen Kuksa @callbacks = callbacks
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa @path = []
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa @current_ontology = nil
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa @current_symbol = nil
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa @current_axiom = nil
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa @current_link = nil
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa end
366ce8d807067a97613cb23d49105d8a093c5015Eugen Kuksa
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa # a tag
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa def start_element(name, attributes)
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa @path << name
4ec9d8b62c3c1a001548eb0883b6f81e00c391a0Eugen Kuksa case name
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa when ROOT
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa callback(:root, Hash[*[attributes]])
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa when ONTOLOGY
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa callback(:ontology, Hash[*[attributes]])
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa when SYMBOL
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa @current_symbol = Hash[*[attributes]]
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa @current_symbol['text'] = ''
4ec9d8b62c3c1a001548eb0883b6f81e00c391a0Eugen Kuksa when AXIOM
5efadb4662f2a63d5f5f1a5b303ab7c3371069a8Eugen Kuksa @current_axiom = Hash[*[attributes]]
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa @current_axiom['symbols'] = []
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa when LINK
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa @current_link = Hash[*[attributes]]
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa when MORPHISM
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa @current_link['morphism'] = Hash[*[attributes]]['name'] if @current_link
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa end
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa end
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa
4ec9d8b62c3c1a001548eb0883b6f81e00c391a0Eugen Kuksa # a text node
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa def characters(text)
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa case @path.last
5efadb4662f2a63d5f5f1a5b303ab7c3371069a8Eugen Kuksa when SYMBOL
5efadb4662f2a63d5f5f1a5b303ab7c3371069a8Eugen Kuksa @current_symbol['text'] << text if @current_symbol
923d69139038e74c0936e826bbfdc8717fbbc7b3Eugen Kuksa when TEXT
5efadb4662f2a63d5f5f1a5b303ab7c3371069a8Eugen Kuksa @current_axiom['text'] = text if @current_axiom
5efadb4662f2a63d5f5f1a5b303ab7c3371069a8Eugen Kuksa when TYPE
5efadb4662f2a63d5f5f1a5b303ab7c3371069a8Eugen Kuksa @current_link['type'] = text if @current_link
5efadb4662f2a63d5f5f1a5b303ab7c3371069a8Eugen Kuksa end
5efadb4662f2a63d5f5f1a5b303ab7c3371069a8Eugen Kuksa end
5efadb4662f2a63d5f5f1a5b303ab7c3371069a8Eugen Kuksa
5efadb4662f2a63d5f5f1a5b303ab7c3371069a8Eugen Kuksa # closing tag
5efadb4662f2a63d5f5f1a5b303ab7c3371069a8Eugen Kuksa def end_element(name)
5efadb4662f2a63d5f5f1a5b303ab7c3371069a8Eugen Kuksa @path.pop
5efadb4662f2a63d5f5f1a5b303ab7c3371069a8Eugen Kuksa
5efadb4662f2a63d5f5f1a5b303ab7c3371069a8Eugen Kuksa case name
5efadb4662f2a63d5f5f1a5b303ab7c3371069a8Eugen Kuksa when ONTOLOGY
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa callback(:ontology_end, @current_ontology)
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa @current_ontology = nil
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa when SYMBOL
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa return if @path.last == 'Hidden'
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa if @current_axiom
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa # add to current axiom
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa @current_axiom['symbols'] << @current_symbol['text']
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa else
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa # return the current symcol
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa callback(:symbol, @current_symbol)
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa end
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa @current_symbol = nil
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa when AXIOM
4ec9d8b62c3c1a001548eb0883b6f81e00c391a0Eugen Kuksa # return the current axiom
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa callback(:axiom, @current_axiom)
28001d576e67ba46ed481c5695f1e0827ff26007Eugen Kuksa @current_axiom = nil
28001d576e67ba46ed481c5695f1e0827ff26007Eugen Kuksa when LINK
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa # return the current axiom
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa callback(:link, @current_link)
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa @current_link = nil
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa end
4ec9d8b62c3c1a001548eb0883b6f81e00c391a0Eugen Kuksa end
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa # error handler for parsing problems
284432981d641cf3d679841f75acbcf039d83062Eugen Kuksa def error(string)
284432981d641cf3d679841f75acbcf039d83062Eugen Kuksa raise ParseException, 'cannot parse: ' + string
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa end
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa private
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa def callback(name, args)
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa block = @callbacks[name]
923d69139038e74c0936e826bbfdc8717fbbc7b3Eugen Kuksa block.call(args) if block
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa end
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa end
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksa
daf3e28fff47a65b53d6fb65155301763b9f166eEugen Kuksaend
4ec9d8b62c3c1a001548eb0883b6f81e00c391a0Eugen Kuksa