rdoc 8.0.0 → 8.1.0

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.
Files changed (114) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +1 -3
  3. data/RI.md +75 -75
  4. data/exe/rdoc +2 -2
  5. data/lib/rdoc/code_object/alias.rb +71 -69
  6. data/lib/rdoc/code_object/any_method.rb +305 -303
  7. data/lib/rdoc/code_object/attr.rb +150 -148
  8. data/lib/rdoc/code_object/class_module.rb +798 -792
  9. data/lib/rdoc/code_object/constant.rb +175 -173
  10. data/lib/rdoc/code_object/context/section.rb +142 -138
  11. data/lib/rdoc/code_object/context.rb +926 -958
  12. data/lib/rdoc/code_object/extend.rb +7 -5
  13. data/lib/rdoc/code_object/include.rb +7 -5
  14. data/lib/rdoc/code_object/method_attr.rb +326 -319
  15. data/lib/rdoc/code_object/mixin.rb +97 -95
  16. data/lib/rdoc/code_object/normal_class.rb +77 -78
  17. data/lib/rdoc/code_object/normal_module.rb +61 -59
  18. data/lib/rdoc/code_object/require.rb +23 -39
  19. data/lib/rdoc/code_object/single_class.rb +21 -19
  20. data/lib/rdoc/code_object/top_level.rb +212 -219
  21. data/lib/rdoc/code_object.rb +305 -303
  22. data/lib/rdoc/comment.rb +275 -273
  23. data/lib/rdoc/cross_reference.rb +192 -190
  24. data/lib/rdoc/encoding.rb +105 -103
  25. data/lib/rdoc/erb_partial.rb +13 -11
  26. data/lib/rdoc/erbio.rb +29 -27
  27. data/lib/rdoc/generator/aliki.rb +161 -153
  28. data/lib/rdoc/generator/darkfish.rb +645 -635
  29. data/lib/rdoc/generator/json_index.rb +233 -229
  30. data/lib/rdoc/generator/markup.rb +164 -146
  31. data/lib/rdoc/generator/pot/message_extractor.rb +57 -51
  32. data/lib/rdoc/generator/pot/po.rb +52 -51
  33. data/lib/rdoc/generator/pot/po_entry.rb +138 -132
  34. data/lib/rdoc/generator/pot.rb +85 -81
  35. data/lib/rdoc/generator/ri.rb +23 -19
  36. data/lib/rdoc/generator/template/aliki/DESIGN.md +6 -4
  37. data/lib/rdoc/generator/template/aliki/_footer.rhtml +1 -1
  38. data/lib/rdoc/generator/template/aliki/_head.rhtml +10 -10
  39. data/lib/rdoc/generator/template/aliki/_header.rhtml +29 -44
  40. data/lib/rdoc/generator/template/aliki/_sidebar_search.rhtml +4 -4
  41. data/lib/rdoc/generator/template/aliki/css/rdoc.css +207 -178
  42. data/lib/rdoc/generator/template/aliki/js/aliki.js +60 -84
  43. data/lib/rdoc/generator/template/darkfish/_footer.rhtml +1 -1
  44. data/lib/rdoc/generator.rb +48 -46
  45. data/lib/rdoc/i18n/locale.rb +99 -95
  46. data/lib/rdoc/i18n/text.rb +109 -105
  47. data/lib/rdoc/i18n.rb +7 -5
  48. data/lib/rdoc/markdown/byte_runtime.rb +80 -0
  49. data/lib/rdoc/markdown.kpeg +15 -11
  50. data/lib/rdoc/markdown.rb +40 -47
  51. data/lib/rdoc/markup/block_quote.rb +12 -8
  52. data/lib/rdoc/markup/document.rb +127 -123
  53. data/lib/rdoc/markup/formatter.rb +219 -215
  54. data/lib/rdoc/markup/include.rb +33 -29
  55. data/lib/rdoc/markup/indented_paragraph.rb +37 -33
  56. data/lib/rdoc/markup/inline_parser.rb +281 -277
  57. data/lib/rdoc/markup/list.rb +80 -88
  58. data/lib/rdoc/markup/list_item.rb +73 -85
  59. data/lib/rdoc/markup/paragraph.rb +23 -19
  60. data/lib/rdoc/markup/parser.rb +501 -497
  61. data/lib/rdoc/markup/pre_process.rb +283 -279
  62. data/lib/rdoc/markup/raw.rb +2 -2
  63. data/lib/rdoc/markup/rule.rb +16 -12
  64. data/lib/rdoc/markup/to_ansi.rb +143 -139
  65. data/lib/rdoc/markup/to_bs.rb +72 -68
  66. data/lib/rdoc/markup/to_html.rb +594 -565
  67. data/lib/rdoc/markup/to_html_crossref.rb +234 -230
  68. data/lib/rdoc/markup/to_html_snippet.rb +232 -227
  69. data/lib/rdoc/markup/to_joined_paragraph.rb +36 -32
  70. data/lib/rdoc/markup/to_label.rb +63 -59
  71. data/lib/rdoc/markup/to_markdown.rb +212 -208
  72. data/lib/rdoc/markup/to_rdoc.rb +336 -332
  73. data/lib/rdoc/markup/to_table_of_contents.rb +66 -62
  74. data/lib/rdoc/markup/to_test.rb +60 -56
  75. data/lib/rdoc/markup/to_tt_only.rb +84 -80
  76. data/lib/rdoc/markup/verbatim.rb +62 -58
  77. data/lib/rdoc/markup.rb +198 -196
  78. data/lib/rdoc/options.rb +1063 -1061
  79. data/lib/rdoc/parser/c.rb +1039 -1037
  80. data/lib/rdoc/parser/changelog.rb +319 -315
  81. data/lib/rdoc/parser/markdown.rb +17 -13
  82. data/lib/rdoc/parser/rbs.rb +239 -235
  83. data/lib/rdoc/parser/rd.rb +17 -13
  84. data/lib/rdoc/parser/ruby.rb +1245 -1124
  85. data/lib/rdoc/parser/ruby_colorizer.rb +263 -213
  86. data/lib/rdoc/parser/simple.rb +31 -27
  87. data/lib/rdoc/parser/text.rb +12 -8
  88. data/lib/rdoc/parser.rb +228 -220
  89. data/lib/rdoc/rbs_helper.rb +1 -1
  90. data/lib/rdoc/rd/inline.rb +57 -53
  91. data/lib/rdoc/rd.rb +90 -88
  92. data/lib/rdoc/rdoc.rb +500 -491
  93. data/lib/rdoc/ri/driver.rb +1140 -1135
  94. data/lib/rdoc/ri/formatter.rb +7 -3
  95. data/lib/rdoc/ri/paths.rb +140 -136
  96. data/lib/rdoc/ri/servlet.rb +354 -350
  97. data/lib/rdoc/ri/store.rb +4 -2
  98. data/lib/rdoc/ri/task.rb +55 -51
  99. data/lib/rdoc/ri.rb +14 -12
  100. data/lib/rdoc/rubygems_hook.rb +183 -181
  101. data/lib/rdoc/server.rb +349 -347
  102. data/lib/rdoc/stats/normal.rb +46 -42
  103. data/lib/rdoc/stats/quiet.rb +39 -35
  104. data/lib/rdoc/stats/verbose.rb +35 -31
  105. data/lib/rdoc/stats.rb +365 -363
  106. data/lib/rdoc/store.rb +888 -902
  107. data/lib/rdoc/task.rb +260 -256
  108. data/lib/rdoc/text.rb +135 -133
  109. data/lib/rdoc/token_stream.rb +101 -93
  110. data/lib/rdoc/tom_doc.rb +203 -201
  111. data/lib/rdoc/version.rb +1 -1
  112. metadata +4 -5
  113. data/lib/rdoc/markdown/literals.kpeg +0 -21
  114. data/lib/rdoc/markdown/literals.rb +0 -454
