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
-
ALL_KNOWN_KEYS =
# File 'actionview/lib/action_view/render_parser.rb', line 90[:partial, :template, :layout, :formats, :locals, :object, :collection, :as, :status, :content_type, :location, :spacer_template]
-
RENDER_TYPE_KEYS =
# File 'actionview/lib/action_view/render_parser.rb', line 92[:partial, :template, :layout]
Class Method Summary
- .new(name, code) ⇒ RenderParser constructor
Instance Method Summary
- #render_calls
- #directory private
- #layout_to_virtual_path(layout_path) private
-
#normalize_args(string, options_hash)
private
Convert.
- #parse_hash(node) private
- #parse_hash_to_symbols(node) private
- #parse_render(node) private
- #parse_render_from_options(options_hash) private
- #parse_str(node) private
- #parse_sym(node) private
- #partial_to_virtual_path(render_type, partial_path) private
- #render_template_with_layout?(render_type, options_hash) ⇒ Boolean private
- #render_template_with_spacer?(options_hash) ⇒ Boolean private
- #resolve_path_directory(path) private
Constructor Details
.new(name, code) ⇒ RenderParser
# 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", ...)
# File 'actionview/lib/action_view/render_parser.rb', line 40
def normalize_args(string, ) if { partial: string, locals: } 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 = normalize_args(node[0], nil) elsif node.length == 2 = normalize_args(node[0], node[1]) end return nil unless ( ) elsif node.length == 1 && node[0].hash? = parse_hash_to_symbols(node[0]) return nil unless ( ) else nil end end
#parse_render_from_options(options_hash) (private)
[ GitHub ]# File 'actionview/lib/action_view/render_parser.rb', line 95
def ( ) renders = [] keys = .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 = [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?( ) virtual_path = partial_to_virtual_path(:partial, spacer_template) renders << virtual_path end if .key?(:object) || .key?(:collection) || object_template return nil if .key?(:object) && .key?(:collection) return nil unless .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, ) 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)
# File 'actionview/lib/action_view/render_parser.rb', line 164
def render_template_with_layout?(render_type, ) if render_type != :layout && .key?(:layout) parse_str( [:layout]) end end
#render_template_with_spacer?(options_hash) ⇒ Boolean
(private)
# File 'actionview/lib/action_view/render_parser.rb', line 170
def render_template_with_spacer?( ) if .key?(:spacer_template) parse_str( [: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