rdoc-f95 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +4 -0
- data/Manifest.txt +79 -0
- data/PostInstall.txt +7 -0
- data/README.rdoc +147 -0
- data/Rakefile +28 -0
- data/bin/rdoc-f95 +70 -0
- data/lib/rdoc-f95.rb +306 -0
- data/lib/rdoc-f95/code_objects.rb +776 -0
- data/lib/rdoc-f95/diagram.rb +342 -0
- data/lib/rdoc-f95/dot.rb +249 -0
- data/lib/rdoc-f95/generator.rb +1088 -0
- data/lib/rdoc-f95/generator/chm.rb +113 -0
- data/lib/rdoc-f95/generator/chm/chm.rb +98 -0
- data/lib/rdoc-f95/generator/html.rb +370 -0
- data/lib/rdoc-f95/generator/html/hefss.rb +414 -0
- data/lib/rdoc-f95/generator/html/html.rb +708 -0
- data/lib/rdoc-f95/generator/html/kilmer.rb +418 -0
- data/lib/rdoc-f95/generator/html/one_page_html.rb +121 -0
- data/lib/rdoc-f95/generator/ri.rb +229 -0
- data/lib/rdoc-f95/generator/xhtml.rb +106 -0
- data/lib/rdoc-f95/generator/xhtml/ctop.xsl +1318 -0
- data/lib/rdoc-f95/generator/xhtml/mathml.xsl +42 -0
- data/lib/rdoc-f95/generator/xhtml/pmathml.xsl +612 -0
- data/lib/rdoc-f95/generator/xhtml/pmathmlcss.xsl +872 -0
- data/lib/rdoc-f95/generator/xhtml/xhtml.rb +732 -0
- data/lib/rdoc-f95/generator/xml.rb +120 -0
- data/lib/rdoc-f95/generator/xml/rdf.rb +113 -0
- data/lib/rdoc-f95/generator/xml/xml.rb +111 -0
- data/lib/rdoc-f95/install.rb +166 -0
- data/lib/rdoc-f95/markup.rb +506 -0
- data/lib/rdoc-f95/markup/formatter.rb +14 -0
- data/lib/rdoc-f95/markup/fragments.rb +337 -0
- data/lib/rdoc-f95/markup/inline.rb +361 -0
- data/lib/rdoc-f95/markup/install.rb +57 -0
- data/lib/rdoc-f95/markup/lines.rb +152 -0
- data/lib/rdoc-f95/markup/mathml_wrapper.rb +91 -0
- data/lib/rdoc-f95/markup/preprocess.rb +71 -0
- data/lib/rdoc-f95/markup/sample/rdoc2latex.rb +16 -0
- data/lib/rdoc-f95/markup/sample/sample.rb +42 -0
- data/lib/rdoc-f95/markup/to_flow.rb +185 -0
- data/lib/rdoc-f95/markup/to_html.rb +357 -0
- data/lib/rdoc-f95/markup/to_html_crossref.rb +123 -0
- data/lib/rdoc-f95/markup/to_latex.rb +328 -0
- data/lib/rdoc-f95/markup/to_test.rb +50 -0
- data/lib/rdoc-f95/markup/to_xhtml_texparser.rb +234 -0
- data/lib/rdoc-f95/options.rb +745 -0
- data/lib/rdoc-f95/parsers/parse_c.rb +775 -0
- data/lib/rdoc-f95/parsers/parse_f95.rb +2499 -0
- data/lib/rdoc-f95/parsers/parse_rb.rb +2587 -0
- data/lib/rdoc-f95/parsers/parse_simple.rb +39 -0
- data/lib/rdoc-f95/parsers/parserfactory.rb +99 -0
- data/lib/rdoc-f95/ri.rb +2 -0
- data/lib/rdoc-f95/ri/cache.rb +188 -0
- data/lib/rdoc-f95/ri/descriptions.rb +147 -0
- data/lib/rdoc-f95/ri/display.rb +244 -0
- data/lib/rdoc-f95/ri/driver.rb +435 -0
- data/lib/rdoc-f95/ri/formatter.rb +603 -0
- data/lib/rdoc-f95/ri/paths.rb +105 -0
- data/lib/rdoc-f95/ri/reader.rb +106 -0
- data/lib/rdoc-f95/ri/util.rb +81 -0
- data/lib/rdoc-f95/ri/writer.rb +64 -0
- data/lib/rdoc-f95/stats.rb +23 -0
- data/lib/rdoc-f95/template.rb +64 -0
- data/lib/rdoc-f95/tokenstream.rb +33 -0
- data/lib/rdoc-f95/usage.rb +210 -0
- data/script/console +10 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/test/test_helper.rb +3 -0
- data/test/test_rdoc-f95.rb +11 -0
- metadata +156 -0
@@ -0,0 +1,357 @@
|
|
1
|
+
require 'rdoc-f95/markup/formatter'
|
2
|
+
require 'rdoc-f95/markup/fragments'
|
3
|
+
require 'rdoc-f95/markup/inline'
|
4
|
+
require 'rdoc-f95/generator'
|
5
|
+
|
6
|
+
require 'cgi'
|
7
|
+
|
8
|
+
class RDocF95::Markup::ToHtml < RDocF95::Markup::Formatter
|
9
|
+
|
10
|
+
LIST_TYPE_TO_HTML = {
|
11
|
+
:BULLET => %w[<ul> </ul>],
|
12
|
+
:NUMBER => %w[<ol> </ol>],
|
13
|
+
:UPPERALPHA => %w[<ol> </ol>],
|
14
|
+
:LOWERALPHA => %w[<ol> </ol>],
|
15
|
+
:LABELED => %w[<dl> </dl>],
|
16
|
+
:NOTE => %w[<table> </table>],
|
17
|
+
}
|
18
|
+
|
19
|
+
InlineTag = Struct.new(:bit, :on, :off)
|
20
|
+
|
21
|
+
def initialize
|
22
|
+
super
|
23
|
+
|
24
|
+
# external hyperlinks
|
25
|
+
@markup.add_special(/((link:|https?:|mailto:|ftp:|www\.)\S+\w)/, :HYPERLINK)
|
26
|
+
|
27
|
+
# and links of the form <text>[<url>]
|
28
|
+
@markup.add_special(/(((\{.*?\})|\b\S+?)\[\S+?\.\S+?\])/, :TIDYLINK)
|
29
|
+
|
30
|
+
init_tags
|
31
|
+
end
|
32
|
+
|
33
|
+
##
|
34
|
+
# Generate a hyperlink for url, labeled with text. Handle the
|
35
|
+
# special cases for img: and link: described under handle_special_HYPEDLINK
|
36
|
+
|
37
|
+
def gen_url(url, text)
|
38
|
+
if url =~ /([A-Za-z]+):(.*)/ then
|
39
|
+
type = $1
|
40
|
+
path = $2
|
41
|
+
else
|
42
|
+
type = "http"
|
43
|
+
path = url
|
44
|
+
url = "http://#{url}"
|
45
|
+
end
|
46
|
+
|
47
|
+
if type == "link" then
|
48
|
+
url = if path[0, 1] == '#' then # is this meaningful?
|
49
|
+
path
|
50
|
+
else
|
51
|
+
RDocF95::Generator.gen_url @from_path, path
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
if (type == "http" or type == "link") and
|
56
|
+
url =~ /\.(gif|png|jpg|jpeg|bmp)$/ then
|
57
|
+
"<img src=\"#{url}\" />"
|
58
|
+
|
59
|
+
elsif type == "link"
|
60
|
+
"<a href=\"#{url}\">#{text.sub(%r{^#{type}:/*}, '')}</a>"
|
61
|
+
else
|
62
|
+
"<a href=\"#{url}\" target=\"_top\">#{text.sub(%r{^#{type}:/*}, '')}</a>"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
##
|
67
|
+
# And we're invoked with a potential external hyperlink mailto:
|
68
|
+
# just gets inserted. http: links are checked to see if they
|
69
|
+
# reference an image. If so, that image gets inserted using an
|
70
|
+
# <img> tag. Otherwise a conventional <a href> is used. We also
|
71
|
+
# support a special type of hyperlink, link:, which is a reference
|
72
|
+
# to a local file whose path is relative to the --op directory.
|
73
|
+
|
74
|
+
def handle_special_HYPERLINK(special)
|
75
|
+
url = special.text
|
76
|
+
gen_url url, url
|
77
|
+
end
|
78
|
+
|
79
|
+
##
|
80
|
+
# Here's a hypedlink where the label is different to the URL
|
81
|
+
# <label>[url] or {long label}[url]
|
82
|
+
|
83
|
+
def handle_special_TIDYLINK(special)
|
84
|
+
text = special.text
|
85
|
+
|
86
|
+
return text unless text =~ /\{(.*?)\}\[(.*?)\]/ or text =~ /(\S+)\[(.*?)\]/
|
87
|
+
|
88
|
+
label = $1
|
89
|
+
url = $2
|
90
|
+
gen_url url, label
|
91
|
+
end
|
92
|
+
|
93
|
+
##
|
94
|
+
# Set up the standard mapping of attributes to HTML tags
|
95
|
+
|
96
|
+
def init_tags
|
97
|
+
@attr_tags = [
|
98
|
+
InlineTag.new(RDocF95::Markup::Attribute.bitmap_for(:BOLD), "<b>", "</b>"),
|
99
|
+
InlineTag.new(RDocF95::Markup::Attribute.bitmap_for(:TT), "<tt>", "</tt>"),
|
100
|
+
InlineTag.new(RDocF95::Markup::Attribute.bitmap_for(:EM), "<em>", "</em>"),
|
101
|
+
]
|
102
|
+
end
|
103
|
+
|
104
|
+
##
|
105
|
+
# Add a new set of HTML tags for an attribute. We allow separate start and
|
106
|
+
# end tags for flexibility.
|
107
|
+
|
108
|
+
def add_tag(name, start, stop)
|
109
|
+
@attr_tags << InlineTag.new(RDocF95::Markup::Attribute.bitmap_for(name), start, stop)
|
110
|
+
end
|
111
|
+
|
112
|
+
##
|
113
|
+
# Given an HTML tag, decorate it with class information and the like if
|
114
|
+
# required. This is a no-op in the base class, but is overridden in HTML
|
115
|
+
# output classes that implement style sheets.
|
116
|
+
|
117
|
+
def annotate(tag)
|
118
|
+
tag
|
119
|
+
end
|
120
|
+
|
121
|
+
##
|
122
|
+
# Here's the client side of the visitor pattern
|
123
|
+
|
124
|
+
def start_accepting
|
125
|
+
@res = ""
|
126
|
+
@in_list_entry = []
|
127
|
+
end
|
128
|
+
|
129
|
+
def end_accepting
|
130
|
+
@res
|
131
|
+
end
|
132
|
+
|
133
|
+
def accept_paragraph(am, fragment)
|
134
|
+
@res << annotate("<p>") + "\n"
|
135
|
+
@res << wrap(convert_flow(am.flow(fragment.txt)))
|
136
|
+
@res << annotate("</p>") + "\n"
|
137
|
+
end
|
138
|
+
|
139
|
+
def accept_verbatim(am, fragment)
|
140
|
+
@res << annotate("<pre>") + "\n"
|
141
|
+
@res << CGI.escapeHTML(fragment.txt)
|
142
|
+
@res << annotate("</pre>") << "\n"
|
143
|
+
end
|
144
|
+
|
145
|
+
def accept_rule(am, fragment)
|
146
|
+
size = fragment.param
|
147
|
+
size = 10 if size > 10
|
148
|
+
@res << "<hr size=\"#{size}\"></hr>"
|
149
|
+
end
|
150
|
+
|
151
|
+
def accept_list_start(am, fragment)
|
152
|
+
@res << html_list_name(fragment.type, true) << "\n"
|
153
|
+
@in_list_entry.push false
|
154
|
+
end
|
155
|
+
|
156
|
+
def accept_list_end(am, fragment)
|
157
|
+
if tag = @in_list_entry.pop
|
158
|
+
@res << annotate(tag) << "\n"
|
159
|
+
end
|
160
|
+
@res << html_list_name(fragment.type, false) << "\n"
|
161
|
+
end
|
162
|
+
|
163
|
+
def accept_list_item(am, fragment)
|
164
|
+
if tag = @in_list_entry.last
|
165
|
+
@res << annotate(tag) << "\n"
|
166
|
+
end
|
167
|
+
|
168
|
+
@res << list_item_start(am, fragment)
|
169
|
+
|
170
|
+
@res << wrap(convert_flow(am.flow(fragment.txt))) << "\n"
|
171
|
+
|
172
|
+
@in_list_entry[-1] = list_end_for(fragment.type)
|
173
|
+
end
|
174
|
+
|
175
|
+
def accept_blank_line(am, fragment)
|
176
|
+
# @res << annotate("<p />") << "\n"
|
177
|
+
end
|
178
|
+
|
179
|
+
def accept_heading(am, fragment)
|
180
|
+
@res << convert_heading(fragment.head_level, am.flow(fragment.txt))
|
181
|
+
end
|
182
|
+
|
183
|
+
##
|
184
|
+
# This is a higher speed (if messier) version of wrap
|
185
|
+
|
186
|
+
def wrap(txt, line_len = 76)
|
187
|
+
res = ""
|
188
|
+
sp = 0
|
189
|
+
ep = txt.length
|
190
|
+
while sp < ep
|
191
|
+
# scan back for a space
|
192
|
+
p = sp + line_len - 1
|
193
|
+
if p >= ep
|
194
|
+
p = ep
|
195
|
+
else
|
196
|
+
while p > sp and txt[p] != ?\s
|
197
|
+
p -= 1
|
198
|
+
end
|
199
|
+
if p <= sp
|
200
|
+
p = sp + line_len
|
201
|
+
while p < ep and txt[p] != ?\s
|
202
|
+
p += 1
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|
206
|
+
res << txt[sp...p] << "\n"
|
207
|
+
sp = p
|
208
|
+
sp += 1 while sp < ep and txt[sp] == ?\s
|
209
|
+
end
|
210
|
+
res
|
211
|
+
end
|
212
|
+
|
213
|
+
private
|
214
|
+
|
215
|
+
def on_tags(res, item)
|
216
|
+
attr_mask = item.turn_on
|
217
|
+
return if attr_mask.zero?
|
218
|
+
|
219
|
+
@attr_tags.each do |tag|
|
220
|
+
if attr_mask & tag.bit != 0
|
221
|
+
res << annotate(tag.on)
|
222
|
+
end
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
def off_tags(res, item)
|
227
|
+
attr_mask = item.turn_off
|
228
|
+
return if attr_mask.zero?
|
229
|
+
|
230
|
+
@attr_tags.reverse_each do |tag|
|
231
|
+
if attr_mask & tag.bit != 0
|
232
|
+
res << annotate(tag.off)
|
233
|
+
end
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
def convert_flow(flow)
|
238
|
+
res = ""
|
239
|
+
|
240
|
+
flow.each do |item|
|
241
|
+
case item
|
242
|
+
when String
|
243
|
+
res << convert_string(item)
|
244
|
+
when RDocF95::Markup::AttrChanger
|
245
|
+
off_tags(res, item)
|
246
|
+
on_tags(res, item)
|
247
|
+
when RDocF95::Markup::Special
|
248
|
+
res << convert_special(item)
|
249
|
+
else
|
250
|
+
raise "Unknown flow element: #{item.inspect}"
|
251
|
+
end
|
252
|
+
end
|
253
|
+
|
254
|
+
res
|
255
|
+
end
|
256
|
+
|
257
|
+
##
|
258
|
+
# some of these patterns are taken from SmartyPants...
|
259
|
+
|
260
|
+
def convert_string(item)
|
261
|
+
CGI.escapeHTML(item).
|
262
|
+
|
263
|
+
# convert -- to em-dash, (-- to en-dash)
|
264
|
+
gsub(/---?/, '—'). #gsub(/--/, '–').
|
265
|
+
|
266
|
+
# convert ... to elipsis (and make sure .... becomes .<elipsis>)
|
267
|
+
gsub(/\.\.\.\./, '.…').gsub(/\.\.\./, '…').
|
268
|
+
|
269
|
+
# convert single closing quote
|
270
|
+
gsub(%r{([^ \t\r\n\[\{\(])\'}, '\1’').
|
271
|
+
gsub(%r{\'(?=\W|s\b)}, '’').
|
272
|
+
|
273
|
+
# convert single opening quote
|
274
|
+
gsub(/'/, '‘').
|
275
|
+
|
276
|
+
# convert double closing quote
|
277
|
+
gsub(%r{([^ \t\r\n\[\{\(])\'(?=\W)}, '\1”').
|
278
|
+
|
279
|
+
# convert double opening quote
|
280
|
+
gsub(/'/, '“').
|
281
|
+
|
282
|
+
# convert copyright
|
283
|
+
gsub(/\(c\)/, '©').
|
284
|
+
|
285
|
+
# convert and registered trademark
|
286
|
+
gsub(/\(r\)/, '®')
|
287
|
+
|
288
|
+
end
|
289
|
+
|
290
|
+
def convert_special(special)
|
291
|
+
handled = false
|
292
|
+
RDocF95::Markup::Attribute.each_name_of(special.type) do |name|
|
293
|
+
method_name = "handle_special_#{name}"
|
294
|
+
if self.respond_to? method_name
|
295
|
+
special.text = send(method_name, special)
|
296
|
+
handled = true
|
297
|
+
end
|
298
|
+
end
|
299
|
+
raise "Unhandled special: #{special}" unless handled
|
300
|
+
special.text
|
301
|
+
end
|
302
|
+
|
303
|
+
def convert_heading(level, flow)
|
304
|
+
res =
|
305
|
+
annotate("<h#{level}>") +
|
306
|
+
convert_flow(flow) +
|
307
|
+
annotate("</h#{level}>\n")
|
308
|
+
end
|
309
|
+
|
310
|
+
def html_list_name(list_type, is_open_tag)
|
311
|
+
tags = LIST_TYPE_TO_HTML[list_type] || raise("Invalid list type: #{list_type.inspect}")
|
312
|
+
annotate(tags[ is_open_tag ? 0 : 1])
|
313
|
+
end
|
314
|
+
|
315
|
+
def list_item_start(am, fragment)
|
316
|
+
case fragment.type
|
317
|
+
when :BULLET, :NUMBER then
|
318
|
+
annotate("<li>")
|
319
|
+
|
320
|
+
when :UPPERALPHA then
|
321
|
+
annotate("<li type=\"A\">")
|
322
|
+
|
323
|
+
when :LOWERALPHA then
|
324
|
+
annotate("<li type=\"a\">")
|
325
|
+
|
326
|
+
when :LABELED then
|
327
|
+
annotate("<dt>") +
|
328
|
+
convert_flow(am.flow(fragment.param)) +
|
329
|
+
annotate("</dt>") +
|
330
|
+
annotate("<dd>")
|
331
|
+
|
332
|
+
when :NOTE then
|
333
|
+
annotate("<tr>") +
|
334
|
+
annotate("<td valign=\"top\">") +
|
335
|
+
convert_flow(am.flow(fragment.param)) +
|
336
|
+
annotate("</td>") +
|
337
|
+
annotate("<td>")
|
338
|
+
else
|
339
|
+
raise "Invalid list type"
|
340
|
+
end
|
341
|
+
end
|
342
|
+
|
343
|
+
def list_end_for(fragment_type)
|
344
|
+
case fragment_type
|
345
|
+
when :BULLET, :NUMBER, :UPPERALPHA, :LOWERALPHA then
|
346
|
+
"</li>"
|
347
|
+
when :LABELED then
|
348
|
+
"</dd>"
|
349
|
+
when :NOTE then
|
350
|
+
"</td></tr>"
|
351
|
+
else
|
352
|
+
raise "Invalid list type"
|
353
|
+
end
|
354
|
+
end
|
355
|
+
|
356
|
+
end
|
357
|
+
|
@@ -0,0 +1,123 @@
|
|
1
|
+
require 'rdoc-f95/markup/to_html'
|
2
|
+
|
3
|
+
##
|
4
|
+
# Subclass of the RDocF95::Markup::ToHtml class that supports looking up words in
|
5
|
+
# the AllReferences list. Those that are found (like AllReferences in this
|
6
|
+
# comment) will be hyperlinked
|
7
|
+
|
8
|
+
class RDocF95::Markup::ToHtmlCrossref < RDocF95::Markup::ToHtml
|
9
|
+
|
10
|
+
attr_accessor :context
|
11
|
+
|
12
|
+
##
|
13
|
+
# We need to record the html path of our caller so we can generate
|
14
|
+
# correct relative paths for any hyperlinks that we find
|
15
|
+
|
16
|
+
def initialize(from_path, context, show_hash)
|
17
|
+
super()
|
18
|
+
|
19
|
+
# class names, variable names, or instance variables
|
20
|
+
@markup.add_special(/(
|
21
|
+
# A::B.meth(**) (for operator and assignment in Fortran 90 or 95)
|
22
|
+
\b\w+(::\w+)*[\.\#]\w+(\([\.\w+\*\/\+\-\=\<\>]+\))?
|
23
|
+
# meth(**) (for operator and assignment in Fortran 90 or 95)
|
24
|
+
| \#\w+(\([.\w\*\/\+\-\=\<\>]+\))?
|
25
|
+
| \b([A-Z]\w*(::\w+)*[.\#]\w+) # A::B.meth
|
26
|
+
| \b([A-Z]\w+(::\w+)*) # A::B
|
27
|
+
| \#\w+[!?=]? # #meth_name
|
28
|
+
| \\?\b\w+([_\/\.]+\w+)*[!?=]? # meth_name
|
29
|
+
)/x,
|
30
|
+
:CROSSREF)
|
31
|
+
|
32
|
+
# file names
|
33
|
+
@markup.add_special(/(
|
34
|
+
((\/|\.\.\/|\.\/|\w)[\w\#\/\.\-\~\:]*[!?=]?) # file_name
|
35
|
+
| ((\/|\.\.\/|\.\/|\w)[\w\#\/\.\-\~\:]*(\([\.\w+\*\/\+\-\=\<\>]+\))?)
|
36
|
+
)/x,
|
37
|
+
:CROSSREFFILE)
|
38
|
+
|
39
|
+
@from_path = from_path
|
40
|
+
@context = context
|
41
|
+
@show_hash = show_hash
|
42
|
+
|
43
|
+
@seen = {}
|
44
|
+
@seen_file = {}
|
45
|
+
end
|
46
|
+
|
47
|
+
##
|
48
|
+
# We're invoked when any text matches the CROSSREF pattern
|
49
|
+
# (defined in MarkUp). If we fine the corresponding reference,
|
50
|
+
# generate a hyperlink. If the name we're looking for contains
|
51
|
+
# no punctuation, we look for it up the module/class chain. For
|
52
|
+
# example, HyperlinkHtml is found, even without the Generator::
|
53
|
+
# prefix, because we look for it in module Generator first.
|
54
|
+
|
55
|
+
def handle_special_CROSSREF(special)
|
56
|
+
name = special.text
|
57
|
+
|
58
|
+
return @seen[name] if @seen.include? name
|
59
|
+
|
60
|
+
if name[0,1] == '#' then
|
61
|
+
lookup = name[1..-1]
|
62
|
+
name = lookup unless @show_hash
|
63
|
+
else
|
64
|
+
lookup = name
|
65
|
+
end
|
66
|
+
|
67
|
+
# Find class, module, or method in class or module.
|
68
|
+
if /([A-Z]\w*)[.\#](\w+[!?=]?)/ =~ lookup then
|
69
|
+
container = $1
|
70
|
+
method = $2
|
71
|
+
ref = @context.find_symbol container, method
|
72
|
+
elsif /([A-Za-z]\w*)[.\#](\w+(\([\.\w+\*\/\+\-\=\<\>]+\))?)/ =~ lookup then
|
73
|
+
container = $1
|
74
|
+
method = $2
|
75
|
+
ref = @context.find_symbol container, method
|
76
|
+
else
|
77
|
+
ref = @context.find_symbol lookup
|
78
|
+
end
|
79
|
+
|
80
|
+
out = if lookup =~ /^\\/ then
|
81
|
+
$'
|
82
|
+
elsif ref and ref.document_self then
|
83
|
+
"<a href=\"#{ref.as_href(@from_path)}\">#{name}</a>"
|
84
|
+
else
|
85
|
+
name
|
86
|
+
end
|
87
|
+
|
88
|
+
@seen[name] = out
|
89
|
+
|
90
|
+
out
|
91
|
+
end
|
92
|
+
|
93
|
+
#
|
94
|
+
# CROSSREFFILE is similar to CROSSREF. But this pattern is
|
95
|
+
# hit to filenames or methods in files
|
96
|
+
#
|
97
|
+
def handle_special_CROSSREFFILE(special)
|
98
|
+
name = special.text
|
99
|
+
|
100
|
+
return @seen_file[name] if @seen_file.include? name
|
101
|
+
|
102
|
+
# Find file, or method in file
|
103
|
+
if /([\w\/\.].*\.\w+)[.\#](.*)/ =~ name
|
104
|
+
file_name = $1
|
105
|
+
method = $2
|
106
|
+
ref = @context.find_file file_name, method
|
107
|
+
else
|
108
|
+
ref = @context.find_file name
|
109
|
+
end
|
110
|
+
|
111
|
+
out = if ref and ref.document_self then
|
112
|
+
"<a href=\"#{ref.as_href(@from_path)}\">#{name}</a>"
|
113
|
+
else
|
114
|
+
name
|
115
|
+
end
|
116
|
+
|
117
|
+
@seen_file[name] = out
|
118
|
+
|
119
|
+
out
|
120
|
+
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|