@@ -6,819 +6,829 @@ require 'fileutils'
6
6
  require 'pathname'
7
7
  require_relative 'markup'
8
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
- # Description of this generator
78
-
79
- DESCRIPTION = 'HTML generator, written by Michael Granger'
80
-
81
- ##
82
- # The relative path to style sheets and javascript. By default this is set
83
- # the same as the rel_prefix.
84
-
85
- attr_accessor :asset_rel_path
86
-
87
- ##
88
- # The path to generate files into, combined with <tt>--op</tt> from the
89
- # options for a full path.
90
-
91
- attr_reader :base_dir
92
-
93
- ##
94
- # Classes and modules to be used by this generator, not necessarily
95
- # displayed. See also #modsort
96
-
97
- attr_reader :classes
98
-
99
- ##
100
- # No files will be written when dry_run is true.
101
-
102
- attr_accessor :dry_run
103
-
104
- ##
105
- # When false the generate methods return a String instead of writing to a
106
- # file. The default is true.
107
-
108
- attr_accessor :file_output
109
-
110
- ##
111
- # Files to be displayed by this generator
112
-
113
- attr_reader :files
114
-
115
- ##
116
- # The JSON index generator for this Darkfish generator
117
-
118
- attr_reader :json_index
9
+ module RDoc
10
+ module Generator
11
+ ##
12
+ # Darkfish RDoc HTML Generator
13
+ #
14
+ # $Id: darkfish.rb 52 2009-01-07 02:08:11Z deveiant $
15
+ #
16
+ # == Author/s
17
+ # * Michael Granger (ged@FaerieMUD.org)
18
+ #
19
+ # == Contributors
20
+ # * Mahlon E. Smith (mahlon@martini.nu)
21
+ # * Eric Hodel (drbrain@segment7.net)
22
+ #
23
+ # == License
24
+ #
25
+ # Copyright (c) 2007, 2008, Michael Granger. All rights reserved.
26
+ #
27
+ # Redistribution and use in source and binary forms, with or without
28
+ # modification, are permitted provided that the following conditions are met:
29
+ #
30
+ # * Redistributions of source code must retain the above copyright notice,
31
+ # this list of conditions and the following disclaimer.
32
+ #
33
+ # * Redistributions in binary form must reproduce the above copyright notice,
34
+ # this list of conditions and the following disclaimer in the documentation
35
+ # and/or other materials provided with the distribution.
36
+ #
37
+ # * Neither the name of the author/s, nor the names of the project's
38
+ # contributors may be used to endorse or promote products derived from this
39
+ # software without specific prior written permission.
40
+ #
41
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
42
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
44
+ # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
45
+ # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46
+ # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
47
+ # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
48
+ # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
49
+ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
50
+ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
51
+ #
52
+ # == Attributions
53
+ #
54
+ # Darkfish uses the {Silk Icons}[http://www.famfamfam.com/lab/icons/silk/] set
55
+ # by Mark James.
56
+
57
+ class Darkfish
58
+
59
+ RDoc.add_generator self
60
+
61
+ include ERB::Util
62
+
63
+ ##
64
+ # Stylesheets, fonts, etc. that are included in RDoc.
65
+
66
+ BUILTIN_STYLE_ITEMS = # :nodoc:
67
+ %w[
68
+ css/fonts.css
69
+ fonts/Lato-Light.ttf
70
+ fonts/Lato-LightItalic.ttf
71
+ fonts/Lato-Regular.ttf
72
+ fonts/Lato-RegularItalic.ttf
73
+ fonts/SourceCodePro-Bold.ttf
74
+ fonts/SourceCodePro-Regular.ttf
75
+ css/rdoc.css
76
+ ]
77
+
78
+ ##
79
+ # Description of this generator
80
+
81
+ DESCRIPTION = 'HTML generator, written by Michael Granger'
82
+
83
+ ##
84
+ # The relative path to style sheets and javascript. By default this is set
85
+ # the same as the rel_prefix.
86
+
87
+ attr_accessor :asset_rel_path
88
+
89
+ ##
90
+ # The path to generate files into, combined with <tt>--op</tt> from the
91
+ # options for a full path.
92
+
93
+ attr_reader :base_dir
94
+
95
+ ##
96
+ # Classes and modules to be used by this generator, not necessarily
97
+ # displayed. See also #modsort
98
+
99
+ attr_reader :classes
100
+
101
+ ##
102
+ # No files will be written when dry_run is true.
103
+
104
+ attr_accessor :dry_run
105
+
106
+ ##
107
+ # When false the generate methods return a String instead of writing to a
108
+ # file. The default is true.
109
+
110
+ attr_accessor :file_output
111
+
112
+ ##
113
+ # Files to be displayed by this generator
114
+
115
+ attr_reader :files
116
+
117
+ ##
118
+ # The JSON index generator for this Darkfish generator
119
+
120
+ attr_reader :json_index
119
121
 
120
- ##
121
- # Methods to be displayed by this generator
122
+ ##
123
+ # Methods to be displayed by this generator
122
124
 
123
- attr_reader :methods
125
+ attr_reader :methods
124
126
 
125
- ##
126
- # Sorted list of classes and modules to be displayed by this generator
127
+ ##
128
+ # Sorted list of classes and modules to be displayed by this generator
127
129
 
128
- attr_reader :modsort
130
+ attr_reader :modsort
129
131
 
130
- ##
131
- # The RDoc::Store that is the source of the generated content
132
+ ##
133
+ # The RDoc::Store that is the source of the generated content
132
134
 
133
- attr_reader :store
135
+ attr_reader :store
134
136
 
135
- ##
136
- # The directory where the template files live
137
+ ##
138
+ # The directory where the template files live
137
139
 
138
- attr_reader :template_dir # :nodoc:
140
+ attr_reader :template_dir # :nodoc:
139
141
 
140
- ##
141
- # The output directory
142
+ ##
143
+ # The output directory
142
144
 
143
- attr_reader :outputdir
145
+ attr_reader :outputdir
144
146
 
145
- ##
146
- # Initialize a few instance variables before we start
147
+ ##
148
+ # Initialize a few instance variables before we start
147
149
 
148
- def initialize(store, options)
149
- @store = store
150
- @options = options
150
+ def initialize(store, options)
151
+ @store = store
152
+ @options = options
151
153
 
152
- @asset_rel_path = ''
153
- @base_dir = Pathname.pwd.expand_path
154
- @dry_run = @options.dry_run
155
- @file_output = true
156
- @template_dir = Pathname.new options.template_dir
157
- @template_cache = {}
154
+ @asset_rel_path = ''
155
+ @base_dir = Pathname.pwd.expand_path
156
+ @dry_run = @options.dry_run
157
+ @file_output = true
158
+ @template_dir = Pathname.new options.template_dir
159
+ @template_cache = {}
158
160
 
159
- @classes = nil
160
- @context = nil
161
- @files = nil
162
- @methods = nil
163
- @modsort = nil
161
+ @classes = nil
162
+ @context = nil
163
+ @files = nil
164
+ @methods = nil
165
+ @modsort = nil
164
166
 
