Class: RDocF95::Markup::ToHtmlCrossref

Inherits:
ToHtml show all
Defined in:
lib/rdoc-f95/markup/to_html_crossref.rb

Overview

Subclass of the RDocF95::Markup::ToHtml class that supports looking up words in the AllReferences list. Those that are found (like AllReferences in this comment) will be hyperlinked

Direct Known Subclasses

ToXHtmlTexParser

Constant Summary

Constants inherited from ToHtml

RDocF95::Markup::ToHtml::LIST_TYPE_TO_HTML

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from ToHtml

#accept_blank_line, #accept_heading, #accept_list_end, #accept_list_item, #accept_list_start, #accept_paragraph, #accept_rule, #accept_verbatim, #add_tag, #annotate, #end_accepting, #gen_url, #handle_special_HYPERLINK, #handle_special_TIDYLINK, #init_tags, #start_accepting, #wrap

Methods inherited from Formatter

#convert

Constructor Details

#initialize(from_path, context, show_hash) ⇒ ToHtmlCrossref

We need to record the html path of our caller so we can generate correct relative paths for any hyperlinks that we find


16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/rdoc-f95/markup/to_html_crossref.rb', line 16

def initialize(from_path, context, show_hash)
  super()

  # class names, variable names, or instance variables
  @markup.add_special(/(
                         # A::B.meth(**) (for operator and assignment in Fortran 90 or 95)
                         \b\w+(::\w+)*[\.\#]\w+(\([\.\w+\*\/\+\-\=\<\>]+\))?
                         # meth(**) (for operator and assignment in Fortran 90 or 95)
                       | \#\w+(\([.\w\*\/\+\-\=\<\>]+\))?
                       | \b([A-Z]\w*(::\w+)*[.\#]\w+)  #    A::B.meth
                       | \b([A-Z]\w+(::\w+)*)          #    A::B
                       | \#\w+[!?=]?                   #    #meth_name
                       | \\?\b\w+([_\/\.]+\w+)*[!?=]?  #    meth_name
                       )/x,
                      :CROSSREF)

  # file names
  @markup.add_special(/(
                         ((\/|\.\.\/|\.\/|\w)[\w\#\/\.\-\~\:]*[!?=]?) # file_name
                       | ((\/|\.\.\/|\.\/|\w)[\w\#\/\.\-\~\:]*(\([\.\w+\*\/\+\-\=\<\>]+\))?)
                       )/x, 
                      :CROSSREFFILE)

  @from_path = from_path
  @context = context
  @show_hash = show_hash

  @seen = {}
  @seen_file = {}
end

Instance Attribute Details

#contextObject

Returns the value of attribute context


10
11
12
# File 'lib/rdoc-f95/markup/to_html_crossref.rb', line 10

def context
  @context
end

Instance Method Details

#handle_special_CROSSREF(special) ⇒ Object

We're invoked when any text matches the CROSSREF pattern (defined in MarkUp). If we fine the corresponding reference, generate a hyperlink. If the name we're looking for contains no punctuation, we look for it up the module/class chain. For

example, HyperlinkHtml is found, even without the Generator

prefix, because we look for it in module Generator first.


55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/rdoc-f95/markup/to_html_crossref.rb', line 55

def handle_special_CROSSREF(special)
  name = special.text

  return @seen[name] if @seen.include? name

  if name[0,1] == '#' then
    lookup = name[1..-1]
    name = lookup unless @show_hash
  else
    lookup = name
  end

  # Find class, module, or method in class or module.
  if /([A-Z]\w*)[.\#](\w+[!?=]?)/ =~ lookup then
    container = $1
    method = $2
    ref = @context.find_symbol container, method
  elsif /([A-Za-z]\w*)[.\#](\w+(\([\.\w+\*\/\+\-\=\<\>]+\))?)/ =~ lookup then
    container = $1
    method = $2
    ref = @context.find_symbol container, method
  else
    ref = @context.find_symbol lookup
  end

  out = if lookup =~ /^\\/ then
          $'
        elsif ref and ref.document_self then
          "<a href=\"#{ref.as_href(@from_path)}\">#{name}</a>"
        else
          name
        end

  @seen[name] = out

  out
end

#handle_special_CROSSREFFILE(special) ⇒ Object

CROSSREFFILE is similar to CROSSREF. But this pattern is hit to filenames or methods in files


97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'lib/rdoc-f95/markup/to_html_crossref.rb', line 97

def handle_special_CROSSREFFILE(special)
  name = special.text

  return @seen_file[name] if @seen_file.include? name

  # Find file, or method in file
  if /([\w\/\.].*\.\w+)[.\#](.*)/ =~ name
    file_name = $1
    method = $2
    ref = @context.find_file file_name, method
  else
    ref = @context.find_file name
  end

  out = if ref and ref.document_self then
          "<a href=\"#{ref.as_href(@from_path)}\">#{name}</a>"
        else
          name
        end

  @seen_file[name] = out

  out

end