require 'jsduck/render/tags'
require 'jsduck/render/sidebar'
require 'jsduck/tag_registry'
module JsDuck
module Render
# Renders the whole documentation page for a class.
class Class
def initialize(opts)
@opts = opts
end
def render(cls)
@cls = cls
return [
"
",
render_sidebar,
"
",
render_tags(@cls),
"
",
"
",
render_all_sections,
"
",
"
",
].flatten.compact.join
end
private
def render_tags(member)
Render::Tags.render(member)
end
def render_sidebar
Render::Sidebar.new(@opts).render(@cls)
end
def render_all_sections
TagRegistry.member_types.map do |member_type|
render_section(member_type)
end
end
def render_section(sec)
members = @cls[:members].find_all {|m| m[:tagname] == sec[:name] }
# Skip rendering empty sections
return [] if members.length == 0
# Split members array into subsections
subsections = Array(sec[:subsections]).map do |subsec|
ms = members.find_all {|m| test_filter(m, subsec[:filter]) }
if ms.length > 0
{:title => subsec[:title], :members => ms, :default => subsec[:default]}
else
nil
end
end.compact
# Print no subsections when no subsections defined or there's
# just single subsection which is the default one.
if subsections.length == 0 || subsections.length == 1 && subsections[0][:default]
return [
"",
"
Defined By
",
"
#{sec[:title]}
",
render_subsection(members, nil),
"
",
]
end
return [
"",
"
#{sec[:title]}
",
subsections.map {|ss| render_subsection(ss[:members], ss[:title]) },
"",
]
end
# Returns true if member matches the conditions described by a
# subsection filter.
def test_filter(member, filter)
filter.each_pair do |field, truthy|
return false unless truthy ? member[field] : !member[field]
end
return true
end
def render_subsection(members, title)
return if members.length == 0
index = 0
return [
"",
title ? "
Defined By
#{title}" : "",
members.map {|m| index += 1; render_member(m, index == 1) },
"
",
]
end
def render_member(m, is_first)
# use classname "first-child" when it's first member in its category
first_child = is_first ? "first-child" : ""
# shorthand to owner class
owner = m[:owner]
# is this method inherited from parent?
inherited = (owner != @cls[:name])
return [
"",
# leftmost column: expand button
"
",
" ",
"",
# member name and type + link to owner class and source
"
",
"
",
render_member_signature(m),
render_tag_signature(m),
"
",
# short and long descriptions
"
",
"
",
m[:short_doc] ? m[:short_doc] : m[:doc],
"
",
"
",
render_tags(m),
"
",
"
",
"
",
]
end
def render_member_signature(m)
TagRegistry.get_by_name(m[:tagname]).to_html(m, @cls)
end
def render_tag_signature(m)
Render::Tags.render_signature(m)
end
end
end
end