165
- @json_index = RDoc::Generator::JsonIndex.new self, options
166
- end
167
+ @json_index = Generator::JsonIndex.new self, options
168
+ end
167
169
 
168
- ##
169
- # Output progress information if debugging is enabled
170
+ ##
171
+ # Output progress information if debugging is enabled
170
172
 
171
- def debug_msg(*msg)
172
- return unless $DEBUG_RDOC
173
- $stderr.puts(*msg)
174
- end
173
+ def debug_msg(*msg)
174
+ return unless $DEBUG_RDOC
175
+ $stderr.puts(*msg)
176
+ end
175
177
 
176
- ##
177
- # Create the directories the generated docs will live in if they don't
178
- # already exist.
178
+ ##
179
+ # Create the directories the generated docs will live in if they don't
180
+ # already exist.
179
181
 
180
- def gen_sub_directories
181
- @outputdir.mkpath
182
- end
182
+ def gen_sub_directories
183
+ @outputdir.mkpath
184
+ end
183
185
 
184
- ##
185
- # Copy over the stylesheet into the appropriate place in the output
186
- # directory.
186
+ ##
187
+ # Copy over the stylesheet into the appropriate place in the output
188
+ # directory.
187
189
 
188
- def write_style_sheet
189
- debug_msg "Copying static files"
190
- options = { :verbose => $DEBUG_RDOC, :noop => @dry_run }
190
+ def write_style_sheet
191
+ debug_msg "Copying static files"
192
+ options = { :verbose => $DEBUG_RDOC, :noop => @dry_run }
191
193
 
192
- BUILTIN_STYLE_ITEMS.each do |item|
193
- install_rdoc_static_file @template_dir + item, "./#{item}", options
194
- end
194
+ BUILTIN_STYLE_ITEMS.each do |item|
195
+ install_rdoc_static_file @template_dir + item, "./#{item}", options
196
+ end
195
197
 
196
- unless @options.template_stylesheets.empty?
197
- FileUtils.cp @options.template_stylesheets, '.', **options
198
- end
198
+ unless @options.template_stylesheets.empty?
199
+ FileUtils.cp @options.template_stylesheets, '.', **options
200
+ end
199
201
 
200
- Dir[(@template_dir + "{js,images}/**/*").to_s].each do |path|
201
- next if File.directory? path
202
- next if File.basename(path) =~ /^\./
202
+ Dir[(@template_dir + "{js,images}/**/*").to_s].each do |path|
203
+ next if File.directory? path
204
+ next if File.basename(path) =~ /^\./
203
205
 
204
- dst = Pathname.new(path).relative_path_from @template_dir
206
+ dst = Pathname.new(path).relative_path_from @template_dir
205
207
 
206
- install_rdoc_static_file @template_dir + path, dst, options
207
- end
208
- end
208
+ install_rdoc_static_file @template_dir + path, dst, options
209
+ end
210
+ end
209
211
 
210
- ##
211
- # Build the initial indices and output objects based on an array of TopLevel
212
- # objects containing the extracted information.
212
+ ##
213
+ # Build the initial indices and output objects based on an array of TopLevel
214
+ # objects containing the extracted information.
213
215
 
214
- def generate
215
- setup
216
+ def generate
217
+ warn "The Darkfish template is deprecated and will be removed in version 9.0."
216
218
 
217
- write_style_sheet
218
- generate_index
219
- generate_class_files
220
- generate_file_files
221
- generate_table_of_contents
222
- @json_index.generate
223
- @json_index.generate_gzipped
219
+ setup
224
220
 
225
- copy_static
221
+ write_style_sheet
222
+ generate_index
223
+ generate_class_files
224
+ generate_file_files
225
+ generate_table_of_contents
226
+ @json_index.generate
227
+ @json_index.generate_gzipped
226
228
 
227
- rescue => e
228
- debug_msg "%s: %s\n %s" % [
229
- e.class.name, e.message, e.backtrace.join("\n ")
230
- ]
229
+ copy_static
231
230
 
232
- raise
233
- end
231
+ rescue => e
232
+ debug_msg "%s: %s\n %s" % [
233
+ e.class.name, e.message, e.backtrace.join("\n ")
234
+ ]
234
235
 
235
- ##
236
- # Copies static files from the static_path into the output directory
236
+ raise
237
+ end
237
238
 
238
- def copy_static
239
- return if @options.static_path.empty?
239
+ ##
240
+ # Copies static files from the static_path into the output directory
240
241
 
241
- fu_options = { :verbose => $DEBUG_RDOC, :noop => @dry_run }
242
+ def copy_static
243
+ return if @options.static_path.empty?
242
244
 
243
- @options.static_path.each do |path|
244
- unless File.directory? path then
245
- FileUtils.install path, @outputdir, **fu_options.merge(:mode => 0644)
246
- next
247
- end
245
+ fu_options = { :verbose => $DEBUG_RDOC, :noop => @dry_run }
246
+
247
+ @options.static_path.each do |path|
248
+ unless File.directory? path
249
+ FileUtils.install path, @outputdir, **fu_options.merge(:mode => 0644)
250
+ next
251
+ end
248
252
 
249
- Dir.chdir path do
250
- Dir[File.join('**', '*')].each do |entry|
251
- dest_file = @outputdir + entry
253
+ Dir.chdir path do
254
+ Dir[File.join('**', '*')].each do |entry|
255
+ dest_file = @outputdir + entry
252
256
 
253
- if File.directory? entry then
254
- FileUtils.mkdir_p entry, **fu_options
255
- else
256
- FileUtils.install entry, dest_file, **fu_options.merge(:mode => 0644)
257
+ if File.directory? entry
258
+ FileUtils.mkdir_p entry, **fu_options
259
+ else
260
+ FileUtils.install entry, dest_file, **fu_options.merge(:mode => 0644)
261
+ end
262
+ end
257
263
  end
258
264
  end
259
265
  end
260
- end
261
- end
262
266
 
263
- ##
264
- # Return a list of the documented modules sorted by salience first, then
265
- # by name.
267
+ ##
268
+ # Return a list of the documented modules sorted by salience first, then
269
+ # by name.
266
270
 
267
- def get_sorted_module_list(classes)
268
- classes.select do |klass|
269
- klass.display?
270
- end.sort
271
- end
271
+ def get_sorted_module_list(classes)
272
+ classes.select do |klass|
273
+ klass.display?
274
+ end.sort
275
+ end
272
276
 
273
- ##
274
- # Generate an index page which lists all the classes which are documented.
277
+ ##
278
+ # Generate an index page which lists all the classes which are documented.
275
279
 
276
- def generate_index
277
- template_file = @template_dir + 'index.rhtml'
278
- return unless template_file.exist?
280
+ def generate_index
281
+ template_file = @template_dir + 'index.rhtml'
282
+ return unless template_file.exist?
279
283
 
280
- debug_msg "Rendering the index page..."
284
+ debug_msg "Rendering the index page..."
281
285
 
282
- out_file = @base_dir + @options.op_dir + 'index.html'
283
- rel_prefix = @outputdir.relative_path_from out_file.dirname
284
- search_index_rel_prefix = rel_prefix
285
- search_index_rel_prefix += @asset_rel_path if @file_output
286
+ out_file = @base_dir + @options.op_dir + 'index.html'
287
+ rel_prefix = @outputdir.relative_path_from out_file.dirname
288
+ search_index_rel_prefix = rel_prefix
289
+ search_index_rel_prefix += @asset_rel_path if @file_output
286
290
 
