rdoc 7.2.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.
- checksums.yaml +4 -4
- data/CONTRIBUTING.md +4 -7
- data/LICENSE.rdoc +4 -0
- data/README.md +43 -2
- data/RI.md +75 -75
- data/doc/markup_reference/markdown.md +104 -3
- data/exe/rdoc +2 -2
- data/lib/rdoc/code_object/alias.rb +70 -74
- data/lib/rdoc/code_object/any_method.rb +305 -298
- data/lib/rdoc/code_object/attr.rb +150 -143
- data/lib/rdoc/code_object/class_module.rb +801 -765
- data/lib/rdoc/code_object/constant.rb +178 -150
- data/lib/rdoc/code_object/context/section.rb +133 -160
- data/lib/rdoc/code_object/context.rb +925 -952
- data/lib/rdoc/code_object/extend.rb +7 -5
- data/lib/rdoc/code_object/include.rb +7 -5
- data/lib/rdoc/code_object/method_attr.rb +325 -324
- data/lib/rdoc/code_object/mixin.rb +97 -95
- data/lib/rdoc/code_object/normal_class.rb +77 -78
- data/lib/rdoc/code_object/normal_module.rb +61 -59
- data/lib/rdoc/code_object/require.rb +23 -39
- data/lib/rdoc/code_object/single_class.rb +21 -19
- data/lib/rdoc/code_object/top_level.rb +212 -213
- data/lib/rdoc/code_object.rb +305 -305
- data/lib/rdoc/comment.rb +274 -337
- data/lib/rdoc/cross_reference.rb +194 -212
- data/lib/rdoc/encoding.rb +105 -103
- data/lib/rdoc/erb_partial.rb +13 -11
- data/lib/rdoc/erbio.rb +29 -27
- data/lib/rdoc/generator/aliki.rb +165 -140
- data/lib/rdoc/generator/darkfish.rb +647 -631
- data/lib/rdoc/generator/json_index.rb +233 -229
- data/lib/rdoc/generator/markup.rb +165 -122
- data/lib/rdoc/generator/pot/message_extractor.rb +57 -51
- data/lib/rdoc/generator/pot/po.rb +52 -51
- data/lib/rdoc/generator/pot/po_entry.rb +138 -132
- data/lib/rdoc/generator/pot.rb +85 -81
- data/lib/rdoc/generator/ri.rb +23 -19
- data/lib/rdoc/generator/template/aliki/DESIGN.md +538 -0
- data/lib/rdoc/generator/template/aliki/_aside_toc.rhtml +1 -1
- data/lib/rdoc/generator/template/aliki/_footer.rhtml +1 -1
- data/lib/rdoc/generator/template/aliki/_head.rhtml +11 -11
- data/lib/rdoc/generator/template/aliki/_header.rhtml +29 -44
- data/lib/rdoc/generator/template/aliki/_sidebar_extends.rhtml +8 -6
- data/lib/rdoc/generator/template/aliki/_sidebar_includes.rhtml +8 -6
- data/lib/rdoc/generator/template/aliki/_sidebar_installed.rhtml +1 -1
- data/lib/rdoc/generator/template/aliki/_sidebar_pages.rhtml +2 -2
- data/lib/rdoc/generator/template/aliki/_sidebar_search.rhtml +4 -4
- data/lib/rdoc/generator/template/aliki/_sidebar_sections.rhtml +1 -1
- data/lib/rdoc/generator/template/aliki/_sidebar_toggle.rhtml +1 -1
- data/lib/rdoc/generator/template/aliki/class.rhtml +56 -46
- data/lib/rdoc/generator/template/aliki/css/rdoc.css +538 -283
- data/lib/rdoc/generator/template/aliki/index.rhtml +1 -1
- data/lib/rdoc/generator/template/aliki/js/aliki.js +80 -102
- data/lib/rdoc/generator/template/aliki/page.rhtml +1 -1
- data/lib/rdoc/generator/template/aliki/servlet_not_found.rhtml +1 -1
- data/lib/rdoc/generator/template/aliki/servlet_root.rhtml +2 -2
- data/lib/rdoc/generator/template/darkfish/_footer.rhtml +1 -1
- data/lib/rdoc/generator/template/darkfish/_sidebar_extends.rhtml +8 -6
- data/lib/rdoc/generator/template/darkfish/_sidebar_includes.rhtml +8 -6
- data/lib/rdoc/generator/template/darkfish/_sidebar_installed.rhtml +1 -1
- data/lib/rdoc/generator/template/darkfish/_sidebar_pages.rhtml +1 -1
- data/lib/rdoc/generator/template/darkfish/_sidebar_sections.rhtml +1 -1
- data/lib/rdoc/generator/template/darkfish/_sidebar_table_of_contents.rhtml +5 -5
- data/lib/rdoc/generator/template/darkfish/class.rhtml +18 -21
- data/lib/rdoc/generator/template/darkfish/css/rdoc.css +0 -1
- data/lib/rdoc/generator/template/darkfish/table_of_contents.rhtml +3 -3
- data/lib/rdoc/generator.rb +48 -46
- data/lib/rdoc/i18n/locale.rb +99 -95
- data/lib/rdoc/i18n/text.rb +109 -105
- data/lib/rdoc/i18n.rb +7 -5
- data/lib/rdoc/markdown/byte_runtime.rb +80 -0
- data/lib/rdoc/markdown.kpeg +30 -21
- data/lib/rdoc/markdown.rb +329 -151
- data/lib/rdoc/markup/block_quote.rb +12 -8
- data/lib/rdoc/markup/document.rb +127 -123
- data/lib/rdoc/markup/formatter.rb +215 -221
- data/lib/rdoc/markup/heading.rb +1 -4
- data/lib/rdoc/markup/include.rb +33 -29
- data/lib/rdoc/markup/indented_paragraph.rb +37 -33
- data/lib/rdoc/markup/inline_parser.rb +281 -277
- data/lib/rdoc/markup/list.rb +80 -88
- data/lib/rdoc/markup/list_item.rb +73 -85
- data/lib/rdoc/markup/paragraph.rb +23 -19
- data/lib/rdoc/markup/parser.rb +501 -497
- data/lib/rdoc/markup/pre_process.rb +284 -305
- data/lib/rdoc/markup/raw.rb +2 -2
- data/lib/rdoc/markup/rule.rb +16 -12
- data/lib/rdoc/markup/to_ansi.rb +143 -139
- data/lib/rdoc/markup/to_bs.rb +72 -68
- data/lib/rdoc/markup/to_html.rb +600 -493
- data/lib/rdoc/markup/to_html_crossref.rb +221 -191
- data/lib/rdoc/markup/to_html_snippet.rb +232 -227
- data/lib/rdoc/markup/to_joined_paragraph.rb +40 -41
- data/lib/rdoc/markup/to_label.rb +63 -59
- data/lib/rdoc/markup/to_markdown.rb +212 -208
- data/lib/rdoc/markup/to_rdoc.rb +336 -332
- data/lib/rdoc/markup/to_table_of_contents.rb +66 -62
- data/lib/rdoc/markup/to_test.rb +60 -56
- data/lib/rdoc/markup/to_tt_only.rb +83 -86
- data/lib/rdoc/markup/verbatim.rb +62 -58
- data/lib/rdoc/markup.rb +198 -196
- data/lib/rdoc/options.rb +1063 -1076
- data/lib/rdoc/parser/c.rb +1039 -1036
- data/lib/rdoc/parser/changelog.rb +319 -315
- data/lib/rdoc/parser/markdown.rb +17 -13
- data/lib/rdoc/parser/rbs.rb +279 -0
- data/lib/rdoc/parser/rd.rb +17 -13
- data/lib/rdoc/parser/ruby.rb +1231 -2222
- data/lib/rdoc/parser/ruby_colorizer.rb +303 -0
- data/lib/rdoc/parser/simple.rb +31 -27
- data/lib/rdoc/parser/text.rb +12 -8
- data/lib/rdoc/parser.rb +230 -221
- data/lib/rdoc/rbs_helper.rb +186 -0
- data/lib/rdoc/rd/inline.rb +57 -53
- data/lib/rdoc/rd.rb +90 -88
- data/lib/rdoc/rdoc.rb +547 -366
- data/lib/rdoc/ri/driver.rb +1141 -1130
- data/lib/rdoc/ri/formatter.rb +7 -3
- data/lib/rdoc/ri/paths.rb +140 -136
- data/lib/rdoc/ri/servlet.rb +456 -0
- data/lib/rdoc/ri/store.rb +4 -2
- data/lib/rdoc/ri/task.rb +55 -51
- data/lib/rdoc/ri.rb +14 -11
- data/lib/rdoc/rubygems_hook.rb +194 -192
- data/lib/rdoc/server.rb +462 -0
- data/lib/rdoc/stats/normal.rb +46 -42
- data/lib/rdoc/stats/quiet.rb +39 -35
- data/lib/rdoc/stats/verbose.rb +35 -31
- data/lib/rdoc/stats.rb +363 -338
- data/lib/rdoc/store.rb +919 -725
- data/lib/rdoc/task.rb +260 -255
- data/lib/rdoc/text.rb +130 -245
- data/lib/rdoc/token_stream.rb +101 -115
- data/lib/rdoc/tom_doc.rb +203 -201
- data/lib/rdoc/version.rb +1 -1
- data/lib/rdoc.rb +35 -7
- data/lib/rubygems_plugin.rb +2 -11
- data/rdoc-logo.svg +43 -0
- data/rdoc.gemspec +6 -4
- metadata +36 -20
- data/lib/rdoc/code_object/anon_class.rb +0 -10
- data/lib/rdoc/code_object/ghost_method.rb +0 -6
- data/lib/rdoc/code_object/meta_method.rb +0 -6
- data/lib/rdoc/markdown/literals.kpeg +0 -21
- data/lib/rdoc/markdown/literals.rb +0 -454
- data/lib/rdoc/parser/prism_ruby.rb +0 -1112
- data/lib/rdoc/parser/ripper_state_lex.rb +0 -302
- data/lib/rdoc/parser/ruby_tools.rb +0 -163
- data/lib/rdoc/servlet.rb +0 -452
data/lib/rdoc/text.rb
CHANGED
|
@@ -5,57 +5,30 @@
|
|
|
5
5
|
|
|
6
6
|
require 'strscan'
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
# Methods for manipulating comment text
|
|
10
|
-
|
|
11
|
-
module RDoc::Text
|
|
12
|
-
|
|
8
|
+
module RDoc
|
|
13
9
|
##
|
|
14
|
-
#
|
|
15
|
-
# markers.
|
|
10
|
+
# Methods for manipulating comment text
|
|
16
11
|
|
|
17
|
-
|
|
12
|
+
module Text
|
|
18
13
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
14
|
+
##
|
|
15
|
+
# The language for this text. This affects stripping comments
|
|
16
|
+
# markers.
|
|
22
17
|
|
|
23
|
-
|
|
24
|
-
'markdown' => RDoc::Markdown,
|
|
25
|
-
'rdoc' => RDoc::Markup,
|
|
26
|
-
'rd' => RDoc::RD,
|
|
27
|
-
'tomdoc' => RDoc::TomDoc,
|
|
28
|
-
}
|
|
18
|
+
attr_accessor :language
|
|
29
19
|
|
|
30
|
-
|
|
20
|
+
##
|
|
21
|
+
# Maps markup formats to classes that can parse them. If the format is
|
|
22
|
+
# unknown, "rdoc" format is used.
|
|
31
23
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
TO_HTML_CHARACTERS = Hash.new do |h, encoding|
|
|
39
|
-
h[encoding] = {
|
|
40
|
-
:close_dquote => encode_fallback('”', encoding, '"'),
|
|
41
|
-
:close_squote => encode_fallback('’', encoding, '\''),
|
|
42
|
-
:copyright => encode_fallback('©', encoding, '(c)'),
|
|
43
|
-
:ellipsis => encode_fallback('…', encoding, '...'),
|
|
44
|
-
:em_dash => encode_fallback('—', encoding, '---'),
|
|
45
|
-
:en_dash => encode_fallback('–', encoding, '--'),
|
|
46
|
-
:open_dquote => encode_fallback('“', encoding, '"'),
|
|
47
|
-
:open_squote => encode_fallback('‘', encoding, '\''),
|
|
48
|
-
:trademark => encode_fallback('®', encoding, '(r)'),
|
|
24
|
+
MARKUP_FORMAT = {
|
|
25
|
+
'markdown' => Markdown,
|
|
26
|
+
'rdoc' => Markup,
|
|
27
|
+
'rd' => RD,
|
|
28
|
+
'tomdoc' => TomDoc,
|
|
49
29
|
}
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
##
|
|
53
|
-
# Transcodes +character+ to +encoding+ with a +fallback+ character.
|
|
54
30
|
|
|
55
|
-
|
|
56
|
-
character.encode(encoding, :fallback => { character => fallback },
|
|
57
|
-
:undef => :replace, :replace => fallback)
|
|
58
|
-
end
|
|
31
|
+
MARKUP_FORMAT.default = Markup
|
|
59
32
|
|
|
60
33
|
##
|
|
61
34
|
# Expands tab characters in +text+ to eight spaces
|
|
@@ -66,7 +39,7 @@ module RDoc::Text
|
|
|
66
39
|
text.each_line do |line|
|
|
67
40
|
nil while line.gsub!(/(?:\G|\r)((?:.{8})*?)([^\t\r\n]{0,7})\t/) do
|
|
68
41
|
r = "#{$1}#{$2}#{' ' * (8 - $2.size)}"
|
|
69
|
-
r =
|
|
42
|
+
r = Encoding.change_encoding r, text.encoding
|
|
70
43
|
r
|
|
71
44
|
end
|
|
72
45
|
|
|
@@ -76,249 +49,160 @@ module RDoc::Text
|
|
|
76
49
|
expanded.join
|
|
77
50
|
end
|
|
78
51
|
|
|
79
|
-
|
|
80
|
-
|
|
52
|
+
##
|
|
53
|
+
# Flush +text+ left based on the shortest line
|
|
81
54
|
|
|
82
|
-
|
|
83
|
-
|
|
55
|
+
def flush_left(text)
|
|
56
|
+
indent = 9999
|
|
84
57
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
58
|
+
text.each_line do |line|
|
|
59
|
+
line_indent = line =~ /\S/ || 9999
|
|
60
|
+
indent = line_indent if indent > line_indent
|
|
61
|
+
end
|
|
89
62
|
|
|
90
|
-
|
|
91
|
-
|
|
63
|
+
empty = ''
|
|
64
|
+
empty = Encoding.change_encoding empty, text.encoding
|
|
92
65
|
|
|
93
|
-
|
|
94
|
-
|
|
66
|
+
text.gsub(/^ {0,#{indent}}/, empty)
|
|
67
|
+
end
|
|
95
68
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
69
|
+
##
|
|
70
|
+
# Convert a string in markup format into HTML.
|
|
71
|
+
#
|
|
72
|
+
# Requires the including class to implement #formatter
|
|
100
73
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
74
|
+
def markup(text)
|
|
75
|
+
if @store.options
|
|
76
|
+
locale = @store.options.locale
|
|
77
|
+
else
|
|
78
|
+
locale = nil
|
|
79
|
+
end
|
|
80
|
+
if locale
|
|
81
|
+
i18n_text = I18n::Text.new(text)
|
|
82
|
+
text = i18n_text.translate(locale)
|
|
83
|
+
end
|
|
84
|
+
parse(text).accept formatter
|
|
110
85
|
end
|
|
111
|
-
parse(text).accept formatter
|
|
112
|
-
end
|
|
113
86
|
|
|
114
|
-
|
|
115
|
-
|
|
87
|
+
##
|
|
88
|
+
# Strips hashes, expands tabs then flushes +text+ to the left
|
|
116
89
|
|
|
117
|
-
|
|
118
|
-
|
|
90
|
+
def normalize_comment(text)
|
|
91
|
+
return text if text.empty?
|
|
119
92
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
93
|
+
case language
|
|
94
|
+
when :ruby
|
|
95
|
+
text = strip_hashes text
|
|
96
|
+
when :c
|
|
97
|
+
text = strip_stars text
|
|
98
|
+
end
|
|
99
|
+
text = expand_tabs text
|
|
100
|
+
text = flush_left text
|
|
101
|
+
text = strip_newlines text
|
|
102
|
+
text
|
|
125
103
|
end
|
|
126
|
-
text = expand_tabs text
|
|
127
|
-
text = flush_left text
|
|
128
|
-
text = strip_newlines text
|
|
129
|
-
text
|
|
130
|
-
end
|
|
131
|
-
|
|
132
|
-
##
|
|
133
|
-
# Normalizes +text+ then builds a RDoc::Markup::Document from it
|
|
134
104
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
return text.parse if RDoc::Comment === text
|
|
105
|
+
##
|
|
106
|
+
# Normalizes +text+ then builds a RDoc::Markup::Document from it
|
|
138
107
|
|
|
139
|
-
|
|
108
|
+
def parse(text, format = 'rdoc')
|
|
109
|
+
return text if Markup::Document === text
|
|
110
|
+
return text.parse if Comment === text
|
|
140
111
|
|
|
141
|
-
|
|
112
|
+
text = normalize_comment text # TODO remove, should not be necessary
|
|
142
113
|
|
|
143
|
-
|
|
144
|
-
end
|
|
114
|
+
return Markup::Document.new if text =~ /\A\n*\z/
|
|
145
115
|
|
|
146
|
-
|
|
147
|
-
|
|
116
|
+
MARKUP_FORMAT[format].parse text
|
|
117
|
+
end
|
|
148
118
|
|
|
149
|
-
|
|
150
|
-
|
|
119
|
+
##
|
|
120
|
+
# The first +limit+ characters of +text+ as HTML
|
|
151
121
|
|
|
152
|
-
|
|
153
|
-
|
|
122
|
+
def snippet(text, limit = 100)
|
|
123
|
+
document = parse text
|
|
154
124
|
|
|
155
|
-
|
|
156
|
-
|
|
125
|
+
Markup::ToHtmlSnippet.new(limit).convert document
|
|
126
|
+
end
|
|
157
127
|
|
|
158
|
-
|
|
159
|
-
|
|
128
|
+
##
|
|
129
|
+
# Strips leading # characters from +text+
|
|
160
130
|
|
|
161
|
-
|
|
162
|
-
|
|
131
|
+
def strip_hashes(text)
|
|
132
|
+
return text if text =~ /^(?>\s*)[^\#]/
|
|
163
133
|
|
|
164
|
-
|
|
165
|
-
|
|
134
|
+
empty = ''
|
|
135
|
+
empty = Encoding.change_encoding empty, text.encoding
|
|
166
136
|
|
|
167
|
-
|
|
168
|
-
|
|
137
|
+
text.gsub(/^\s*(#+)/) { $1.tr '#', ' ' }.gsub(/^\s+$/, empty)
|
|
138
|
+
end
|
|
169
139
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
end
|
|
140
|
+
##
|
|
141
|
+
# Strips leading and trailing \n characters from +text+
|
|
173
142
|
|
|
174
|
-
|
|
175
|
-
|
|
143
|
+
def strip_newlines(text)
|
|
144
|
+
text.gsub(/\A\n*(.*?)\n*\z/m) do $1 end # block preserves String encoding
|
|
145
|
+
end
|
|
176
146
|
|
|
177
|
-
|
|
178
|
-
|
|
147
|
+
##
|
|
148
|
+
# Strips /* */ style comments
|
|
179
149
|
|
|
180
|
-
|
|
150
|
+
def strip_stars(text)
|
|
151
|
+
return text unless text =~ %r%/\*.*\*/%m
|
|
181
152
|
|
|
182
|
-
|
|
153
|
+
encoding = text.encoding
|
|
183
154
|
|
|
184
|
-
|
|
185
|
-
space = RDoc::Encoding.change_encoding space, encoding if encoding
|
|
155
|
+
text = text.gsub %r%Document-method:\s+[\w:.#=!?|^&<>~+\-/*\%@`\[\]]+%, ''
|
|
186
156
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
text.gsub! %r%^[ \t]*\*%m do space * $&.length end
|
|
157
|
+
space = ' '
|
|
158
|
+
space = Encoding.change_encoding space, encoding if encoding
|
|
190
159
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
end
|
|
160
|
+
text.sub! %r%/\*+% do space * $&.length end
|
|
161
|
+
text.sub! %r%\*+/% do space * $&.length end
|
|
162
|
+
text.gsub! %r%^[ \t]*\*%m do space * $&.length end
|
|
195
163
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
164
|
+
empty = ''
|
|
165
|
+
empty = Encoding.change_encoding empty, encoding if encoding
|
|
166
|
+
text.gsub(/^\s+$/, empty)
|
|
167
|
+
end
|
|
199
168
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
# trademark symbols in +text+ to properly encoded characters.
|
|
203
|
-
|
|
204
|
-
def to_html_characters(text)
|
|
205
|
-
html = (''.encode text.encoding).dup
|
|
206
|
-
|
|
207
|
-
encoded = RDoc::Text::TO_HTML_CHARACTERS[text.encoding]
|
|
208
|
-
|
|
209
|
-
s = StringScanner.new text
|
|
210
|
-
insquotes = false
|
|
211
|
-
indquotes = false
|
|
212
|
-
after_word = nil
|
|
213
|
-
|
|
214
|
-
until s.eos? do
|
|
215
|
-
case
|
|
216
|
-
when s.scan(/<(tt|code)>.*?<\/\1>/) then # skip contents of tt
|
|
217
|
-
html << s.matched
|
|
218
|
-
when s.scan(/<(tt|code)>.*?/) then
|
|
219
|
-
warn "mismatched <#{s[1]}> tag" # TODO signal file/line
|
|
220
|
-
html << s.matched
|
|
221
|
-
when s.scan(/<[^>]+\/?s*>/) then # skip HTML tags
|
|
222
|
-
html << s.matched
|
|
223
|
-
when s.scan(/\.\.\.(\.?)/) then
|
|
224
|
-
html << s[1] << encoded[:ellipsis]
|
|
225
|
-
after_word = nil
|
|
226
|
-
when s.scan(/\(c\)/i) then
|
|
227
|
-
html << encoded[:copyright]
|
|
228
|
-
after_word = nil
|
|
229
|
-
when s.scan(/\(r\)/i) then
|
|
230
|
-
html << encoded[:trademark]
|
|
231
|
-
after_word = nil
|
|
232
|
-
when s.scan(/---/) then
|
|
233
|
-
html << encoded[:em_dash]
|
|
234
|
-
after_word = nil
|
|
235
|
-
when s.scan(/--/) then
|
|
236
|
-
html << encoded[:en_dash]
|
|
237
|
-
after_word = nil
|
|
238
|
-
when s.scan(/"|"/) then
|
|
239
|
-
html << encoded[indquotes ? :close_dquote : :open_dquote]
|
|
240
|
-
indquotes = !indquotes
|
|
241
|
-
after_word = nil
|
|
242
|
-
when s.scan(/``/) then # backtick double quote
|
|
243
|
-
html << encoded[:open_dquote]
|
|
244
|
-
after_word = nil
|
|
245
|
-
when s.scan(/(?:'|'){2}/) then # tick double quote
|
|
246
|
-
html << encoded[:close_dquote]
|
|
247
|
-
after_word = nil
|
|
248
|
-
when s.scan(/`/) then # backtick
|
|
249
|
-
if insquotes or after_word
|
|
250
|
-
html << '`'
|
|
251
|
-
after_word = false
|
|
252
|
-
else
|
|
253
|
-
html << encoded[:open_squote]
|
|
254
|
-
insquotes = true
|
|
255
|
-
end
|
|
256
|
-
when s.scan(/'|'/) then # single quote
|
|
257
|
-
if insquotes
|
|
258
|
-
html << encoded[:close_squote]
|
|
259
|
-
insquotes = false
|
|
260
|
-
elsif after_word
|
|
261
|
-
# Mary's dog, my parents' house: do not start paired quotes
|
|
262
|
-
html << encoded[:close_squote]
|
|
263
|
-
else
|
|
264
|
-
html << encoded[:open_squote]
|
|
265
|
-
insquotes = true
|
|
266
|
-
end
|
|
169
|
+
##
|
|
170
|
+
# Wraps +txt+ to +line_len+
|
|
267
171
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
172
|
+
def wrap(txt, line_len = 76)
|
|
173
|
+
res = []
|
|
174
|
+
sp = 0
|
|
175
|
+
ep = txt.length
|
|
271
176
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
177
|
+
while sp < ep
|
|
178
|
+
# scan back for a space
|
|
179
|
+
p = sp + line_len - 1
|
|
180
|
+
if p >= ep
|
|
181
|
+
p = ep
|
|
275
182
|
else
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
##
|
|
286
|
-
# Wraps +txt+ to +line_len+
|
|
287
|
-
|
|
288
|
-
def wrap(txt, line_len = 76)
|
|
289
|
-
res = []
|
|
290
|
-
sp = 0
|
|
291
|
-
ep = txt.length
|
|
292
|
-
|
|
293
|
-
while sp < ep
|
|
294
|
-
# scan back for a space
|
|
295
|
-
p = sp + line_len - 1
|
|
296
|
-
if p >= ep
|
|
297
|
-
p = ep
|
|
298
|
-
else
|
|
299
|
-
while p > sp and txt[p] != ?\s
|
|
300
|
-
p -= 1
|
|
301
|
-
end
|
|
302
|
-
if p <= sp
|
|
303
|
-
p = sp + line_len
|
|
304
|
-
while p < ep and txt[p] != ?\s
|
|
305
|
-
p += 1
|
|
183
|
+
while p > sp and txt[p] != ?\s
|
|
184
|
+
p -= 1
|
|
185
|
+
end
|
|
186
|
+
if p <= sp
|
|
187
|
+
p = sp + line_len
|
|
188
|
+
while p < ep and txt[p] != ?\s
|
|
189
|
+
p += 1
|
|
190
|
+
end
|
|
306
191
|
end
|
|
307
192
|
end
|
|
193
|
+
res << txt[sp...p] << "\n"
|
|
194
|
+
sp = p
|
|
195
|
+
sp += 1 while sp < ep and txt[sp] == ?\s
|
|
308
196
|
end
|
|
309
|
-
res << txt[sp...p] << "\n"
|
|
310
|
-
sp = p
|
|
311
|
-
sp += 1 while sp < ep and txt[sp] == ?\s
|
|
312
|
-
end
|
|
313
197
|
|
|
314
|
-
|
|
315
|
-
|
|
198
|
+
res.join.strip
|
|
199
|
+
end
|
|
316
200
|
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
201
|
+
##
|
|
202
|
+
# Character class to be separated by a space when concatenating
|
|
203
|
+
# lines.
|
|
320
204
|
|
|
321
|
-
|
|
205
|
+
SPACE_SEPARATED_LETTER_CLASS = /[\p{Nd}\p{Lc}\p{Pc}]|[!-~&&\W]/
|
|
322
206
|
|
|
323
207
|
##
|
|
324
208
|
# Converts +text+ to a GitHub-style anchor ID:
|
|
@@ -358,4 +242,5 @@ module RDoc::Text
|
|
|
358
242
|
label
|
|
359
243
|
end
|
|
360
244
|
|
|
245
|
+
end
|
|
361
246
|
end
|
data/lib/rdoc/token_stream.rb
CHANGED
|
@@ -1,126 +1,112 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
# A TokenStream is a list of tokens, gathered during the parse of some entity
|
|
5
|
-
# (say a method). Entities populate these streams by being registered with the
|
|
6
|
-
# lexer. Any class can collect tokens by including TokenStream. From the
|
|
7
|
-
# outside, you use such an object by calling the start_collecting_tokens
|
|
8
|
-
# method, followed by calls to add_token and pop_token.
|
|
9
|
-
|
|
10
|
-
module RDoc::TokenStream
|
|
11
|
-
|
|
3
|
+
module RDoc
|
|
12
4
|
##
|
|
13
|
-
#
|
|
14
|
-
#
|
|
15
|
-
#
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
5
|
+
# A TokenStream is a list of tokens, gathered during the parse of some entity
|
|
6
|
+
# (say a method). Entities populate these streams by being registered with the
|
|
7
|
+
# lexer. Any class can collect tokens by including TokenStream. From the
|
|
8
|
+
# outside, you use such an object by calling the start_collecting_tokens
|
|
9
|
+
# method, followed by calls to add_token and pop_token.
|
|
10
|
+
|
|
11
|
+
module TokenStream
|
|
12
|
+
|
|
13
|
+
##
|
|
14
|
+
# Converts +token_stream+ to HTML wrapping various tokens with
|
|
15
|
+
# <tt><span></tt> elements. Some tokens types are wrapped in spans
|
|
16
|
+
# with the given class names. Other token types are not wrapped in spans.
|
|
17
|
+
|
|
18
|
+
def self.to_html(token_stream)
|
|
19
|
+
token_stream.map do |t|
|
|
20
|
+
next unless t
|
|
21
|
+
|
|
22
|
+
style = case t[:kind]
|
|
23
|
+
when :operator then 'ruby-operator'
|
|
24
|
+
when :keyword then 'ruby-keyword'
|
|
25
|
+
when :constant then 'ruby-constant'
|
|
26
|
+
when :ivar then 'ruby-ivar'
|
|
27
|
+
when :comment then 'ruby-comment'
|
|
28
|
+
when :value then 'ruby-value'
|
|
29
|
+
when :string then 'ruby-string'
|
|
30
|
+
when :symbol then 'ruby-value'
|
|
31
|
+
when :x_string then 'ruby-string'
|
|
32
|
+
when :regexp then 'ruby-regexp'
|
|
33
|
+
when :identifier then 'ruby-identifier'
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
text = t[:text]
|
|
37
|
+
|
|
38
|
+
text = CGI.escapeHTML text
|
|
39
|
+
|
|
40
|
+
if style
|
|
41
|
+
end_with_newline = text.end_with?("\n")
|
|
42
|
+
text = text.chomp if end_with_newline
|
|
43
|
+
"<span class=\"#{style}\">#{text}</span>#{"\n" if end_with_newline}"
|
|
44
|
+
else
|
|
45
|
+
text
|
|
46
|
+
end
|
|
47
|
+
end.join
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
##
|
|
51
|
+
# Adds +tokens+ to the collected tokens
|
|
52
|
+
|
|
53
|
+
def add_tokens(tokens)
|
|
54
|
+
token_stream.concat(tokens)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
##
|
|
58
|
+
# Adds one +token+ to the collected tokens
|
|
59
|
+
|
|
60
|
+
def add_token(token)
|
|
61
|
+
token_stream.push(token)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
##
|
|
65
|
+
# Starts collecting tokens
|
|
66
|
+
#
|
|
67
|
+
# The optional +loader+ is called once on first access and its result is reused.
|
|
68
|
+
|
|
69
|
+
def collect_tokens(language, loader: nil)
|
|
70
|
+
@token_stream = []
|
|
71
|
+
@token_stream_loader = loader
|
|
72
|
+
@token_stream_language = language
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
alias start_collecting_tokens collect_tokens
|
|
76
|
+
|
|
77
|
+
##
|
|
78
|
+
# Remove the last token from the collected tokens
|
|
79
|
+
|
|
80
|
+
def pop_token
|
|
81
|
+
token_stream.pop
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
##
|
|
85
|
+
# Current token stream
|
|
86
|
+
|
|
87
|
+
def token_stream
|
|
88
|
+
if @token_stream_loader
|
|
89
|
+
@token_stream = @token_stream_loader.call
|
|
90
|
+
@token_stream_loader = nil
|
|
57
91
|
end
|
|
92
|
+
@token_stream
|
|
93
|
+
end
|
|
58
94
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
if style then
|
|
62
|
-
end_with_newline = text.end_with?("\n")
|
|
63
|
-
text = text.chomp if end_with_newline
|
|
64
|
-
"<span class=\"#{style}\">#{text}</span>#{"\n" if end_with_newline}"
|
|
65
|
-
else
|
|
66
|
-
text
|
|
67
|
-
end
|
|
68
|
-
end.join
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
##
|
|
72
|
-
# Adds +tokens+ to the collected tokens
|
|
73
|
-
|
|
74
|
-
def add_tokens(tokens)
|
|
75
|
-
@token_stream.concat(tokens)
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
##
|
|
79
|
-
# Adds one +token+ to the collected tokens
|
|
80
|
-
|
|
81
|
-
def add_token(token)
|
|
82
|
-
@token_stream.push(token)
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
##
|
|
86
|
-
# Starts collecting tokens
|
|
87
|
-
#
|
|
88
|
-
|
|
89
|
-
def collect_tokens(language)
|
|
90
|
-
@token_stream = []
|
|
91
|
-
@token_stream_language = language
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
alias start_collecting_tokens collect_tokens
|
|
95
|
-
|
|
96
|
-
##
|
|
97
|
-
# Remove the last token from the collected tokens
|
|
98
|
-
|
|
99
|
-
def pop_token
|
|
100
|
-
@token_stream.pop
|
|
101
|
-
end
|
|
95
|
+
##
|
|
96
|
+
# Returns a string representation of the token stream
|
|
102
97
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
def token_stream
|
|
107
|
-
@token_stream
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
##
|
|
111
|
-
# Returns a string representation of the token stream
|
|
98
|
+
def tokens_to_s
|
|
99
|
+
(token_stream or return '').compact.map { |token| token[:text] }.join ''
|
|
100
|
+
end
|
|
112
101
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
102
|
+
##
|
|
103
|
+
# Returns the source language of the token stream as a string
|
|
104
|
+
#
|
|
105
|
+
# Returns 'c' or 'ruby'
|
|
116
106
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
# Returns 'c' or 'ruby'
|
|
107
|
+
def source_language
|
|
108
|
+
@token_stream_language == :c ? 'c' : 'ruby'
|
|
109
|
+
end
|
|
121
110
|
|
|
122
|
-
def source_language
|
|
123
|
-
@token_stream_language == :c ? 'c' : 'ruby'
|
|
124
111
|
end
|
|
125
|
-
|
|
126
112
|
end
|