class RDoc::CrossReference

RDoc::CrossReference 是一种可重用的方式来创建名称的交叉引用。

常量

ALL_CROSSREF_REGEXP

当指定 --hyperlink-all 时使用的 CROSSREF_REGEXP 的版本。

CLASS_REGEXP_STR

用于匹配类引用的正则表达式

  1. 文本前面可以有 ‘\’ 来抑制交叉引用

  2. 类名称前面可以有 ‘::’ 来引用顶级命名空间。

  3. 方法后面可以跟括号(不推荐)

CROSSREF_REGEXP

匹配应该潜在地生成交叉引用链接的文本的正则表达式被传递给 add_regexp_handling。请注意,这些表达式旨在拾取交叉引用已被抑制的文本,因为抑制字符会被触发的代码删除。

METHOD_ARGS_REGEXP_STR

用于匹配方法参数的正则表达式。

METHOD_ARG_REGEXP_STR

用于匹配单个方法参数的正则表达式。

METHOD_REGEXP_STR

用于匹配方法引用的正则表达式。

请参见 CLASS_REGEXP_STR

属性

seen[RW]

已查找的引用及其替换的哈希表

公共类方法

new(context) 点击以切换源代码

允许基于给定的 context (RDoc::Context) 创建交叉引用。

# File rdoc/cross_reference.rb, line 127
def initialize context
  @context = context
  @store   = context.store

  @seen = {}
end

公共实例方法

resolve(name, text) 点击以切换源代码

返回对 name 的引用。

如果找到引用且 name 未被记录,则将返回 text。如果 name 被转义,则返回 name。如果未找到 name,则返回 text

# File rdoc/cross_reference.rb, line 190
def resolve name, text
  return @seen[name] if @seen.include? name

  ref = case name
        when /^\\(#{CLASS_REGEXP_STR})$/o then
          @context.find_symbol $1
        else
          @context.find_symbol name
        end

  ref = resolve_method name unless ref

  # Try a page name
  ref = @store.page name if not ref and name =~ /^[\w.]+$/

  ref = nil if RDoc::Alias === ref # external alias, can't link to it

  out = if name == '\\' then
          name
        elsif name =~ /^\\/ then
          # we remove the \ only in front of what we know:
          # other backslashes are treated later, only outside of <tt>
          ref ? $' : name
        elsif ref then
          if ref.display? then
            ref
          else
            text
          end
        else
          text
        end

  @seen[name] = out

  out
end
resolve_method(name) 点击以切换源代码

返回对 name 的方法引用。

# File rdoc/cross_reference.rb, line 137
def resolve_method name
  ref = nil

  if /#{CLASS_REGEXP_STR}([.#]|::)#{METHOD_REGEXP_STR}/o =~ name then
    type = $2
    if '.' == type # will find either #method or ::method
      method = $3
    else
      method = "#{type}#{$3}"
    end
    container = @context.find_symbol_module($1)
  elsif /^([.#]|::)#{METHOD_REGEXP_STR}/o =~ name then
    type = $1
    if '.' == type
      method = $2
    else
      method = "#{type}#{$2}"
    end
    container = @context
  else
    type = nil
    container = nil
  end

  if container then
    unless RDoc::TopLevel === container then
      if '.' == type then
        if 'new' == method then # AnyClassName.new will be class method
          ref = container.find_local_symbol method
          ref = container.find_ancestor_local_symbol method unless ref
        else
          ref = container.find_local_symbol "::#{method}"
          ref = container.find_ancestor_local_symbol "::#{method}" unless ref
          ref = container.find_local_symbol "##{method}" unless ref
          ref = container.find_ancestor_local_symbol "##{method}" unless ref
        end
      else
        ref = container.find_local_symbol method
        ref = container.find_ancestor_local_symbol method unless ref
      end
    end
  end

  ref
end