287
- asset_rel_prefix = rel_prefix + @asset_rel_path
291
+ asset_rel_prefix = rel_prefix + @asset_rel_path
288
292
 
289
- @title = @options.title
290
- @main_page = @files.find { |f| f.full_name == @options.main_page }
293
+ @title = @options.title
294
+ @main_page = @files.find { |f| f.full_name == @options.main_page }
291
295
 
292
- render_template template_file, out_file do |io|
293
- here = binding
294
- # suppress 1.9.3 warning
295
- here.local_variable_set(:asset_rel_prefix, asset_rel_prefix)
296
- # some partials rely on the presence of current variable to render
297
- here.local_variable_set(:current, @main_page) if @main_page
298
- here
299
- end
300
- rescue => e
301
- error = RDoc::Error.new \
302
- "error generating index.html: #{e.message} (#{e.class})"
303
- error.set_backtrace e.backtrace
296
+ render_template template_file, out_file do |io|
297
+ here = binding
298
+ # suppress 1.9.3 warning
299
+ here.local_variable_set(:asset_rel_prefix, asset_rel_prefix)
300
+ # some partials rely on the presence of current variable to render
301
+ here.local_variable_set(:current, @main_page) if @main_page
302
+ here
303
+ end
304
+ rescue => e
305
+ error = Error.new \
306
+ "error generating index.html: #{e.message} (#{e.class})"
307
+ error.set_backtrace e.backtrace
304
308
 
305
- raise error
306
- end
309
+ raise error
310
+ end
307
311
 
308
- ##
309
- # Generates a class file for +klass+
312
+ ##
313
+ # Generates a class file for +klass+
310
314
 
311
- def generate_class(klass, template_file = nil)
312
- # This is used to auto-collapse Pages section on class/module pages
313
- @inside_class_file = true
314
- current = klass
315
+ def generate_class(klass, template_file = nil)
316
+ # This is used to auto-collapse Pages section on class/module pages
317
+ @inside_class_file = true
318
+ current = klass
315
319
 
316
- template_file ||= @template_dir + 'class.rhtml'
320
+ template_file ||= @template_dir + 'class.rhtml'
317
321
 
318
- debug_msg " working on %s (%s)" % [klass.full_name, klass.path]
319
- out_file = @outputdir + klass.path
320
- rel_prefix = @outputdir.relative_path_from out_file.dirname
321
- search_index_rel_prefix = rel_prefix
322
- search_index_rel_prefix += @asset_rel_path if @file_output
322
+ debug_msg " working on %s (%s)" % [klass.full_name, klass.path]
323
+ out_file = @outputdir + klass.path
324
+ rel_prefix = @outputdir.relative_path_from out_file.dirname
325
+ search_index_rel_prefix = rel_prefix
326
+ search_index_rel_prefix += @asset_rel_path if @file_output
323
327
 
324
- asset_rel_prefix = rel_prefix + @asset_rel_path
328
+ asset_rel_prefix = rel_prefix + @asset_rel_path
325
329
 
326
- breadcrumb = # used in templates
327
- breadcrumb = generate_nesting_namespaces_breadcrumb(current, rel_prefix)
330
+ breadcrumb = # used in templates
331
+ breadcrumb = generate_nesting_namespaces_breadcrumb(current, rel_prefix)
328
332
 
329
- @title = "#{klass.type} #{klass.full_name} - #{@options.title}"
333
+ @title = "#{klass.type} #{klass.full_name} - #{@options.title}"
330
334
 
331
- debug_msg " rendering #{out_file}"
332
- render_template template_file, out_file do |io|
333
- here = binding
334
- # suppress 1.9.3 warning
335
- here.local_variable_set(:asset_rel_prefix, asset_rel_prefix)
336
- here
337
- end
338
- ensure
339
- @inside_class_file = false
340
- end
335
+ debug_msg " rendering #{out_file}"
336
+ render_template template_file, out_file do |io|
337
+ here = binding
338
+ # suppress 1.9.3 warning
339
+ here.local_variable_set(:asset_rel_prefix, asset_rel_prefix)
340
+ here
341
+ end
342
+ ensure
343
+ @inside_class_file = false
344
+ end
341
345
 
342
- ##
343
- # Generate a documentation file for each class and module
346
+ ##
347
+ # Generate a documentation file for each class and module
344
348
 
345
- def generate_class_files
346
- template_file = @template_dir + 'class.rhtml'
347
- template_file = @template_dir + 'classpage.rhtml' unless
348
- template_file.exist?
349
- return unless template_file.exist?
350
- debug_msg "Generating class documentation in #{@outputdir}"
349
+ def generate_class_files
350
+ template_file = @template_dir + 'class.rhtml'
351
+ template_file = @template_dir + 'classpage.rhtml' unless
352
+ template_file.exist?
353
+ return unless template_file.exist?
354
+ debug_msg "Generating class documentation in #{@outputdir}"
351
355
 
352
- current = nil
356
+ current = nil
353
357
 
354
- # Document files are generated only for non-alias classes/modules
355
- @classes.reject(&:is_alias_for).each do |klass|
358
+ # Document files are generated only for non-alias classes/modules
359
+ @classes.reject(&:is_alias_for).each do |klass|
356
360
 
357
- current = klass
361
+ current = klass
358
362
 
359
- generate_class klass, template_file
360
- end
361
- rescue => e
362
- error = RDoc::Error.new \
363
- "error generating #{current.path}: #{e.message} (#{e.class})"
364
- error.set_backtrace e.backtrace
363
+ generate_class klass, template_file
364
+ end
365
+ rescue => e
366
+ error = Error.new \
367
+ "error generating #{current.path}: #{e.message} (#{e.class})"
368
+ error.set_backtrace e.backtrace
365
369
 
366
- raise error
367
- end
370
+ raise error
371
+ end
368
372
 
369
- ##
370
- # Generate a documentation file for each file
373
+ ##
374
+ # Generate a documentation file for each file
371
375
 
372
- def generate_file_files
373
- page_file = @template_dir + 'page.rhtml'
374
- fileinfo_file = @template_dir + 'fileinfo.rhtml'
376
+ def generate_file_files
377
+ page_file = @template_dir + 'page.rhtml'
378
+ fileinfo_file = @template_dir + 'fileinfo.rhtml'
375
379
 
376
- # for legacy templates
377
- filepage_file = @template_dir + 'filepage.rhtml' unless
378
- page_file.exist? or fileinfo_file.exist?
380
+ # for legacy templates
381
+ filepage_file = @template_dir + 'filepage.rhtml' unless
382
+ page_file.exist? or fileinfo_file.exist?
379
383
 
380
- return unless
381
- page_file.exist? or fileinfo_file.exist? or filepage_file.exist?
384
+ return unless
385
+ page_file.exist? or fileinfo_file.exist? or filepage_file.exist?
382
386
 
383
- debug_msg "Generating file documentation in #{@outputdir}"
387
+ debug_msg "Generating file documentation in #{@outputdir}"
384
388
 
385
- out_file = nil
386
- current = nil
389
+ out_file = nil
390
+ current = nil
387
391
 
388
- @files.each do |file|
389
- current = file
392
+ @files.each do |file|
393
+ current = file
390
394
 
391
- next if file.text? && file.full_name == @options.main_page
395
+ next if file.text? && file.full_name == @options.main_page
392
396
 
