class RDoc::CrossReference
RDoc::CrossReference
是一种可重用的方式来创建名称的交叉引用。
常量
- ALL_CROSSREF_REGEXP
当指定
--hyperlink-all
时使用的CROSSREF_REGEXP
的版本。- CLASS_REGEXP_STR
用于匹配类引用的正则表达式
-
文本前面可以有 ‘\’ 来抑制交叉引用
-
类名称前面可以有 ‘::’ 来引用顶级命名空间。
-
方法后面可以跟括号(不推荐)
-
- 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