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

Support @links to alternate classnames.

When {@link Foo} found and Foo is alternate classname for Bar, then
link to Bar is created instead.
parent b7f2be4a
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -159,6 +159,8 @@ module JsDuck

    # applies the link template
    def link(cls, member, anchor_text)
      # 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)

+3 −0
Original line number Diff line number Diff line
@@ -21,6 +21,9 @@ module JsDuck
      @lookup = {}
      @classes.each do |cls|
        @lookup[cls.full_name] = cls
        (cls[:alternateClassNames] || []).each do |alt_name|
          @lookup[alt_name] = cls
        end
        cls.relations = self
      end

+34 −14
Original line number Diff line number Diff line
require "jsduck/doc_formatter"
require "jsduck/relations"

describe JsDuck::DocFormatter do

  before do
    @formatter = JsDuck::DocFormatter.new
    @formatter.class_context = "Context"
    @formatter.relations = {
      'Context' => JsDuck::Class.new({
    @formatter.relations = JsDuck::Relations.new([
      JsDuck::Class.new({
        :name => "Context",
        :method => [{:name => "bar", :tagname => :method}]
      }),
      'Ext.Msg' => JsDuck::Class.new({
      JsDuck::Class.new({
        :name => 'Ext.Msg'
      }),
      'Foo' => JsDuck::Class.new({
        :cfg => [{:name => "bar", :tagname => :cfg}]
      JsDuck::Class.new({
        :name => "Foo",
        :cfg => [{:name => "bar", :tagname => :cfg}],
        :alternateClassNames => ["FooBar"]
      }),
    }
    ])
  end

  describe "#replace" do
@@ -41,6 +46,11 @@ describe JsDuck::DocFormatter do
        'Look at <a href="Foo">link text</a>'
    end

    it "Links alternate classname to real classname" do
      @formatter.replace("Look at {@link FooBar}").should ==
        'Look at <a href="Foo">FooBar</a>'
    end

    it "leaves text without {@link...} untouched" do
      @formatter.replace("Look at {@me here} too").should ==
        'Look at {@me here} too'
@@ -86,18 +96,23 @@ describe JsDuck::DocFormatter do
    # auto-conversion of identifiable ClassNames to links
    describe "auto-detect" do
      before do
        @formatter.relations = {
          'FooBar' => JsDuck::Class.new({}),
          'FooBar.Blah' => JsDuck::Class.new({}),
          'Ext.form.Field' => JsDuck::Class.new({
        @formatter.relations = JsDuck::Relations.new([
          JsDuck::Class.new({:name => 'FooBar'}),
          JsDuck::Class.new({:name => 'FooBar.Blah'}),
          JsDuck::Class.new({
            :name => 'Ext.form.Field',
            :method => [{:name => "getValues", :tagname => :method}]
          }),
          'Ext.XTemplate' => JsDuck::Class.new({}),
          'MyClass' => JsDuck::Class.new({}),
          'Ext' => JsDuck::Class.new({
          JsDuck::Class.new({
            :name => 'Ext.XTemplate',
            :alternateClassNames => ['Ext.AltXTemplate']
          }),
          JsDuck::Class.new({:name => 'MyClass'}),
          JsDuck::Class.new({
            :name => 'Ext',
            :method => [{:name => "encode", :tagname => :method}]
          }),
        }
        ])
      end

      it "doesn't recognize John as class name" do
@@ -130,6 +145,11 @@ describe JsDuck::DocFormatter do
          'Look at <a href="Ext.XTemplate">Ext.XTemplate</a>'
      end

      it "links alternate classname to canonical classname" do
        @formatter.replace("Look at Ext.AltXTemplate").should ==
          'Look at <a href="Ext.XTemplate">Ext.AltXTemplate</a>'
      end

      it "converts ClassName ending with dot to class link" do
        @formatter.replace("Look at MyClass.").should ==
          'Look at <a href="MyClass">MyClass</a>.'