rd2odt 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. data/FUTURE +63 -0
  2. data/LICENSE +21 -0
  3. data/NEWS +42 -0
  4. data/README +78 -0
  5. data/Rakefile +51 -0
  6. data/bin/rd2odt +4 -0
  7. data/doc/sample/body-text.rd +5 -0
  8. data/doc/sample/enum-list-over-headline-multi-level.rd +10 -0
  9. data/doc/sample/enum-list-over-headline.rd +9 -0
  10. data/doc/sample/enum-list-over-item-list-multi-level-2.rd +9 -0
  11. data/doc/sample/enum-list-over-item-list-multi-level.rd +8 -0
  12. data/doc/sample/enum-list-over-item-list.rd +7 -0
  13. data/doc/sample/headline.rd +60 -0
  14. data/doc/sample/include-file-figure.odt +0 -0
  15. data/doc/sample/include-file-ole-object.odt +0 -0
  16. data/doc/sample/include-file-original-styled-text.odt +0 -0
  17. data/doc/sample/include-file-shape.odt +0 -0
  18. data/doc/sample/include-file-simple-styled-text.odt +0 -0
  19. data/doc/sample/include-file-simple-text.odt +0 -0
  20. data/doc/sample/include-file-table.odt +0 -0
  21. data/doc/sample/include.rd +21 -0
  22. data/doc/sample/list.rd +22 -0
  23. data/doc/sample/multi-paragraph.rd +12 -0
  24. data/doc/sample/page-break.odt +0 -0
  25. data/doc/sample/verbatim.rd +8 -0
  26. data/doc/sample.rd.ja +75 -0
  27. data/doc/sample.rd.ja.ott +0 -0
  28. data/doc/sample.rd.ja.pdf +0 -0
  29. data/doc/specification.ja.rd +35 -0
  30. data/lib/rd2odt/rdtool/NOTICE.rd2odt +8 -0
  31. data/lib/rd2odt/rdtool/README.rd +50 -0
  32. data/lib/rd2odt/rdtool/README.rd.ja +53 -0
  33. data/lib/rd2odt/rdtool/rd/block-element.rb +114 -0
  34. data/lib/rd2odt/rdtool/rd/complex-list-item.rb +65 -0
  35. data/lib/rd2odt/rdtool/rd/desclist.rb +55 -0
  36. data/lib/rd2odt/rdtool/rd/document-struct.rb +46 -0
  37. data/lib/rd2odt/rdtool/rd/element.rb +160 -0
  38. data/lib/rd2odt/rdtool/rd/filter.rb +255 -0
  39. data/lib/rd2odt/rdtool/rd/inline-element.rb +233 -0
  40. data/lib/rd2odt/rdtool/rd/labeled-element.rb +14 -0
  41. data/lib/rd2odt/rdtool/rd/list.rb +57 -0
  42. data/lib/rd2odt/rdtool/rd/loose-struct.rb +11 -0
  43. data/lib/rd2odt/rdtool/rd/methodlist.rb +57 -0
  44. data/lib/rd2odt/rdtool/rd/output-format-visitor.rb +28 -0
  45. data/lib/rd2odt/rdtool/rd/package.rb +4 -0
  46. data/lib/rd2odt/rdtool/rd/parser-util.rb +14 -0
  47. data/lib/rd2odt/rdtool/rd/rbl-file.rb +69 -0
  48. data/lib/rd2odt/rdtool/rd/rbl-suite.rb +37 -0
  49. data/lib/rd2odt/rdtool/rd/rd-struct.rb +86 -0
  50. data/lib/rd2odt/rdtool/rd/rd2html-lib.rb +490 -0
  51. data/lib/rd2odt/rdtool/rd/rd2html-opt.rb +67 -0
  52. data/lib/rd2odt/rdtool/rd/rd2man-lib.rb +241 -0
  53. data/lib/rd2odt/rdtool/rd/rd2rdo-lib.rb +19 -0
  54. data/lib/rd2odt/rdtool/rd/rd2rmi-lib.rb +32 -0
  55. data/lib/rd2odt/rdtool/rd/rdblockparser.tab.rb +1050 -0
  56. data/lib/rd2odt/rdtool/rd/rdfmt.rb +15 -0
  57. data/lib/rd2odt/rdtool/rd/rdinlineparser.tab.rb +1243 -0
  58. data/lib/rd2odt/rdtool/rd/rdvisitor.rb +214 -0
  59. data/lib/rd2odt/rdtool/rd/reference-resolver.rb +114 -0
  60. data/lib/rd2odt/rdtool/rd/search-file.rb +14 -0
  61. data/lib/rd2odt/rdtool/rd/tree.rb +103 -0
  62. data/lib/rd2odt/rdtool/rd/version.rb +39 -0
  63. data/lib/rd2odt/rdtool/rd/visitor.rb +86 -0
  64. data/lib/rd2odt.rb +603 -0
  65. data/rd2odt.gemspec +108 -0
  66. data/setup.rb +1585 -0
  67. data/test/functional/rd2odt-spec.rb +733 -0
  68. data/test/test-helper.rb +93 -0
  69. data/test/unit/rd2odt-spec.rb +831 -0
  70. metadata +122 -0
