Class: XPath::Renderer

### Home Classes Methods

### In Files

- lib/xpath/renderer.rb

### Parent

Object

### Methods

- ::new
- ::render
- #and
- #anywhere
- #attribute
- #axis
- #child
- #contains
- #convert_argument
- #css
- #descendant
- #equality
- #inverse
- #is
- #literal
- #next_sibling
- #node_name
- #normalized_space
- #one_of
- #or
- #previous_sibling
- #render
- #starts_with
- #string_function
- #string_literal
- #text
- #this_node
- #union
- #variable
- #where

### Class/Module Index

Quicksearch

- XPath
- XPath::DSL
- XPath::DSL::ExpressionLevel
- XPath::DSL::TopLevel
- XPath::Expression
- XPath::HTML
- XPath::Literal
- XPath::Renderer
- XPath::Union

No matching classes.

# XPath::Renderer

### Public Class Methods

new(type) click to toggle source

    # File lib/xpath/renderer.rb, line 7
    def initialize(type)
      @type = type
    end

render(node, type) click to toggle source

    # File lib/xpath/renderer.rb, line 3
    def self.render(node, type)
      new(type).render(node)
    end

### Public Instance Methods

and(one, two) click to toggle source

    # File lib/xpath/renderer.rb, line 134
    def and(one, two)
      "(#{one} and #{two})"
    end

anywhere(element_names) click to toggle source

    # File lib/xpath/renderer.rb, line 116
    def anywhere(element_names)
      if element_names.length == 1
        "//#{element_names.first}"
      elsif element_names.length > 1
        "//*[#{element_names.map { |e| "self::#{e}" }.join(" | ")}]"
      else
        "//*"
      end
    end

attribute(current, name) click to toggle source

    # File lib/xpath/renderer.rb, line 73
    def attribute(current, name)
      "#{current}/@#{name}"
    end

axis(parent, name, tag_name) click to toggle source

    # File lib/xpath/renderer.rb, line 61
    def axis(parent, name, tag_name)
      "#{parent}/#{name}::#{tag_name}"
    end

child(parent, element_names) click to toggle source

    # File lib/xpath/renderer.rb, line 51
    def child(parent, element_names)
      if element_names.length == 1
        "#{parent}/#{element_names.first}"
      elsif element_names.length > 1
        "#{parent}/*[#{element_names.map { |e| "self::#{e}" }.join(" | ")}]"
      else
        "#{parent}/*"
      end
    end

contains(current, value) click to toggle source

    # File lib/xpath/renderer.rb, line 126
    def contains(current, value)
      "contains(#{current}, #{value})"
    end

convert_argument(argument) click to toggle source

    # File lib/xpath/renderer.rb, line 16
    def convert_argument(argument)
      case argument
        when Expression, Union then render(argument)
        when Array then argument.map { |element| convert_argument(element) }
        when String then string_literal(argument)
        when Literal then argument.value
        else argument.to_s
      end
    end

css(current, selector) click to toggle source

    # File lib/xpath/renderer.rb, line 105
    def css(current, selector)
      paths = Nokogiri::CSS.xpath_for(selector).map do |xpath_selector|
        "#{current}#{xpath_selector}"
      end
      union(paths)
    end

descendant(parent, element_names) click to toggle source

    # File lib/xpath/renderer.rb, line 41
    def descendant(parent, element_names)
      if element_names.length == 1
        "#{parent}//#{element_names.first}"
      elsif element_names.length > 1
        "#{parent}//*[#{element_names.map { |e| "self::#{e}" }.join(" | ")}]"
      else
        "#{parent}//*"
      end
    end

equality(one, two) click to toggle source

    # File lib/xpath/renderer.rb, line 77
    def equality(one, two)
      "#{one} = #{two}"
    end

inverse(current) click to toggle source

    # File lib/xpath/renderer.rb, line 166
    def inverse(current)
      "not(#{current})"
    end

is(one, two) click to toggle source

    # File lib/xpath/renderer.rb, line 81
    def is(one, two)
      if @type == :exact
        equality(one, two)
      else
        contains(one, two)
      end
    end

literal(node) click to toggle source

    # File lib/xpath/renderer.rb, line 101
    def literal(node)
      node
    end

next_sibling(current, element_names) click to toggle source

    # File lib/xpath/renderer.rb, line 146
    def next_sibling(current, element_names)
      if element_names.length == 1
        "#{current}/following-sibling::*[1]/self::#{element_names.first}"
      elsif element_names.length > 1
        "#{current}/following-sibling::*[1]/self::*[#{element_names.map { |e| "self::#{e}" }.join(" | ")}]"
      else
        "#{current}/following-sibling::*[1]/self::*"
      end
    end

node_name(current) click to toggle source

    # File lib/xpath/renderer.rb, line 65
    def node_name(current)
      "name(#{current})"
    end

normalized_space(current) click to toggle source

    # File lib/xpath/renderer.rb, line 97
    def normalized_space(current)
      "normalize-space(#{current})"
    end

one_of(current, values) click to toggle source

    # File lib/xpath/renderer.rb, line 142
    def one_of(current, values)
      values.map { |value| "#{current} = #{value}" }.join(' or ')
    end

or(one, two) click to toggle source

    # File lib/xpath/renderer.rb, line 138
    def or(one, two)
      "(#{one} or #{two})"
    end

previous_sibling(current, element_names) click to toggle source

    # File lib/xpath/renderer.rb, line 156
    def previous_sibling(current, element_names)
      if element_names.length == 1
        "#{current}/preceding-sibling::*[1]/self::#{element_names.first}"
      elsif element_names.length > 1
        "#{current}/preceding-sibling::*[1]/self::*[#{element_names.map { |e| "self::#{e}" }.join(" | ")}]"
      else
        "#{current}/preceding-sibling::*[1]/self::*"
      end
    end

render(node) click to toggle source

    # File lib/xpath/renderer.rb, line 11
    def render(node)
      arguments = node.arguments.map { |argument| convert_argument(argument) }
      send(node.expression, *arguments)
    end

starts_with(current, value) click to toggle source

    # File lib/xpath/renderer.rb, line 130
    def starts_with(current, value)
      "starts-with(#{current}, #{value})"
    end

string_function(current) click to toggle source

    # File lib/xpath/renderer.rb, line 170
    def string_function(current)
      "string(#{current})"
    end

string_literal(string) click to toggle source

    # File lib/xpath/renderer.rb, line 26
    def string_literal(string)
      if string.include?("'")
        string = string.split("'", -1).map do |substr|
          "'#{substr}'"
        end.join(%{,"'",})
        "concat(#{string})"
      else
        "'#{string}'"
      end
    end

text(current) click to toggle source

    # File lib/xpath/renderer.rb, line 93
    def text(current)
      "#{current}/text()"
    end

this_node() click to toggle source

    # File lib/xpath/renderer.rb, line 37
    def this_node
      '.'
    end

union(*expressions) click to toggle source

    # File lib/xpath/renderer.rb, line 112
    def union(*expressions)
      expressions.join(' | ')
    end

variable(name) click to toggle source

    # File lib/xpath/renderer.rb, line 89
    def variable(name)
      "%{#{name}}"
    end

where(on, condition) click to toggle source

    # File lib/xpath/renderer.rb, line 69
    def where(on, condition)
      "#{on}[#{condition}]"
    end

[Validate]

Generated with the Darkfish Rdoc Generator 2.