123456789_123456789_123456789_123456789_123456789_

Class: ActionView::RenderParser

Do not use. This class is for internal use only.
Relationships & Source Files
Namespace Children
Modules:
Inherits: Object
Defined in: actionview/lib/action_view/render_parser.rb,
actionview/lib/action_view/ripper_ast_parser.rb

Constant Summary

Class Method Summary

Instance Method Summary

Constructor Details

.new(name, code) ⇒ RenderParser

[ GitHub ]

  
# File 'actionview/lib/action_view/render_parser.rb', line 7

def initialize(name, code)
  @name = name
  @code = code
  @parser = RipperASTParser
end

Instance Method Details

#directory (private)

[ GitHub ]

  
# File 'actionview/lib/action_view/render_parser.rb', line 22

def directory
  File.dirname(@name)
end

#layout_to_virtual_path(layout_path) (private)

[ GitHub ]

  
# File 'actionview/lib/action_view/render_parser.rb', line 184

def layout_to_virtual_path(layout_path)
  "layouts/#{layout_path}"
end

#normalize_args(string, options_hash) (private)

Convert

render("foo", ...)

into either

render(template: "foo", ...)

or

render(partial: "foo", ...)
[ GitHub ]

  
# File 'actionview/lib/action_view/render_parser.rb', line 40

def normalize_args(string, options_hash)
  if options_hash
    { partial: string, locals: options_hash }
  else
    { partial: string }
  end
end

#parse_hash(node) (private)

[ GitHub ]

  
# File 'actionview/lib/action_view/render_parser.rb', line 72

def parse_hash(node)
  node.hash? && node.to_hash
end

#parse_hash_to_symbols(node) (private)

[ GitHub ]

  
# File 'actionview/lib/action_view/render_parser.rb', line 76

def parse_hash_to_symbols(node)
  hash = parse_hash(node)

  return unless hash

  hash.transform_keys do |key_node|
    key = parse_sym(key_node)

    return unless key

    key
  end
end

#parse_render(node) (private)

[ GitHub ]

  
# File 'actionview/lib/action_view/render_parser.rb', line 48

def parse_render(node)
  node = node.argument_nodes

  if (node.length == 1 || node.length == 2) && !node[0].hash?
    if node.length == 1
      options = normalize_args(node[0], nil)
    elsif node.length == 2
      options = normalize_args(node[0], node[1])
    end

    return nil unless options

    parse_render_from_options(options)
  elsif node.length == 1 && node[0].hash?
    options = parse_hash_to_symbols(node[0])

    return nil unless options

    parse_render_from_options(options)
  else
    nil
  end
end

#parse_render_from_options(options_hash) (private)

[ GitHub ]

  
# File 'actionview/lib/action_view/render_parser.rb', line 95

def parse_render_from_options(options_hash)
  renders = []
  keys = options_hash.keys

  if (keys & RENDER_TYPE_KEYS).size < 1
    # Must have at least one of render keys
    return nil
  end

  if (keys - ALL_KNOWN_KEYS).any?
    # de-opt in case of unknown option
    return nil
  end

  render_type = (keys & RENDER_TYPE_KEYS)[0]

  node = options_hash[render_type]

  if node.string?
    template = resolve_path_directory(node.to_string)
  else
    if node.variable_reference?
      dependency = node.variable_name.sub(/\A(?:\$|@{1,2})/, "")
    elsif node.vcall?
      dependency = node.variable_name
    elsif node.call?
      dependency = node.call_method_name
    else
      return
    end

    object_template = true
    template = "#{dependency.pluralize}/#{dependency.singularize}"
  end

  return unless template

  if spacer_template = render_template_with_spacer?(options_hash)
    virtual_path = partial_to_virtual_path(:partial, spacer_template)
    renders << virtual_path
  end

  if options_hash.key?(:object) || options_hash.key?(:collection) || object_template
    return nil if options_hash.key?(:object) && options_hash.key?(:collection)
    return nil unless options_hash.key?(:partial)
  end

  virtual_path = partial_to_virtual_path(render_type, template)
  renders << virtual_path

  # Support for rendering multiple templates (i.e. a partial with a layout)
  if layout_template = render_template_with_layout?(render_type, options_hash)
    virtual_path = partial_to_virtual_path(:layout, layout_template)

    renders << virtual_path
  end

  renders
end

#parse_str(node) (private)

[ GitHub ]

  
# File 'actionview/lib/action_view/render_parser.rb', line 155

def parse_str(node)
  node.string? && node.to_string
end

#parse_sym(node) (private)

[ GitHub ]

  
# File 'actionview/lib/action_view/render_parser.rb', line 159

def parse_sym(node)
  node.symbol? && node.to_symbol
end

#partial_to_virtual_path(render_type, partial_path) (private)

[ GitHub ]

  
# File 'actionview/lib/action_view/render_parser.rb', line 176

def partial_to_virtual_path(render_type, partial_path)
  if render_type == :partial || render_type == :layout
    partial_path.gsub(%r{(/|^)([^/]*)\z}, '\1_\2')
  else
    partial_path
  end
end

#render_calls

[ GitHub ]

  
# File 'actionview/lib/action_view/render_parser.rb', line 13

def render_calls
  render_nodes = @parser.parse_render_nodes(@code)

  render_nodes.map do |method, nodes|
    nodes.map { |n| send(:parse_render, n) }
  end.flatten.compact
end

#render_template_with_layout?(render_type, options_hash) ⇒ Boolean (private)

[ GitHub ]

  
# File 'actionview/lib/action_view/render_parser.rb', line 164

def render_template_with_layout?(render_type, options_hash)
  if render_type != :layout && options_hash.key?(:layout)
    parse_str(options_hash[:layout])
  end
end

#render_template_with_spacer?(options_hash) ⇒ Boolean (private)

[ GitHub ]

  
# File 'actionview/lib/action_view/render_parser.rb', line 170

def render_template_with_spacer?(options_hash)
  if options_hash.key?(:spacer_template)
    parse_str(options_hash[:spacer_template])
  end
end

#resolve_path_directory(path) (private)

[ GitHub ]

  
# File 'actionview/lib/action_view/render_parser.rb', line 26

def resolve_path_directory(path)
  if path.include?("/")
    path
  else
    "#{directory}/#{path}"
  end
end