@@ -0,0 +1,67 @@
1
+ =begin
2
+ = rd2html-opt.rb
3
+ sub-OptionParser for rd2html-lib.rb.
4
+ =end
5
+ require "optparse"
6
+
7
+ q = ARGV.options
8
+
9
+ q.on_tail("rd2html-lib options:")
10
+
11
+
12
+ #q.on_tail("--use-numbering-anchor",
13
+ # "use number for anchor name (old style)") do
14
+ # $Visitor.use_old_anchor = true
15
+ #end
16
+
17
+ q.on_tail("--output-rbl",
18
+ "output external Label file") do
19
+ $Visitor.output_rbl = true
20
+ end
21
+
22
+ q.on_tail("--with-css=FILE",
23
+ String,
24
+ "use FILE as CSS of output HTML") do |i|
25
+ $Visitor.css = i
26
+ end
27
+
28
+ q.on_tail("--html-charset=CHARSET",
29
+ String,
30
+ "indicate CHARSET as charset(char encoding)") do |i|
31
+ $Visitor.charset = i
32
+ end
33
+
34
+ q.on_tail("--html-lang=LANG",
35
+ String,
36
+ "indicate LANG as lang attribute of html") do |i|
37
+ $Visitor.lang = i
38
+ end
39
+
40
+ q.on_tail("--html-title=TITLE",
41
+ String,
42
+ "content of TITLE element of HTML") do |i|
43
+ $Visitor.title = i
44
+ end
45
+
46
+ q.on_tail("--html-link-rel=REL",
47
+ String,
48
+ "add forward LINK element.(\"<rel>:<href>\")") do |i|
49
+ if /(\w+):(.+)/ =~ i
50
+ $Visitor.html_link_rel[$1] = $2
51
+ else
52
+ # warning
53
+ end
54
+ end
55
+
56
+ q.on_tail("--html-link-rev=REV",
57
+ String,
58
+ "add reverse LINK element.(\"<rev>:<href>\")") do |i|
59
+ if /(\w+):(.+)/ =~ i
60
+ $Visitor.html_link_rev[$1] = $2
61
+ else
62
+ # warning
63
+ end
64
+ end
65
+
66
+
67
+
@@ -0,0 +1,241 @@
1
+ =begin
2
+ = rd/rd2man-lib.rb
3
+ =end
4
+
5
+ require "rd/rdvisitor"
6
+
7
+ unless [].respond_to? :collect!
8
+ class Array
9
+ alias collect! filter
10
+ end
11
+ end
12
+
13
+ module RD
14
+ class RD2MANVisitor < RDVisitor
15
+ include AutoLabel
16
+ include MethodParse
17
+
18
+ SYSTEM_NAME = "RDtool -- RD2ManVisitor"
19
+ SYSTEM_VERSION = "$Version: 0.6.21$" #"
20
+ VERSION = Version.new_from_version_string(SYSTEM_NAME, SYSTEM_VERSION)
21
+
22
+ def self.version
23
+ VERSION
24
+ end
25
+
26
+ # must-have constants
27
+ OUTPUT_SUFFIX = "1"
28
+ INCLUDE_SUFFIX = ["1"]
29
+
30
+ def initialize
31
+ @enumcounter = 0
32
+ @index = {}
33
+ @filename = nil
34
+ end
35
+
36
+ def visit(tree)
37
+ prepare_labels(tree, "")
38
+ super(tree)
39
+ end
40
+
41
+ def apply_to_DocumentElement(element, content)
42
+ content = content.join
43
+ title = @filename || ARGF.filename || "Untitled"
44
+ title = File.basename title
45
+ title = title.sub(/\.rd$/i, '')
46
+ <<"EOT"
47
+ .\\" DO NOT MODIFY THIS FILE! it was generated by rd2
48
+ .TH #{title} 1 "#{Time.now.strftime '%B %Y'}"
49
+ #{content}
50
+ EOT
51
+ end # "
52
+
53
+ def apply_to_Headline(element, title)
54
+ element.level <= 1 ? ".SH #{title}\n" : ".SS #{title}\n"
55
+ end
56
+
57
+ # RDVisitor#apply_to_Include
58
+
59
+ def apply_to_TextBlock(element, content)
60
+ if RD::DescListItem === element.parent ||
61
+ RD::ItemListItem === element.parent ||
62
+ RD::EnumListItem === element.parent
63
+ return content.join
64
+ else
65
+ return ".PP\n" + content.join
66
+ end
67
+ end
68
+
69
+ def apply_to_Verbatim(element)
70
+ content = []
71
+ element.each_line do |i|
72
+ content.push(apply_to_String(i))
73
+ end
74
+ # Can we use BLOCKQUOTE such like?
75
+ %Q[.nf\n\\& #{content.join("\\& ")}.fi\n]
76
+ end
77
+
78
+ def apply_to_ItemList(element, items)
79
+ items.collect! do |x| x.sub(/\n\n/, "\n") end
80
+ items = items.join(".IP\n.B\n\\(bu\n") # "\\(bu" -> "" ?
81
+ ".IP\n.B\n\\(bu\n" + items
82
+ end
83
+
84
+ def apply_to_EnumList(element, items)
85
+ @enumcounter = 0
86
+ items.join
87
+ end
88
+
89
+ def apply_to_DescList(element, items)
90
+ items.map{ |i| i =~ /\n$/ ? i : i + "\n" }.join("")
91
+ end
92
+
93
+ def apply_to_MethodList(element, items)
94
+ items.map{ |i| i =~ /\n$/ ? i : i + "\n" }.join("")
95
+ end
96
+
97
+ def apply_to_ItemListItem(element, content)
98
+ content.map{ |c| c =~ /\n$/ ? c : c + "\n" }.join("")
99
+ end
100
+
101
+ def apply_to_EnumListItem(element, content)
102
+ @enumcounter += 1
103
+ %Q[.TP\n#{@enumcounter}.\n#{content.join("\n")}]
104
+ end
105
+
106
+ def apply_to_DescListItem(element, term, description)
107
+ anchor = refer(element)
108
+ if description.empty?
109
+ ".TP\n.fi\n.B\n#{term}"
110
+ else
111
+ %[.TP\n.fi\n.B\n#{term}\n#{description.join("\n")}].chomp
112
+ end
113
+ end
114
+
115
+ def apply_to_MethodListItem(element, term, description)
116
+ term = parse_method(term) # maybe: term -> element.term
117
+ anchor = refer(element)
118
+ if description.empty?
119
+ ".TP\n.fi\n.B\n#{term}"
120
+ else
121
+ %[.TP\n.fi\n.B\n#{term}\n#{description.join("\n")}]
122
+ end
123
+ end
124
+
125
+ def parse_method(method)
126
+ klass, kind, method, args = MethodParse.analize_method(method)
127
+
128
+ if kind == :function
129
+ klass = kind = nil
130
+ else
131
+ kind = MethodParse.kind2str(kind)
132
+ end
133
+
134
+ case method
135
+ when "[]"
136
+ args.strip!
137
+ args.sub!(/^\((.*)\)$/, '\\1')
138
+ "#{klass}#{kind}[#{args}]"
139
+ when "[]="
140
+ args.strip!
141
+ args.sub!(/^\((.*)\)$/, '\\1')
142
+ args, val = /^(.*),([^,]*)$/.match(args)[1,2]
143
+ args.strip!
144
+ val.strip!
145
+
146
+ "#{klass}#{kind}[#{args}] = #{val}"
147
+ else
148
+ "#{klass}#{kind}#{method}#{args}"
149
+ end
150
+ end
151
+ private :parse_method
152
+
153
+ def apply_to_StringElement(element)
154
+ apply_to_String(element.content)
155
+ end
156
+
157
+ def apply_to_Emphasis(element, content)
158
+ %Q[\\fI#{content.join}\\fP]
159
+ end
160
+
161
+ def apply_to_Code(element, content)
162
+ %{\\&\\fB#{content.join.sub(/\./, '\\.')}\\fP}
163
+ end
164
+
165
+ def apply_to_Var(element, content)
166
+ content.join
167
+ end
168
+
169
+ def apply_to_Keyboard(element, content)
170
+ content.join
171
+ end
172
+
173
+ def apply_to_Index(element, content)
174
+ tmp = []
175
+ element.each do |i|
176
+ tmp.push(i) if i.is_a?(String)
177
+ end
178
+ key = meta_char_escape(tmp.join)
179
+ if @index.has_key?(key)
180
+ # warning?
181
+ ""
182
+ else
183
+ num = @index[key] = @index.size
184
+ %{\\&\\fB#{content.join.sub(/\./, '\\.')}\\fP}
185
+ end
186
+ end
187
+
188
+ def apply_to_Reference(element, content)
189
+ case element.label
190
+ when Reference::URL
191
+ apply_to_RefToURL(element, content)
192
+ when Reference::RDLabel
193
+ if element.label.filename
194
+ apply_to_RefToOtherFile(element, content)
195
+ else
196
+ apply_to_RefToElement(element, content)
197
+ end
198
+ end
199
+ end
200
+
201
+ def apply_to_RefToElement(element, content)
202
+ content = content.join
203
+ content.sub(/^function#/, "")
204
+ end
205
+
206
+ def apply_to_RefToOtherFile(element, content)
207
+ content.join
208
+ end
209
+
210
+ def apply_to_RefToURL(element, content)
211
+ content.join
212
+ end
213
+
214
+ def apply_to_Footnote(element, content)
215
+ ""
216
+ end
217
+
218
+ def apply_to_Verb(element)
219
+ apply_to_String(element.content)
220
+ end
221
+
222
+ def apply_to_String(element)
223
+ meta_char_escape(element)
224
+ end
225
+
226
+ def meta_char_escape(str)
227
+ str.gsub(/[-\\]/, '\\\\\\&').gsub(/^[.']/, '\\&') # '
228
+ end
229
+ private :meta_char_escape
230
+
231
+ end # RD2MANVisitor
232
+ end # RD
233
+
234
+ $Visitor_Class = RD::RD2MANVisitor
235
+
236
+ =begin
237
+ == script info.
238
+ RD to MAN translate library for rdfmt.rb
239
+ $Id: rd2man-lib.rb,v 1.9 2003/08/02 15:45:49 tosh Exp $
240
+ copyright WATANABE Hirofumi <eban@os.rim.or.jp>, 2000
241
+ =end
@@ -0,0 +1,19 @@
1
+ =begin
2
+ = rd2rdo-lib.rb
3
+ Format lib to dump tree objects.
4
+ =end
5
+
6
+ require "rd/rdvisitor"
7
+
8
+ module RD
9
+ class RD2RDOVisitor < RDVisitor
10
+ OUTPUT_SUFFIX = "rdo"
11
+ INCLUDE_SUFFIX = []
12
+
13
+ def visit(tree)
14
+ Marshal.dump(tree)
15
+ end
16
+ end
17
+ end
18
+
19
+ $Visitor_Class = RD::RD2RDOVisitor
@@ -0,0 +1,32 @@
1
+ =begin
2
+ = rd2rmi-lib.rb
3
+ library to output RMI.
4
+ =end
5
+ require "rd/rdvisitor"
6
+
7
+ module RD
8
+ class RD2RMIVisitor < RDVisitor
9
+ include AutoLabel
10
+ include MethodParse
11
+
12
+ OUTPUT_SUFFIX = "rmi"
13
+ INCLUDE_SUFFIX = ["rmi"]
14
+
15
+ def visit(tree)
16
+ ret = ""
17
+
18
+ prepare_labels(tree)
19
+
20
+ index = make_method_index(tree)
21
+ index.each do |i|
22
+ i[1] = kind2str(i[1])
23
+ i[3] = @filename
24
+ i[4] = refer(i[0]+i[1]+i[2])
25
+ ret << "$method_index.push(#{i.inspect})\n"
26
+ end
27
+ ret
28
+ end
29
+ end # class RD2RMIVisitor
30
+ end # module RD
31
+
32
+ $Visitor_Class = RD::RD2RMIVisitor