Commit 292d4752 authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Extract SignatureRenderer class from Renderer.

parent e45d4684
Loading
Loading
Loading
Loading
+3 −55
Original line number Diff line number Diff line
require 'jsduck/meta_tag_registry'
require 'jsduck/html'
require 'jsduck/signature_renderer'

module JsDuck

@@ -12,6 +13,7 @@ module JsDuck

    def render(cls)
        @cls = cls
        @signature = SignatureRenderer.new(cls)

        return [
          "<div>",
@@ -241,61 +243,7 @@ module JsDuck
    end

    def render_signature(m)
      expandable = m[:shortDoc] ? "expandable" : "not-expandable"

      uri = "#!/api/#{m[:owner]}-#{m[:id]}"

      return [
        render_new_signature(m),
        "<a href='#{uri}' class='name #{expandable}'>#{render_member_name(m)}</a>",
        render_params_signature(m),
        render_meta_signatures(m)
      ]
    end

    def render_new_signature(m)
      constructor?(m) ? "<strong class='new-keyword'>new</strong>" : ""
    end

    def render_member_name(m)
      constructor?(m) ? @cls[:name] : m[:name]
    end

    def constructor?(m)
      m[:tagname] == :method && m[:name] == "constructor"
    end

    def render_params_signature(m)
      if m[:tagname] == :cfg || m[:tagname] == :property || m[:tagname] == :css_var
        "<span> : #{m[:html_type]}</span>"
      else
        ps = m[:params].map {|p| render_short_param(p) }.join(", ")
        "( <span class='pre'>#{ps}</span> )" + render_return_signature(m)
      end
    end

    def render_return_signature(m)
      method_with_return?(m) ? (" : " + m[:return][:html_type]) : ""
    end

    def method_with_return?(m)
      m[:tagname] == :method && m[:return][:type] != "undefined"
    end

    def render_meta_signatures(m)
      html = ""
      MetaTagRegistry.instance.signatures.each do |s|
        if m[:meta][s[:key]]
          title = s[:tooltip] ? "title='#{s[:tooltip]}'" : ""
          html += "<strong class='#{s[:key]} signature' #{title}>#{s[:long]}</strong>"
        end
      end
      html
    end

    def render_short_param(param)
      p = param[:html_type] + " " + param[:name]
      return param[:optional] ? "["+p+"]" : p
      @signature.render(m)
    end

    def render_long_doc(m)
+99 −0
Original line number Diff line number Diff line
require 'jsduck/meta_tag_registry'

module JsDuck

  # Performs the rendering of member signatures.
  class SignatureRenderer
    # Initializes the renderer for rendering members of the given
    # class.
    def initialize(cls)
      @cls = cls
    end

    # Renders signature of the given member.
    def render(member)
      # Keep the code simpler by not passing around the member hash
      @m = member

      return [
        render_new,
        render_link,
        render_type,
        render_meta,
      ]
    end

    private

    def render_new
      constructor? ? "<strong class='new-keyword'>new</strong>" : ""
    end

    def render_link
      "<a href='#{render_url}' class='name #{render_expandable}'>#{render_name}</a>"
    end

    def render_url
      "#!/api/#{@m[:owner]}-#{@m[:id]}"
    end

    def render_expandable
      @m[:shortDoc] ? "expandable" : "not-expandable"
    end

    def render_name
      constructor? ? @cls[:name] : @m[:name]
    end

    def constructor?
      @m[:tagname] == :method && @m[:name] == "constructor"
    end

    def render_type
      if like_property?
        render_property_type
      else
        render_params + render_return
      end
    end

    def like_property?
      @m[:tagname] == :cfg || @m[:tagname] == :property || @m[:tagname] == :css_var
    end

    def render_property_type
      "<span> : #{@m[:html_type]}</span>"
    end

    def render_params
      ps = @m[:params].map {|p| render_single_param(p) }.join(", ")
      "( <span class='pre'>#{ps}</span> )"
    end

    def render_single_param(param)
      p = param[:html_type] + " " + param[:name]
      param[:optional] ? "["+p+"]" : p
    end

    def render_return
      method_with_return? ? (" : " + @m[:return][:html_type]) : ""
    end

    def method_with_return?
      @m[:tagname] == :method && @m[:return][:type] != "undefined"
    end

    def render_meta
      html = ""
      MetaTagRegistry.instance.signatures.each do |s|
        if @m[:meta][s[:key]]
          title = s[:tooltip] ? "title='#{s[:tooltip]}'" : ""
          html += "<strong class='#{s[:key]} signature' #{title}>#{s[:long]}</strong>"
        end
      end
      html
    end

  end

end