rdoc-f95 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +4 -0
- data/Manifest.txt +79 -0
- data/PostInstall.txt +7 -0
- data/README.rdoc +147 -0
- data/Rakefile +28 -0
- data/bin/rdoc-f95 +70 -0
- data/lib/rdoc-f95.rb +306 -0
- data/lib/rdoc-f95/code_objects.rb +776 -0
- data/lib/rdoc-f95/diagram.rb +342 -0
- data/lib/rdoc-f95/dot.rb +249 -0
- data/lib/rdoc-f95/generator.rb +1088 -0
- data/lib/rdoc-f95/generator/chm.rb +113 -0
- data/lib/rdoc-f95/generator/chm/chm.rb +98 -0
- data/lib/rdoc-f95/generator/html.rb +370 -0
- data/lib/rdoc-f95/generator/html/hefss.rb +414 -0
- data/lib/rdoc-f95/generator/html/html.rb +708 -0
- data/lib/rdoc-f95/generator/html/kilmer.rb +418 -0
- data/lib/rdoc-f95/generator/html/one_page_html.rb +121 -0
- data/lib/rdoc-f95/generator/ri.rb +229 -0
- data/lib/rdoc-f95/generator/xhtml.rb +106 -0
- data/lib/rdoc-f95/generator/xhtml/ctop.xsl +1318 -0
- data/lib/rdoc-f95/generator/xhtml/mathml.xsl +42 -0
- data/lib/rdoc-f95/generator/xhtml/pmathml.xsl +612 -0
- data/lib/rdoc-f95/generator/xhtml/pmathmlcss.xsl +872 -0
- data/lib/rdoc-f95/generator/xhtml/xhtml.rb +732 -0
- data/lib/rdoc-f95/generator/xml.rb +120 -0
- data/lib/rdoc-f95/generator/xml/rdf.rb +113 -0
- data/lib/rdoc-f95/generator/xml/xml.rb +111 -0
- data/lib/rdoc-f95/install.rb +166 -0
- data/lib/rdoc-f95/markup.rb +506 -0
- data/lib/rdoc-f95/markup/formatter.rb +14 -0
- data/lib/rdoc-f95/markup/fragments.rb +337 -0
- data/lib/rdoc-f95/markup/inline.rb +361 -0
- data/lib/rdoc-f95/markup/install.rb +57 -0
- data/lib/rdoc-f95/markup/lines.rb +152 -0
- data/lib/rdoc-f95/markup/mathml_wrapper.rb +91 -0
- data/lib/rdoc-f95/markup/preprocess.rb +71 -0
- data/lib/rdoc-f95/markup/sample/rdoc2latex.rb +16 -0
- data/lib/rdoc-f95/markup/sample/sample.rb +42 -0
- data/lib/rdoc-f95/markup/to_flow.rb +185 -0
- data/lib/rdoc-f95/markup/to_html.rb +357 -0
- data/lib/rdoc-f95/markup/to_html_crossref.rb +123 -0
- data/lib/rdoc-f95/markup/to_latex.rb +328 -0
- data/lib/rdoc-f95/markup/to_test.rb +50 -0
- data/lib/rdoc-f95/markup/to_xhtml_texparser.rb +234 -0
- data/lib/rdoc-f95/options.rb +745 -0
- data/lib/rdoc-f95/parsers/parse_c.rb +775 -0
- data/lib/rdoc-f95/parsers/parse_f95.rb +2499 -0
- data/lib/rdoc-f95/parsers/parse_rb.rb +2587 -0
- data/lib/rdoc-f95/parsers/parse_simple.rb +39 -0
- data/lib/rdoc-f95/parsers/parserfactory.rb +99 -0
- data/lib/rdoc-f95/ri.rb +2 -0
- data/lib/rdoc-f95/ri/cache.rb +188 -0
- data/lib/rdoc-f95/ri/descriptions.rb +147 -0
- data/lib/rdoc-f95/ri/display.rb +244 -0
- data/lib/rdoc-f95/ri/driver.rb +435 -0
- data/lib/rdoc-f95/ri/formatter.rb +603 -0
- data/lib/rdoc-f95/ri/paths.rb +105 -0
- data/lib/rdoc-f95/ri/reader.rb +106 -0
- data/lib/rdoc-f95/ri/util.rb +81 -0
- data/lib/rdoc-f95/ri/writer.rb +64 -0
- data/lib/rdoc-f95/stats.rb +23 -0
- data/lib/rdoc-f95/template.rb +64 -0
- data/lib/rdoc-f95/tokenstream.rb +33 -0
- data/lib/rdoc-f95/usage.rb +210 -0
- data/script/console +10 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/test/test_helper.rb +3 -0
- data/test/test_rdoc-f95.rb +11 -0
- metadata +156 -0
@@ -0,0 +1,328 @@
|
|
1
|
+
require 'rdoc-f95/markup/formatter'
|
2
|
+
require 'rdoc-f95/markup/fragments'
|
3
|
+
require 'rdoc-f95/markup/inline'
|
4
|
+
|
5
|
+
require 'cgi'
|
6
|
+
|
7
|
+
##
|
8
|
+
# Convert SimpleMarkup to basic LaTeX report format.
|
9
|
+
|
10
|
+
class RDocF95::Markup::ToLaTeX < RDocF95::Markup::Formatter
|
11
|
+
|
12
|
+
BS = "\020" # \
|
13
|
+
OB = "\021" # {
|
14
|
+
CB = "\022" # }
|
15
|
+
DL = "\023" # Dollar
|
16
|
+
|
17
|
+
BACKSLASH = "#{BS}symbol#{OB}92#{CB}"
|
18
|
+
HAT = "#{BS}symbol#{OB}94#{CB}"
|
19
|
+
BACKQUOTE = "#{BS}symbol#{OB}0#{CB}"
|
20
|
+
TILDE = "#{DL}#{BS}sim#{DL}"
|
21
|
+
LESSTHAN = "#{DL}<#{DL}"
|
22
|
+
GREATERTHAN = "#{DL}>#{DL}"
|
23
|
+
|
24
|
+
def self.l(str)
|
25
|
+
str.tr('\\', BS).tr('{', OB).tr('}', CB).tr('$', DL)
|
26
|
+
end
|
27
|
+
|
28
|
+
def l(arg)
|
29
|
+
RDocF95::Markup::ToLaTeX.l(arg)
|
30
|
+
end
|
31
|
+
|
32
|
+
LIST_TYPE_TO_LATEX = {
|
33
|
+
:BULLET => [ l("\\begin{itemize}"), l("\\end{itemize}") ],
|
34
|
+
:NUMBER => [ l("\\begin{enumerate}"), l("\\end{enumerate}"), "\\arabic" ],
|
35
|
+
:UPPERALPHA => [ l("\\begin{enumerate}"), l("\\end{enumerate}"), "\\Alph" ],
|
36
|
+
:LOWERALPHA => [ l("\\begin{enumerate}"), l("\\end{enumerate}"), "\\alph" ],
|
37
|
+
:LABELED => [ l("\\begin{description}"), l("\\end{description}") ],
|
38
|
+
:NOTE => [
|
39
|
+
l("\\begin{tabularx}{\\linewidth}{@{} l X @{}}"),
|
40
|
+
l("\\end{tabularx}") ],
|
41
|
+
}
|
42
|
+
|
43
|
+
InlineTag = Struct.new(:bit, :on, :off)
|
44
|
+
|
45
|
+
def initialize
|
46
|
+
init_tags
|
47
|
+
@list_depth = 0
|
48
|
+
@prev_list_types = []
|
49
|
+
end
|
50
|
+
|
51
|
+
##
|
52
|
+
# Set up the standard mapping of attributes to LaTeX
|
53
|
+
|
54
|
+
def init_tags
|
55
|
+
@attr_tags = [
|
56
|
+
InlineTag.new(RDocF95::Markup::Attribute.bitmap_for(:BOLD), l("\\textbf{"), l("}")),
|
57
|
+
InlineTag.new(RDocF95::Markup::Attribute.bitmap_for(:TT), l("\\texttt{"), l("}")),
|
58
|
+
InlineTag.new(RDocF95::Markup::Attribute.bitmap_for(:EM), l("\\emph{"), l("}")),
|
59
|
+
]
|
60
|
+
end
|
61
|
+
|
62
|
+
##
|
63
|
+
# Escape a LaTeX string
|
64
|
+
|
65
|
+
def escape(str)
|
66
|
+
$stderr.print "FE: ", str if $DEBUG_RDOC
|
67
|
+
s = str.
|
68
|
+
sub(/\s+$/, '').
|
69
|
+
gsub(/([_\${}&%#])/, "#{BS}\\1").
|
70
|
+
gsub(/\\/, BACKSLASH).
|
71
|
+
gsub(/\^/, HAT).
|
72
|
+
gsub(/~/, TILDE).
|
73
|
+
gsub(/</, LESSTHAN).
|
74
|
+
gsub(/>/, GREATERTHAN).
|
75
|
+
gsub(/,,/, ",{},").
|
76
|
+
gsub(/\`/, BACKQUOTE)
|
77
|
+
$stderr.print "-> ", s, "\n" if $DEBUG_RDOC
|
78
|
+
s
|
79
|
+
end
|
80
|
+
|
81
|
+
##
|
82
|
+
# Add a new set of LaTeX tags for an attribute. We allow
|
83
|
+
# separate start and end tags for flexibility
|
84
|
+
|
85
|
+
def add_tag(name, start, stop)
|
86
|
+
@attr_tags << InlineTag.new(RDocF95::Markup::Attribute.bitmap_for(name), start, stop)
|
87
|
+
end
|
88
|
+
|
89
|
+
##
|
90
|
+
# Here's the client side of the visitor pattern
|
91
|
+
|
92
|
+
def start_accepting
|
93
|
+
@res = ""
|
94
|
+
@in_list_entry = []
|
95
|
+
end
|
96
|
+
|
97
|
+
def end_accepting
|
98
|
+
@res.tr(BS, '\\').tr(OB, '{').tr(CB, '}').tr(DL, '$')
|
99
|
+
end
|
100
|
+
|
101
|
+
def accept_paragraph(am, fragment)
|
102
|
+
@res << wrap(convert_flow(am.flow(fragment.txt)))
|
103
|
+
@res << "\n"
|
104
|
+
end
|
105
|
+
|
106
|
+
def accept_verbatim(am, fragment)
|
107
|
+
@res << "\n\\begin{code}\n"
|
108
|
+
@res << fragment.txt.sub(/[\n\s]+\Z/, '')
|
109
|
+
@res << "\n\\end{code}\n\n"
|
110
|
+
end
|
111
|
+
|
112
|
+
def accept_rule(am, fragment)
|
113
|
+
size = fragment.param
|
114
|
+
size = 10 if size > 10
|
115
|
+
@res << "\n\n\\rule{\\linewidth}{#{size}pt}\n\n"
|
116
|
+
end
|
117
|
+
|
118
|
+
def accept_list_start(am, fragment)
|
119
|
+
@res << list_name(fragment.type, true) << "\n"
|
120
|
+
@in_list_entry.push false
|
121
|
+
end
|
122
|
+
|
123
|
+
def accept_list_end(am, fragment)
|
124
|
+
if tag = @in_list_entry.pop
|
125
|
+
@res << tag << "\n"
|
126
|
+
end
|
127
|
+
@res << list_name(fragment.type, false) << "\n"
|
128
|
+
end
|
129
|
+
|
130
|
+
def accept_list_item(am, fragment)
|
131
|
+
if tag = @in_list_entry.last
|
132
|
+
@res << tag << "\n"
|
133
|
+
end
|
134
|
+
@res << list_item_start(am, fragment)
|
135
|
+
@res << wrap(convert_flow(am.flow(fragment.txt))) << "\n"
|
136
|
+
@in_list_entry[-1] = list_end_for(fragment.type)
|
137
|
+
end
|
138
|
+
|
139
|
+
def accept_blank_line(am, fragment)
|
140
|
+
# @res << "\n"
|
141
|
+
end
|
142
|
+
|
143
|
+
def accept_heading(am, fragment)
|
144
|
+
@res << convert_heading(fragment.head_level, am.flow(fragment.txt))
|
145
|
+
end
|
146
|
+
|
147
|
+
##
|
148
|
+
# This is a higher speed (if messier) version of wrap
|
149
|
+
|
150
|
+
def wrap(txt, line_len = 76)
|
151
|
+
res = ""
|
152
|
+
sp = 0
|
153
|
+
ep = txt.length
|
154
|
+
while sp < ep
|
155
|
+
# scan back for a space
|
156
|
+
p = sp + line_len - 1
|
157
|
+
if p >= ep
|
158
|
+
p = ep
|
159
|
+
else
|
160
|
+
while p > sp and txt[p] != ?\s
|
161
|
+
p -= 1
|
162
|
+
end
|
163
|
+
if p <= sp
|
164
|
+
p = sp + line_len
|
165
|
+
while p < ep and txt[p] != ?\s
|
166
|
+
p += 1
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
res << txt[sp...p] << "\n"
|
171
|
+
sp = p
|
172
|
+
sp += 1 while sp < ep and txt[sp] == ?\s
|
173
|
+
end
|
174
|
+
res
|
175
|
+
end
|
176
|
+
|
177
|
+
private
|
178
|
+
|
179
|
+
def on_tags(res, item)
|
180
|
+
attr_mask = item.turn_on
|
181
|
+
return if attr_mask.zero?
|
182
|
+
|
183
|
+
@attr_tags.each do |tag|
|
184
|
+
if attr_mask & tag.bit != 0
|
185
|
+
res << tag.on
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
def off_tags(res, item)
|
191
|
+
attr_mask = item.turn_off
|
192
|
+
return if attr_mask.zero?
|
193
|
+
|
194
|
+
@attr_tags.reverse_each do |tag|
|
195
|
+
if attr_mask & tag.bit != 0
|
196
|
+
res << tag.off
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
def convert_flow(flow)
|
202
|
+
res = ""
|
203
|
+
flow.each do |item|
|
204
|
+
case item
|
205
|
+
when String
|
206
|
+
$stderr.puts "Converting '#{item}'" if $DEBUG_RDOC
|
207
|
+
res << convert_string(item)
|
208
|
+
when AttrChanger
|
209
|
+
off_tags(res, item)
|
210
|
+
on_tags(res, item)
|
211
|
+
when Special
|
212
|
+
res << convert_special(item)
|
213
|
+
else
|
214
|
+
raise "Unknown flow element: #{item.inspect}"
|
215
|
+
end
|
216
|
+
end
|
217
|
+
res
|
218
|
+
end
|
219
|
+
|
220
|
+
##
|
221
|
+
# some of these patterns are taken from SmartyPants...
|
222
|
+
|
223
|
+
def convert_string(item)
|
224
|
+
escape(item).
|
225
|
+
|
226
|
+
# convert ... to elipsis (and make sure .... becomes .<elipsis>)
|
227
|
+
gsub(/\.\.\.\./, '.\ldots{}').gsub(/\.\.\./, '\ldots{}').
|
228
|
+
|
229
|
+
# convert single closing quote
|
230
|
+
gsub(%r{([^ \t\r\n\[\{\(])\'}, '\1\'').
|
231
|
+
gsub(%r{\'(?=\W|s\b)}, "'" ).
|
232
|
+
|
233
|
+
# convert single opening quote
|
234
|
+
gsub(/'/, '`').
|
235
|
+
|
236
|
+
# convert double closing quote
|
237
|
+
gsub(%r{([^ \t\r\n\[\{\(])\"(?=\W)}, "\\1''").
|
238
|
+
|
239
|
+
# convert double opening quote
|
240
|
+
gsub(/"/, "``").
|
241
|
+
|
242
|
+
# convert copyright
|
243
|
+
gsub(/\(c\)/, '\copyright{}')
|
244
|
+
|
245
|
+
end
|
246
|
+
|
247
|
+
def convert_special(special)
|
248
|
+
handled = false
|
249
|
+
Attribute.each_name_of(special.type) do |name|
|
250
|
+
method_name = "handle_special_#{name}"
|
251
|
+
if self.respond_to? method_name
|
252
|
+
special.text = send(method_name, special)
|
253
|
+
handled = true
|
254
|
+
end
|
255
|
+
end
|
256
|
+
raise "Unhandled special: #{special}" unless handled
|
257
|
+
special.text
|
258
|
+
end
|
259
|
+
|
260
|
+
def convert_heading(level, flow)
|
261
|
+
res =
|
262
|
+
case level
|
263
|
+
when 1 then "\\chapter{"
|
264
|
+
when 2 then "\\section{"
|
265
|
+
when 3 then "\\subsection{"
|
266
|
+
when 4 then "\\subsubsection{"
|
267
|
+
else "\\paragraph{"
|
268
|
+
end +
|
269
|
+
convert_flow(flow) +
|
270
|
+
"}\n"
|
271
|
+
end
|
272
|
+
|
273
|
+
def list_name(list_type, is_open_tag)
|
274
|
+
tags = LIST_TYPE_TO_LATEX[list_type] || raise("Invalid list type: #{list_type.inspect}")
|
275
|
+
if tags[2] # enumerate
|
276
|
+
if is_open_tag
|
277
|
+
@list_depth += 1
|
278
|
+
if @prev_list_types[@list_depth] != tags[2]
|
279
|
+
case @list_depth
|
280
|
+
when 1
|
281
|
+
roman = "i"
|
282
|
+
when 2
|
283
|
+
roman = "ii"
|
284
|
+
when 3
|
285
|
+
roman = "iii"
|
286
|
+
when 4
|
287
|
+
roman = "iv"
|
288
|
+
else
|
289
|
+
raise("Too deep list: level #{@list_depth}")
|
290
|
+
end
|
291
|
+
@prev_list_types[@list_depth] = tags[2]
|
292
|
+
return l("\\renewcommand{\\labelenum#{roman}}{#{tags[2]}{enum#{roman}}}") + "\n" + tags[0]
|
293
|
+
end
|
294
|
+
else
|
295
|
+
@list_depth -= 1
|
296
|
+
end
|
297
|
+
end
|
298
|
+
tags[ is_open_tag ? 0 : 1]
|
299
|
+
end
|
300
|
+
|
301
|
+
def list_item_start(am, fragment)
|
302
|
+
case fragment.type
|
303
|
+
when :BULLET, :NUMBER, :UPPERALPHA, :LOWERALPHA then
|
304
|
+
"\\item "
|
305
|
+
|
306
|
+
when :LABELED then
|
307
|
+
"\\item[" + convert_flow(am.flow(fragment.param)) + "] "
|
308
|
+
|
309
|
+
when :NOTE then
|
310
|
+
convert_flow(am.flow(fragment.param)) + " & "
|
311
|
+
else
|
312
|
+
raise "Invalid list type"
|
313
|
+
end
|
314
|
+
end
|
315
|
+
|
316
|
+
def list_end_for(fragment_type)
|
317
|
+
case fragment_type
|
318
|
+
when :BULLET, :NUMBER, :UPPERALPHA, :LOWERALPHA, :LABELED then
|
319
|
+
""
|
320
|
+
when :NOTE
|
321
|
+
"\\\\\n"
|
322
|
+
else
|
323
|
+
raise "Invalid list type"
|
324
|
+
end
|
325
|
+
end
|
326
|
+
|
327
|
+
end
|
328
|
+
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'rdoc-f95/markup'
|
2
|
+
require 'rdoc-f95/markup/formatter'
|
3
|
+
|
4
|
+
##
|
5
|
+
# This Markup outputter is used for testing purposes.
|
6
|
+
|
7
|
+
class RDocF95::Markup::ToTest < RDocF95::Markup::Formatter
|
8
|
+
|
9
|
+
def start_accepting
|
10
|
+
@res = []
|
11
|
+
end
|
12
|
+
|
13
|
+
def end_accepting
|
14
|
+
@res
|
15
|
+
end
|
16
|
+
|
17
|
+
def accept_paragraph(am, fragment)
|
18
|
+
@res << fragment.to_s
|
19
|
+
end
|
20
|
+
|
21
|
+
def accept_verbatim(am, fragment)
|
22
|
+
@res << fragment.to_s
|
23
|
+
end
|
24
|
+
|
25
|
+
def accept_list_start(am, fragment)
|
26
|
+
@res << fragment.to_s
|
27
|
+
end
|
28
|
+
|
29
|
+
def accept_list_end(am, fragment)
|
30
|
+
@res << fragment.to_s
|
31
|
+
end
|
32
|
+
|
33
|
+
def accept_list_item(am, fragment)
|
34
|
+
@res << fragment.to_s
|
35
|
+
end
|
36
|
+
|
37
|
+
def accept_blank_line(am, fragment)
|
38
|
+
@res << fragment.to_s
|
39
|
+
end
|
40
|
+
|
41
|
+
def accept_heading(am, fragment)
|
42
|
+
@res << fragment.to_s
|
43
|
+
end
|
44
|
+
|
45
|
+
def accept_rule(am, fragment)
|
46
|
+
@res << fragment.to_s
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
@@ -0,0 +1,234 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'rdoc-f95/markup/to_html_crossref'
|
3
|
+
require 'rdoc-f95/markup/mathml_wrapper'
|
4
|
+
|
5
|
+
##
|
6
|
+
#<b>Note that Japanese and English are described in parallel.</b>
|
7
|
+
#
|
8
|
+
#== TeX �ο����� MathML ���Ѵ�
|
9
|
+
#
|
10
|
+
#TeX �ǵ��Ҥ��줿������ MathML ���Ѵ����ޤ�.
|
11
|
+
#����饤���ɽ�����������, TeX �ο�����ʲ��Τ褦�� $ ... $ �Ǥ����ä�
|
12
|
+
#���Ҥ��Ƥ�������. $ ��
|
13
|
+
#����ˤ�Ⱦ�Ѷ�����ʸ���ʾ�����Ʋ�����.
|
14
|
+
#(�ʤ�, "$ID: ... $" �� "$LOG: ... $
|
15
|
+
#�Ȥ��ä�, CVS �Υ�����ɤȤ���
|
16
|
+
#�Ѥ����Ƥ�������Ͽ����Ȥ��ư����ޤ���.)
|
17
|
+
#
|
18
|
+
# ����饤���ɽ����������� $ f(x) = x^2 + 1 $ �Τ褦�˵��Ҥ��ޤ�.
|
19
|
+
# ($ ������˶����˺��ʤ�).
|
20
|
+
#
|
21
|
+
#�֥��å���ɽ��������, �ʲ��Τ褦�� \[ ��
|
22
|
+
#\] �ȤǤ����äƵ��Ҥ��Ƥ�������. \[, ��ɬ����Ƭ�˵��Ҥ��Ƥ�������.
|
23
|
+
#
|
24
|
+
# \[
|
25
|
+
# \sum_{i=1}^nf_n(x)
|
26
|
+
# \]
|
27
|
+
#
|
28
|
+
#������ʣ���Ԥ�ɽ��������ˤ�, ���Ԥ�����ʬ�� "\] \[" �Ҥ��Ƥ�������.
|
29
|
+
#
|
30
|
+
# \[
|
31
|
+
# d\zeta/dt + J(\psi,\zeta) = Ra \; dT/dx + \nabla\zeta, \] \[
|
32
|
+
# dT/dt + J(\psi,T) - d\psi/dx = \nabla T, \] \[
|
33
|
+
# \nabla\psi = \zeta
|
34
|
+
# \]
|
35
|
+
#
|
36
|
+
#TeX �ο������� MathML �Ѵ��ˤ�
|
37
|
+
#<b>Ruby �� MathML �饤�֥��ΥС������ 0.8</b> ����Ѥ��Ƥ��ޤ�.
|
38
|
+
#���Υ饤�֥���{�Ҥ餯�ι�˼}[http://www.hinet.mydns.jp/~hiraku/]
|
39
|
+
#�ˤƸ�������Ƥ��ޤ�. ���ѤǤ��� TeX ���ޥ�ɤξܺ٤˴ؤ��Ƥ�
|
40
|
+
#������Υ����ȤȤ��Ƥ�������.
|
41
|
+
#
|
42
|
+
#�������줿�ɥ�����Ȥ��������ݤˤ� MathML ���б�����
|
43
|
+
#�֥饦������Ѥ���ɬ�פ�
|
44
|
+
#����ޤ�. {MathML ���ܸ����}[http://washitake.com/MathML/]
|
45
|
+
#�� {MathML Software - Browsers}[http://www.w3.org/Math/Software/mathml_software_cat_browsers.html]
|
46
|
+
#�ʤɤȤ��Ƥ�������.
|
47
|
+
#
|
48
|
+
#
|
49
|
+
#== TeX is converted to MathML
|
50
|
+
#
|
51
|
+
#TeX formula is converted to MathML.
|
52
|
+
#When inline display, TeX formula should be bundled by $ ... $
|
53
|
+
#as follows.
|
54
|
+
#One or more normal-width blank is necessary before and behind "$".
|
55
|
+
#(The format of CVS keywords, that is "$ID: ... $" or
|
56
|
+
#"$LOG: ... $ etc. is ignored.)
|
57
|
+
#
|
58
|
+
# Inline formula is $ f(x) = x^2 + 1 $ .
|
59
|
+
#
|
60
|
+
#When block display, TeX formula should be bundled by \[ ... \]
|
61
|
+
#as follows.
|
62
|
+
#Describe \[ at the head of line.
|
63
|
+
#
|
64
|
+
# \[
|
65
|
+
# \sum_{i=1}^nf_n(x)
|
66
|
+
# \]
|
67
|
+
#
|
68
|
+
#To write equations across multiple lines, describe "\] \["
|
69
|
+
#as follows.
|
70
|
+
#
|
71
|
+
# \[
|
72
|
+
# d\zeta/dt + J(\psi,\zeta) = Ra \; dT/dx + \nabla\zeta, \] \[
|
73
|
+
# dT/dt + J(\psi,T) - d\psi/dx = \nabla T, \] \[
|
74
|
+
# \nabla\psi = \zeta
|
75
|
+
# \]
|
76
|
+
#
|
77
|
+
#<b>MathML library for Ruby version 0.8</b> is needed to
|
78
|
+
#convert TeX formula to MathML.
|
79
|
+
#This library is available from {Bottega of Hiraku (JAPANESE only)}[http://www.hinet.mydns.jp/~hiraku/].
|
80
|
+
#See this site about available TeX commands.
|
81
|
+
#
|
82
|
+
#When you browse generated documents, you need to use
|
83
|
+
#browers that can handle MathML.
|
84
|
+
#See {MathML Software - Browsers}[http://www.w3.org/Math/Software/mathml_software_cat_browsers.html], etc.
|
85
|
+
#
|
86
|
+
#
|
87
|
+
#== \newcommand, \newenvironment �λ�����ˡ
|
88
|
+
#
|
89
|
+
#\newcommand �� \newenvironment ̿��ˤ��ޥ�������Ѥ���ˤ�,
|
90
|
+
#Ruby �Υ����ɥѥ��ʲ��� '<b><tt>mathml/macro</tt></b>' �ǥ��쥯�ȥ��
|
91
|
+
#������, ���Υǥ��쥯�ȥ�ʲ��˥ޥ���̿������ե�������֤��Ƥ�������.
|
92
|
+
#�ե�����̾���䤤�ޤ���.
|
93
|
+
#
|
94
|
+
#�㤨��, '<tt>/usr/lib/ruby/1.8</tt>' �� Ruby �Υ����ɥѥ��Ǥ�����,
|
95
|
+
#'<tt>/usr/lib/ruby/1.8/mathml</tt>' �����
|
96
|
+
#'<tt>/usr/lib/ruby/1.8/mathml/macro</tt>' �ǥ��쥯�ȥ�������,
|
97
|
+
#���Υǥ��쥯�ȥ�ʲ���, 'D6math.sty' �Ȥ����ե������������ޤ�
|
98
|
+
#(���Ҥ����褦�ˤ��Υե�����̾�ϲ��Ǥ���ޤ���). ���Υե��������
|
99
|
+
#�ʲ��Τ褦�� \newcommand ̿��Ҥ��Ƥ������Ȥ�, '<b>\DP{}{}</b>'
|
100
|
+
#(����ʬ���ñ�˵��Ҥ��뤿��Υޥ���) ���ޥ�ɤ����Ѳ�ǽ�ˤʤ�ޤ�.
|
101
|
+
#
|
102
|
+
# \newcommand{\DP}[2]{\frac{\partial #1}{\partial #2}}
|
103
|
+
#
|
104
|
+
#�ϵ�ή����Ǿ����������Ƥ��� {TeX �ޥ��� (�̾�: ��Ǿ��������)}[http://www.gfd-dennou.org/library/cc-env/TeXmacro/dennou/SIGEN.htm]
|
105
|
+
#�˴ޤޤ�� 'D6math.sty' �� Ruby �� Mathml �饤�֥��ǻ��ѤǤ���褦��
|
106
|
+
#���������ѥå������� libmathml-macro-dennou-ruby[http://www.gfd-dennou.org/library/cc-env/libmathml-macro-dennou-ruby/debian/stable/] �Ȥ���
|
107
|
+
#���Ƥ��ޤ�. ����ץ�Ȥ������Ѥ��ƤߤƤ�������.
|
108
|
+
#
|
109
|
+
#
|
110
|
+
#== Usage of \newcommand and \newenvironment
|
111
|
+
#
|
112
|
+
#If you want to use macros defined by \newcommand and
|
113
|
+
#\newenvironment commands, make '<b><tt>mathml/macro</tt></b>' directory
|
114
|
+
#under load paths of Ruby, and prepare a file that macro commands are
|
115
|
+
#described in the directory. A name of the file is free.
|
116
|
+
#
|
117
|
+
#For example, if your load path of Ruby is '<tt>/usr/lib/ruby/1.8</tt>',
|
118
|
+
#you should make '<tt>/usr/lib/ruby/1.8/mathml</tt>' and
|
119
|
+
#'<tt>/usr/lib/ruby/1.8/mathml/macro</tt>' directories,
|
120
|
+
#and make 'D6math.sty' file (already mentioned, the file name is free).
|
121
|
+
#When you describe a following \newcommand command, you can use
|
122
|
+
#'<b>\DP{}{}</b>' (a macro for partial differentiations) command.
|
123
|
+
#
|
124
|
+
# \newcommand{\DP}[2]{\frac{\partial #1}{\partial #2}}
|
125
|
+
#
|
126
|
+
#As a sample, please use libmathml-macro-dennou-ruby[http://www.gfd-dennou.org/library/cc-env/libmathml-macro-dennou-ruby/debian/stable/].
|
127
|
+
#The original style file is 'D6math.sty' in {TeX macro (Dennou style)}[http://www.gfd-dennou.org/library/cc-env/TeXmacro/dennou/SIGEN.htm].
|
128
|
+
#libmathml-macro-dennou-ruby is a reconfigured package for Mathml library for Ruby.
|
129
|
+
#
|
130
|
+
#
|
131
|
+
class RDocF95::Markup::ToXHtmlTexParser < RDocF95::Markup::ToHtmlCrossref
|
132
|
+
|
133
|
+
attr_accessor :context
|
134
|
+
attr_reader :block_exceptions
|
135
|
+
|
136
|
+
##
|
137
|
+
# We need to record the html path of our caller so we can generate
|
138
|
+
# correct relative paths for any hyperlinks that we find
|
139
|
+
|
140
|
+
def initialize(from_path, context, show_hash, mathml=nil)
|
141
|
+
super(from_path, context, show_hash)
|
142
|
+
@mathml = mathml
|
143
|
+
|
144
|
+
if @mathml
|
145
|
+
# TeX inline form
|
146
|
+
@markup.add_special(/(\$(.*?)[^\\]\$)/im, :TEXINLINE)
|
147
|
+
|
148
|
+
# TeX inline delimiter
|
149
|
+
@markup.add_special(/(\\\$)/im, :TEXINLINEDELIMITER)
|
150
|
+
|
151
|
+
# TeX block form
|
152
|
+
@markup.add_special(/(\\\[(.+?)\\\])/im, :TEXBLOCK)
|
153
|
+
end
|
154
|
+
|
155
|
+
@block_exceptions = []
|
156
|
+
if @markup
|
157
|
+
@block_exceptions << {
|
158
|
+
'name' => :texblockform,
|
159
|
+
'start' => Regexp.new("^\\\\\\["),
|
160
|
+
'end' => Regexp.new("\\\\\\]$"),
|
161
|
+
'replaces' => []
|
162
|
+
}
|
163
|
+
@block_exceptions[0]['replaces'] << {
|
164
|
+
'from' => Regexp.new("\\\\\\\\"),
|
165
|
+
'to' => "\\\\\\\\\\\\\\\\",
|
166
|
+
}
|
167
|
+
end
|
168
|
+
|
169
|
+
end
|
170
|
+
|
171
|
+
def file_location
|
172
|
+
if @context.context.parent
|
173
|
+
class_or_method = @context.context.name
|
174
|
+
end
|
175
|
+
context = @context.context
|
176
|
+
while context.parent
|
177
|
+
context = context.parent
|
178
|
+
end
|
179
|
+
location = context.file_relative_name
|
180
|
+
if class_or_method
|
181
|
+
location += "#"+class_or_method
|
182
|
+
end
|
183
|
+
return location
|
184
|
+
end
|
185
|
+
|
186
|
+
##
|
187
|
+
# TEXINLINE pattern $...$ is converted to MathML format
|
188
|
+
# when --mathml option is given.
|
189
|
+
#
|
190
|
+
def handle_special_TEXINLINE(special)
|
191
|
+
text = special.text
|
192
|
+
return text unless @mathml
|
193
|
+
raw_text = text.scan(/^.*?\$/).to_s.sub(/\$$/, '')
|
194
|
+
return text if text =~ /^.*?\$[A-Z]\w+:/ # CVS keywords are skipped
|
195
|
+
text.sub!(/^.*?\$/, '')
|
196
|
+
text.sub!(/\$$/, '')
|
197
|
+
tex = MathMLWrapper.new
|
198
|
+
mathml, stat = tex.parse(text)
|
199
|
+
if !(stat == 0)
|
200
|
+
$stderr.puts "Warning: in #{file_location}, following TeX commands can not be converted to MathML\n\n",
|
201
|
+
" #{text}\n\n"
|
202
|
+
end
|
203
|
+
return raw_text + mathml
|
204
|
+
end
|
205
|
+
|
206
|
+
##
|
207
|
+
# TEXINLINEDELIMITER pattern "\$" is converted to single dollar "$"
|
208
|
+
# when --mathml option is given.
|
209
|
+
#
|
210
|
+
def handle_special_TEXINLINEDELIMITER(special)
|
211
|
+
text = special.text
|
212
|
+
return text unless @mathml
|
213
|
+
return text.gsub(/\\\$/, '$')
|
214
|
+
end
|
215
|
+
|
216
|
+
##
|
217
|
+
# TEXBLOCK pattern \[...\] is converted to MathML format
|
218
|
+
# when --mathml option is given.
|
219
|
+
#
|
220
|
+
def handle_special_TEXBLOCK(special)
|
221
|
+
text = special.text
|
222
|
+
return text unless @mathml
|
223
|
+
text.sub!(/^\\\[/, '')
|
224
|
+
text.sub!(/\\\]$/, '')
|
225
|
+
tex = MathMLWrapper.new
|
226
|
+
mathml, stat = tex.parse(text, true)
|
227
|
+
if !(stat == 0)
|
228
|
+
$stderr.puts "Warning: in #{file_location}, following TeX commands can not be converted to MathML\n\n",
|
229
|
+
" #{text}\n\n"
|
230
|
+
end
|
231
|
+
return mathml
|
232
|
+
end
|
233
|
+
|
234
|
+
end
|