From fd1e23978b097f5a38bbe3f4b23222d0effdaa3b Mon Sep 17 00:00:00 2001 From: Rene Saarsoo Date: Mon, 5 Dec 2011 15:46:57 +0200 Subject: [PATCH] Auto-linking of current class #members. When #foo is found inside text, it is automatically interpreted as {@link #foo} when the current class happens to have a member called #foo. --- lib/jsduck/doc_formatter.rb | 14 +++++++++----- spec/doc_formatter_spec.rb | 19 +++++++++++++++++++ 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/lib/jsduck/doc_formatter.rb b/lib/jsduck/doc_formatter.rb index daf05904..2a5593b9 100644 --- a/lib/jsduck/doc_formatter.rb +++ b/lib/jsduck/doc_formatter.rb @@ -196,16 +196,20 @@ module JsDuck end def replace_class_names(input) - input.gsub(/\b([A-Z][A-Za-z0-9.]*[A-Za-z0-9])(?:(#)([A-Za-z0-9]+))?\b/m) do + cls_re = "([A-Z][A-Za-z0-9.]*[A-Za-z0-9])" + member_re = "(?:#([A-Za-z0-9]+))" + + input.gsub(/\b#{cls_re}#{member_re}?\b|#{member_re}\b/m) do cls = $1 - hash = $2 - member = $3 + member = $2 || $3 - if @relations[cls] && (member ? get_matching_member(cls, member) : cls =~ /\./) + if cls && @relations[cls] && (member ? get_matching_member(cls, member) : cls =~ /\./) label = member ? cls+"."+member : cls link(cls, member, label) + elsif !cls && member && get_matching_member(@class_context, member) + link(@class_context, member, member) else - cls + (hash || "") + (member || "") + "#{cls}#{member ? '#' : ''}#{member}" end end end diff --git a/spec/doc_formatter_spec.rb b/spec/doc_formatter_spec.rb index 17c4f7ec..d6f59ae0 100644 --- a/spec/doc_formatter_spec.rb +++ b/spec/doc_formatter_spec.rb @@ -116,6 +116,7 @@ describe JsDuck::DocFormatter do # auto-conversion of identifiable ClassNames to links describe "auto-detect" do before do + @formatter.class_context = "Context" @formatter.relations = JsDuck::Relations.new([ JsDuck::Class.new({:name => 'Foo.Bar'}), JsDuck::Class.new({:name => 'Foo.Bar.Blah'}), @@ -135,6 +136,12 @@ describe JsDuck::DocFormatter do :method => [{:tagname => :method, :name => "encode", :id => "method-encode"}] } }), + JsDuck::Class.new({ + :name => "Context", + :members => { + :method => [{:tagname => :method, :name => "bar", :id => "method-bar"}] + }, + }), ]) end @@ -193,6 +200,8 @@ describe JsDuck::DocFormatter do 'See: Foo.Bar, Ext.XTemplate' end + # Links to #members + it "converts Ext#encode to method link" do @formatter.replace("Look at Ext#encode").should == 'Look at Ext.encode' @@ -203,6 +212,16 @@ describe JsDuck::DocFormatter do 'Look at Ext.form.Field.getValues' end + it "converts #bar to link to current class method" do + @formatter.replace("Look at #bar method").should == + 'Look at bar method' + end + + it "Doesn't convert #unknown to link" do + @formatter.replace("Ahh, an #unknown method").should == + 'Ahh, an #unknown method' + end + # Ensure links aren't created inside ... or {@link} and {@img} tags. it "doesn't create links inside {@link} tag" do -- GitLab