Class XTemplate::XPath::Action
In: lib/xtemplate/xpath.rb
Parent: Object

Methods

_alt   _alt_exist?   _unalt   alt   array   attr   clear   clear_stack   copy   date   delete   dump   flatten   float   hash   import   index   int   node   p   pop   pop_all   push   rename   reverse   sanitize   size   sort   string   strip   tag   text   time   unalt   unattr   unsanitize   untag  

Included Modules

XPath Util

External Aliases

sanitize -> __sanitize__
unsanitize -> __unsanitize__

Public Instance methods

[Source]

# File lib/xtemplate/xpath.rb, line 32
      def _alt(name)
        @alts ||= {}
        @alts[name] = true
      end

[Source]

# File lib/xtemplate/xpath.rb, line 27
      def _alt_exist?(name)
        @alts ||= {}
        @alts.key?(name)
      end

[Source]

# File lib/xtemplate/xpath.rb, line 37
      def _unalt(name)
        @alts.delete(name)
      end

[Source]

# File lib/xtemplate/xpath.rb, line 41
      def alt(val, *args)
        args.each{|arg|
          if( _alt_exist?(arg) )
            val = nil
          else
            _alt(arg)
          end
        }
        val
      end

[Source]

# File lib/xtemplate/xpath.rb, line 244
      def array(val)
        if( val.is_a?(Enumerable) )
          newval = val.to_a
        else
          newval = val
        end
        newval
      end

[Source]

# File lib/xtemplate/xpath.rb, line 59
      def attr(val, *args)
        case val
        when Hash
          newval = val.dup
          args.each{|a|
            a.strip!
            if( v = newval[a] )
              newval.delete(a)
              newval['@'+a] = v
            end
          }
          newval
        when Array
          val.collect{|v| attr(v, *args)}
        else
          nil
        end
      end

[Source]

# File lib/xtemplate/xpath.rb, line 428
      def clear(val)
        []
      end

[Source]

# File lib/xtemplate/xpath.rb, line 422
      def clear_stack(val, name)
        stack = ((Thread.current[:xtemplate] ||= [])[name.intern] ||= [])
        stack.clear
        val
      end

[Source]

# File lib/xtemplate/xpath.rb, line 120
      def copy(val, x, y)
        case val
        when Hash
          newval = val.dup
          if( v = newval[x] )
            newval[y] = v
          end
          newval
        when Array
          val.collect{|v| copy(v, x, y)}
        else
          nil
        end
      end
date(val, fmt, tag=nil)

Alias for time

[Source]

# File lib/xtemplate/xpath.rb, line 378
      def delete(val, *args)
        case val
        when Hash
          newval = val.dup
          args.each{|s|
            s.strip!
            if( newval[s] )
              newval.delete(s)
            end
          }
          newval
        when Array
          val.collect{|v| delete(v, *args)}
        else
          nil
        end
      end

[Source]

# File lib/xtemplate/xpath.rb, line 348
      def dump(val, name=nil)
        if( name )
          parent = XNode.new(name)
        else
          parent = XNode.new()
        end
        value_to_xml(val, parent)
        parent.to_s
      end

[Source]

# File lib/xtemplate/xpath.rb, line 322
      def flatten(val)
        warn("The action 'flatten' and 'hash' will be obsoleted.")
        case val
        when Array
          newval = {}
          text   = ""
          val.each{|elem|
            case elem
            when Hash
              elem.each{|k,v|
                newval[k] = v
              }
            else
              text.concat(elem.to_s)
            end
          }
          if( text.size > 0 )
            newval[TextNode] = text
          end
        else
          newval = val
        end
        newval
      end

[Source]

# File lib/xtemplate/xpath.rb, line 223
      def float(val)
        if( val[TextNode] )
          newval = val.dup
          newval[TextNode] = newval[TextNode].to_i
        else
          newval = val.to_f
        end
        newval
      end
hash(val)

Alias for flatten

[Source]

