class DR::SimpleKeywordsParser
Attributes
keywords[RW]
opts[RW]
Public Class Methods
new(hash, **opts)
click to toggle source
# File lib/dr/parse/simple_keywords.rb, line 5 def initialize(hash, **opts) @opts=opts @keywords=hash end
Public Instance Methods
keyword(name, &b)
click to toggle source
# File lib/dr/parse/simple_keywords.rb, line 10 def keyword(name, &b) @keywords[name]=b end
parse(msg, **opts)
click to toggle source
# File lib/dr/parse/simple_keywords.rb, line 14 def parse(msg, **opts) opts=@opts.merge(opts) sep=opts[:sep] || ',' # Warning: the delims must take only one char delims= opts[:delims] || '()' bdelim= delims[0] edelim= delims[1] || bdelim keywords=@keywords.keys keywords_r="(?:"+keywords.map {|k| "(?:"+k+")"}.join("|")+")" reg = %r{(?<kw>#{keywords_r})(?<re>#{'\\'+bdelim}(?:(?>[^#{'\\'+bdelim}#{edelim == bdelim ? '' : '\\'+edelim}]+)|\g<re>)*#{'\\'+edelim})} if (m=reg.match(msg)) arg=m[:re][1...m[:re].length-1] arg=parse(arg, **opts) args=arg.split(sep) args=args.map {|a| a.strip} unless opts[:space] key=keywords.find {|k| /#{k}/ =~ m[:kw]} r=@keywords[key].call(*args).to_s msg=m.pre_match+r+parse(m.post_match,**opts) msg=keywords(msg,@keywords,**opts) if opts[:recursive] end return msg end