module JsDuck
module Render
# Generates HTML for the class hierarchy sidebar inside class
# documentation.
class Sidebar
def initialize(opts)
@opts = opts
end
# Renders a sidebar for given class.
# Returns Array of HTML or nil.
def render(cls)
items = [
render_alternate_class_names(cls[:alternateClassNames]),
render_tree(cls),
render_dependencies(cls[:mixins], "Mixins"),
render_dependencies(cls[:parentMixins], "Inherited mixins"),
render_dependencies(cls[:requires], "Requires"),
render_dependencies(cls[:subclasses], "Subclasses"),
render_dependencies(cls[:mixedInto], "Mixed into"),
render_dependencies(cls[:uses], "Uses"),
render_files(cls[:files])
]
if items.compact.length > 0
return ['
', items, '
']
else
return nil
end
end
private
def render_alternate_class_names(names)
return if names.length == 0
return [
"Alternate names
",
names.map {|name| "#{name}
" },
]
end
def render_dependencies(names, title)
return if !names || names.length == 0
return [
"#{title}
",
names.map {|name| "#{name.exists? ? render_link(name) : name}
" },
]
end
def render_files(files)
return if !@opts.source || files.length == 0 || files[0][:filename] == ""
return [
"Files
",
files.map do |file|
url = "source/" + file[:href]
title = File.basename(file[:filename])
""
end
]
end
# Take care of the special case where class has parent for which we have no docs.
# In that case the "extends" property exists but "superclasses" is empty.
# We still create the tree, but without links in it.
def render_tree(cls)
return if !cls[:extends] || cls[:extends] == "Object"
return [
"Hierarchy
",
render_class_tree(cls[:superclasses] + [cls[:name]])
]
end
def render_class_tree(classes, i=0)
return "" if classes.length <= i
name = classes[i]
return [
"",
classes.length-1 == i ? "#{name}" : (name.exists? ? render_link(name) : name),
render_class_tree(classes, i+1),
"
",
]
end
def render_link(cls_name)
"#{cls_name}"
end
end
end
end