panmind-rtf 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. data/CHANGES +8 -0
  2. data/LICENSE +20 -0
  3. data/README +186 -0
  4. data/Rakefile +48 -0
  5. data/VERSION.yml +5 -0
  6. data/examples/example01.rb +51 -0
  7. data/examples/example02.rb +45 -0
  8. data/examples/example03.rb +66 -0
  9. data/examples/example03.rtf +164 -0
  10. data/examples/example04.rb +50 -0
  11. data/examples/rubyrtf.bmp +0 -0
  12. data/examples/rubyrtf.jpg +0 -0
  13. data/examples/rubyrtf.png +0 -0
  14. data/lib/rtf.rb +34 -0
  15. data/lib/rtf/colour.rb +173 -0
  16. data/lib/rtf/font.rb +173 -0
  17. data/lib/rtf/information.rb +111 -0
  18. data/lib/rtf/node.rb +1680 -0
  19. data/lib/rtf/paper.rb +55 -0
  20. data/lib/rtf/style.rb +305 -0
  21. data/test/character_style_test.rb +136 -0
  22. data/test/colour_table_test.rb +93 -0
  23. data/test/colour_test.rb +116 -0
  24. data/test/command_node_test.rb +219 -0
  25. data/test/container_node_test.rb +64 -0
  26. data/test/document_style_test.rb +79 -0
  27. data/test/document_test.rb +106 -0
  28. data/test/fixtures/bitmap1.bmp +0 -0
  29. data/test/fixtures/bitmap2.bmp +0 -0
  30. data/test/fixtures/jpeg1.jpg +0 -0
  31. data/test/fixtures/jpeg2.jpg +0 -0
  32. data/test/fixtures/png1.png +0 -0
  33. data/test/fixtures/png2.png +0 -0
  34. data/test/font_table_test.rb +91 -0
  35. data/test/font_test.rb +48 -0
  36. data/test/footer_node_test.rb +30 -0
  37. data/test/header_node_test.rb +30 -0
  38. data/test/image_node_test.rb +125 -0
  39. data/test/information_test.rb +127 -0
  40. data/test/node_test.rb +25 -0
  41. data/test/paragraph_style_test.rb +81 -0
  42. data/test/style_test.rb +16 -0
  43. data/test/table_cell_node_test.rb +89 -0
  44. data/test/table_node_test.rb +83 -0
  45. data/test/table_row_node_test.rb +59 -0
  46. data/test/test_helper.rb +13 -0
  47. data/test/text_node_test.rb +50 -0
  48. metadata +133 -0
