require 'jsduck/render/signature'
require 'jsduck/render/tags'
require 'jsduck/render/sidebar'
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
@signature = Render::Signature.new(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][sec[:name]] + @cls[:statics][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
"
",
"
",
# method params signature or property type signature
@signature.render(m),
"
",
# short and long descriptions
"
",
"
",
m[:short_doc] ? m[:short_doc] : m[:doc],
"
",
"
",
render_tags(m),
"
",
"
",
"
",
]
end
end
end
end