class JsDuck::Render::Sidebar

Generates HTML for the class hierarchy sidebar inside class documentation.

Public Class Methods

new(opts) click to toggle source
# File lib/jsduck/render/sidebar.rb, line 7
def initialize(opts)
  @opts = opts
end

Public Instance Methods

render(cls) click to toggle source

Renders a sidebar for given class. Returns Array of HTML or nil.

# File lib/jsduck/render/sidebar.rb, line 13
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 ['<pre class="hierarchy">', items, '</pre>']
  else
    return nil
  end
end

Private Instance Methods

render_alternate_class_names(names) click to toggle source
# File lib/jsduck/render/sidebar.rb, line 35
def render_alternate_class_names(names)
  return if names.length == 0

  return [
    "<h4>Alternate names</h4>",
    names.map {|name| "<div class='alternate-class-name'>#{name}</div>" },
  ]
end
render_class_tree(classes, i=0) click to toggle source
# File lib/jsduck/render/sidebar.rb, line 78
def render_class_tree(classes, i=0)
  return "" if classes.length <= i

  name = classes[i]
  return [
    "<div class='subclass #{i == 0 ? 'first-child' : ''}'>",
      classes.length-1 == i ? "<strong>#{name}</strong>" : (name.exists? ? render_link(name) : name),
      render_class_tree(classes, i+1),
    "</div>",
  ]
end
render_dependencies(names, title) click to toggle source
# File lib/jsduck/render/sidebar.rb, line 44
def render_dependencies(names, title)
  return if !names || names.length == 0

  return [
    "<h4>#{title}</h4>",
    names.map {|name| "<div class='dependency'>#{name.exists? ? render_link(name) : name}</div>" },
  ]
end
render_files(files) click to toggle source
# File lib/jsduck/render/sidebar.rb, line 53
def render_files(files)
  return if !@opts.source || files.length == 0 || files[0][:filename] == ""

  return [
    "<h4>Files</h4>",
    files.map do |file|
      url = "source/" + file[:href]
      title = File.basename(file[:filename])
      "<div class='dependency'><a href='#{url}' target='_blank'>#{title}</a></div>"
    end
  ]
end
render_tree(cls) click to toggle source

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.

# File lib/jsduck/render/sidebar.rb, line 69
def render_tree(cls)
  return if !cls[:extends] || cls[:extends] == "Object"

  return [
    "<h4>Hierarchy</h4>",
    render_class_tree(cls[:superclasses] + [cls[:name]])
  ]
end