393
- if file.text? and page_file.exist? then
394
- generate_page file
395
- next
396
- end
397
+ if file.text? and page_file.exist?
398
+ generate_page file
399
+ next
400
+ end
397
401
 
398
- template_file = nil
399
- out_file = @outputdir + file.path
400
- debug_msg " working on %s (%s)" % [file.full_name, out_file]
401
- rel_prefix = @outputdir.relative_path_from out_file.dirname
402
- search_index_rel_prefix = rel_prefix
403
- search_index_rel_prefix += @asset_rel_path if @file_output
402
+ template_file = nil
403
+ out_file = @outputdir + file.path
404
+ debug_msg " working on %s (%s)" % [file.full_name, out_file]
405
+ rel_prefix = @outputdir.relative_path_from out_file.dirname
406
+ search_index_rel_prefix = rel_prefix
407
+ search_index_rel_prefix += @asset_rel_path if @file_output
408
+
409
+ asset_rel_prefix = rel_prefix + @asset_rel_path
410
+
411
+ unless filepage_file
412
+ if file.text?
413
+ next unless page_file.exist?
414
+ template_file = page_file
415
+ @title = file.page_name
416
+ else
417
+ next unless fileinfo_file.exist?
418
+ template_file = fileinfo_file
419
+ @title = "File: #{file.base_name}"
420
+ end
421
+ end
404
422
 
405
- asset_rel_prefix = rel_prefix + @asset_rel_path
423
+ @title += " - #{@options.title}"
424
+ template_file ||= filepage_file
406
425
 
407
- unless filepage_file then
408
- if file.text? then
409
- next unless page_file.exist?
410
- template_file = page_file
411
- @title = file.page_name
412
- else
413
- next unless fileinfo_file.exist?
414
- template_file = fileinfo_file
415
- @title = "File: #{file.base_name}"
426
+ render_template template_file, out_file do |io|
427
+ here = binding
428
+ # suppress 1.9.3 warning
429
+ here.local_variable_set(:asset_rel_prefix, asset_rel_prefix)
430
+ here.local_variable_set(:current, current)
431
+ here
432
+ end
416
433
  end
417
- end
418
-
419
- @title += " - #{@options.title}"
420
- template_file ||= filepage_file
434
+ rescue => e
435
+ error =
436
+ Error.new "error generating #{out_file}: #{e.message} (#{e.class})"
437
+ error.set_backtrace e.backtrace
421
438
 
422
- render_template template_file, out_file do |io|
423
- here = binding
424
- # suppress 1.9.3 warning
425
- here.local_variable_set(:asset_rel_prefix, asset_rel_prefix)
426
- here.local_variable_set(:current, current)
427
- here
439
+ raise error
428
440
  end
429
- end
430
- rescue => e
431
- error =
432
- RDoc::Error.new "error generating #{out_file}: #{e.message} (#{e.class})"
433
- error.set_backtrace e.backtrace
434
-
435
- raise error
436
- end
437
441
 
438
- ##
439
- # Generate a page file for +file+
442
+ ##
443
+ # Generate a page file for +file+
440
444
 
441
- def generate_page(file)
442
- template_file = @template_dir + 'page.rhtml'
445
+ def generate_page(file)
446
+ template_file = @template_dir + 'page.rhtml'
443
447
 
444
- out_file = @outputdir + file.path
445
- debug_msg " working on %s (%s)" % [file.full_name, out_file]
446
- rel_prefix = @outputdir.relative_path_from out_file.dirname
447
- search_index_rel_prefix = rel_prefix
448
- search_index_rel_prefix += @asset_rel_path if @file_output
448
+ out_file = @outputdir + file.path
449
+ debug_msg " working on %s (%s)" % [file.full_name, out_file]
450
+ rel_prefix = @outputdir.relative_path_from out_file.dirname
451
+ search_index_rel_prefix = rel_prefix
452
+ search_index_rel_prefix += @asset_rel_path if @file_output
449
453
 
450
- current = file
451
- asset_rel_prefix = rel_prefix + @asset_rel_path
454
+ current = file
455
+ asset_rel_prefix = rel_prefix + @asset_rel_path
452
456
 
453
- @title = "#{file.page_name} - #{@options.title}"
457
+ @title = "#{file.page_name} - #{@options.title}"
454
458
 
455
- debug_msg " rendering #{out_file}"
456
- render_template template_file, out_file do |io|
457
- here = binding
458
- # suppress 1.9.3 warning
459
- here.local_variable_set(:current, current)
460
- here.local_variable_set(:asset_rel_prefix, asset_rel_prefix)
461
- here
462
- end
463
- end
459
+ debug_msg " rendering #{out_file}"
460
+ render_template template_file, out_file do |io|
461
+ here = binding
462
+ # suppress 1.9.3 warning
463
+ here.local_variable_set(:current, current)
464
+ here.local_variable_set(:asset_rel_prefix, asset_rel_prefix)
465
+ here
466
+ end
467
+ end
464
468
 
465
- ##
466
- # Generates the 404 page for the RDoc servlet
469
+ ##
470
+ # Generates the 404 page for the RDoc servlet
467
471
 
468
- def generate_servlet_not_found(message)
469
- template_file = @template_dir + 'servlet_not_found.rhtml'
470
- return unless template_file.exist?
472
+ def generate_servlet_not_found(message)
473
+ template_file = @template_dir + 'servlet_not_found.rhtml'
474
+ return unless template_file.exist?
471
475
 
472
- debug_msg "Rendering the servlet 404 Not Found page..."
476
+ debug_msg "Rendering the servlet 404 Not Found page..."
473
477
 
474
- rel_prefix = rel_prefix = ''
475
- search_index_rel_prefix = rel_prefix
476
- search_index_rel_prefix += @asset_rel_path if @file_output
478
+ rel_prefix = rel_prefix = ''
479
+ search_index_rel_prefix = rel_prefix
480
+ search_index_rel_prefix += @asset_rel_path if @file_output
477
481
 
478
- asset_rel_prefix = ''
482
+ asset_rel_prefix = ''
479
483
 
480
- @title = 'Not Found'
484
+ @title = 'Not Found'
481
485
 
482
- render_template template_file do |io|
483
- here = binding
484
- # suppress 1.9.3 warning
485
- here.local_variable_set(:asset_rel_prefix, asset_rel_prefix)
486
- here
487
- end
488
- rescue => e
489
- error = RDoc::Error.new \
490
- "error generating servlet_not_found: #{e.message} (#{e.class})"
491
- error.set_backtrace e.backtrace
486
+ render_template template_file do |io|
487
+ here = binding
488
+ # suppress 1.9.3 warning
489
+ here.local_variable_set(:asset_rel_prefix, asset_rel_prefix)
490
+ here
491
+ end
492
+ rescue => e
493
+ error = Error.new \
494
+ "error generating servlet_not_found: #{e.message} (#{e.class})"
495
+ error.set_backtrace e.backtrace
492
496
 
493
- raise error
494
- end
497
+ raise error
498
+ end
495
499
 
496
- ##
497
- # Generates the servlet root page for the RDoc servlet
500
+ ##
501
+ # Generates the servlet root page for the RDoc servlet
498
502
 
499
- def generate_servlet_root(installed)
500
- template_file = @template_dir + 'servlet_root.rhtml'
501
- return unless template_file.exist?
503
+ def generate_servlet_root(installed)
504
+ template_file = @template_dir + 'servlet_root.rhtml'
505
+ return unless template_file.exist?
502
506
 
