[ruby/rdoc] Enable cross reference in code
(https://github.com/ruby/rdoc/pull/1240) Some people like to mark up method names in MarkDown style block quotes, like this: ruby/ruby#12333. Currently, no links are created in the code in the RDoc, but such words most likely refer to methods. This PR makes a word a code cross-reference if the whole word can be resolved as a reference. https://github.com/ruby/rdoc/commit/7d7efb0709
This commit is contained in:
parent
375fec7c53
commit
fef8ecc708
@ -195,18 +195,20 @@ class RDoc::Markup::Formatter
|
|||||||
@in_tt > 0
|
@in_tt > 0
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def tt_tag? attr_mask, reverse = false
|
||||||
|
each_attr_tag(attr_mask, reverse) do |tag|
|
||||||
|
return true if tt? tag
|
||||||
|
end
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
##
|
##
|
||||||
# Turns on tags for +item+ on +res+
|
# Turns on tags for +item+ on +res+
|
||||||
|
|
||||||
def on_tags res, item
|
def on_tags res, item
|
||||||
attr_mask = item.turn_on
|
each_attr_tag(item.turn_on) do |tag|
|
||||||
return if attr_mask.zero?
|
res << annotate(tag.on)
|
||||||
|
@in_tt += 1 if tt? tag
|
||||||
@attr_tags.each do |tag|
|
|
||||||
if attr_mask & tag.bit != 0 then
|
|
||||||
res << annotate(tag.on)
|
|
||||||
@in_tt += 1 if tt? tag
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -214,13 +216,18 @@ class RDoc::Markup::Formatter
|
|||||||
# Turns off tags for +item+ on +res+
|
# Turns off tags for +item+ on +res+
|
||||||
|
|
||||||
def off_tags res, item
|
def off_tags res, item
|
||||||
attr_mask = item.turn_off
|
each_attr_tag(item.turn_off, true) do |tag|
|
||||||
|
@in_tt -= 1 if tt? tag
|
||||||
|
res << annotate(tag.off)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def each_attr_tag attr_mask, reverse = false
|
||||||
return if attr_mask.zero?
|
return if attr_mask.zero?
|
||||||
|
|
||||||
@attr_tags.reverse_each do |tag|
|
@attr_tags.public_send(reverse ? :reverse_each : :each) do |tag|
|
||||||
if attr_mask & tag.bit != 0 then
|
if attr_mask & tag.bit != 0 then
|
||||||
@in_tt -= 1 if tt? tag
|
yield tag
|
||||||
res << annotate(tag.off)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -182,4 +182,43 @@ class RDoc::Markup::ToHtmlCrossref < RDoc::Markup::ToHtml
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def convert_flow(flow)
|
||||||
|
res = []
|
||||||
|
|
||||||
|
i = 0
|
||||||
|
while i < flow.size
|
||||||
|
item = flow[i]
|
||||||
|
i += 1
|
||||||
|
case item
|
||||||
|
when RDoc::Markup::AttrChanger then
|
||||||
|
# Make "+Class#method+" a cross reference
|
||||||
|
if tt_tag?(item.turn_on) and
|
||||||
|
String === (str = flow[i]) and
|
||||||
|
RDoc::Markup::AttrChanger === flow[i+1] and
|
||||||
|
tt_tag?(flow[i+1].turn_off, true) and
|
||||||
|
(@options.hyperlink_all ? ALL_CROSSREF_REGEXP : CROSSREF_REGEXP).match?(str) and
|
||||||
|
(text = cross_reference str) != str
|
||||||
|
then
|
||||||
|
text = yield text, res if defined?(yield)
|
||||||
|
res << text
|
||||||
|
i += 2
|
||||||
|
next
|
||||||
|
end
|
||||||
|
off_tags res, item
|
||||||
|
on_tags res, item
|
||||||
|
when String then
|
||||||
|
text = convert_string(item)
|
||||||
|
text = yield text, res if defined?(yield)
|
||||||
|
res << text
|
||||||
|
when RDoc::Markup::RegexpHandling then
|
||||||
|
text = convert_regexp_handling(item)
|
||||||
|
text = yield text, res if defined?(yield)
|
||||||
|
res << text
|
||||||
|
else
|
||||||
|
raise "Unknown flow element: #{item.inspect}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
res.join('')
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
@ -16,6 +16,18 @@ class RDocMarkupToHtmlCrossrefTest < XrefTestCase
|
|||||||
result = @to.convert 'C1'
|
result = @to.convert 'C1'
|
||||||
|
|
||||||
assert_equal para("<a href=\"C1.html\"><code>C1</code></a>"), result
|
assert_equal para("<a href=\"C1.html\"><code>C1</code></a>"), result
|
||||||
|
|
||||||
|
result = @to.convert '+C1+'
|
||||||
|
assert_equal para("<a href=\"C1.html\"><code>C1</code></a>"), result
|
||||||
|
|
||||||
|
result = @to.convert 'FOO'
|
||||||
|
assert_equal para("FOO"), result
|
||||||
|
|
||||||
|
result = @to.convert '+FOO+'
|
||||||
|
assert_equal para("<code>FOO</code>"), result
|
||||||
|
|
||||||
|
result = @to.convert '<tt># :stopdoc:</tt>:'
|
||||||
|
assert_equal para("<code># :stopdoc:</code>:"), result
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_convert_CROSSREF_method
|
def test_convert_CROSSREF_method
|
||||||
|
Loading…
x
Reference in New Issue
Block a user