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