503
- debug_msg 'Rendering the servlet root page...'
507
+ debug_msg 'Rendering the servlet root page...'
504
508
 
505
- rel_prefix = '.'
506
- asset_rel_prefix = rel_prefix
507
- search_index_rel_prefix = asset_rel_prefix
508
- search_index_rel_prefix += @asset_rel_path if @file_output
509
+ rel_prefix = '.'
510
+ asset_rel_prefix = rel_prefix
511
+ search_index_rel_prefix = asset_rel_prefix
512
+ search_index_rel_prefix += @asset_rel_path if @file_output
509
513
 
510
- @title = 'Local RDoc Documentation'
514
+ @title = 'Local RDoc Documentation'
511
515
 
512
- render_template template_file do |io| binding end
513
- rescue => e
514
- error = RDoc::Error.new \
515
- "error generating servlet_root: #{e.message} (#{e.class})"
516
- error.set_backtrace e.backtrace
516
+ render_template template_file do |io| binding end
517
+ rescue => e
518
+ error = Error.new \
519
+ "error generating servlet_root: #{e.message} (#{e.class})"
520
+ error.set_backtrace e.backtrace
517
521
 
518
- raise error
519
- end
522
+ raise error
523
+ end
520
524
 
521
- ##
522
- # Generate an index page which lists all the classes which are documented.
525
+ ##
526
+ # Generate an index page which lists all the classes which are documented.
523
527
 
524
- def generate_table_of_contents
525
- template_file = @template_dir + 'table_of_contents.rhtml'
526
- return unless template_file.exist?
528
+ def generate_table_of_contents
529
+ template_file = @template_dir + 'table_of_contents.rhtml'
530
+ return unless template_file.exist?
527
531
 
528
- debug_msg "Rendering the Table of Contents..."
532
+ debug_msg "Rendering the Table of Contents..."
529
533
 
530
- out_file = @outputdir + 'table_of_contents.html'
531
- rel_prefix = @outputdir.relative_path_from out_file.dirname
532
- search_index_rel_prefix = rel_prefix
533
- search_index_rel_prefix += @asset_rel_path if @file_output
534
+ out_file = @outputdir + 'table_of_contents.html'
535
+ rel_prefix = @outputdir.relative_path_from out_file.dirname
536
+ search_index_rel_prefix = rel_prefix
537
+ search_index_rel_prefix += @asset_rel_path if @file_output
534
538
 
535
- asset_rel_prefix = rel_prefix + @asset_rel_path
539
+ asset_rel_prefix = rel_prefix + @asset_rel_path
536
540
 
537
- @title = "Table of Contents - #{@options.title}"
541
+ @title = "Table of Contents - #{@options.title}"
538
542
 
539
- render_template template_file, out_file do |io|
540
- here = binding
541
- # suppress 1.9.3 warning
542
- here.local_variable_set(:asset_rel_prefix, asset_rel_prefix)
543
- here
544
- end
545
- rescue => e
546
- error = RDoc::Error.new \
547
- "error generating table_of_contents.html: #{e.message} (#{e.class})"
548
- error.set_backtrace e.backtrace
543
+ render_template template_file, out_file do |io|
544
+ here = binding
545
+ # suppress 1.9.3 warning
546
+ here.local_variable_set(:asset_rel_prefix, asset_rel_prefix)
547
+ here
548
+ end
549
+ rescue => e
550
+ error = Error.new \
551
+ "error generating table_of_contents.html: #{e.message} (#{e.class})"
552
+ error.set_backtrace e.backtrace
549
553
 
550
- raise error
551
- end
554
+ raise error
555
+ end
552
556
 
553
- def install_rdoc_static_file(source, destination, options) # :nodoc:
554
- return unless source.exist?
557
+ def install_rdoc_static_file(source, destination, options) # :nodoc:
558
+ return unless source.exist?
555
559
 
556
- begin
557
- FileUtils.mkdir_p File.dirname(destination), **options
560
+ begin
561
+ FileUtils.mkdir_p File.dirname(destination), **options
558
562
 
559
- begin
560
- FileUtils.ln source, destination, **options
561
- rescue Errno::EEXIST
562
- FileUtils.rm destination
563
- retry
563
+ begin
564
+ FileUtils.ln source, destination, **options
565
+ rescue Errno::EEXIST
566
+ FileUtils.rm destination
567
+ retry
568
+ end
569
+ rescue
570
+ FileUtils.cp source, destination, **options
571
+ end
564
572
  end
565
- rescue
566
- FileUtils.cp source, destination, **options
567
- end
568
- end
569
573
 
570
- ##
571
- # Prepares for generation of output from the current directory
574
+ ##
575
+ # Prepares for generation of output from the current directory
572
576
 
573
- def setup
574
- return if instance_variable_defined? :@outputdir
577
+ def setup
578
+ return if instance_variable_defined? :@outputdir
575
579
 
576
- @outputdir = Pathname.new(@options.op_dir).expand_path @base_dir
580
+ @outputdir = Pathname.new(@options.op_dir).expand_path @base_dir
577
581
 
578
- return unless @store
582
+ return unless @store
579
583
 
580
- refresh_store_data
581
- end
584
+ refresh_store_data
585
+ end
582
586
 
583
- ##
584
- # Refreshes the generator's data from the store. Called by #setup and
585
- # can be called again after the store has been updated (e.g. in server
586
- # mode after re-parsing changed files).
587
+ ##
588
+ # Refreshes the generator's data from the store. Called by #setup and
589
+ # can be called again after the store has been updated (e.g. in server
590
+ # mode after re-parsing changed files).
587
591
 
588
- def refresh_store_data
589
- @classes = @store.all_classes_and_modules.sort
590
- @files = @store.all_files.sort
591
- @methods = @classes.flat_map { |m| m.method_list }.sort
592
- @modsort = get_sorted_module_list @classes
593
- end
592
+ def refresh_store_data
593
+ @classes = @store.all_classes_and_modules.sort
594
+ @files = @store.all_files.sort
595
+ @methods = @classes.flat_map { |m| m.method_list }.sort
596
+ @modsort = get_sorted_module_list @classes
597
+ end
594
598
 
595
- ##
596
- # Creates a template from its components and the +body_file+.
597
- #
598
- # For backwards compatibility, if +body_file+ contains "<html" the body is
599
- # used directly.
599
+ ##
600
+ # Creates a template from its components and the +body_file+.
601
+ #
602
+ # For backwards compatibility, if +body_file+ contains "<html" the body is
603
+ # used directly.
600
604
 
601
- def assemble_template(body_file)
602
- body = body_file.read
603
- return body if body =~ /<html/
605
+ def assemble_template(body_file)
606
+ body = body_file.read(encoding: template_encoding)
607
+ return body if body =~ /<html/
604
608
 
605
- head_file = @template_dir + '_head.rhtml'
609
+ head_file = @template_dir + '_head.rhtml'
606
610
 
607
- <<-TEMPLATE
611
+ <<-TEMPLATE
608
612
  <!DOCTYPE html>
609
613
 
610
614
  <html lang="#{@options.locale&.name || 'en'}">
611
615
  <head>
612
- #{head_file.read}
616
+ #{head_file.read(encoding: template_encoding)}
613
617
 
614
618
  #{body}
615
619
  TEMPLATE
616
- end
620
+ end
617
621
 
