Commit c0a0acf9 authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Moved class name methods to Class class.

Both Page and Tree can now use these common methods without implementing
their own.
parent 2ba7cb2a
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ require 'jsduck/lexer'
require 'jsduck/parser'
require 'jsduck/doc_parser'
require 'jsduck/merger'
require 'jsduck/class'
require 'jsduck/tree'
require 'jsduck/page'
require 'json'
@@ -46,13 +47,13 @@ module JsDuck
    docs
  end

  # Filters out class-documentations
  # Filters out class-documentations, converting them to Class objects.
  # For each other type, prints a warning message and discards it
  def JsDuck.filter_classes(docs)
    classes = []
    docs.each do |d|
      if d[:tagname] == :class
        classes << d
        classes << Class.new(d)
      else
        puts "Warning: Ignoring " + d[:tagname].to_s + ": " + (d[:name] || "")
      end
@@ -129,8 +130,8 @@ if __FILE__ == $0 then
    exit(1)
  end

  docs = JsDuck.filter_classes(JsDuck.parse_files(input_files, verbose))
  JsDuck.write_tree(output_dir+"/tree.js", docs)
  JsDuck.write_pages(output_dir, docs, verbose)
  classes = JsDuck.filter_classes(JsDuck.parse_files(input_files, verbose))
  JsDuck.write_tree(output_dir+"/tree.js", classes)
  JsDuck.write_pages(output_dir, classes, verbose)
end

lib/jsduck/class.rb

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

  # Encapsulates class documentation and provides some commonly needed
  # methods on it.  Otherwise it acts like Hash, providing the []
  # method.
  class Class
    def initialize(doc)
      @doc = doc
    end

    def [](key)
      @doc[key]
    end

    # A way to access full class name with similar syntax to
    # package_name and short_name
    def full_name
      @doc[:name]
    end

    # Returns package name of the class.
    #
    # That is the namespace part of full class name.
    #
    # For example "My.package" is package_name of "My.package.Class"
    def package_name
      Class.package_name(@doc[:name])
    end

    # Returns last part of full class name
    #
    # For example for "My.package.Class" it is "Class"
    def short_name
      Class.short_name(@doc[:name])
    end

    # Static methods

    # Utility method that given a package or class name finds the name
    # of its parent package.
    def self.package_name(name)
      parts = name.split(/\./)
      parts.slice(0, parts.length - 1).join(".")
    end

    # Utility method that given full package or class name extracts
    # the last part of the name.
    def self.short_name(name)
      name.split(/\./).last
    end
  end

end
+3 −6
Original line number Diff line number Diff line
@@ -17,18 +17,15 @@ module JsDuck
    end

    def heading
      "<h1>Class <a href='source/sample.html#cls-#{@cls[:name]}'>#{@cls[:name]}</a></h1>"
      "<h1>Class <a href='source/sample.html#cls-#{@cls.full_name}'>#{@cls.full_name}</a></h1>"
    end

    def abstract
      parts = @cls[:name].split(/\./)
      namespace = parts.slice(0, parts.length - 1).join(".")
      short_name = parts.last
      [
       "<table cellspacing='0'>",
       abstract_row("Package:", namespace),
       abstract_row("Package:", @cls.package_name),
       abstract_row("Defined In:", "sample.js"),
       abstract_row("Class:", "<a href='source/sample.html#cls-#{@cls[:name]}'>#{short_name}</a>"),
       abstract_row("Class:", "<a href='source/sample.html#cls-#{@cls.full_name}'>#{@cls.short_name}</a>"),
       abstract_row("Extends:", @cls[:extends] || "Object"),
       "</table>",
      ].join("\n")
+6 −27
Original line number Diff line number Diff line
@@ -45,7 +45,7 @@ module JsDuck
    # When package for the class exists, add class node to that
    # package; otherwise create the package first.
    def add_class(cls)
      parent_name = package_name(cls[:name])
      parent_name = cls.package_name
      parent = @packages[parent_name] || add_package(parent_name)
      parent[:children] << class_node(cls)
    end
@@ -57,7 +57,7 @@ module JsDuck
    # Note that the root package always exists, so we can safely
    # recurse knowing we will eventually stop.
    def add_package(name)
      parent_name = package_name(name)
      parent_name = Class.package_name(name)
      parent = @packages[parent_name] || add_package(parent_name)
      package = package_node(name)
      parent[:children] << package
@@ -65,33 +65,12 @@ module JsDuck
      package
    end

    # Given full class name, returns package name
    #
    # For example:
    #     My.package.Class => My.package
    #     My.package => My
    #     My => ""
    def package_name(name)
      parts = name.split(/\./)
      parts.slice(0, parts.length - 1).join(".")
    end

    # Given full class name, returns class name
    #
    # For example:
    #     My.package.Class => Class
    #     My.package => package
    #     My => My
    def class_name(name)
      name.split(/\./).last
    end

    # Given full doc object for class creates class node
    def class_node(cls)
      return {
        :href => "output/#{cls[:name]}.html",
        :text => class_name(cls[:name]),
        :id => cls[:name],
        :href => "output/#{cls.full_name}.html",
        :text => cls.short_name,
        :id => cls.full_name,
        :isClass => true,
        :iconCls => cls[:singleton] ? "icon-static" : "icon-cls",
        :cls => "cls",
@@ -103,7 +82,7 @@ module JsDuck
    def package_node(name)
      return {
        :id => "pkg-#{name}",
        :text => class_name(name),
        :text => Class.short_name(name),
        :iconCls => "icon-pkg",
        :cls => "package",
        :singleClickExpand => true,
+3 −2
Original line number Diff line number Diff line
require "jsduck/class"
require "jsduck/tree"
require "test/unit"

@@ -5,8 +6,8 @@ class TestTree < Test::Unit::TestCase

  def test_create
    output = JsDuck::Tree.new.create([
      {:tagname => :class, :name => "SamplePackage.SampleClass"},
      {:tagname => :class, :name => "SamplePackage.Singleton", :singleton => true},
      JsDuck::Class.new({:tagname => :class, :name => "SamplePackage.SampleClass"}),
      JsDuck::Class.new({:tagname => :class, :name => "SamplePackage.Singleton", :singleton => true}),
    ])
    assert_equal({
      :id => "apidocs",