gitlab-rdoc 6.3.2
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.
- checksums.yaml +7 -0
- data/CONTRIBUTING.rdoc +220 -0
- data/CVE-2013-0256.rdoc +49 -0
- data/ExampleMarkdown.md +37 -0
- data/ExampleRDoc.rdoc +208 -0
- data/Gemfile +12 -0
- data/History.rdoc +1666 -0
- data/LEGAL.rdoc +50 -0
- data/LICENSE.rdoc +57 -0
- data/README.rdoc +133 -0
- data/RI.rdoc +57 -0
- data/Rakefile +101 -0
- data/TODO.rdoc +59 -0
- data/bin/console +7 -0
- data/bin/setup +6 -0
- data/exe/rdoc +44 -0
- data/exe/ri +12 -0
- data/lib/rdoc/alias.rb +112 -0
- data/lib/rdoc/anon_class.rb +11 -0
- data/lib/rdoc/any_method.rb +361 -0
- data/lib/rdoc/attr.rb +176 -0
- data/lib/rdoc/class_module.rb +802 -0
- data/lib/rdoc/code_object.rb +421 -0
- data/lib/rdoc/code_objects.rb +6 -0
- data/lib/rdoc/comment.rb +250 -0
- data/lib/rdoc/constant.rb +187 -0
- data/lib/rdoc/context/section.rb +232 -0
- data/lib/rdoc/context.rb +1266 -0
- data/lib/rdoc/cross_reference.rb +202 -0
- data/lib/rdoc/encoding.rb +136 -0
- data/lib/rdoc/erb_partial.rb +19 -0
- data/lib/rdoc/erbio.rb +42 -0
- data/lib/rdoc/extend.rb +10 -0
- data/lib/rdoc/generator/darkfish.rb +790 -0
- data/lib/rdoc/generator/json_index.rb +300 -0
- data/lib/rdoc/generator/markup.rb +160 -0
- data/lib/rdoc/generator/pot/message_extractor.rb +68 -0
- data/lib/rdoc/generator/pot/po.rb +84 -0
- data/lib/rdoc/generator/pot/po_entry.rb +141 -0
- data/lib/rdoc/generator/pot.rb +98 -0
- data/lib/rdoc/generator/ri.rb +31 -0
- data/lib/rdoc/generator/template/darkfish/.document +0 -0
- data/lib/rdoc/generator/template/darkfish/_footer.rhtml +5 -0
- data/lib/rdoc/generator/template/darkfish/_head.rhtml +22 -0
- data/lib/rdoc/generator/template/darkfish/_sidebar_VCS_info.rhtml +19 -0
- data/lib/rdoc/generator/template/darkfish/_sidebar_classes.rhtml +9 -0
- data/lib/rdoc/generator/template/darkfish/_sidebar_extends.rhtml +15 -0
- data/lib/rdoc/generator/template/darkfish/_sidebar_in_files.rhtml +9 -0
- data/lib/rdoc/generator/template/darkfish/_sidebar_includes.rhtml +15 -0
- data/lib/rdoc/generator/template/darkfish/_sidebar_installed.rhtml +15 -0
- data/lib/rdoc/generator/template/darkfish/_sidebar_methods.rhtml +12 -0
- data/lib/rdoc/generator/template/darkfish/_sidebar_navigation.rhtml +11 -0
- data/lib/rdoc/generator/template/darkfish/_sidebar_pages.rhtml +12 -0
- data/lib/rdoc/generator/template/darkfish/_sidebar_parent.rhtml +11 -0
- data/lib/rdoc/generator/template/darkfish/_sidebar_search.rhtml +14 -0
- data/lib/rdoc/generator/template/darkfish/_sidebar_sections.rhtml +11 -0
- data/lib/rdoc/generator/template/darkfish/_sidebar_table_of_contents.rhtml +18 -0
- data/lib/rdoc/generator/template/darkfish/class.rhtml +172 -0
- data/lib/rdoc/generator/template/darkfish/css/fonts.css +167 -0
- data/lib/rdoc/generator/template/darkfish/css/rdoc.css +639 -0
- data/lib/rdoc/generator/template/darkfish/fonts/Lato-Light.ttf +0 -0
- data/lib/rdoc/generator/template/darkfish/fonts/Lato-LightItalic.ttf +0 -0
- data/lib/rdoc/generator/template/darkfish/fonts/Lato-Regular.ttf +0 -0
- data/lib/rdoc/generator/template/darkfish/fonts/Lato-RegularItalic.ttf +0 -0
- data/lib/rdoc/generator/template/darkfish/fonts/SourceCodePro-Bold.ttf +0 -0
- data/lib/rdoc/generator/template/darkfish/fonts/SourceCodePro-Regular.ttf +0 -0
- data/lib/rdoc/generator/template/darkfish/images/add.png +0 -0
- data/lib/rdoc/generator/template/darkfish/images/arrow_up.png +0 -0
- data/lib/rdoc/generator/template/darkfish/images/brick.png +0 -0
- data/lib/rdoc/generator/template/darkfish/images/brick_link.png +0 -0
- data/lib/rdoc/generator/template/darkfish/images/bug.png +0 -0
- data/lib/rdoc/generator/template/darkfish/images/bullet_black.png +0 -0
- data/lib/rdoc/generator/template/darkfish/images/bullet_toggle_minus.png +0 -0
- data/lib/rdoc/generator/template/darkfish/images/bullet_toggle_plus.png +0 -0
- data/lib/rdoc/generator/template/darkfish/images/date.png +0 -0
- data/lib/rdoc/generator/template/darkfish/images/delete.png +0 -0
- data/lib/rdoc/generator/template/darkfish/images/find.png +0 -0
- data/lib/rdoc/generator/template/darkfish/images/loadingAnimation.gif +0 -0
- data/lib/rdoc/generator/template/darkfish/images/macFFBgHack.png +0 -0
- data/lib/rdoc/generator/template/darkfish/images/package.png +0 -0
- data/lib/rdoc/generator/template/darkfish/images/page_green.png +0 -0
- data/lib/rdoc/generator/template/darkfish/images/page_white_text.png +0 -0
- data/lib/rdoc/generator/template/darkfish/images/page_white_width.png +0 -0
- data/lib/rdoc/generator/template/darkfish/images/plugin.png +0 -0
- data/lib/rdoc/generator/template/darkfish/images/ruby.png +0 -0
- data/lib/rdoc/generator/template/darkfish/images/tag_blue.png +0 -0
- data/lib/rdoc/generator/template/darkfish/images/tag_green.png +0 -0
- data/lib/rdoc/generator/template/darkfish/images/transparent.png +0 -0
- data/lib/rdoc/generator/template/darkfish/images/wrench.png +0 -0
- data/lib/rdoc/generator/template/darkfish/images/wrench_orange.png +0 -0
- data/lib/rdoc/generator/template/darkfish/images/zoom.png +0 -0
- data/lib/rdoc/generator/template/darkfish/index.rhtml +22 -0
- data/lib/rdoc/generator/template/darkfish/js/darkfish.js +84 -0
- data/lib/rdoc/generator/template/darkfish/js/search.js +110 -0
- data/lib/rdoc/generator/template/darkfish/page.rhtml +18 -0
- data/lib/rdoc/generator/template/darkfish/servlet_not_found.rhtml +18 -0
- data/lib/rdoc/generator/template/darkfish/servlet_root.rhtml +62 -0
- data/lib/rdoc/generator/template/darkfish/table_of_contents.rhtml +58 -0
- data/lib/rdoc/generator/template/json_index/.document +1 -0
- data/lib/rdoc/generator/template/json_index/js/navigation.js +105 -0
- data/lib/rdoc/generator/template/json_index/js/searcher.js +229 -0
- data/lib/rdoc/generator.rb +51 -0
- data/lib/rdoc/ghost_method.rb +7 -0
- data/lib/rdoc/i18n/locale.rb +102 -0
- data/lib/rdoc/i18n/text.rb +126 -0
- data/lib/rdoc/i18n.rb +10 -0
- data/lib/rdoc/include.rb +10 -0
- data/lib/rdoc/known_classes.rb +73 -0
- data/lib/rdoc/markdown/entities.rb +2132 -0
- data/lib/rdoc/markdown/literals.kpeg +23 -0
- data/lib/rdoc/markdown/literals.rb +417 -0
- data/lib/rdoc/markdown.kpeg +1237 -0
- data/lib/rdoc/markdown.rb +16685 -0
- data/lib/rdoc/markup/attr_changer.rb +23 -0
- data/lib/rdoc/markup/attr_span.rb +36 -0
- data/lib/rdoc/markup/attribute_manager.rb +409 -0
- data/lib/rdoc/markup/attributes.rb +71 -0
- data/lib/rdoc/markup/blank_line.rb +28 -0
- data/lib/rdoc/markup/block_quote.rb +15 -0
- data/lib/rdoc/markup/document.rb +165 -0
- data/lib/rdoc/markup/formatter.rb +266 -0
- data/lib/rdoc/markup/hard_break.rb +32 -0
- data/lib/rdoc/markup/heading.rb +79 -0
- data/lib/rdoc/markup/include.rb +43 -0
- data/lib/rdoc/markup/indented_paragraph.rb +48 -0
- data/lib/rdoc/markup/list.rb +102 -0
- data/lib/rdoc/markup/list_item.rb +100 -0
- data/lib/rdoc/markup/paragraph.rb +29 -0
- data/lib/rdoc/markup/parser.rb +575 -0
- data/lib/rdoc/markup/pre_process.rb +296 -0
- data/lib/rdoc/markup/raw.rb +70 -0
- data/lib/rdoc/markup/regexp_handling.rb +41 -0
- data/lib/rdoc/markup/rule.rb +21 -0
- data/lib/rdoc/markup/table.rb +47 -0
- data/lib/rdoc/markup/to_ansi.rb +94 -0
- data/lib/rdoc/markup/to_bs.rb +77 -0
- data/lib/rdoc/markup/to_html.rb +444 -0
- data/lib/rdoc/markup/to_html_crossref.rb +176 -0
- data/lib/rdoc/markup/to_html_snippet.rb +285 -0
- data/lib/rdoc/markup/to_joined_paragraph.rb +47 -0
- data/lib/rdoc/markup/to_label.rb +75 -0
- data/lib/rdoc/markup/to_markdown.rb +192 -0
- data/lib/rdoc/markup/to_rdoc.rb +362 -0
- data/lib/rdoc/markup/to_table_of_contents.rb +89 -0
- data/lib/rdoc/markup/to_test.rb +70 -0
- data/lib/rdoc/markup/to_tt_only.rb +121 -0
- data/lib/rdoc/markup/verbatim.rb +84 -0
- data/lib/rdoc/markup.rb +867 -0
- data/lib/rdoc/meta_method.rb +7 -0
- data/lib/rdoc/method_attr.rb +419 -0
- data/lib/rdoc/mixin.rb +121 -0
- data/lib/rdoc/normal_class.rb +93 -0
- data/lib/rdoc/normal_module.rb +74 -0
- data/lib/rdoc/options.rb +1285 -0
- data/lib/rdoc/parser/c.rb +1225 -0
- data/lib/rdoc/parser/changelog.rb +335 -0
- data/lib/rdoc/parser/markdown.rb +24 -0
- data/lib/rdoc/parser/rd.rb +23 -0
- data/lib/rdoc/parser/ripper_state_lex.rb +590 -0
- data/lib/rdoc/parser/ruby.rb +2327 -0
- data/lib/rdoc/parser/ruby_tools.rb +167 -0
- data/lib/rdoc/parser/simple.rb +61 -0
- data/lib/rdoc/parser/text.rb +12 -0
- data/lib/rdoc/parser.rb +277 -0
- data/lib/rdoc/rd/block_parser.rb +1056 -0
- data/lib/rdoc/rd/block_parser.ry +639 -0
- data/lib/rdoc/rd/inline.rb +72 -0
- data/lib/rdoc/rd/inline_parser.rb +1208 -0
- data/lib/rdoc/rd/inline_parser.ry +593 -0
- data/lib/rdoc/rd.rb +100 -0
- data/lib/rdoc/rdoc.rb +579 -0
- data/lib/rdoc/require.rb +52 -0
- data/lib/rdoc/ri/driver.rb +1572 -0
- data/lib/rdoc/ri/formatter.rb +6 -0
- data/lib/rdoc/ri/paths.rb +171 -0
- data/lib/rdoc/ri/store.rb +7 -0
- data/lib/rdoc/ri/task.rb +71 -0
- data/lib/rdoc/ri.rb +21 -0
- data/lib/rdoc/rubygems_hook.rb +246 -0
- data/lib/rdoc/servlet.rb +451 -0
- data/lib/rdoc/single_class.rb +26 -0
- data/lib/rdoc/stats/normal.rb +58 -0
- data/lib/rdoc/stats/quiet.rb +60 -0
- data/lib/rdoc/stats/verbose.rb +46 -0
- data/lib/rdoc/stats.rb +462 -0
- data/lib/rdoc/store.rb +979 -0
- data/lib/rdoc/task.rb +329 -0
- data/lib/rdoc/text.rb +304 -0
- data/lib/rdoc/token_stream.rb +119 -0
- data/lib/rdoc/tom_doc.rb +263 -0
- data/lib/rdoc/top_level.rb +289 -0
- data/lib/rdoc/version.rb +8 -0
- data/lib/rdoc.rb +201 -0
- data/man/ri.1 +247 -0
- data/rdoc.gemspec +249 -0
- metadata +279 -0
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
##
|
|
3
|
+
# RDoc::CrossReference is a reusable way to create cross references for names.
|
|
4
|
+
|
|
5
|
+
class RDoc::CrossReference
|
|
6
|
+
|
|
7
|
+
##
|
|
8
|
+
# Regular expression to match class references
|
|
9
|
+
#
|
|
10
|
+
# 1. There can be a '\\' in front of text to suppress the cross-reference
|
|
11
|
+
# 2. There can be a '::' in front of class names to reference from the
|
|
12
|
+
# top-level namespace.
|
|
13
|
+
# 3. The method can be followed by parenthesis (not recommended)
|
|
14
|
+
|
|
15
|
+
CLASS_REGEXP_STR = '\\\\?((?:\:{2})?[A-Z]\w*(?:\:\:\w+)*)'
|
|
16
|
+
|
|
17
|
+
##
|
|
18
|
+
# Regular expression to match method references.
|
|
19
|
+
#
|
|
20
|
+
# See CLASS_REGEXP_STR
|
|
21
|
+
|
|
22
|
+
METHOD_REGEXP_STR = '([a-z]\w*[!?=]?|%|===|\[\]=?|<<|>>|\+@|-@|-|\+|\*)(?:\([\w.+*/=<>-]*\))?'
|
|
23
|
+
|
|
24
|
+
##
|
|
25
|
+
# Regular expressions matching text that should potentially have
|
|
26
|
+
# cross-reference links generated are passed to add_regexp_handling. Note
|
|
27
|
+
# that these expressions are meant to pick up text for which cross-references
|
|
28
|
+
# have been suppressed, since the suppression characters are removed by the
|
|
29
|
+
# code that is triggered.
|
|
30
|
+
|
|
31
|
+
CROSSREF_REGEXP = /(?:^|[\s()])
|
|
32
|
+
(
|
|
33
|
+
(?:
|
|
34
|
+
# A::B::C.meth
|
|
35
|
+
#{CLASS_REGEXP_STR}(?:[.#]|::)#{METHOD_REGEXP_STR}
|
|
36
|
+
|
|
37
|
+
# Stand-alone method (preceded by a #)
|
|
38
|
+
| \\?\##{METHOD_REGEXP_STR}
|
|
39
|
+
|
|
40
|
+
# Stand-alone method (preceded by ::)
|
|
41
|
+
| ::#{METHOD_REGEXP_STR}
|
|
42
|
+
|
|
43
|
+
# A::B::C
|
|
44
|
+
# The stuff after CLASS_REGEXP_STR is a
|
|
45
|
+
# nasty hack. CLASS_REGEXP_STR unfortunately matches
|
|
46
|
+
# words like dog and cat (these are legal "class"
|
|
47
|
+
# names in Fortran 95). When a word is flagged as a
|
|
48
|
+
# potential cross-reference, limitations in the markup
|
|
49
|
+
# engine suppress other processing, such as typesetting.
|
|
50
|
+
# This is particularly noticeable for contractions.
|
|
51
|
+
# In order that words like "can't" not
|
|
52
|
+
# be flagged as potential cross-references, only
|
|
53
|
+
# flag potential class cross-references if the character
|
|
54
|
+
# after the cross-reference is a space, sentence
|
|
55
|
+
# punctuation, tag start character, or attribute
|
|
56
|
+
# marker.
|
|
57
|
+
| #{CLASS_REGEXP_STR}(?=[@\s).?!,;<\000]|\z)
|
|
58
|
+
|
|
59
|
+
# Things that look like filenames
|
|
60
|
+
# The key thing is that there must be at least
|
|
61
|
+
# one special character (period, slash, or
|
|
62
|
+
# underscore).
|
|
63
|
+
| (?:\.\.\/)*[-\/\w]+[_\/.][-\w\/.]+
|
|
64
|
+
|
|
65
|
+
# Things that have markup suppressed
|
|
66
|
+
# Don't process things like '\<' in \<tt>, though.
|
|
67
|
+
# TODO: including < is a hack, not very satisfying.
|
|
68
|
+
| \\[^\s<]
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
# labels for headings
|
|
72
|
+
(?:@[\w+%-]+(?:\.[\w|%-]+)?)?
|
|
73
|
+
)/x
|
|
74
|
+
|
|
75
|
+
##
|
|
76
|
+
# Version of CROSSREF_REGEXP used when <tt>--hyperlink-all</tt> is specified.
|
|
77
|
+
|
|
78
|
+
ALL_CROSSREF_REGEXP = /
|
|
79
|
+
(?:^|[\s()])
|
|
80
|
+
(
|
|
81
|
+
(?:
|
|
82
|
+
# A::B::C.meth
|
|
83
|
+
#{CLASS_REGEXP_STR}(?:[.#]|::)#{METHOD_REGEXP_STR}
|
|
84
|
+
|
|
85
|
+
# Stand-alone method
|
|
86
|
+
| \\?#{METHOD_REGEXP_STR}
|
|
87
|
+
|
|
88
|
+
# A::B::C
|
|
89
|
+
| #{CLASS_REGEXP_STR}(?=[@\s).?!,;<\000]|\z)
|
|
90
|
+
|
|
91
|
+
# Things that look like filenames
|
|
92
|
+
| (?:\.\.\/)*[-\/\w]+[_\/.][-\w\/.]+
|
|
93
|
+
|
|
94
|
+
# Things that have markup suppressed
|
|
95
|
+
| \\[^\s<]
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
# labels for headings
|
|
99
|
+
(?:@[\w+%-]+)?
|
|
100
|
+
)/x
|
|
101
|
+
|
|
102
|
+
##
|
|
103
|
+
# Hash of references that have been looked-up to their replacements
|
|
104
|
+
|
|
105
|
+
attr_accessor :seen
|
|
106
|
+
|
|
107
|
+
##
|
|
108
|
+
# Allows cross-references to be created based on the given +context+
|
|
109
|
+
# (RDoc::Context).
|
|
110
|
+
|
|
111
|
+
def initialize context
|
|
112
|
+
@context = context
|
|
113
|
+
@store = context.store
|
|
114
|
+
|
|
115
|
+
@seen = {}
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
##
|
|
119
|
+
# Returns a reference to +name+.
|
|
120
|
+
#
|
|
121
|
+
# If the reference is found and +name+ is not documented +text+ will be
|
|
122
|
+
# returned. If +name+ is escaped +name+ is returned. If +name+ is not
|
|
123
|
+
# found +text+ is returned.
|
|
124
|
+
|
|
125
|
+
def resolve name, text
|
|
126
|
+
return @seen[name] if @seen.include? name
|
|
127
|
+
|
|
128
|
+
if /#{CLASS_REGEXP_STR}([.#]|::)#{METHOD_REGEXP_STR}/o =~ name then
|
|
129
|
+
type = $2
|
|
130
|
+
if '.' == type # will find either #method or ::method
|
|
131
|
+
method = $3
|
|
132
|
+
else
|
|
133
|
+
method = "#{type}#{$3}"
|
|
134
|
+
end
|
|
135
|
+
container = @context.find_symbol_module($1)
|
|
136
|
+
elsif /^([.#]|::)#{METHOD_REGEXP_STR}/o =~ name then
|
|
137
|
+
type = $1
|
|
138
|
+
if '.' == type
|
|
139
|
+
method = $2
|
|
140
|
+
else
|
|
141
|
+
method = "#{type}#{$2}"
|
|
142
|
+
end
|
|
143
|
+
container = @context
|
|
144
|
+
else
|
|
145
|
+
type = nil
|
|
146
|
+
container = nil
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
if container then
|
|
150
|
+
unless RDoc::TopLevel === container then
|
|
151
|
+
if '.' == type then
|
|
152
|
+
if 'new' == method then # AnyClassName.new will be class method
|
|
153
|
+
ref = container.find_local_symbol method
|
|
154
|
+
ref = container.find_ancestor_local_symbol method unless ref
|
|
155
|
+
else
|
|
156
|
+
ref = container.find_local_symbol "::#{method}"
|
|
157
|
+
ref = container.find_ancestor_local_symbol "::#{method}" unless ref
|
|
158
|
+
ref = container.find_local_symbol "##{method}" unless ref
|
|
159
|
+
ref = container.find_ancestor_local_symbol "##{method}" unless ref
|
|
160
|
+
end
|
|
161
|
+
else
|
|
162
|
+
ref = container.find_local_symbol method
|
|
163
|
+
ref = container.find_ancestor_local_symbol method unless ref
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
ref = case name
|
|
169
|
+
when /^\\(#{CLASS_REGEXP_STR})$/o then
|
|
170
|
+
@context.find_symbol $1
|
|
171
|
+
else
|
|
172
|
+
@context.find_symbol name
|
|
173
|
+
end unless ref
|
|
174
|
+
|
|
175
|
+
# Try a page name
|
|
176
|
+
ref = @store.page name if not ref and name =~ /^[\w.]+$/
|
|
177
|
+
|
|
178
|
+
ref = nil if RDoc::Alias === ref # external alias, can't link to it
|
|
179
|
+
|
|
180
|
+
out = if name == '\\' then
|
|
181
|
+
name
|
|
182
|
+
elsif name =~ /^\\/ then
|
|
183
|
+
# we remove the \ only in front of what we know:
|
|
184
|
+
# other backslashes are treated later, only outside of <tt>
|
|
185
|
+
ref ? $' : name
|
|
186
|
+
elsif ref then
|
|
187
|
+
if ref.display? then
|
|
188
|
+
ref
|
|
189
|
+
else
|
|
190
|
+
text
|
|
191
|
+
end
|
|
192
|
+
else
|
|
193
|
+
text
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
@seen[name] = out
|
|
197
|
+
|
|
198
|
+
out
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
end
|
|
202
|
+
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# coding: US-ASCII
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
##
|
|
5
|
+
# This class is a wrapper around File IO and Encoding that helps RDoc load
|
|
6
|
+
# files and convert them to the correct encoding.
|
|
7
|
+
|
|
8
|
+
module RDoc::Encoding
|
|
9
|
+
|
|
10
|
+
HEADER_REGEXP = /^
|
|
11
|
+
(?:
|
|
12
|
+
\A\#!.*\n
|
|
13
|
+
|
|
|
14
|
+
^\#\s+frozen[-_]string[-_]literal[=:].+\n
|
|
15
|
+
|
|
|
16
|
+
^\#[^\n]+\b(?:en)?coding[=:]\s*(?<name>[^\s;]+).*\n
|
|
17
|
+
|
|
|
18
|
+
<\?xml[^?]*encoding=(?<quote>["'])(?<name>.*?)\k<quote>.*\n
|
|
19
|
+
)+
|
|
20
|
+
/xi # :nodoc:
|
|
21
|
+
|
|
22
|
+
##
|
|
23
|
+
# Reads the contents of +filename+ and handles any encoding directives in
|
|
24
|
+
# the file.
|
|
25
|
+
#
|
|
26
|
+
# The content will be converted to the +encoding+. If the file cannot be
|
|
27
|
+
# converted a warning will be printed and nil will be returned.
|
|
28
|
+
#
|
|
29
|
+
# If +force_transcode+ is true the document will be transcoded and any
|
|
30
|
+
# unknown character in the target encoding will be replaced with '?'
|
|
31
|
+
|
|
32
|
+
def self.read_file filename, encoding, force_transcode = false
|
|
33
|
+
content = File.open filename, "rb" do |f| f.read end
|
|
34
|
+
content.gsub!("\r\n", "\n") if RUBY_PLATFORM =~ /mswin|mingw/
|
|
35
|
+
|
|
36
|
+
utf8 = content.sub!(/\A\xef\xbb\xbf/, '')
|
|
37
|
+
|
|
38
|
+
enc = RDoc::Encoding.detect_encoding content
|
|
39
|
+
content = RDoc::Encoding.change_encoding content, enc if enc
|
|
40
|
+
|
|
41
|
+
begin
|
|
42
|
+
encoding ||= Encoding.default_external
|
|
43
|
+
orig_encoding = content.encoding
|
|
44
|
+
|
|
45
|
+
if not orig_encoding.ascii_compatible? then
|
|
46
|
+
content = content.encode encoding
|
|
47
|
+
elsif utf8 then
|
|
48
|
+
content = RDoc::Encoding.change_encoding content, Encoding::UTF_8
|
|
49
|
+
content = content.encode encoding
|
|
50
|
+
else
|
|
51
|
+
# assume the content is in our output encoding
|
|
52
|
+
content = RDoc::Encoding.change_encoding content, encoding
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
unless content.valid_encoding? then
|
|
56
|
+
# revert and try to transcode
|
|
57
|
+
content = RDoc::Encoding.change_encoding content, orig_encoding
|
|
58
|
+
content = content.encode encoding
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
unless content.valid_encoding? then
|
|
62
|
+
warn "unable to convert #{filename} to #{encoding}, skipping"
|
|
63
|
+
content = nil
|
|
64
|
+
end
|
|
65
|
+
rescue Encoding::InvalidByteSequenceError,
|
|
66
|
+
Encoding::UndefinedConversionError => e
|
|
67
|
+
if force_transcode then
|
|
68
|
+
content = RDoc::Encoding.change_encoding content, orig_encoding
|
|
69
|
+
content = content.encode(encoding,
|
|
70
|
+
:invalid => :replace,
|
|
71
|
+
:undef => :replace,
|
|
72
|
+
:replace => '?')
|
|
73
|
+
return content
|
|
74
|
+
else
|
|
75
|
+
warn "unable to convert #{e.message} for #{filename}, skipping"
|
|
76
|
+
return nil
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
content
|
|
81
|
+
rescue ArgumentError => e
|
|
82
|
+
raise unless e.message =~ /unknown encoding name - (.*)/
|
|
83
|
+
warn "unknown encoding name \"#{$1}\" for #{filename}, skipping"
|
|
84
|
+
nil
|
|
85
|
+
rescue Errno::EISDIR, Errno::ENOENT
|
|
86
|
+
nil
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def self.remove_frozen_string_literal string
|
|
90
|
+
string =~ /\A(?:#!.*\n)?(.*\n)/
|
|
91
|
+
first_line = $1
|
|
92
|
+
|
|
93
|
+
if first_line =~ /\A# +frozen[-_]string[-_]literal[=:].+$/i
|
|
94
|
+
string = string.sub first_line, ''
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
string
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
##
|
|
101
|
+
# Detects the encoding of +string+ based on the magic comment
|
|
102
|
+
|
|
103
|
+
def self.detect_encoding string
|
|
104
|
+
result = HEADER_REGEXP.match string
|
|
105
|
+
name = result && result[:name]
|
|
106
|
+
|
|
107
|
+
name ? Encoding.find(name) : nil
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
##
|
|
111
|
+
# Removes magic comments and shebang
|
|
112
|
+
|
|
113
|
+
def self.remove_magic_comment string
|
|
114
|
+
string.sub HEADER_REGEXP do |s|
|
|
115
|
+
s.gsub(/[^\n]/, '')
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
##
|
|
120
|
+
# Changes encoding based on +encoding+ without converting and returns new
|
|
121
|
+
# string
|
|
122
|
+
|
|
123
|
+
def self.change_encoding text, encoding
|
|
124
|
+
if text.kind_of? RDoc::Comment
|
|
125
|
+
text.encode! encoding
|
|
126
|
+
else
|
|
127
|
+
# TODO: Remove this condition after Ruby 2.2 EOL
|
|
128
|
+
if RUBY_VERSION < '2.3.0'
|
|
129
|
+
text.force_encoding encoding
|
|
130
|
+
else
|
|
131
|
+
String.new text, encoding: encoding
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
##
|
|
3
|
+
# Allows an ERB template to be rendered in the context (binding) of an
|
|
4
|
+
# existing ERB template evaluation.
|
|
5
|
+
|
|
6
|
+
class RDoc::ERBPartial < ERB
|
|
7
|
+
|
|
8
|
+
##
|
|
9
|
+
# Overrides +compiler+ startup to set the +eoutvar+ to an empty string only
|
|
10
|
+
# if it isn't already set.
|
|
11
|
+
|
|
12
|
+
def set_eoutvar compiler, eoutvar = '_erbout'
|
|
13
|
+
super
|
|
14
|
+
|
|
15
|
+
compiler.pre_cmd = ["#{eoutvar} ||= +''"]
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
end
|
|
19
|
+
|
data/lib/rdoc/erbio.rb
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require 'erb'
|
|
3
|
+
|
|
4
|
+
##
|
|
5
|
+
# A subclass of ERB that writes directly to an IO. Credit to Aaron Patterson
|
|
6
|
+
# and Masatoshi SEKI.
|
|
7
|
+
#
|
|
8
|
+
# To use:
|
|
9
|
+
#
|
|
10
|
+
# erbio = RDoc::ERBIO.new '<%= "hello world" %>', nil, nil
|
|
11
|
+
#
|
|
12
|
+
# File.open 'hello.txt', 'w' do |io|
|
|
13
|
+
# erbio.result binding
|
|
14
|
+
# end
|
|
15
|
+
#
|
|
16
|
+
# Note that binding must enclose the io you wish to output on.
|
|
17
|
+
|
|
18
|
+
class RDoc::ERBIO < ERB
|
|
19
|
+
|
|
20
|
+
##
|
|
21
|
+
# Defaults +eoutvar+ to 'io', otherwise is identical to ERB's initialize
|
|
22
|
+
|
|
23
|
+
def initialize str, safe_level = nil, legacy_trim_mode = nil, legacy_eoutvar = 'io', trim_mode: nil, eoutvar: 'io'
|
|
24
|
+
if RUBY_VERSION >= '2.6'
|
|
25
|
+
super(str, trim_mode: trim_mode, eoutvar: eoutvar)
|
|
26
|
+
else
|
|
27
|
+
super(str, safe_level, legacy_trim_mode, legacy_eoutvar)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
##
|
|
32
|
+
# Instructs +compiler+ how to write to +io_variable+
|
|
33
|
+
|
|
34
|
+
def set_eoutvar compiler, io_variable
|
|
35
|
+
compiler.put_cmd = "#{io_variable}.write"
|
|
36
|
+
compiler.insert_cmd = "#{io_variable}.write"
|
|
37
|
+
compiler.pre_cmd = []
|
|
38
|
+
compiler.post_cmd = []
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|
|
42
|
+
|
data/lib/rdoc/extend.rb
ADDED
|
@@ -0,0 +1,790 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# -*- mode: ruby; ruby-indent-level: 2; tab-width: 2 -*-
|
|
3
|
+
|
|
4
|
+
require 'erb'
|
|
5
|
+
require 'fileutils'
|
|
6
|
+
require 'pathname'
|
|
7
|
+
require_relative 'markup'
|
|
8
|
+
|
|
9
|
+
##
|
|
10
|
+
# Darkfish RDoc HTML Generator
|
|
11
|
+
#
|
|
12
|
+
# $Id: darkfish.rb 52 2009-01-07 02:08:11Z deveiant $
|
|
13
|
+
#
|
|
14
|
+
# == Author/s
|
|
15
|
+
# * Michael Granger (ged@FaerieMUD.org)
|
|
16
|
+
#
|
|
17
|
+
# == Contributors
|
|
18
|
+
# * Mahlon E. Smith (mahlon@martini.nu)
|
|
19
|
+
# * Eric Hodel (drbrain@segment7.net)
|
|
20
|
+
#
|
|
21
|
+
# == License
|
|
22
|
+
#
|
|
23
|
+
# Copyright (c) 2007, 2008, Michael Granger. All rights reserved.
|
|
24
|
+
#
|
|
25
|
+
# Redistribution and use in source and binary forms, with or without
|
|
26
|
+
# modification, are permitted provided that the following conditions are met:
|
|
27
|
+
#
|
|
28
|
+
# * Redistributions of source code must retain the above copyright notice,
|
|
29
|
+
# this list of conditions and the following disclaimer.
|
|
30
|
+
#
|
|
31
|
+
# * Redistributions in binary form must reproduce the above copyright notice,
|
|
32
|
+
# this list of conditions and the following disclaimer in the documentation
|
|
33
|
+
# and/or other materials provided with the distribution.
|
|
34
|
+
#
|
|
35
|
+
# * Neither the name of the author/s, nor the names of the project's
|
|
36
|
+
# contributors may be used to endorse or promote products derived from this
|
|
37
|
+
# software without specific prior written permission.
|
|
38
|
+
#
|
|
39
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
40
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
41
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
42
|
+
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
|
43
|
+
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
44
|
+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
45
|
+
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
46
|
+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
47
|
+
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
48
|
+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
49
|
+
#
|
|
50
|
+
# == Attributions
|
|
51
|
+
#
|
|
52
|
+
# Darkfish uses the {Silk Icons}[http://www.famfamfam.com/lab/icons/silk/] set
|
|
53
|
+
# by Mark James.
|
|
54
|
+
|
|
55
|
+
class RDoc::Generator::Darkfish
|
|
56
|
+
|
|
57
|
+
RDoc::RDoc.add_generator self
|
|
58
|
+
|
|
59
|
+
include ERB::Util
|
|
60
|
+
|
|
61
|
+
##
|
|
62
|
+
# Stylesheets, fonts, etc. that are included in RDoc.
|
|
63
|
+
|
|
64
|
+
BUILTIN_STYLE_ITEMS = # :nodoc:
|
|
65
|
+
%w[
|
|
66
|
+
css/fonts.css
|
|
67
|
+
fonts/Lato-Light.ttf
|
|
68
|
+
fonts/Lato-LightItalic.ttf
|
|
69
|
+
fonts/Lato-Regular.ttf
|
|
70
|
+
fonts/Lato-RegularItalic.ttf
|
|
71
|
+
fonts/SourceCodePro-Bold.ttf
|
|
72
|
+
fonts/SourceCodePro-Regular.ttf
|
|
73
|
+
css/rdoc.css
|
|
74
|
+
]
|
|
75
|
+
|
|
76
|
+
##
|
|
77
|
+
# Path to this file's parent directory. Used to find templates and other
|
|
78
|
+
# resources.
|
|
79
|
+
|
|
80
|
+
GENERATOR_DIR = File.join 'rdoc', 'generator'
|
|
81
|
+
|
|
82
|
+
##
|
|
83
|
+
# Release Version
|
|
84
|
+
|
|
85
|
+
VERSION = '3'
|
|
86
|
+
|
|
87
|
+
##
|
|
88
|
+
# Description of this generator
|
|
89
|
+
|
|
90
|
+
DESCRIPTION = 'HTML generator, written by Michael Granger'
|
|
91
|
+
|
|
92
|
+
##
|
|
93
|
+
# The relative path to style sheets and javascript. By default this is set
|
|
94
|
+
# the same as the rel_prefix.
|
|
95
|
+
|
|
96
|
+
attr_accessor :asset_rel_path
|
|
97
|
+
|
|
98
|
+
##
|
|
99
|
+
# The path to generate files into, combined with <tt>--op</tt> from the
|
|
100
|
+
# options for a full path.
|
|
101
|
+
|
|
102
|
+
attr_reader :base_dir
|
|
103
|
+
|
|
104
|
+
##
|
|
105
|
+
# Classes and modules to be used by this generator, not necessarily
|
|
106
|
+
# displayed. See also #modsort
|
|
107
|
+
|
|
108
|
+
attr_reader :classes
|
|
109
|
+
|
|
110
|
+
##
|
|
111
|
+
# No files will be written when dry_run is true.
|
|
112
|
+
|
|
113
|
+
attr_accessor :dry_run
|
|
114
|
+
|
|
115
|
+
##
|
|
116
|
+
# When false the generate methods return a String instead of writing to a
|
|
117
|
+
# file. The default is true.
|
|
118
|
+
|
|
119
|
+
attr_accessor :file_output
|
|
120
|
+
|
|
121
|
+
##
|
|
122
|
+
# Files to be displayed by this generator
|
|
123
|
+
|
|
124
|
+
attr_reader :files
|
|
125
|
+
|
|
126
|
+
##
|
|
127
|
+
# The JSON index generator for this Darkfish generator
|
|
128
|
+
|
|
129
|
+
attr_reader :json_index
|
|
130
|
+
|
|
131
|
+
##
|
|
132
|
+
# Methods to be displayed by this generator
|
|
133
|
+
|
|
134
|
+
attr_reader :methods
|
|
135
|
+
|
|
136
|
+
##
|
|
137
|
+
# Sorted list of classes and modules to be displayed by this generator
|
|
138
|
+
|
|
139
|
+
attr_reader :modsort
|
|
140
|
+
|
|
141
|
+
##
|
|
142
|
+
# The RDoc::Store that is the source of the generated content
|
|
143
|
+
|
|
144
|
+
attr_reader :store
|
|
145
|
+
|
|
146
|
+
##
|
|
147
|
+
# The directory where the template files live
|
|
148
|
+
|
|
149
|
+
attr_reader :template_dir # :nodoc:
|
|
150
|
+
|
|
151
|
+
##
|
|
152
|
+
# The output directory
|
|
153
|
+
|
|
154
|
+
attr_reader :outputdir
|
|
155
|
+
|
|
156
|
+
##
|
|
157
|
+
# Initialize a few instance variables before we start
|
|
158
|
+
|
|
159
|
+
def initialize store, options
|
|
160
|
+
@store = store
|
|
161
|
+
@options = options
|
|
162
|
+
|
|
163
|
+
@asset_rel_path = ''
|
|
164
|
+
@base_dir = Pathname.pwd.expand_path
|
|
165
|
+
@dry_run = @options.dry_run
|
|
166
|
+
@file_output = true
|
|
167
|
+
@template_dir = Pathname.new options.template_dir
|
|
168
|
+
@template_cache = {}
|
|
169
|
+
|
|
170
|
+
@classes = nil
|
|
171
|
+
@context = nil
|
|
172
|
+
@files = nil
|
|
173
|
+
@methods = nil
|
|
174
|
+
@modsort = nil
|
|
175
|
+
|
|
176
|
+
@json_index = RDoc::Generator::JsonIndex.new self, options
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
##
|
|
180
|
+
# Output progress information if debugging is enabled
|
|
181
|
+
|
|
182
|
+
def debug_msg *msg
|
|
183
|
+
return unless $DEBUG_RDOC
|
|
184
|
+
$stderr.puts(*msg)
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
##
|
|
188
|
+
# Directory where generated class HTML files live relative to the output
|
|
189
|
+
# dir.
|
|
190
|
+
|
|
191
|
+
def class_dir
|
|
192
|
+
nil
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
##
|
|
196
|
+
# Directory where generated class HTML files live relative to the output
|
|
197
|
+
# dir.
|
|
198
|
+
|
|
199
|
+
def file_dir
|
|
200
|
+
nil
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
##
|
|
204
|
+
# Create the directories the generated docs will live in if they don't
|
|
205
|
+
# already exist.
|
|
206
|
+
|
|
207
|
+
def gen_sub_directories
|
|
208
|
+
@outputdir.mkpath
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
##
|
|
212
|
+
# Copy over the stylesheet into the appropriate place in the output
|
|
213
|
+
# directory.
|
|
214
|
+
|
|
215
|
+
def write_style_sheet
|
|
216
|
+
debug_msg "Copying static files"
|
|
217
|
+
options = { :verbose => $DEBUG_RDOC, :noop => @dry_run }
|
|
218
|
+
|
|
219
|
+
BUILTIN_STYLE_ITEMS.each do |item|
|
|
220
|
+
install_rdoc_static_file @template_dir + item, "./#{item}", options
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
@options.template_stylesheets.each do |stylesheet|
|
|
224
|
+
FileUtils.cp stylesheet, '.', options
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
Dir[(@template_dir + "{js,images}/**/*").to_s].each do |path|
|
|
228
|
+
next if File.directory? path
|
|
229
|
+
next if File.basename(path) =~ /^\./
|
|
230
|
+
|
|
231
|
+
dst = Pathname.new(path).relative_path_from @template_dir
|
|
232
|
+
|
|
233
|
+
install_rdoc_static_file @template_dir + path, dst, options
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
##
|
|
238
|
+
# Build the initial indices and output objects based on an array of TopLevel
|
|
239
|
+
# objects containing the extracted information.
|
|
240
|
+
|
|
241
|
+
def generate
|
|
242
|
+
setup
|
|
243
|
+
|
|
244
|
+
write_style_sheet
|
|
245
|
+
generate_index
|
|
246
|
+
generate_class_files
|
|
247
|
+
generate_file_files
|
|
248
|
+
generate_table_of_contents
|
|
249
|
+
@json_index.generate
|
|
250
|
+
@json_index.generate_gzipped
|
|
251
|
+
|
|
252
|
+
copy_static
|
|
253
|
+
|
|
254
|
+
rescue => e
|
|
255
|
+
debug_msg "%s: %s\n %s" % [
|
|
256
|
+
e.class.name, e.message, e.backtrace.join("\n ")
|
|
257
|
+
]
|
|
258
|
+
|
|
259
|
+
raise
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
##
|
|
263
|
+
# Copies static files from the static_path into the output directory
|
|
264
|
+
|
|
265
|
+
def copy_static
|
|
266
|
+
return if @options.static_path.empty?
|
|
267
|
+
|
|
268
|
+
fu_options = { :verbose => $DEBUG_RDOC, :noop => @dry_run }
|
|
269
|
+
|
|
270
|
+
@options.static_path.each do |path|
|
|
271
|
+
unless File.directory? path then
|
|
272
|
+
FileUtils.install path, @outputdir, **fu_options.merge(:mode => 0644)
|
|
273
|
+
next
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
Dir.chdir path do
|
|
277
|
+
Dir[File.join('**', '*')].each do |entry|
|
|
278
|
+
dest_file = @outputdir + entry
|
|
279
|
+
|
|
280
|
+
if File.directory? entry then
|
|
281
|
+
FileUtils.mkdir_p entry, **fu_options
|
|
282
|
+
else
|
|
283
|
+
FileUtils.install entry, dest_file, **fu_options.merge(:mode => 0644)
|
|
284
|
+
end
|
|
285
|
+
end
|
|
286
|
+
end
|
|
287
|
+
end
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
##
|
|
291
|
+
# Return a list of the documented modules sorted by salience first, then
|
|
292
|
+
# by name.
|
|
293
|
+
|
|
294
|
+
def get_sorted_module_list classes
|
|
295
|
+
classes.select do |klass|
|
|
296
|
+
klass.display?
|
|
297
|
+
end.sort
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
##
|
|
301
|
+
# Generate an index page which lists all the classes which are documented.
|
|
302
|
+
|
|
303
|
+
def generate_index
|
|
304
|
+
setup
|
|
305
|
+
|
|
306
|
+
template_file = @template_dir + 'index.rhtml'
|
|
307
|
+
return unless template_file.exist?
|
|
308
|
+
|
|
309
|
+
debug_msg "Rendering the index page..."
|
|
310
|
+
|
|
311
|
+
out_file = @base_dir + @options.op_dir + 'index.html'
|
|
312
|
+
rel_prefix = @outputdir.relative_path_from out_file.dirname
|
|
313
|
+
search_index_rel_prefix = rel_prefix
|
|
314
|
+
search_index_rel_prefix += @asset_rel_path if @file_output
|
|
315
|
+
|
|
316
|
+
asset_rel_prefix = rel_prefix + @asset_rel_path
|
|
317
|
+
|
|
318
|
+
@title = @options.title
|
|
319
|
+
|
|
320
|
+
render_template template_file, out_file do |io|
|
|
321
|
+
here = binding
|
|
322
|
+
# suppress 1.9.3 warning
|
|
323
|
+
here.local_variable_set(:asset_rel_prefix, asset_rel_prefix)
|
|
324
|
+
here
|
|
325
|
+
end
|
|
326
|
+
rescue => e
|
|
327
|
+
error = RDoc::Error.new \
|
|
328
|
+
"error generating index.html: #{e.message} (#{e.class})"
|
|
329
|
+
error.set_backtrace e.backtrace
|
|
330
|
+
|
|
331
|
+
raise error
|
|
332
|
+
end
|
|
333
|
+
|
|
334
|
+
##
|
|
335
|
+
# Generates a class file for +klass+
|
|
336
|
+
|
|
337
|
+
def generate_class klass, template_file = nil
|
|
338
|
+
setup
|
|
339
|
+
|
|
340
|
+
current = klass
|
|
341
|
+
|
|
342
|
+
template_file ||= @template_dir + 'class.rhtml'
|
|
343
|
+
|
|
344
|
+
debug_msg " working on %s (%s)" % [klass.full_name, klass.path]
|
|
345
|
+
out_file = @outputdir + klass.path
|
|
346
|
+
rel_prefix = @outputdir.relative_path_from out_file.dirname
|
|
347
|
+
search_index_rel_prefix = rel_prefix
|
|
348
|
+
search_index_rel_prefix += @asset_rel_path if @file_output
|
|
349
|
+
|
|
350
|
+
asset_rel_prefix = rel_prefix + @asset_rel_path
|
|
351
|
+
svninfo = get_svninfo(current)
|
|
352
|
+
|
|
353
|
+
@title = "#{klass.type} #{klass.full_name} - #{@options.title}"
|
|
354
|
+
|
|
355
|
+
debug_msg " rendering #{out_file}"
|
|
356
|
+
render_template template_file, out_file do |io|
|
|
357
|
+
here = binding
|
|
358
|
+
# suppress 1.9.3 warning
|
|
359
|
+
here.local_variable_set(:asset_rel_prefix, asset_rel_prefix)
|
|
360
|
+
here.local_variable_set(:svninfo, svninfo)
|
|
361
|
+
here
|
|
362
|
+
end
|
|
363
|
+
end
|
|
364
|
+
|
|
365
|
+
##
|
|
366
|
+
# Generate a documentation file for each class and module
|
|
367
|
+
|
|
368
|
+
def generate_class_files
|
|
369
|
+
setup
|
|
370
|
+
|
|
371
|
+
template_file = @template_dir + 'class.rhtml'
|
|
372
|
+
template_file = @template_dir + 'classpage.rhtml' unless
|
|
373
|
+
template_file.exist?
|
|
374
|
+
return unless template_file.exist?
|
|
375
|
+
debug_msg "Generating class documentation in #{@outputdir}"
|
|
376
|
+
|
|
377
|
+
current = nil
|
|
378
|
+
|
|
379
|
+
@classes.each do |klass|
|
|
380
|
+
current = klass
|
|
381
|
+
|
|
382
|
+
generate_class klass, template_file
|
|
383
|
+
end
|
|
384
|
+
rescue => e
|
|
385
|
+
error = RDoc::Error.new \
|
|
386
|
+
"error generating #{current.path}: #{e.message} (#{e.class})"
|
|
387
|
+
error.set_backtrace e.backtrace
|
|
388
|
+
|
|
389
|
+
raise error
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
##
|
|
393
|
+
# Generate a documentation file for each file
|
|
394
|
+
|
|
395
|
+
def generate_file_files
|
|
396
|
+
setup
|
|
397
|
+
|
|
398
|
+
page_file = @template_dir + 'page.rhtml'
|
|
399
|
+
fileinfo_file = @template_dir + 'fileinfo.rhtml'
|
|
400
|
+
|
|
401
|
+
# for legacy templates
|
|
402
|
+
filepage_file = @template_dir + 'filepage.rhtml' unless
|
|
403
|
+
page_file.exist? or fileinfo_file.exist?
|
|
404
|
+
|
|
405
|
+
return unless
|
|
406
|
+
page_file.exist? or fileinfo_file.exist? or filepage_file.exist?
|
|
407
|
+
|
|
408
|
+
debug_msg "Generating file documentation in #{@outputdir}"
|
|
409
|
+
|
|
410
|
+
out_file = nil
|
|
411
|
+
current = nil
|
|
412
|
+
|
|
413
|
+
@files.each do |file|
|
|
414
|
+
current = file
|
|
415
|
+
|
|
416
|
+
if file.text? and page_file.exist? then
|
|
417
|
+
generate_page file
|
|
418
|
+
next
|
|
419
|
+
end
|
|
420
|
+
|
|
421
|
+
template_file = nil
|
|
422
|
+
out_file = @outputdir + file.path
|
|
423
|
+
debug_msg " working on %s (%s)" % [file.full_name, out_file]
|
|
424
|
+
rel_prefix = @outputdir.relative_path_from out_file.dirname
|
|
425
|
+
search_index_rel_prefix = rel_prefix
|
|
426
|
+
search_index_rel_prefix += @asset_rel_path if @file_output
|
|
427
|
+
|
|
428
|
+
asset_rel_prefix = rel_prefix + @asset_rel_path
|
|
429
|
+
|
|
430
|
+
unless filepage_file then
|
|
431
|
+
if file.text? then
|
|
432
|
+
next unless page_file.exist?
|
|
433
|
+
template_file = page_file
|
|
434
|
+
@title = file.page_name
|
|
435
|
+
else
|
|
436
|
+
next unless fileinfo_file.exist?
|
|
437
|
+
template_file = fileinfo_file
|
|
438
|
+
@title = "File: #{file.base_name}"
|
|
439
|
+
end
|
|
440
|
+
end
|
|
441
|
+
|
|
442
|
+
@title += " - #{@options.title}"
|
|
443
|
+
template_file ||= filepage_file
|
|
444
|
+
|
|
445
|
+
render_template template_file, out_file do |io|
|
|
446
|
+
here = binding
|
|
447
|
+
# suppress 1.9.3 warning
|
|
448
|
+
here.local_variable_set(:asset_rel_prefix, asset_rel_prefix)
|
|
449
|
+
here.local_variable_set(:current, current)
|
|
450
|
+
here
|
|
451
|
+
end
|
|
452
|
+
end
|
|
453
|
+
rescue => e
|
|
454
|
+
error =
|
|
455
|
+
RDoc::Error.new "error generating #{out_file}: #{e.message} (#{e.class})"
|
|
456
|
+
error.set_backtrace e.backtrace
|
|
457
|
+
|
|
458
|
+
raise error
|
|
459
|
+
end
|
|
460
|
+
|
|
461
|
+
##
|
|
462
|
+
# Generate a page file for +file+
|
|
463
|
+
|
|
464
|
+
def generate_page file
|
|
465
|
+
setup
|
|
466
|
+
|
|
467
|
+
template_file = @template_dir + 'page.rhtml'
|
|
468
|
+
|
|
469
|
+
out_file = @outputdir + file.path
|
|
470
|
+
debug_msg " working on %s (%s)" % [file.full_name, out_file]
|
|
471
|
+
rel_prefix = @outputdir.relative_path_from out_file.dirname
|
|
472
|
+
search_index_rel_prefix = rel_prefix
|
|
473
|
+
search_index_rel_prefix += @asset_rel_path if @file_output
|
|
474
|
+
|
|
475
|
+
current = file
|
|
476
|
+
asset_rel_prefix = rel_prefix + @asset_rel_path
|
|
477
|
+
|
|
478
|
+
@title = "#{file.page_name} - #{@options.title}"
|
|
479
|
+
|
|
480
|
+
debug_msg " rendering #{out_file}"
|
|
481
|
+
render_template template_file, out_file do |io|
|
|
482
|
+
here = binding
|
|
483
|
+
# suppress 1.9.3 warning
|
|
484
|
+
here.local_variable_set(:current, current)
|
|
485
|
+
here.local_variable_set(:asset_rel_prefix, asset_rel_prefix)
|
|
486
|
+
here
|
|
487
|
+
end
|
|
488
|
+
end
|
|
489
|
+
|
|
490
|
+
##
|
|
491
|
+
# Generates the 404 page for the RDoc servlet
|
|
492
|
+
|
|
493
|
+
def generate_servlet_not_found message
|
|
494
|
+
setup
|
|
495
|
+
|
|
496
|
+
template_file = @template_dir + 'servlet_not_found.rhtml'
|
|
497
|
+
return unless template_file.exist?
|
|
498
|
+
|
|
499
|
+
debug_msg "Rendering the servlet 404 Not Found page..."
|
|
500
|
+
|
|
501
|
+
rel_prefix = rel_prefix = ''
|
|
502
|
+
search_index_rel_prefix = rel_prefix
|
|
503
|
+
search_index_rel_prefix += @asset_rel_path if @file_output
|
|
504
|
+
|
|
505
|
+
asset_rel_prefix = ''
|
|
506
|
+
|
|
507
|
+
@title = 'Not Found'
|
|
508
|
+
|
|
509
|
+
render_template template_file do |io|
|
|
510
|
+
here = binding
|
|
511
|
+
# suppress 1.9.3 warning
|
|
512
|
+
here.local_variable_set(:asset_rel_prefix, asset_rel_prefix)
|
|
513
|
+
here
|
|
514
|
+
end
|
|
515
|
+
rescue => e
|
|
516
|
+
error = RDoc::Error.new \
|
|
517
|
+
"error generating servlet_not_found: #{e.message} (#{e.class})"
|
|
518
|
+
error.set_backtrace e.backtrace
|
|
519
|
+
|
|
520
|
+
raise error
|
|
521
|
+
end
|
|
522
|
+
|
|
523
|
+
##
|
|
524
|
+
# Generates the servlet root page for the RDoc servlet
|
|
525
|
+
|
|
526
|
+
def generate_servlet_root installed
|
|
527
|
+
setup
|
|
528
|
+
|
|
529
|
+
template_file = @template_dir + 'servlet_root.rhtml'
|
|
530
|
+
return unless template_file.exist?
|
|
531
|
+
|
|
532
|
+
debug_msg 'Rendering the servlet root page...'
|
|
533
|
+
|
|
534
|
+
rel_prefix = '.'
|
|
535
|
+
asset_rel_prefix = rel_prefix
|
|
536
|
+
search_index_rel_prefix = asset_rel_prefix
|
|
537
|
+
search_index_rel_prefix += @asset_rel_path if @file_output
|
|
538
|
+
|
|
539
|
+
@title = 'Local RDoc Documentation'
|
|
540
|
+
|
|
541
|
+
render_template template_file do |io| binding end
|
|
542
|
+
rescue => e
|
|
543
|
+
error = RDoc::Error.new \
|
|
544
|
+
"error generating servlet_root: #{e.message} (#{e.class})"
|
|
545
|
+
error.set_backtrace e.backtrace
|
|
546
|
+
|
|
547
|
+
raise error
|
|
548
|
+
end
|
|
549
|
+
|
|
550
|
+
##
|
|
551
|
+
# Generate an index page which lists all the classes which are documented.
|
|
552
|
+
|
|
553
|
+
def generate_table_of_contents
|
|
554
|
+
setup
|
|
555
|
+
|
|
556
|
+
template_file = @template_dir + 'table_of_contents.rhtml'
|
|
557
|
+
return unless template_file.exist?
|
|
558
|
+
|
|
559
|
+
debug_msg "Rendering the Table of Contents..."
|
|
560
|
+
|
|
561
|
+
out_file = @outputdir + 'table_of_contents.html'
|
|
562
|
+
rel_prefix = @outputdir.relative_path_from out_file.dirname
|
|
563
|
+
search_index_rel_prefix = rel_prefix
|
|
564
|
+
search_index_rel_prefix += @asset_rel_path if @file_output
|
|
565
|
+
|
|
566
|
+
asset_rel_prefix = rel_prefix + @asset_rel_path
|
|
567
|
+
|
|
568
|
+
@title = "Table of Contents - #{@options.title}"
|
|
569
|
+
|
|
570
|
+
render_template template_file, out_file do |io|
|
|
571
|
+
here = binding
|
|
572
|
+
# suppress 1.9.3 warning
|
|
573
|
+
here.local_variable_set(:asset_rel_prefix, asset_rel_prefix)
|
|
574
|
+
here
|
|
575
|
+
end
|
|
576
|
+
rescue => e
|
|
577
|
+
error = RDoc::Error.new \
|
|
578
|
+
"error generating table_of_contents.html: #{e.message} (#{e.class})"
|
|
579
|
+
error.set_backtrace e.backtrace
|
|
580
|
+
|
|
581
|
+
raise error
|
|
582
|
+
end
|
|
583
|
+
|
|
584
|
+
def install_rdoc_static_file source, destination, options # :nodoc:
|
|
585
|
+
return unless source.exist?
|
|
586
|
+
|
|
587
|
+
begin
|
|
588
|
+
FileUtils.mkdir_p File.dirname(destination), **options
|
|
589
|
+
|
|
590
|
+
begin
|
|
591
|
+
FileUtils.ln source, destination, **options
|
|
592
|
+
rescue Errno::EEXIST
|
|
593
|
+
FileUtils.rm destination
|
|
594
|
+
retry
|
|
595
|
+
end
|
|
596
|
+
rescue
|
|
597
|
+
FileUtils.cp source, destination, **options
|
|
598
|
+
end
|
|
599
|
+
end
|
|
600
|
+
|
|
601
|
+
##
|
|
602
|
+
# Prepares for generation of output from the current directory
|
|
603
|
+
|
|
604
|
+
def setup
|
|
605
|
+
return if instance_variable_defined? :@outputdir
|
|
606
|
+
|
|
607
|
+
@outputdir = Pathname.new(@options.op_dir).expand_path @base_dir
|
|
608
|
+
|
|
609
|
+
return unless @store
|
|
610
|
+
|
|
611
|
+
@classes = @store.all_classes_and_modules.sort
|
|
612
|
+
@files = @store.all_files.sort
|
|
613
|
+
@methods = @classes.map { |m| m.method_list }.flatten.sort
|
|
614
|
+
@modsort = get_sorted_module_list @classes
|
|
615
|
+
end
|
|
616
|
+
|
|
617
|
+
##
|
|
618
|
+
# Return a string describing the amount of time in the given number of
|
|
619
|
+
# seconds in terms a human can understand easily.
|
|
620
|
+
|
|
621
|
+
def time_delta_string seconds
|
|
622
|
+
return 'less than a minute' if seconds < 60
|
|
623
|
+
return "#{seconds / 60} minute#{seconds / 60 == 1 ? '' : 's'}" if
|
|
624
|
+
seconds < 3000 # 50 minutes
|
|
625
|
+
return 'about one hour' if seconds < 5400 # 90 minutes
|
|
626
|
+
return "#{seconds / 3600} hours" if seconds < 64800 # 18 hours
|
|
627
|
+
return 'one day' if seconds < 86400 # 1 day
|
|
628
|
+
return 'about one day' if seconds < 172800 # 2 days
|
|
629
|
+
return "#{seconds / 86400} days" if seconds < 604800 # 1 week
|
|
630
|
+
return 'about one week' if seconds < 1209600 # 2 week
|
|
631
|
+
return "#{seconds / 604800} weeks" if seconds < 7257600 # 3 months
|
|
632
|
+
return "#{seconds / 2419200} months" if seconds < 31536000 # 1 year
|
|
633
|
+
return "#{seconds / 31536000} years"
|
|
634
|
+
end
|
|
635
|
+
|
|
636
|
+
# %q$Id: darkfish.rb 52 2009-01-07 02:08:11Z deveiant $"
|
|
637
|
+
SVNID_PATTERN = /
|
|
638
|
+
\$Id:\s
|
|
639
|
+
(\S+)\s # filename
|
|
640
|
+
(\d+)\s # rev
|
|
641
|
+
(\d{4}-\d{2}-\d{2})\s # Date (YYYY-MM-DD)
|
|
642
|
+
(\d{2}:\d{2}:\d{2}Z)\s # Time (HH:MM:SSZ)
|
|
643
|
+
(\w+)\s # committer
|
|
644
|
+
\$$
|
|
645
|
+
/x
|
|
646
|
+
|
|
647
|
+
##
|
|
648
|
+
# Try to extract Subversion information out of the first constant whose
|
|
649
|
+
# value looks like a subversion Id tag. If no matching constant is found,
|
|
650
|
+
# and empty hash is returned.
|
|
651
|
+
|
|
652
|
+
def get_svninfo klass
|
|
653
|
+
constants = klass.constants or return {}
|
|
654
|
+
|
|
655
|
+
constants.find { |c| c.value =~ SVNID_PATTERN } or return {}
|
|
656
|
+
|
|
657
|
+
filename, rev, date, time, committer = $~.captures
|
|
658
|
+
commitdate = Time.parse "#{date} #{time}"
|
|
659
|
+
|
|
660
|
+
return {
|
|
661
|
+
:filename => filename,
|
|
662
|
+
:rev => Integer(rev),
|
|
663
|
+
:commitdate => commitdate,
|
|
664
|
+
:commitdelta => time_delta_string(Time.now - commitdate),
|
|
665
|
+
:committer => committer,
|
|
666
|
+
}
|
|
667
|
+
end
|
|
668
|
+
|
|
669
|
+
##
|
|
670
|
+
# Creates a template from its components and the +body_file+.
|
|
671
|
+
#
|
|
672
|
+
# For backwards compatibility, if +body_file+ contains "<html" the body is
|
|
673
|
+
# used directly.
|
|
674
|
+
|
|
675
|
+
def assemble_template body_file
|
|
676
|
+
body = body_file.read
|
|
677
|
+
return body if body =~ /<html/
|
|
678
|
+
|
|
679
|
+
head_file = @template_dir + '_head.rhtml'
|
|
680
|
+
footer_file = @template_dir + '_footer.rhtml'
|
|
681
|
+
|
|
682
|
+
<<-TEMPLATE
|
|
683
|
+
<!DOCTYPE html>
|
|
684
|
+
|
|
685
|
+
<html>
|
|
686
|
+
<head>
|
|
687
|
+
#{head_file.read}
|
|
688
|
+
|
|
689
|
+
#{body}
|
|
690
|
+
|
|
691
|
+
#{footer_file.read}
|
|
692
|
+
TEMPLATE
|
|
693
|
+
end
|
|
694
|
+
|
|
695
|
+
##
|
|
696
|
+
# Renders the ERb contained in +file_name+ relative to the template
|
|
697
|
+
# directory and returns the result based on the current context.
|
|
698
|
+
|
|
699
|
+
def render file_name
|
|
700
|
+
template_file = @template_dir + file_name
|
|
701
|
+
|
|
702
|
+
template = template_for template_file, false, RDoc::ERBPartial
|
|
703
|
+
|
|
704
|
+
template.filename = template_file.to_s
|
|
705
|
+
|
|
706
|
+
template.result @context
|
|
707
|
+
end
|
|
708
|
+
|
|
709
|
+
##
|
|
710
|
+
# Load and render the erb template in the given +template_file+ and write
|
|
711
|
+
# it out to +out_file+.
|
|
712
|
+
#
|
|
713
|
+
# Both +template_file+ and +out_file+ should be Pathname-like objects.
|
|
714
|
+
#
|
|
715
|
+
# An io will be yielded which must be captured by binding in the caller.
|
|
716
|
+
|
|
717
|
+
def render_template template_file, out_file = nil # :yield: io
|
|
718
|
+
io_output = out_file && !@dry_run && @file_output
|
|
719
|
+
erb_klass = io_output ? RDoc::ERBIO : ERB
|
|
720
|
+
|
|
721
|
+
template = template_for template_file, true, erb_klass
|
|
722
|
+
|
|
723
|
+
if io_output then
|
|
724
|
+
debug_msg "Outputting to %s" % [out_file.expand_path]
|
|
725
|
+
|
|
726
|
+
out_file.dirname.mkpath
|
|
727
|
+
out_file.open 'w', 0644 do |io|
|
|
728
|
+
io.set_encoding @options.encoding
|
|
729
|
+
|
|
730
|
+
@context = yield io
|
|
731
|
+
|
|
732
|
+
template_result template, @context, template_file
|
|
733
|
+
end
|
|
734
|
+
else
|
|
735
|
+
@context = yield nil
|
|
736
|
+
|
|
737
|
+
output = template_result template, @context, template_file
|
|
738
|
+
|
|
739
|
+
debug_msg " would have written %d characters to %s" % [
|
|
740
|
+
output.length, out_file.expand_path
|
|
741
|
+
] if @dry_run
|
|
742
|
+
|
|
743
|
+
output
|
|
744
|
+
end
|
|
745
|
+
end
|
|
746
|
+
|
|
747
|
+
##
|
|
748
|
+
# Creates the result for +template+ with +context+. If an error is raised a
|
|
749
|
+
# Pathname +template_file+ will indicate the file where the error occurred.
|
|
750
|
+
|
|
751
|
+
def template_result template, context, template_file
|
|
752
|
+
template.filename = template_file.to_s
|
|
753
|
+
template.result context
|
|
754
|
+
rescue NoMethodError => e
|
|
755
|
+
raise RDoc::Error, "Error while evaluating %s: %s" % [
|
|
756
|
+
template_file.expand_path,
|
|
757
|
+
e.message,
|
|
758
|
+
], e.backtrace
|
|
759
|
+
end
|
|
760
|
+
|
|
761
|
+
##
|
|
762
|
+
# Retrieves a cache template for +file+, if present, or fills the cache.
|
|
763
|
+
|
|
764
|
+
def template_for file, page = true, klass = ERB
|
|
765
|
+
template = @template_cache[file]
|
|
766
|
+
|
|
767
|
+
return template if template
|
|
768
|
+
|
|
769
|
+
if page then
|
|
770
|
+
template = assemble_template file
|
|
771
|
+
erbout = 'io'
|
|
772
|
+
else
|
|
773
|
+
template = file.read
|
|
774
|
+
template = template.encode @options.encoding
|
|
775
|
+
|
|
776
|
+
file_var = File.basename(file).sub(/\..*/, '')
|
|
777
|
+
|
|
778
|
+
erbout = "_erbout_#{file_var}"
|
|
779
|
+
end
|
|
780
|
+
|
|
781
|
+
if RUBY_VERSION >= '2.6'
|
|
782
|
+
template = klass.new template, trim_mode: '-', eoutvar: erbout
|
|
783
|
+
else
|
|
784
|
+
template = klass.new template, nil, '-', erbout
|
|
785
|
+
end
|
|
786
|
+
@template_cache[file] = template
|
|
787
|
+
template
|
|
788
|
+
end
|
|
789
|
+
|
|
790
|
+
end
|