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 "
", "
", inherited ? "#{owner}" : "#{owner}", "
", @opts.source ? "view 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