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

Support for {@link Class#type-name} syntax.

Links to members can now optionally also specify member type.
parent d2f35e23
Loading
Loading
Loading
Loading
+14 −11
Original line number Diff line number Diff line
@@ -114,22 +114,25 @@ module JsDuck
      all_members
    end

    # Looks up member type by member name
    # Returns member by name.
    #
    # Returns type of nil if member not found
    def member_type(name)
    # Optionally one can also specify type name to differenciate
    # between different types of members.
    def get_member(name, type_name=nil)
      # build hash of all members
      unless @type_map
        @type_map = {}
        @doc[:members].each_key do |type|
          @type_map.merge!(members_hash(type))
      unless @members_map
        @members_map = {}
        [:members, :statics].each do |group|
          @doc[group].each_key do |type|
            members_hash(type).each_pair do |key, member|
              @members_map["#{type}-#{key}"] = member
              @members_map[key] = member
            end
          end
        @doc[:statics].each_key do |type|
          @type_map.merge!(members_hash(type, :statics))
        end
      end

      @type_map[name] && @type_map[name][:tagname]
      @members_map[type_name ? "#{type_name}-#{name}" : name]
    end

    # A way to access full class name with similar syntax to
+10 −8
Original line number Diff line number Diff line
@@ -91,11 +91,13 @@ module JsDuck
      input.sub(@link_re) do
        target = $1
        text = $2
        if target =~ /^(.*)#(.*)$/
        if target =~ /^(.*)#(?:(.*)-)?(.*)$/
          cls = $1.empty? ? @class_context : $1
          member = $2
          type = $2 ? $2.intern : nil
          member = $3
        else
          cls = target
          type = false
          member = false
        end

@@ -113,11 +115,11 @@ module JsDuck
        if !@relations[cls]
          Logger.instance.warn("#{file} line #{line} #{input} links to non-existing class.")
          text
        elsif member && !get_member_type(cls, member)
        elsif member && !get_member(cls, member, type)
          Logger.instance.warn("#{file} line #{line} #{input} links to non-existing member.")
          text
        else
          link(cls, member, text)
          link(cls, member, text, type)
        end
      end
    end
@@ -158,11 +160,11 @@ module JsDuck
    end

    # applies the link template
    def link(cls, member, anchor_text)
    def link(cls, member, anchor_text, type=nil)
      # Use the canonical class name for link (not some alternateClassName)
      cls = @relations[cls].full_name
      # prepend type name to member name
      member = member && (get_member_type(cls, member).to_s + "-" + member)
      member = member && (get_member(cls, member, type)[:tagname].to_s + "-" + member)

      @link_tpl.gsub(/(%[\w#-])/) do
        case $1
@@ -182,8 +184,8 @@ module JsDuck
      end
    end

    def get_member_type(cls, member)
      @relations[cls] && @relations[cls].member_type(member)
    def get_member(cls, member, type)
      @relations[cls] && @relations[cls].get_member(member, type)
    end

    # Formats doc-comment for placement into HTML.
+24 −0
Original line number Diff line number Diff line
@@ -188,6 +188,30 @@ describe JsDuck::DocFormatter do
          '<img src="some/file.jpg" alt="a MyClass image"/>'
      end
    end

    describe "with type information" do
      before do
        @formatter.relations = JsDuck::Relations.new([
          JsDuck::Class.new({
            :name => 'Foo',
            :members => {
              :method => [{:name => "select", :tagname => :method}],
              :event => [{:name => "select", :tagname => :event}],
            }
          })
        ])
      end

      it "replaces {@link Foo#method-select} with link to method" do
        @formatter.replace("Look at {@link Foo#method-select}").should ==
          'Look at <a href="Foo#method-select">Foo.select</a>'
      end

      it "replaces {@link Foo#event-select} with link to event" do
        @formatter.replace("Look at {@link Foo#event-select}").should ==
          'Look at <a href="Foo#event-select">Foo.select</a>'
      end
    end
  end

  describe "#format" do