Commit 2fef3dca authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Throw away Ruby code for class-tree creation.

Instead of Tree and TreeIcons there now is an Icons class, which
just detects tree-icon class name for each class.
parent 5783b47a
Loading
Loading
Loading
Loading
+2 −13
Original line number Diff line number Diff line
@@ -4,8 +4,7 @@ require 'jsduck/source_file'
require 'jsduck/source_writer'
require 'jsduck/doc_formatter'
require 'jsduck/class'
require 'jsduck/tree'
require 'jsduck/tree_icons'
require 'jsduck/icons'
require 'jsduck/search_data'
require 'jsduck/relations'
require 'jsduck/aliases'
@@ -137,18 +136,8 @@ module JsDuck

    # Writes classes, guides, videos, and search data to one big .js file
    def write_app_data
      tree = Tree.new.create(@relations.classes)
      icons = TreeIcons.new.extract_icons(tree)
      classes = @relations.classes.map do |cls|
        {
          :name => cls[:name],
          :singleton => cls[:singleton],
          :extends => cls[:extends],
        }
      end
      js = "Docs.data = " + JsonDuck.generate({
        :classes => classes,
        :icons => icons,
        :classes => Icons.new.create(@relations.classes),
        :guides => @guides.to_array,
        :videos => @videos.to_array,
        :examples => @examples.to_array,

lib/jsduck/icons.rb

0 → 100644
+27 −0
Original line number Diff line number Diff line
module JsDuck

  # Creates an array of small hashes documenting name, parent class
  # and icon of a class.
  class Icons
    def create(classes)
      classes.map do |cls|
        {
          :name => cls[:name],
          :extends => cls[:extends],
          :icon => icon(cls),
        }
      end
    end

    def icon(cls)
      if cls[:singleton]
        "icon-singleton"
      elsif cls.inherits_from?("Ext.Component")
        "icon-component"
      else
        "icon-class"
      end
    end
  end

end

lib/jsduck/tree.rb

deleted100644 → 0
+0 −97
Original line number Diff line number Diff line

module JsDuck

  # Creator of package-tree in the format expected by the
  # documentation browser UI.
  #
  # See unit test for example output.
  #
  class Tree
    def initialize
      @root = {
        :id => "apidocs",
        :iconCls => "icon-docs",
        :text => "API Documentation",
        :children => []
      }
      @packages = {"" => @root}
    end

    # Given list of class documentation objects returns a
    # tree-structure that can be turned into JSON that's needed by
    # documentation browser interface.
    def create(docs)
      docs.each {|cls| add_class(cls) }
      sort_tree(@root)
      @root
    end

    # Sorts all child nodes, and recursively all child packages.
    def sort_tree(node)
      node[:children].sort! {|a,b| compare(a, b) }
      node[:children].find_all {|c| c[:children] }.each {|c| sort_tree(c) }
    end

    # Comparson method that sorts package nodes before class nodes.
    def compare(a, b)
      if a[:leaf] == b[:leaf]
        a[:text].casecmp(b[:text])
      else
        a[:leaf] ? 1 : -1
      end
    end

    # When package for the class exists, add class node to that
    # package; otherwise create the package first.
    def add_class(cls)
      parent_name = cls.package_name
      parent = @packages[parent_name] || add_package(parent_name)
      parent[:children] << class_node(cls)
    end

    # When parent package exists, add new package node into it, also
    # record the package into @packages hash for quick lookups;
    # otherwise create the parent package first.
    #
    # Note that the root package always exists, so we can safely
    # recurse knowing we will eventually stop.
    def add_package(name)
      parent_name = Class.package_name(name)
      parent = @packages[parent_name] || add_package(parent_name)
      package = package_node(name)
      parent[:children] << package
      @packages[name] = package
      package
    end

    # Given full doc object for class creates class node
    def class_node(cls)
      return {
        :text => cls.short_name,
        :url => "/api/"+cls.full_name,
        :iconCls => class_icon(cls),
        :leaf => true
      }
    end

    def class_icon(cls)
      if cls[:singleton]
        "icon-singleton"
      elsif cls.inherits_from?("Ext.Component")
        "icon-component"
      else
        "icon-class"
      end
    end

    # Given full package name like my.package creates package node
    def package_node(name)
      return {
        :text => Class.short_name(name),
        :iconCls => "icon-pkg",
        :children => []
      }
    end
  end

end

lib/jsduck/tree_icons.rb

deleted100644 → 0
+0 −19
Original line number Diff line number Diff line
module JsDuck

  # Takes the structure produced by JsDuck::Tree.create and creates
  # hashmap of classname-icon pairs.
  class TreeIcons
    def extract_icons(node)
      icons = {}
      if node[:children]
        node[:children].each do |child|
          icons.merge!(extract_icons(child))
        end
      else
        icons[node[:url]] = node[:iconCls]
      end
      icons
    end
  end

end

spec/tree_icons_spec.rb

deleted100644 → 0
+0 −61
Original line number Diff line number Diff line
require "jsduck/tree_icons"

describe JsDuck::TreeIcons do

  before do
    @icons = JsDuck::TreeIcons.new.extract_icons({
        :id => "apidocs",
        :iconCls => "icon-docs",
        :text => "API Documentation",
        :children => [
          {
            :clsName => "pkg-SamplePackage",
            :text => "SamplePackage",
            :iconCls => "icon-pkg",
            :cls => "package",
            :children => [
              {
                :text => "Component",
                :url => "/api/SamplePackage.Component",
                :iconCls => "icon-cmp",
                :leaf => true
              },
              {
                :text => "Singleton",
                :url => "/api/SamplePackage.Singleton",
                :iconCls => "icon-static",
                :leaf => true
              },
              {
                :text => "sub",
                :iconCls => "icon-pkg",
                :children => [
                  {
                    :text => "Foo",
                    :url => "/api/SamplePackage.sub.Foo",
                    :iconCls => "icon-cls",
                    :leaf => true
                  },
                ]
              }
            ]
          }
        ]
      })
  end

  it "extracts as many icons as there are classes in tree" do
    @icons.length.should == 3
  end

  it "extracts icons inside a package" do
    @icons["/api/SamplePackage.Component"].should == "icon-cmp"
    @icons["/api/SamplePackage.Singleton"].should == "icon-static"
  end

  it "extracts icons inside all subpackages too" do
    @icons["/api/SamplePackage.sub.Foo"].should == "icon-cls"
  end

end
Loading