class RDoc::Markup::ToHtmlCrossref
def convert_flow(flow)
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
def cross_reference(name, text = nil, code = true, rdoc_ref: false)
def cross_reference(name, text = nil, code = true, rdoc_ref: false) lookup = name name = name[1..-1] unless @show_hash if name[0, 1] == '#' if !(name.end_with?('+@', '-@')) and name =~ /(.*[^#:])?@/ text ||= [CGI.unescape($'), (" at <code>#{$1}</code>" if $~.begin(1))].join("") code = false else text ||= name end link lookup, text, code, rdoc_ref: rdoc_ref end
def gen_url(url, text)
def gen_url(url, text) if url =~ /\Ardoc-ref:/ name = $' cross_reference name, text, name == text, rdoc_ref: true else super end end
def handle_regexp_CROSSREF(target)
def handle_regexp_CROSSREF(target) name = target.text return name if @options.autolink_excluded_words&.include?(name) return name if name =~ /@[\w-]+\.[\w-]/ # labels that look like emails unless @hyperlink_all then # This ensures that words entirely consisting of lowercase letters will # not have cross-references generated (to suppress lots of erroneous # cross-references to "new" in text, for instance) return name if name =~ /\A[a-z]*\z/ end cross_reference name, rdoc_ref: false end
def handle_regexp_HYPERLINK(target)
def handle_regexp_HYPERLINK(target) url = target.text case url when /\Ardoc-ref:/ cross_reference $', rdoc_ref: true else super end end
def handle_regexp_RDOCLINK(target)
def handle_regexp_RDOCLINK(target) url = target.text case url when /\Ardoc-ref:/ cross_reference $', rdoc_ref: true else super end end
def init_link_notation_regexp_handlings
def init_link_notation_regexp_handlings add_regexp_handling_RDOCLINK # The crossref must be linked before tidylink because Klass.method[:sym] # will be processed as a tidylink first and will be broken. crossref_re = @options.hyperlink_all ? ALL_CROSSREF_REGEXP : CROSSREF_REGEXP @markup.add_regexp_handling crossref_re, :CROSSREF add_regexp_handling_TIDYLINK end
def initialize(options, from_path, context, markup = nil)
def initialize(options, from_path, context, markup = nil) raise ArgumentError, 'from_path cannot be nil' if from_path.nil? super options, markup @context = context @from_path = from_path @hyperlink_all = @options.hyperlink_all @show_hash = @options.show_hash @cross_reference = RDoc::CrossReference.new @context end
def link(name, text, code = true, rdoc_ref: false)
def link(name, text, code = true, rdoc_ref: false) if !(name.end_with?('+@', '-@')) and name =~ /(.*[^#:])?@/ name = $1 label = $' end ref = @cross_reference.resolve name, text if name case ref when String then if rdoc_ref && @options.warn_missing_rdoc_ref puts "#{@from_path}: `rdoc-ref:#{name}` can't be resolved for `#{text}`" end ref else path = ref ? ref.as_href(@from_path) : +"" if code and RDoc::CodeObject === ref and !(RDoc::TopLevel === ref) text = "<code>#{CGI.escapeHTML text}</code>" end if label if path =~ /#/ path << "-label-#{label}" elsif ref&.sections&.any? { |section| label == section.title } path << "##{label}" elsif ref.respond_to?(:aref) path << "##{ref.aref}-label-#{label}" else path << "#label-#{label}" end end "<a href=\"#{path}\">#{text}</a>" end end