VALUE_BY_PATH1 |
= |
%q` # (1)path (2)current data (3)parent data (4)root data (5)plugin object def value_by_path(ids, data, pdata, rdata, plugin) data[ParentNode] ||= pdata hd,*ids = ids case hd when nil data when RootNode value_by_path(ids, rdata, nil, rdata, plugin) when CurrentNode value_by_path(ids, data, pdata, rdata, plugin) when ParentNode value_by_path(ids, data[ParentNode], nil, rdata, plugin) when AnyNode0 [ value_by_path(ids, data, pdata, rdata, plugin), value_by_path([AnyNode2]+ids, data, pdata, rdata, plugin) ].flatten when /^(@\*|\*\*|\*)([\[\{].+[\]\}])?$/ if( $1 == '@*' ) opt = $2 if( opt ) val = data.keys.select{|x| x[0] == ?@}.collect{|key| key = key + opt value_by_path([key]+ids, data, pdata, rdata, plugin) }.flatten else val = data.keys.select{|x| x[0] == ?@}.collect{|key| value_by_path([key]+ids, data, pdata, rdata, plugin) }.flatten end elsif( $1 == '*' ) opt = $2 if( opt ) val = data.keys.select{|x| !(x == ParentNode || x == TextNode) }.collect{|key| key = key + opt value_by_path([key]+ids, data, pdata, rdata, plugin) }.flatten else val = data.keys.reject{|x| (x == ParentNode || x == TextNode) }.collect{|key| value_by_path([key]+ids, data, pdata, rdata, plugin) }.flatten end else # case '**' opt = $2 ss = [] vals = [] d = value_depth(data) # {'1' => {'2' => {'3' => '...'}}} d = 3 # { * => { * => {'3' => '...'}}} if( opt ) for i in 0..(d - 2) ss.push(AnyNode + opt) v = value_by_path(ss+ids, data, pdata, rdata, plugin) ss.pop ss.push(AnyNode) vals.push(v) end else for i in 0..(d - 2) ss.push(AnyNode) v = value_by_path(ss+ids, data, pdata, rdata, plugin) vals.push(v) end end val = vals.flatten end val else ` |
VALUE_BY_PATH2_1 |
= |
%q` case hd[-1] when ?] hd,*opts = cond_split(hd) when ?} hd,*opts = cond_split(hd) else opts = [] end if( hd.size > 0 ) hd,recv,*rargs = hd.split(".") val = data[hd] if( recv ) if( recv =~ /(.+)\((.*)\)/ ) recv = $1 rargs = $2.split(',').collect{|c| eval_expr(c, data, plugin) } else rargs = [] end val = val.__send__(recv,*rargs) end else val = data end if( (val = normalize(val)).nil? ) return nil end for opt in opts case opt when /^\{(.+)\}/ val = eval_action($1.strip, val, plugin) when /^\[(\d+)\.\.\.(\d+)\]/ range = ($1.to_i ... $2.to_i) val = val[range] when /^\[(\d+)\.\.(\d+)\]/ range = ($1.to_i .. $2.to_i) val = val[range] when /^\[(\d+),(\d+)\]/ pos = $1.to_i n = $2.to_i val = val[pos,n] when /^\[(\d+)\]/ pos = $1.to_i val = val[pos] when /^\[(.+)\]/ cond = $1 case val when Array val = val.select{|n| eval_condition(cond, n, plugin) } else unless( eval_condition(cond,val,plugin) ) val = nil end end else raise(RuntimeError, "unknown path components: #{opt}") end if( (val = normalize(val)).nil? ) return nil end end # end of 'for' ` |
VALUE_BY_PATH2_2 |
= |
%q` if( hd.size > 0 ) hd,recv,*rargs = hd.split(".") val = data[hd] if( recv ) if( recv =~ /(.+)\((.*)\)/ ) recv = $1 rargs = $2.split(',').collect{|c| eval_expr(c, data, plugin) } else rargs = [] end val = val.__send__(recv,*rargs) end else val = data end val = normalize(val) ` |
VALUE_BY_PATH3 |
= |
%q` case val when Hash value_by_path(ids, val, data, rdata, plugin) when Array val.collect{|x| case x when Hash value_by_path(ids, x, data, rdata, plugin) else if( ids.empty? ) x else nil end end }.flatten when nil nil else if( ids.empty? ) # 'val' should be a text node, if 'ids' is empty. val else nil end end end # end of 'case hd' end # end of value_by_path() ` |