# File lib/xtemplate/xpath.rb, line 432
      def import(val, *args)
        case args[0]
        when /^xml:\/\/(.+)/
          fn = $1
          doc = File.open(fn){|f|f.read}
          parser = XMLParser.new()
          node = parser.parse(doc)
          node.prepare()
          XMLDocument.new(node).to_hash
        when /^data:\/\/(.+)/
          fn = $1
          eval(File.open(fn){|f|f.read})
        when /^var:(.+)/
          eval($1)
        when /^yaml:\/\/(.+)/
          require 'xtemplate/yaml'
          fn = $1
          File.open(fn){|f|YAMLDocument.new(f)}
        when /^soap:\/\/(.+)/
          require 'soap/driver'
          args.shift
          endpoint  = $1
          namespace = args.shift
          if( namespace =~ /^\s*$/ )
            namespace = nil
          end
          obj = SOAP::Driver.new(nil, nil, namespace, "http://#{endpoint}")
          m = args.shift
          argv = args.collect{|s| eval_expr(s,val,nil) }
          i = -1
          obj.addMethod(m, *(argv.collect{ i+=1; "arg" + i.to_s }))
          obj.call(m, *argv)
        when /^xmlrpc:\/\/(.+)/
          require 'xmlrpc/client'
          m = args[1]
          argv = args[2..-1].collect{|s| eval_expr(s,val,nil) }
          client = XMLRPC::Client.new2("http://#{$1}")
          client.call(m, *argv)
        when /^dbi:(.+)/
          require 'dbi'
          h = DBI.connect("dbi:#{$1}")
          query = args[1..-1].collect{|s|s.gsub(/\#\{(.+)\}/){eval_expr($1,val,nil).to_s }}.join(',')
          newval = []
          h.execute(query){|sth|
            while( r = sth.fetch_hash )
              newval.push(r)
            end
          }
          newval
        else
          eval(args[0])
        end
      end

[Source]

# File lib/xtemplate/xpath.rb, line 291
      def index(val, tag, ini=0)
        if( ini )
          if( ini =~ /^([1-9]\d*)$/ )
            ini = $1.to_i
          end
        end
        case val
        when Hash
          newval = val.dup
          newval[tag] = ini
        when Array
          newval = []
          idx = ini
          val.each{|v|
            case v
            when Hash
              v = v.dup
              v[tag] = idx
              newval.push(v)
            else
              v = {TextNode => v, tag => idx}
              newval.push(v)
            end
            idx = idx.succ
          }
        else
          newval = {tag => ini, TextNode => val}
        end
        newval
      end

[Source]

# File lib/xtemplate/xpath.rb, line 213
      def int(val)
        if( val[TextNode] )
          newval = val.dup
          newval[TextNode] = newval[TextNode].to_i
        else
          newval = val.to_i
        end
        newval
      end

[Source]

# File lib/xtemplate/xpath.rb, line 98
      def node(val)
        case val
        when Hash
          val.reject{|k,v| (k[0] == ?@ || k == TextNode)}
        when Array
          val.collect{|v| node(v)}
        else
          nil
        end
      end

[Source]

# File lib/xtemplate/xpath.rb, line 515
      def p(val, out=nil)
        case out
        when "stdout"
          f = $stdout
        when "stderr"
          f = $stderr
        else
          f = $stdout
        end
        f.print(value_inspect(val),"\n")
        val
      end

[Source]

# File lib/xtemplate/xpath.rb, line 409
      def pop(val, name)
        stack = ((Thread.current[:xtemplate] ||= [])[name.intern] ||= [])
        v = stack.pop
        [val, v].flatten
      end

[Source]

# File lib/xtemplate/xpath.rb, line 415
      def pop_all(val, name)
        stack = ((Thread.current[:xtemplate] ||= [])[name.intern] ||= [])
        newval = [val, stack.dup].flatten
        stack.clear
        newval
      end

[Source]

# File lib/xtemplate/xpath.rb, line 396
      def push(val, name)
        stack = ((Thread.current[:xtemplate] ||= {})[name.intern] ||= [])
        stack.push(val)
        case val
        when Hash
          {}
        when Array
          []
        else
          nil
        end
      end

[Source]

# File lib/xtemplate/xpath.rb, line 135
      def rename(val, x, y)
        case val
        when Hash
          newval = val.dup
          if( v = newval[x] )
            newval[y] = v
            newval.delete(x)
          end
          newval
        when Array
          val.collect{|v| rename(v, x, y)}
        else
          nil
        end
      end

[Source]

# File lib/xtemplate/xpath.rb, line 370
      def reverse(val)
        if( val.is_a?(Array) )
          val.reverse
        else
          nil
        end
      end

[Source]

# File lib/xtemplate/xpath.rb, line 359
      def sanitize(val)
        s = String.new(val.to_s)
        __sanitize__(s)
      end

[Source]

# File lib/xtemplate/xpath.rb, line 280
      def size(val)
        case val
        when Array
          val.size
        when nil
          0
        else
          1
        end
      end

[Source]

# File lib/xtemplate/xpath.rb, line 183
      def sort(val, path=nil)
        if( val.is_a?(Array) )
          if( path )
            newval = val.sort{|x,y|
              path.split("/").each{|key|
                key.strip!
                if( x.is_a?(Hash) && y.is_a?(Hash) )
                  x,y = x[key], y[key]
                end
              }
              if( x.is_a?(Comparable) && y.is_a?(Comparable) )
                x <=> y
              else
                0
              end
            }
          else
            newval = val.sort{|x,y|
              if( x && y )
                x <=> y
              else
                0
              end
            }
          end
        else
          val
        end
      end

[Source]

# File lib/xtemplate/xpath.rb, line 234
      def string(val)
        if( val[TextNode] )
          newval = val.dup
          newval[TextNode] = newval[TextNode].to_i
        else
          newval = val.to_s
        end
        newval
      end

[Source]

# File lib/xtemplate/xpath.rb, line 253
      def strip(val)
        case val
        when Hash
          if( val[TextNode] )
            newval = val.dup()
            newval[TextNode] = newval[TextNode].strip()
          else
            newval = val
          end
        when Array
          newval = val.reject{|v|
            case v
            when Hash, Array
              false
            else
              v.to_s() =~ /\A\s*\z/
            end
          }
        else
          newval = val.to_s().strip()
          if( newval.size == 0 )
            newval = nil
          end
        end
        newval
      end

[Source]

# File lib/xtemplate/xpath.rb, line 151
      def tag(val, tag)
        case val
        when Hash
          newval = val.dup
          if( v = newval[TextNode] )
            newval[tag] = v
            newval.delete(TextNode)
          end
          newval
        when Array
          val.collect{|v| tag(v, tag)}
        else
          {tag => val}
        end
      end

[Source]

# File lib/xtemplate/xpath.rb, line 109
      def text(val)
        case val
        when Hash
          val[TextNode]
        when Array
          val.collect{|v| text(v)}
        else
          val
        end
      end

[Source]

# File lib/xtemplate/xpath.rb, line 486
      def time(val, fmt, tag=nil)
        if( tag )
          case val
          when Array
            val.collect{|v| time(v, fmt, tag)}
          when Hash
            str = Time.now.strftime(fmt)
            newval = val.dup
            tag ||= TextNode
            newval[tag] = str
            newval
          else
            if( val )
              str = Time.now.strftime(fmt)
              newval = {
                tag => str,
                TextNode => val,
              }
              newval
            else
              nil
            end
          end
        else
          Time.now.strftime(fmt)
        end
      end

[Source]

# File lib/xtemplate/xpath.rb, line 52
      def unalt(val, *args)
        args.each{|arg|
          _unalt(arg)
        }
        val
      end

[Source]

# File lib/xtemplate/xpath.rb, line 78
      def unattr(val, *args)
        case val
        when Hash
          newval = val.dup
          args.each{|a|
            a.strip!
            k = '@'+a
            if( v = newval[k] )
              newval.delete(k)
              newval[a] = v
            end
          }
          newval
        when Array
          val.collect{|v| unattr(v, *args)}
        else
          nil
        end
      end

[Source]

# File lib/xtemplate/xpath.rb, line 365
      def unsanitize(val)
        s = SanitizedString[val.to_s]
        SanitizedString[__unsanitize__(s)]
      end

[Source]

# File lib/xtemplate/xpath.rb, line 167
      def untag(val, tag)
        case val
        when Hash
          newval = val.dup
          if( v = newval[tag] )
            newval[TextNode] = v
            newval.delete(tag)
          end
          newval
        when Array
          val.collect{|v| untag(v,tag)}
        else
          nil
        end
      end

[Validate]