@@ -0,0 +1,93 @@
1
+ require 'test_helper'
2
+
3
+ # ColourTable class unit test class.
4
+ class ColourTableTest < Test::Unit::TestCase
5
+ def setup
6
+ @colours = [Colour.new(0, 0, 0),
7
+ Colour.new(100, 100, 100),
8
+ Colour.new(150, 150, 150),
9
+ Colour.new(200, 200, 200),
10
+ Colour.new(250, 250, 250)]
11
+ end
12
+
13
+ def test_01
14
+ tables = []
15
+ tables.push(ColourTable.new)
16
+ tables.push(ColourTable.new(@colours[0], @colours[2]))
17
+ tables.push(ColourTable.new(*@colours))
18
+ tables.push(ColourTable.new(@colours[0], @colours[1], @colours[0]))
19
+
20
+ assert(tables[0].size == 0)
21
+ assert(tables[1].size == 2)
22
+ assert(tables[2].size == 5)
23
+ assert(tables[3].size == 2)
24
+
25
+ assert(tables[0][0] == nil)
26
+ assert(tables[1][1] == @colours[2])
27
+ assert(tables[2][3] == @colours[3])
28
+ assert(tables[3][5] == nil)
29
+
30
+ assert(tables[0].index(@colours[1]) == nil)
31
+ assert(tables[1].index(@colours[2]) == 2)
32
+ assert(tables[2].index(@colours[3]) == 4)
33
+ assert(tables[3].index(@colours[4]) == nil)
34
+
35
+ tables[0].add(@colours[0])
36
+ assert(tables[0].size == 1)
37
+ assert(tables[0].index(@colours[0]) == 1)
38
+
39
+ tables[0] << @colours[1]
40
+ assert(tables[0].size == 2)
41
+ assert(tables[0].index(@colours[1]) == 2)
42
+
43
+ tables[0].add(@colours[1])
44
+ assert(tables[0].size == 2)
45
+ assert([tables[0][0], tables[0][1]] == [@colours[0], @colours[1]])
46
+
47
+ tables[0] << @colours[0]
48
+ assert(tables[0].size == 2)
49
+ assert([tables[0][0], tables[0][1]] == [@colours[0], @colours[1]])
50
+
51
+ flags = [false, false, false, false, false]
52
+ tables[2].each do |colour|
53
+ flags[@colours.index(colour)] = true if @colours.index(colour) != nil
54
+ end
55
+ assert(flags.index(false) == nil)
56
+
57
+ assert(tables[0].to_s(2) == " Colour Table (2 colours)\n"\
58
+ " Colour (0/0/0)\n"\
59
+ " Colour (100/100/100)")
60
+ assert(tables[1].to_s(4) == " Colour Table (2 colours)\n"\
61
+ " Colour (0/0/0)\n"\
62
+ " Colour (150/150/150)")
63
+ assert(tables[2].to_s(-6) == "Colour Table (5 colours)\n"\
64
+ " Colour (0/0/0)\n"\
65
+ " Colour (100/100/100)\n"\
66
+ " Colour (150/150/150)\n"\
67
+ " Colour (200/200/200)\n"\
68
+ " Colour (250/250/250)")
69
+ assert(tables[3].to_s == "Colour Table (2 colours)\n"\
70
+ " Colour (0/0/0)\n"\
71
+ " Colour (100/100/100)")
72
+
73
+ assert(tables[0].to_rtf(3) == " {\\colortbl\n ;\n"\
74
+ " \\red0\\green0\\blue0;\n"\
75
+ " \\red100\\green100\\blue100;\n"\
76
+ " }")
77
+ assert(tables[1].to_rtf(6) == " {\\colortbl\n ;\n"\
78
+ " \\red0\\green0\\blue0;\n"\
79
+ " \\red150\\green150\\blue150;\n"\
80
+ " }")
81
+ assert(tables[2].to_rtf(-9) == "{\\colortbl\n;\n"\
82
+ "\\red0\\green0\\blue0;\n"\
83
+ "\\red100\\green100\\blue100;\n"\
84
+ "\\red150\\green150\\blue150;\n"\
85
+ "\\red200\\green200\\blue200;\n"\
86
+ "\\red250\\green250\\blue250;\n"\
87
+ "}")
88
+ assert(tables[3].to_rtf == "{\\colortbl\n;\n"\
89
+ "\\red0\\green0\\blue0;\n"\
90
+ "\\red100\\green100\\blue100;\n"\
91
+ "}")
92
+ end
93
+ end
@@ -0,0 +1,116 @@
1
+ require 'test_helper'
2
+
3
+ # Colour class unit test class.
4
+ class ColourTest < Test::Unit::TestCase
5
+ def test_01
6
+ colours = []
7
+ colours.push(Colour.new(255, 255, 255))
8
+ colours.push(Colour.new(200, 0, 0))
9
+ colours.push(Colour.new(0, 150, 0))
10
+ colours.push(Colour.new(0, 0, 100))
11
+ colours.push(Colour.new(0, 0, 0))
12
+
13
+ assert(colours[0] == colours[0])
14
+ assert(!(colours[1] == colours[2]))
15
+ assert(colours[3] == Colour.new(0, 0, 100))
16
+ assert(!(colours[4] == 12345))
17
+
18
+ assert(colours[0].red == 255)
19
+ assert(colours[0].green == 255)
20
+ assert(colours[0].blue == 255)
21
+
22
+ assert(colours[1].red == 200)
23
+ assert(colours[1].green == 0)
24
+ assert(colours[1].blue == 0)
25
+
26
+ assert(colours[2].red == 0)
27
+ assert(colours[2].green == 150)
28
+ assert(colours[2].blue == 0)
29
+
30
+ assert(colours[3].red == 0)
31
+ assert(colours[3].green == 0)
32
+ assert(colours[3].blue == 100)
33
+
34
+ assert(colours[4].red == 0)
35
+ assert(colours[4].green == 0)
36
+ assert(colours[4].blue == 0)
37
+
38
+ assert(colours[0].to_s(3) == ' Colour (255/255/255)')
39
+ assert(colours[1].to_s(6) == ' Colour (200/0/0)')
40
+ assert(colours[2].to_s(-20) == 'Colour (0/150/0)')
41
+ assert(colours[3].to_s == 'Colour (0/0/100)')
42
+ assert(colours[4].to_s == 'Colour (0/0/0)')
43
+
44
+ assert(colours[0].to_rtf(2) == ' \red255\green255\blue255;')
45
+ assert(colours[1].to_rtf(4) == ' \red200\green0\blue0;')
46
+ assert(colours[2].to_rtf(-6) == '\red0\green150\blue0;')
47
+ assert(colours[3].to_rtf == '\red0\green0\blue100;')
48
+ assert(colours[4].to_rtf == '\red0\green0\blue0;')
49
+
50
+ begin
51
+ Colour.new(256, 0, 0)
52
+ flunk("Successfully created a colour with an invalid red setting.")
53
+ rescue RTFError
54
+ rescue Test::Unit::AssertionFailedError => error
55
+ raise error
56
+ rescue => error
57
+ flunk("Unexpected exception caught. Type: #{error.class.name}\n"\
58
+ "Message: #{error.message}")
59
+ end
60
+
61
+ begin
62
+ Colour.new(0, 1000, 0)
63
+ flunk("Successfully created a colour with an invalid green setting.")
64
+ rescue RTFError
65
+ rescue Test::Unit::AssertionFailedError => error
66
+ raise error
67
+ rescue => error
68
+ flunk("Unexpected exception caught. Type: #{error.class.name}\n"\
69
+ "Message: #{error.message}")
70
+ end
71
+
72
+ begin
73
+ Colour.new(0, 0, -300)
74
+ flunk("Successfully created a colour with an invalid blue setting.")
75
+ rescue RTFError
76
+ rescue Test::Unit::AssertionFailedError => error
77
+ raise error
78
+ rescue => error
79
+ flunk("Unexpected exception caught. Type: #{error.class.name}\n"\
80
+ "Message: #{error.message}")
81
+ end
82
+
83
+ begin
84
+ Colour.new('La la la', 0, 0)
85
+ flunk("Successfully created a colour with an invalid red type.")
86
+ rescue RTFError
87
+ rescue Test::Unit::AssertionFailedError => error
88
+ raise error
89
+ rescue => error
90
+ flunk("Unexpected exception caught. Type: #{error.class.name}\n"\
91
+ "Message: #{error.message}")
92
+ end
93
+
94
+ begin
95
+ Colour.new(0, {}, 0)
96
+ flunk("Successfully created a colour with an invalid green type.")
97
+ rescue RTFError
98
+ rescue Test::Unit::AssertionFailedError => error
99
+ raise error
100
+ rescue => error
101
+ flunk("Unexpected exception caught. Type: #{error.class.name}\n"\
102
+ "Message: #{error.message}")
103
+ end
104
+
105
+ begin
106
+ Colour.new(0, 0, [])
107
+ flunk("Successfully created a colour with an invalid blue type.")
108
+ rescue RTFError
109
+ rescue Test::Unit::AssertionFailedError => error
110
+ raise error
111
+ rescue => error
112
+ flunk("Unexpected exception caught. Type: #{error.class.name}\n"\
113
+ "Message: #{error.message}")
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,219 @@
1
+ require 'test_helper'
2
+
3
+ # Information class unit test class.
4
+ class CommandNodeTest < Test::Unit::TestCase
5
+ def test_basics
6
+ nodes = []
7
+ nodes.push(CommandNode.new(nil, 'prefix'))
8
+ nodes.push(CommandNode.new(nil, '', 'lalala'))
9
+ nodes.push(CommandNode.new(nodes[0], '', nil, false))
10
+
11
+ assert(nodes[0].prefix == 'prefix')
12
+ assert(nodes[1].prefix == '')
13
+ assert(nodes[2].prefix == '')
14
+
15
+ assert(nodes[0].suffix == nil)
16
+ assert(nodes[1].suffix == 'lalala')
17
+ assert(nodes[2].suffix == nil)
18
+
19
+ assert(nodes[0].split == true)
20
+ assert(nodes[1].split == true)
21
+ assert(nodes[2].split == false)
22
+ end
23
+
24
+ # Test line breaks.
25
+ def test_line_break
26
+ root = CommandNode.new(nil, nil)
27
+
28
+ assert(root.line_break == nil)
29
+ assert(root.size == 1)
30
+ assert(root[0].class == CommandNode)
31
+ assert(root[0].prefix == '\line')
32
+ assert(root[0].suffix == nil)
33
+ assert(root[0].split == false)
34
+ end
35
+
36
+ # Test paragraphs.
37
+ def test_paragraph
38
+ root = CommandNode.new(nil, nil)
39
+ style = ParagraphStyle.new
40
+
41
+ assert(root.paragraph(style) != nil)
42
+ assert(root.size == 1)
43
+ assert(root[0].class == CommandNode)
44
+ assert(root[0].prefix == '\pard\ql')
45
+ assert(root[0].suffix == '\par')
46
+ assert(root.split == true)
47
+
48
+ style.justification = ParagraphStyle::RIGHT_JUSTIFY
49
+ assert(root.paragraph(style).prefix == '\pard\qr')
50
+
51
+ style.justification = ParagraphStyle::CENTRE_JUSTIFY
52
+ assert(root.paragraph(style).prefix == '\pard\qc')
53
+
54
+ style.justification = ParagraphStyle::FULL_JUSTIFY
55
+ assert(root.paragraph(style).prefix == '\pard\qj')
56
+
57
+ style.justification = ParagraphStyle::LEFT_JUSTIFY
58
+ style.space_before = 100
59
+ root.paragraph(style)
60
+ assert(root[-1].prefix == '\pard\ql\sb100')
61
+
62
+ style.space_before = nil
63
+ style.space_after = 1234
64
+ root.paragraph(style)
65
+ assert(root[-1].prefix == '\pard\ql\sa1234')
66
+
67
+ style.space_before = nil
68
+ style.space_after = nil
69
+ style.left_indent = 10
70
+ root.paragraph(style)
71
+ assert(root[-1].prefix == '\pard\ql\li10')
72
+
73
+ style.space_before = nil
74
+ style.space_after = nil
75
+ style.left_indent = nil
76
+ style.right_indent = 234
77
+ root.paragraph(style)
78
+ assert(root[-1].prefix == '\pard\ql\ri234')
79
+
80
+ style.space_before = nil
81
+ style.space_after = nil
82
+ style.left_indent = nil
83
+ style.right_indent = nil
84
+ style.first_line_indent = 765
85
+ root.paragraph(style)
86
+ assert(root[-1].prefix == '\pard\ql\fi765')
87
+
88
+ style.space_before = 12
89
+ style.space_after = 23
90
+ style.left_indent = 34
91
+ style.right_indent = 45
92
+ style.first_line_indent = 56
93
+ root.paragraph(style)
94
+ assert(root[-1].prefix == '\pard\ql\li34\ri45\fi56\sb12\sa23')
95
+
96
+ node = nil
97
+ root.paragraph(style) {|n| node = n}
98
+ assert(node == root[-1])
99
+ end
100
+
101
+ # Test applications of styles.
102
+ def test_style
103
+ root = Document.new(Font.new(Font::ROMAN, 'Arial'))
104
+ style = CharacterStyle.new
105
+ style.bold = true
106
+
107
+ assert(root.apply(style) != nil)
108
+ assert(root.size == 1)
109
+ assert(root[0].class == CommandNode)
110
+ assert(root[0].prefix == '\b')
111
+ assert(root[0].suffix == nil)
112
+ assert(root[0].split == true)
113
+
114
+ style.underline = true
115
+ assert(root.apply(style).prefix == '\b\ul')
116
+
117
+ style.bold = false
118
+ style.superscript = true
119
+ assert(root.apply(style).prefix == '\ul\super')
120
+
121
+ style.underline = false
122
+ style.italic = true
123
+ assert(root.apply(style).prefix == '\i\super')
124
+
125
+ style.italic = false
126
+ style.bold = true
127
+ assert(root.apply(style).prefix == '\b\super')
128
+
129
+ style.bold = false
130
+ style.superscript = false
131
+ style.italic = true
132
+ style.font_size = 20
133
+ assert(root.apply(style).prefix == '\i\fs20')
134
+
135
+ node = nil
136
+ root.apply(style) {|n| node = n}
137
+ assert(node == root[-1])
138
+
139
+ # Test style short cuts.
140
+ node = root.bold
141
+ assert(node.prefix == '\b')
142
+ assert(node.suffix == nil)
143
+ assert(node == root[-1])
144
+
145
+ node = root.italic
146
+ assert(node.prefix == '\i')
147
+ assert(node.suffix == nil)
148
+ assert(node == root[-1])
149
+
150
+ node = root.underline
151
+ assert(node.prefix == '\ul')
152
+ assert(node.suffix == nil)
153
+ assert(node == root[-1])
154
+
155
+ node = root.superscript
156
+ assert(node.prefix == '\super')
157
+ assert(node.suffix == nil)
158
+ assert(node == root[-1])
159
+
160
+ node = root.subscript
161
+ assert(node.prefix == '\sub')
162
+ assert(node.suffix == nil)
163
+ assert(node == root[-1])
164
+ end
165
+
166
+ # Test text node addition.
167
+ def test_text
168
+ root = CommandNode.new(nil, nil)
169
+
170
+ root << 'A block of text.'
171
+ assert(root.size == 1)
172
+ assert(root[0].class == TextNode)
173
+ assert(root[0].text == 'A block of text.')
174
+
175
+ root << " More text."
176
+ assert(root.size == 1)
177
+ assert(root[0].class == TextNode)
178
+ assert(root[0].text == 'A block of text. More text.')
179
+
180
+ root.paragraph
181
+ root << "A new node."
182
+ assert(root.size == 3)
183
+ assert(root[0].class == TextNode)
184
+ assert(root[-1].class == TextNode)
185
+ assert(root[0].text == 'A block of text. More text.')
186
+ assert(root[-1].text == 'A new node.')
187
+ end
188
+
189
+ # Test table addition.
190
+ def test_table
191
+ root = CommandNode.new(nil, nil)
192
+
193
+ table = root.table(3, 3, 100, 150, 200)
194
+ assert(root.size == 1)
195
+ assert(root[0].class == TableNode)
196
+ assert(root[0] == table)
197
+ assert(table.rows == 3)
198
+ assert(table.columns == 3)
199
+
200
+ assert(table[0][0].width == 100)
201
+ assert(table[0][1].width == 150)
202
+ assert(table[0][2].width == 200)
203
+ end
204
+
205
+ # This test checks the previous_node and next_node methods that could not be
206
+ # fully and properly checked in the NodeTest.rb file.
207
+ def test_peers
208
+ root = Document.new(Font.new(Font::ROMAN, 'Arial'))
209
+ nodes = []
210
+ nodes.push(root.paragraph)
211
+ nodes.push(root.bold)
212
+ nodes.push(root.underline)
213
+
214
+ assert(root.previous_node == nil)
215
+ assert(root.next_node == nil)
216
+ assert(nodes[1].previous_node == nodes[0])
217
+ assert(nodes[1].next_node == nodes[2])
218
+ end
219
+ end
@@ -0,0 +1,64 @@
1
+ require 'test_helper'
2
+
3
+ # Information class unit test class.
4
+ class ContainerNodeTest < Test::Unit::TestCase
5
+ def test01
6
+ nodes = []
7
+ nodes.push(ContainerNode.new(nil))
8
+ nodes.push(ContainerNode.new(nodes[0]))
9
+
10
+ assert(nodes[0].size == 0)
11
+ assert(nodes[1].size == 0)
12
+
13
+ assert(nodes[0].first == nil)
14
+ assert(nodes[0].last == nil)
15
+ assert(nodes[1].first == nil)
16
+ assert(nodes[1].last == nil)
17
+
18
+ assert(nodes[0][0] == nil)
19
+ assert(nodes[1][-1] == nil)
20
+
21
+ count = 0
22
+ nodes[0].each {|entry| count += 1}
23
+ assert(count == 0)
24
+ nodes[1].each {|entry| count += 1}
25
+ assert(count == 0)
26
+ end
27
+
28
+ def test02
29
+ node = ContainerNode.new(nil)
30
+ child1 = ContainerNode.new(nil)
31
+ child2 = ContainerNode.new(nil)
32
+
33
+ node.store(child1)
34
+ assert(node.size == 1)
35
+ assert(node[0] == child1)
36
+ assert(node[-1] == child1)
37
+ assert(node[0].parent == node)
38
+ assert(node.first == child1)
39
+ assert(node.last == child1)
40
+
41
+ count = 0
42
+ node.each {|entry| count += 1}
43
+ assert(count == 1)
44
+
45
+ node.store(child2)
46
+ assert(node.size == 2)
47
+ assert(node[0] == child1)
48
+ assert(node[1] == child2)
49
+ assert(node[-1] == child2)
50
+ assert(node[-2] == child1)
51
+ assert(node[0].parent == node)
52
+ assert(node[1].parent == node)
53
+ assert(node.first == child1)
54
+ assert(node.last == child2)
55
+ end
56
+
57
+ def test03
58
+ begin
59
+ ContainerNode.new(nil).to_rtf
60
+ flunk("Successfully called ContainerNode#to_rtf().")
61
+ rescue => error
62
+ end
63
+ end
64
+ end