Commit 9b9a2558 authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Extract categories class name formatting to separate class.

parent d40e9fb1
Loading
Loading
Loading
Loading
+3 −44
Original line number Diff line number Diff line
require 'jsduck/logger'
require 'jsduck/file_categories'
require 'jsduck/auto_categories'
require 'jsduck/categories_class_name'

module JsDuck

@@ -17,8 +18,7 @@ module JsDuck

    def initialize(categories, doc_formatter, relations={})
      @categories = categories
      @doc_formatter = doc_formatter
      @relations = relations
      @class_name = CategoriesClassName.new(doc_formatter, relations)
    end

    # Returns HTML listing of classes divided into categories
@@ -58,53 +58,12 @@ module JsDuck
        [
          "<h3>#{g['name']}</h3>",
          "<ul class='links'>",
          g["classes"].map {|cls| "<li>" + render_class_name(cls) + "</li>" },
          g["classes"].map {|cls| "<li>" + @class_name.render(cls) + "</li>" },
          "</ul>",
        ]
      end
    end

    def render_class_name(name)
      cls = @relations[name]
      if cls
        @doc_formatter.link(name, nil, name) + render_new_label(cls)
      else
        name
      end
    end

    # Adds small star to new classes in the current version.
    def render_new_label(cls)
      if cls[:meta][:new]
        "&nbsp;<span class='new-class' title='New class'>#{stars(1)}</span>"
      else
        n = new_members_count(cls)
        if n > 0
          "&nbsp;<span class='new-members' title='#{n} new members'>#{stars(n)}</span>"
        else
          ""
        end
      end
    end

    # Produces string of n stars.
    # First 3 stars are rendered as "<unicode-star>", the following as "+".
    # At max 15 stars are rendered.
    def stars(n)
      if n > 15
        stars(3) + ("+" * (15-3))
      elsif n > 3
        stars(3) + ("+" * (n-3))
      else
        "&#9733;" * n
      end
    end

    # Returns number of new members the class has in the current version
    def new_members_count(cls)
      cls.find_members(:local => true).find_all {|m| m[:meta][:new] && !m[:private] }.length
    end

    # Splits the array of items into n chunks so that the sum of
    # largest chunk is as small as possible.
    #
+60 −0
Original line number Diff line number Diff line
module JsDuck

  # Renders class names for class categories page.
  class CategoriesClassName
    def initialize(doc_formatter, relations={})
      @doc_formatter = doc_formatter
      @relations = relations
    end

    # Renders the class name as a link or plain text.
    #
    # For new classes appends a star behind class name.  For classes
    # with new members appends list n small stars behind class name
    # (reflecting the number of new members).
    def render(name)
      cls = @relations[name]
      if cls
        @doc_formatter.link(name, nil, name) + render_new_label(cls)
      else
        name
      end
    end

    private

    # Adds small star to new classes in the current version.
    def render_new_label(cls)
      if cls[:meta][:new]
        "&nbsp;<span class='new-class' title='New class'>#{stars(1)}</span>"
      else
        n = new_members_count(cls)
        if n > 0
          "&nbsp;<span class='new-members' title='#{n} new members'>#{stars(n)}</span>"
        else
          ""
        end
      end
    end

    # Produces string of n stars.
    # First 3 stars are rendered as "<unicode-star>", the following as "+".
    # At max 15 stars are rendered.
    def stars(n)
      if n > 15
        stars(3) + ("+" * (15-3))
      elsif n > 3
        stars(3) + ("+" * (n-3))
      else
        "&#9733;" * n
      end
    end

    # Returns number of new members the class has in the current version
    def new_members_count(cls)
      cls.find_members(:local => true).find_all {|m| m[:meta][:new] && !m[:private] }.length
    end

  end

end