618
- ##
619
- # Renders the ERb contained in +file_name+ relative to the template
620
- # directory and returns the result based on the current context.
622
+ ##
623
+ # Renders the ERb contained in +file_name+ relative to the template
624
+ # directory and returns the result based on the current context.
621
625
 
622
- def render(file_name)
623
- template_file = @template_dir + file_name
626
+ def render(file_name)
627
+ template_file = @template_dir + file_name
624
628
 
625
- template = template_for template_file, false, RDoc::ERBPartial
629
+ template = template_for template_file, false, ERBPartial
626
630
 
627
- template.filename = template_file.to_s
631
+ template.filename = template_file.to_s
628
632
 
629
- template.result @context
630
- end
633
+ template.result @context
634
+ end
631
635
 
632
- ##
633
- # Load and render the erb template in the given +template_file+ and write
634
- # it out to +out_file+.
635
- #
636
- # Both +template_file+ and +out_file+ should be Pathname-like objects.
637
- #
638
- # An io will be yielded which must be captured by binding in the caller.
636
+ ##
637
+ # Load and render the erb template in the given +template_file+ and write
638
+ # it out to +out_file+.
639
+ #
640
+ # Both +template_file+ and +out_file+ should be Pathname-like objects.
641
+ #
642
+ # An io will be yielded which must be captured by binding in the caller.
639
643
 
640
- def render_template(template_file, out_file = nil) # :yield: io
641
- io_output = out_file && !@dry_run && @file_output
642
- erb_klass = io_output ? RDoc::ERBIO : ERB
644
+ def render_template(template_file, out_file = nil) # :yield: io
645
+ io_output = out_file && !@dry_run && @file_output
646
+ erb_klass = io_output ? ERBIO : ERB
643
647
 
644
- template = template_for template_file, true, erb_klass
648
+ template = template_for template_file, true, erb_klass
645
649
 
646
- if io_output then
647
- debug_msg "Outputting to %s" % [out_file.expand_path]
650
+ if io_output
651
+ debug_msg "Outputting to %s" % [out_file.expand_path]
648
652
 
649
- out_file.dirname.mkpath
650
- out_file.open 'w', 0644 do |io|
651
- io.set_encoding @options.encoding
653
+ out_file.dirname.mkpath
654
+ out_file.open 'w', 0644 do |io|
655
+ io.set_encoding @options.encoding
652
656
 
653
- @context = yield io
657
+ @context = yield io
654
658
 
655
- template_result template, @context, template_file
656
- end
657
- else
658
- @context = yield nil
659
+ template_result template, @context, template_file
660
+ end
661
+ else
662
+ @context = yield nil
659
663
 
660
- output = template_result template, @context, template_file
664
+ output = template_result template, @context, template_file
661
665
 
662
- debug_msg " would have written %d characters to %s" % [
663
- output.length, out_file.expand_path
664
- ] if @dry_run
666
+ debug_msg " would have written %d characters to %s" % [
667
+ output.length, out_file.expand_path
668
+ ] if @dry_run
665
669
 
666
- output
667
- end
668
- end
670
+ output
671
+ end
672
+ end
669
673
 
670
- ##
671
- # Creates the result for +template+ with +context+. If an error is raised a
672
- # Pathname +template_file+ will indicate the file where the error occurred.
673
-
674
- def template_result(template, context, template_file)
675
- template.filename = template_file.to_s
676
- template.result context
677
- rescue NoMethodError => e
678
- raise RDoc::Error, "Error while evaluating %s: %s" % [
679
- template_file.expand_path,
680
- e.message,
681
- ], e.backtrace
682
- end
674
+ ##
675
+ # Creates the result for +template+ with +context+. If an error is raised a
676
+ # Pathname +template_file+ will indicate the file where the error occurred.
677
+
678
+ def template_result(template, context, template_file)
679
+ template.filename = template_file.to_s
680
+ template.result context
681
+ rescue NoMethodError => e
682
+ raise Error, "Error while evaluating %s: %s" % [
683
+ template_file.expand_path,
684
+ e.message,
685
+ ], e.backtrace
686
+ end
683
687
 
684
- ##
685
- # Retrieves a cache template for +file+, if present, or fills the cache.
688
+ ##
689
+ # Retrieves a cache template for +file+, if present, or fills the cache.
686
690
 
687
- def template_for(file, page = true, klass = ERB)
688
- template = @template_cache[file]
691
+ def template_for(file, page = true, klass = ERB)
692
+ template = @template_cache[file]
689
693
 
690
- return template if template
694
+ return template if template
691
695
 
692
- if page then
693
- template = assemble_template file
694
- erbout = 'io'
695
- else
696
- template = file.read
697
- template = template.encode @options.encoding
696
+ if page
697
+ template = assemble_template file
698
+ erbout = 'io'
699
+ else
700
+ template = file.read(encoding: template_encoding)
701
+ template = template.encode @options.encoding
698
702
 
699
- file_var = File.basename(file).sub(/\..*/, '')
703
+ file_var = File.basename(file).sub(/\..*/, '')
700
704
 
701
- erbout = "_erbout_#{file_var}"
702
- end
705
+ erbout = "_erbout_#{file_var}"
706
+ end
703
707
 
704
- template = klass.new template, trim_mode: '-', eoutvar: erbout
705
- @template_cache[file] = template
706
- template
707
- end
708
+ template = klass.new template, trim_mode: '-', eoutvar: erbout
709
+ @template_cache[file] = template
710
+ template
711
+ end
708
712
 
709
- # :stopdoc:
710
- ParagraphExcerptRegexpOther = %r[\b\w[^./:]++\.]
711
- # use \p/\P{letter} instead of \w/\W in Unicode
712
- ParagraphExcerptRegexpUnicode = %r[\b\p{letter}[^./:]++\.]
713
- # :startdoc:
714
-
715
- # Returns an excerpt of the comment for usage in meta description tags
716
- def excerpt(comment)
717
- text = case comment
718
- when RDoc::Comment
719
- comment.text
720
- else
721
- comment
722
- end
713
+ # :stopdoc:
714
+ ParagraphExcerptRegexpOther = %r[\b\w[^./:]++\.]
715
+ # use \p/\P{letter} instead of \w/\W in Unicode
716
+ ParagraphExcerptRegexpUnicode = %r[\b\p{letter}[^./:]++\.]
717
+ # :startdoc:
718
+
719
+ # Returns an excerpt of the comment for usage in meta description tags
720
+ def excerpt(comment)
721
+ text = case comment
722
+ when Comment
723
+ comment.text
724
+ else
725
+ comment
726
+ end
723
727
 
724
- # Match from a capital letter to the first period, discarding any links, so
725
- # that we don't end up matching badges in the README
726
- pattern = ParagraphExcerptRegexpUnicode
727
- begin
728
- first_paragraph_match = text.match(pattern)
729
- rescue Encoding::CompatibilityError
730
- # The doc is non-ASCII text and encoded in other than Unicode base encodings.
731
- raise if pattern == ParagraphExcerptRegexpOther
732
- pattern = ParagraphExcerptRegexpOther
733
- retry
734
- end
735
- return text[0...150].tr_s("\n", " ").squeeze(" ") unless first_paragraph_match
728
+ # Match from a capital letter to the first period, discarding any links, so
729
+ # that we don't end up matching badges in the README
730
+ pattern = ParagraphExcerptRegexpUnicode
731
+ begin
732
+ first_paragraph_match = text.match(pattern)
733
+ rescue ::Encoding::CompatibilityError
734
+ # The doc is non-ASCII text and encoded in other than Unicode base encodings.
735
+ raise if pattern == ParagraphExcerptRegexpOther
736
+ pattern = ParagraphExcerptRegexpOther
737
+ retry
738
+ end
739
+ return text[0...150].tr_s("\n", " ").squeeze(" ") unless first_paragraph_match
736
740
 
