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,53 @@
1
+ =begin
2
+ = RDtool 0.6.21
3
+ == RDってなに?
4
+
5
+ RDはRubyにおけるPOD(Plain Old Documentation)のようなものです。
6
+ RDtoolはRDのフォーマッタであり、RDをHTMLなどに変換できます。
7
+
8
+ == 何が変わった?
9
+
10
+ HISTORYを見てください。
11
+
12
+ == インストールの方法
13
+
14
+ (1)必要なら、((%su%))
15
+ (2)((%ruby setup.rb%))
16
+ (3)utils/rd-mode.elを使いたいならば
17
+ それらを((*手で*))インストールします。
18
+
19
+ == どうやって使うか。
20
+
21
+ 基本的には、こんな感じ。
22
+ % rd2 rdfile.rd > outputfile
23
+
24
+ フォーマットライブラリを指定したい時は、こう。
25
+ % rd2 -r library rdfile.rd > outputfile
26
+
27
+ ((% rd2 --help %))でオプションの詳細がでます。
28
+
29
+ フォーマットライブラリ依存のオプションは先にフォーマットライブラリの
30
+ 指定をしてから((%--help%))。例えば、
31
+
32
+ % rd2 -r rd/rd2html-lib.rb --help
33
+
34
+ rd2はホームディレクトリにある".rd2rc"というファイルを読み込みます。
35
+ これはRubyスクリプトです。
36
+
37
+ == RDの書き方
38
+
39
+ doc/rd-draft.rdを読んでください。
40
+
41
+ == バグ報告
42
+
43
+ バグを見付けた時は、次のアドレスまでメールしてください。
44
+ ((<URL:mailto:moonwolf@moonwolf.com>))
45
+
46
+ == ライセンス
47
+
48
+ RDtoolはRuby's LicenseかGPLの下で使用/配布/改造してください。
49
+ RDtoolのパッケージにはTosh以外の人が著作権を持つファイルが含まれています。
50
+ それらのファイルについての配布条件はファイル自体に書かれたライセンスの下で
51
+ 行ってください。
52
+
53
+ =end
@@ -0,0 +1,114 @@
1
+ require 'rd/element'
2
+ require 'rd/labeled-element'
3
+
4
+ module RD
5
+ # Block-level Element of document tree. abstruct class.
6
+ class BlockElement < Element
7
+ end
8
+
9
+ class Headline < BlockElement
10
+ include NonterminalElement
11
+ include LabeledElement
12
+
13
+ MARK2LEVEL = {
14
+ "=" => 1,
15
+ "==" => 2,
16
+ "===" => 3,
17
+ "====" => 4,
18
+ "+" => 5,
19
+ "++" => 6
20
+ }
21
+
22
+ attr_accessor :level
23
+ attr_reader :title
24
+
25
+ def initialize(level_num)
26
+ super()
27
+ @level = level_num
28
+ @title = []
29
+ end
30
+
31
+ def accept(visitor)
32
+ visitor.visit_Headline(self)
33
+ end
34
+
35
+ def calculate_label
36
+ ret = ""
37
+ @title.each do |i|
38
+ ret << i.to_label
39
+ end
40
+ ret
41
+ end
42
+ private :calculate_label
43
+
44
+ def Headline.mark_to_level(mark_str)
45
+ MARK2LEVEL[mark_str] or
46
+ raise ArgumentError, "#{mark_str} is irregular for Headline mark."
47
+ end
48
+
49
+ def children
50
+ @title
51
+ end
52
+ end
53
+
54
+ class Include < BlockElement
55
+ include TerminalElement
56
+
57
+ attr_accessor :filename
58
+
59
+ def initialize(filename)
60
+ super()
61
+ @filename = filename
62
+ end
63
+
64
+ def accept(visitor)
65
+ visitor.visit_Include(self)
66
+ end
67
+ end # Include
68
+
69
+ class TextBlock < BlockElement
70
+ include NonterminalElement
71
+
72
+ attr_accessor :content
73
+
74
+ def initialize()
75
+ super()
76
+ @content = []
77
+ end
78
+
79
+ def accept(visitor)
80
+ visitor.visit_TextBlock(self)
81
+ end
82
+
83
+ def children
84
+ @content
85
+ end
86
+ end
87
+
88
+ class Verbatim < BlockElement
89
+ include TerminalElement
90
+
91
+ attr_reader :content
92
+
93
+ def initialize(content_strings = [])
94
+ super()
95
+ @content = content_strings # Array of String
96
+ end
97
+
98
+ def accept(visitor)
99
+ visitor.visit_Verbatim(self)
100
+ end
101
+
102
+ def each_line
103
+ if @content.respond_to?(:each_line)
104
+ @content.each_line {|i|
105
+ yield i
106
+ }
107
+ else
108
+ @content.each {|i|
109
+ yield i
110
+ }
111
+ end
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,65 @@
1
+
2
+
3
+ module RD
4
+ # abstruct class for ListItem which have term part additionaly.
5
+ # (i.e. DescListItem and MethodListItem)
6
+ module ComplexListItem
7
+ def set_term(term)
8
+ set_term_under_document_struct(term, tree.document_struct)
9
+ end
10
+ alias term= set_term
11
+
12
+ def set_term_under_document_struct(term, document_struct)
13
+ raise ArgumentError unless document_struct.is_valid?(self, term)
14
+ assign_term(term)
15
+ end
16
+
17
+ def set_term_without_document_struct(term)
18
+ assign_term(term)
19
+ end
20
+
21
+ def assign_term(term)
22
+ @term = term
23
+ term.parent = self
24
+ end
25
+
26
+ def make_term(*args_of_new, &block)
27
+ child = self.class::Term.new(*args_of_new)
28
+ set_term(child)
29
+ child.build(&block) if block_given?
30
+ child
31
+ end
32
+
33
+ def each_element(&block)
34
+ yield(self)
35
+ @term.each_element(&block)
36
+ @description.each do |i|
37
+ i.each_element(&block)
38
+ end
39
+ end
40
+ alias each each_element
41
+
42
+ def each_block_in_description
43
+ @description.each do |i|
44
+ yield(i)
45
+ end
46
+ end
47
+ alias each_block each_block_in_description
48
+
49
+ def children
50
+ @description
51
+ end
52
+
53
+ def to_label
54
+ @term.to_label
55
+ end
56
+ alias label to_label
57
+
58
+ def inspect
59
+ t = indent2(term.inspect) if term
60
+ c = children.collect{|i| indent2(i.inspect)}.join("\n")
61
+ "<#{self.class.name}>" + (term ? "\n" : "") + t.to_s +
62
+ (c.empty? ? "" : "\n") + c
63
+ end
64
+ end # ComplexListItem
65
+ end # RD
@@ -0,0 +1,55 @@
1
+ require 'rd/element'
2
+ require 'rd/list'
3
+ require 'rd/complex-list-item'
4
+ require 'rd/labeled-element'
5
+
6
+ module RD
7
+ class DescList < List
8
+ def accept(visitor)
9
+ visitor.visit_DescList(self)
10
+ end
11
+ end
12
+
13
+ class DescListItem < ListItem
14
+ include ComplexListItem
15
+
16
+ attr_reader :term
17
+ attr_reader :description
18
+
19
+ def initialize
20
+ @term = nil
21
+ @description = []
22
+ @label = nil
23
+ end
24
+
25
+ def accept(visitor)
26
+ visitor.visit_DescListItem(self)
27
+ end
28
+
29
+ class Term < Element
30
+ include NonterminalElement
31
+ include LabeledElement
32
+
33
+ def initialize
34
+ @content = []
35
+ end
36
+
37
+ def calculate_label
38
+ ret = ""
39
+ children.each do |i|
40
+ ret.concat(i.to_label)
41
+ end
42
+ ret
43
+ end
44
+ private :calculate_label
45
+
46
+ def accept(visitor)
47
+ visitor.visit_DescListItemTerm(self)
48
+ end
49
+
50
+ def children
51
+ @content
52
+ end
53
+ end
54
+ end # DescListItem
55
+ end # RD
@@ -0,0 +1,46 @@
1
+
2
+ module RD
3
+ # DocumentStructure defines and restricts structure of document tree.
4
+ # it consists of ElementRelationship
5
+ class DocumentStructure
6
+ def initialize
7
+ @relationships = []
8
+ end
9
+
10
+ def add_relationships(*relations)
11
+ @relationships += relations
12
+ end
13
+
14
+ def define_relationship(parent, child)
15
+ add_relationships(ElementRelationship.new(parent, child))
16
+ end
17
+
18
+ def each_relationship
19
+ @relationships.each do |i|
20
+ yield(i)
21
+ end
22
+ end
23
+
24
+ def is_valid?(parent, child)
25
+ each_relationship do |i|
26
+ return true if i.match?(parent, child)
27
+ end
28
+ false
29
+ end
30
+ end
31
+
32
+ # ElementRelationship is knowledge about parent-children relationship
33
+ # between Elements.
34
+ class ElementRelationship
35
+ attr_reader(:parent, :child)
36
+
37
+ def initialize(parent, child)
38
+ @parent = parent
39
+ @child = child
40
+ end
41
+
42
+ def match?(parent, child)
43
+ parent.is_a? @parent and child.is_a? @child
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,160 @@
1
+
2
+ module RD
3
+
4
+ # abstruct class of node of document tree
5
+ class Element
6
+ include Enumerable
7
+
8
+ attr_accessor :parent
9
+
10
+ def initialize
11
+ @parent = nil
12
+ end
13
+
14
+ def tree
15
+ raise RuntimeError, "#{self} doesn't have a parent." unless @parent
16
+ @parent.tree
17
+ end
18
+
19
+ def inspect
20
+ c = children.collect{|i| indent2(i.inspect)}.join("\n")
21
+ "<#{self.class.name}>" + (c.empty? ? "" : "\n") + c
22
+ end
23
+ end # Element
24
+
25
+ # element which don't have children.
26
+ module TerminalElement
27
+ def children
28
+ []
29
+ end
30
+
31
+ def each_element
32
+ yield(self)
33
+ end
34
+ alias each each_element
35
+ end
36
+
37
+ # element which have children.
38
+ module NonterminalElement
39
+ def initialize(*arg)
40
+ @temporary_document_structure = nil
41
+ super
42
+ end
43
+
44
+ def children
45
+ raise NotImplimentedError, "need #{self}#children."
46
+ end
47
+
48
+ def each_child
49
+ children.each do |i|
50
+ yield(i)
51
+ end
52
+ end
53
+
54
+ def each_element(&block)
55
+ yield(self)
56
+ children.each do |i|
57
+ i.each_element(&block)
58
+ end
59
+ end
60
+ alias each each_element
61
+
62
+ def add_child(child)
63
+ add_child_under_document_struct(child, tree.document_struct)
64
+ end
65
+
66
+ def add_child_under_document_struct(child, document_struct)
67
+ if document_struct.is_valid?(self, child)
68
+ push_to_children(child)
69
+ else
70
+ raise ArgumentError,
71
+ "mismatched document structure, #{self} <-/- #{child}."
72
+ end
73
+ return self
74
+ end
75
+
76
+ def add_children(children)
77
+ add_children_under_document_struct(children, tree.document_struct)
78
+ end
79
+
80
+ def add_children_under_document_struct(children, document_struct)
81
+ children.each do |i|
82
+ add_child_under_document_struct(i, document_struct)
83
+ end
84
+ return self
85
+ end
86
+
87
+ def add_children_without_document_struct(new_children)
88
+ new_children.each do |i|
89
+ push_to_children(i)
90
+ end
91
+ return self
92
+ end
93
+
94
+ def push_to_children(child)
95
+ children.push(child)
96
+ child.parent = self
97
+ end
98
+
99
+ attr_accessor :temporary_document_structure
100
+
101
+ def build(document_struct = tree.document_struct, &block)
102
+ under_temporary_document_structure(document_struct) do
103
+ self.instance_eval(&block)
104
+ end
105
+ self
106
+ end
107
+
108
+ def make_child(child_class, *args_of_new, &block)
109
+ child = child_class.new(*args_of_new)
110
+ if self.temporary_document_structure
111
+ self.add_child_under_document_struct(child,
112
+ self.temporary_document_structure)
113
+ child.build(self.temporary_document_structure, &block) if block_given?
114
+ else
115
+ self.add_child(child)
116
+ child.build(&block) if block_given?
117
+ end
118
+ child
119
+ end
120
+ alias new make_child
121
+ private :new
122
+ # NonterminalElement#new, not NonterminalElement.new
123
+
124
+ def under_temporary_document_structure(document_struct)
125
+ begin
126
+ self.temporary_document_structure = document_struct
127
+ yield
128
+ ensure
129
+ self.temporary_document_structure = nil
130
+ end
131
+ end
132
+
133
+ def indent2(str)
134
+ buf = ''
135
+ str.each_line{|i| buf << " " << i }
136
+ buf
137
+ end
138
+ private :indent2
139
+ end
140
+
141
+ # root node of document tree
142
+ class DocumentElement < Element
143
+ include NonterminalElement
144
+ attr_reader :blocks
145
+
146
+ def initialize()
147
+ @blocks = []
148
+ end
149
+
150
+ def accept(visitor)
151
+ visitor.visit_DocumentElement(self)
152
+ end
153
+
154
+ alias each_block each_child
155
+
156
+ def children
157
+ @blocks
158
+ end
159
+ end
160
+ end