737
- extracted_text = first_paragraph_match[0]
738
- second_paragraph = text.match(pattern, first_paragraph_match.end(0))
739
- extracted_text << " " << second_paragraph[0] if second_paragraph
741
+ extracted_text = first_paragraph_match[0]
742
+ second_paragraph = text.match(pattern, first_paragraph_match.end(0))
743
+ extracted_text << " " << second_paragraph[0] if second_paragraph
740
744
 
741
- extracted_text[0...150].tr_s("\n", " ").squeeze(" ")
742
- end
745
+ extracted_text[0...150].tr_s("\n", " ").squeeze(" ")
746
+ end
743
747
 
744
- def generate_ancestor_list(ancestors, klass)
745
- return '' if ancestors.empty?
748
+ def generate_ancestor_list(ancestors, klass)
749
+ return '' if ancestors.empty?
746
750
 
747
- ancestor = ancestors.shift
748
- content = +'<ul><li>'
751
+ ancestor = ancestors.shift
752
+ content = +'<ul><li>'
749
753
 
750
- if ancestor.is_a?(RDoc::NormalClass)
751
- content << "<a href=\"#{klass.aref_to ancestor.path}\">#{ancestor.full_name}</a>"
752
- else
753
- content << ancestor.to_s
754
- end
754
+ if ancestor.is_a?(NormalClass)
755
+ content << "<a href=\"#{klass.aref_to ancestor.path}\">#{ancestor.full_name}</a>"
756
+ else
757
+ content << ancestor.to_s
758
+ end
755
759
 
756
- # Recursively call the method for the remaining ancestors
757
- content << generate_ancestor_list(ancestors, klass)
760
+ # Recursively call the method for the remaining ancestors
761
+ content << generate_ancestor_list(ancestors, klass)
758
762
 
759
- content << '</li></ul>'
760
- end
763
+ content << '</li></ul>'
764
+ end
761
765
 
762
- def generate_class_link(klass, rel_prefix)
763
- if klass.display?
764
- %(<code><a href="#{rel_prefix}/#{klass.path}">#{klass.name}</a></code>)
765
- else
766
- %(<code>#{klass.name}</code>)
767
- end
768
- end
766
+ def generate_class_link(klass, rel_prefix)
767
+ if klass.display?
768
+ %(<code><a href="#{rel_prefix}/#{klass.path}">#{klass.name}</a></code>)
769
+ else
770
+ %(<code>#{klass.name}</code>)
771
+ end
772
+ end
769
773
 
770
- def generate_class_index_content(classes, rel_prefix)
771
- grouped_classes = group_classes_by_namespace_for_sidebar(classes)
772
- return '' unless top = grouped_classes[nil]
774
+ def generate_class_index_content(classes, rel_prefix)
775
+ grouped_classes = group_classes_by_namespace_for_sidebar(classes)
776
+ return '' unless top = grouped_classes[nil]
773
777
 
774
- solo = top.one? { |klass| klass.display? }
775
- traverse_classes(top, grouped_classes, rel_prefix, solo)
776
- end
778
+ solo = top.one? { |klass| klass.display? }
779
+ traverse_classes(top, grouped_classes, rel_prefix, solo)
780
+ end
777
781
 
778
- def traverse_classes(klasses, grouped_classes, rel_prefix, solo = false)
779
- content = +'<ul class="link-list nav-list">'
782
+ def traverse_classes(klasses, grouped_classes, rel_prefix, solo = false)
783
+ content = +'<ul class="link-list nav-list">'
784
+
785
+ klasses.each do |index_klass|
786
+ if children = grouped_classes[index_klass.full_name]
787
+ content << %(<li><details#{solo ? ' open' : ''}><summary>#{generate_class_link(index_klass, rel_prefix)}</summary>)
788
+ content << traverse_classes(children, grouped_classes, rel_prefix)
789
+ content << '</details></li>'
790
+ solo = false
791
+ elsif index_klass.display?
792
+ content << %(<li>#{generate_class_link(index_klass, rel_prefix)}</li>)
793
+ end
794
+ end
780
795
 
781
- klasses.each do |index_klass|
782
- if children = grouped_classes[index_klass.full_name]
783
- content << %(<li><details#{solo ? ' open' : ''}><summary>#{generate_class_link(index_klass, rel_prefix)}</summary>)
784
- content << traverse_classes(children, grouped_classes, rel_prefix)
785
- content << '</details></li>'
786
- solo = false
787
- elsif index_klass.display?
788
- content << %(<li>#{generate_class_link(index_klass, rel_prefix)}</li>)
796
+ "#{content}</ul>"
789
797
  end
790
- end
791
798
 
792
- "#{content}</ul>"
793
- end
799
+ def group_classes_by_namespace_for_sidebar(classes)
800
+ grouped_classes = classes.group_by do |klass|
801
+ klass.full_name[/\A[^:]++(?:::[^:]++(?=::))*+(?=::[^:]*+\z)/]
802
+ end.select do |_, klasses|
803
+ klasses.any?(&:display?)
804
+ end
794
805
 
795
- def group_classes_by_namespace_for_sidebar(classes)
796
- grouped_classes = classes.group_by do |klass|
797
- klass.full_name[/\A[^:]++(?:::[^:]++(?=::))*+(?=::[^:]*+\z)/]
798
- end.select do |_, klasses|
799
- klasses.any?(&:display?)
800
- end
806
+ grouped_classes.values.each(&:uniq!)
807
+ grouped_classes
808
+ end
801
809
 
802
- grouped_classes.values.each(&:uniq!)
803
- grouped_classes
804
- end
810
+ private
805
811
 
806
- private
812
+ def template_encoding
813
+ nil
814
+ end
807
815
 
808
- def nesting_namespaces_to_class_modules(klass)
809
- tree = {}
816
+ def nesting_namespaces_to_class_modules(klass)
817
+ tree = {}
810
818
 
811
- klass.nesting_namespaces.zip(klass.fully_qualified_nesting_namespaces) do |ns, fqns|
812
- tree[ns] = @store.classes_hash[fqns] || @store.modules_hash[fqns]
813
- end
819
+ klass.nesting_namespaces.zip(klass.fully_qualified_nesting_namespaces) do |ns, fqns|
820
+ tree[ns] = @store.classes_hash[fqns] || @store.modules_hash[fqns]
821
+ end
814
822
 
815
- tree
816
- end
823
+ tree
824
+ end
817
825
 
818
- def generate_nesting_namespaces_breadcrumb(klass, rel_prefix)
819
- nesting_namespaces_to_class_modules(klass).map do |namespace, class_module|
820
- path = class_module ? (rel_prefix + class_module.path).to_s : ""
821
- { name: namespace, path: path, self: klass.full_name == class_module&.full_name }
826
+ def generate_nesting_namespaces_breadcrumb(klass, rel_prefix)
827
+ nesting_namespaces_to_class_modules(klass).map do |namespace, class_module|
828
+ path = class_module ? (rel_prefix + class_module.path).to_s : ""
829
+ { name: namespace, path: path, self: klass.full_name == class_module&.full_name }
830
+ end
831
+ end
822
832
  end
823
833
  end
824
834
  end