rbpdf 1.20.0 → 1.20.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +4 -0
- data/lib/rbpdf/version.rb +1 -1
- data/rbpdf.gemspec +1 -2
- metadata +4 -90
- data/test/err_font1.rb +0 -7
- data/test/err_font2.rb +0 -8
- data/test/input.jpg +0 -0
- data/test/json: +0 -0
- data/test/logo_rbpdf_8bit .png +0 -0
- data/test/logo_rbpdf_8bit+ .png +0 -0
- data/test/logo_rbpdf_8bit.gif +0 -0
- data/test/logo_rbpdf_8bit.jpg +0 -0
- data/test/logo_rbpdf_8bit.png +0 -0
- data/test/logo_rbpdf_8bit_alpha.gif +0 -0
- data/test/logo_rbpdf_mono_gray.jpg +0 -0
- data/test/logo_rbpdf_mono_gray.png +0 -0
- data/test/logo_rbpdf_mono_rgb.jpg +0 -0
- data/test/logo_rbpdf_mono_rgb.png +0 -0
- data/test/output.png +0 -0
- data/test/png_test_alpha.png +0 -0
- data/test/png_test_msk_alpha.png +0 -0
- data/test/png_test_non_alpha.png +0 -0
- data/test/rbpdf_bidi_test.rb +0 -453
- data/test/rbpdf_bookmark_test.rb +0 -66
- data/test/rbpdf_cell_test.rb +0 -231
- data/test/rbpdf_content_test.rb +0 -213
- data/test/rbpdf_css_test.rb +0 -640
- data/test/rbpdf_dom_test.rb +0 -272
- data/test/rbpdf_examples_test.rb +0 -83
- data/test/rbpdf_font_func_test.rb +0 -45
- data/test/rbpdf_font_style_test.rb +0 -37
- data/test/rbpdf_font_test.rb +0 -308
- data/test/rbpdf_format_test.rb +0 -30
- data/test/rbpdf_func_test.rb +0 -139
- data/test/rbpdf_html_anchor_test.rb +0 -105
- data/test/rbpdf_html_func_test.rb +0 -170
- data/test/rbpdf_html_test.rb +0 -658
- data/test/rbpdf_htmlcell_test.rb +0 -60
- data/test/rbpdf_http_test.rb +0 -76
- data/test/rbpdf_image_rmagick_test.rb +0 -170
- data/test/rbpdf_image_test.rb +0 -174
- data/test/rbpdf_test.rb +0 -375
- data/test/rbpdf_transaction_test.rb +0 -203
- data/test/rbpdf_viewerpreferences_test.rb +0 -41
- data/test/rbpdf_write_test.rb +0 -229
- data/test/test.rb +0 -22
- data/test/test_helper.rb +0 -9
data/test/rbpdf_dom_test.rb
DELETED
@@ -1,272 +0,0 @@
|
|
1
|
-
# Copyright (c) 2011-2017 NAITOH Jun
|
2
|
-
# Released under the MIT license
|
3
|
-
# http://www.opensource.org/licenses/MIT
|
4
|
-
|
5
|
-
require 'test_helper'
|
6
|
-
|
7
|
-
class RbpdfTest < Test::Unit::TestCase
|
8
|
-
class MYPDF < RBPDF
|
9
|
-
def get_temp_rtl
|
10
|
-
@tmprtl
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
htmls = {
|
15
|
-
'Simple Text' => {:html => 'abc', :length => 2,
|
16
|
-
:params => [{:parent => 0, :tag => false}, # parent -> Root
|
17
|
-
{:parent => 0, :tag => false, :value => 'abc', :elkey => 0, :block => false}]},
|
18
|
-
'Back Slash Text' => {:html => 'a\\bc', :length => 2,
|
19
|
-
:params => [{:parent => 0, :tag => false}, # parent -> Root
|
20
|
-
{:parent => 0, :tag => false, :value => 'a\\bc', :elkey => 0, :block => false}]},
|
21
|
-
'Simple Tag' => {:html => '<b>abc</b>', :length => 4,
|
22
|
-
:params => [{:parent => 0, :tag => false, :attribute => {}}, # parent -> Root
|
23
|
-
{:parent => 0, :tag => true, :value => 'b', :elkey => 0, :opening => true, :attribute => {}},
|
24
|
-
{:parent => 1, :tag => false, :value => 'abc', :elkey => 1, :block => false}, # parent -> open tag key
|
25
|
-
{:parent => 1, :tag => true, :value => 'b', :elkey => 2, :opening => false}]}, # parent -> open tag key
|
26
|
-
'pre Tag' => {:html => "<pre>abc</pre>", :length => 4, # See. 'Dom pre tag test'
|
27
|
-
:params => [{:parent => 0, :tag => false, :attribute => {}}, # parent -> Root
|
28
|
-
{:parent => 0, :tag => true, :value => 'pre', :elkey => 0, :opening => true, :attribute => {}},
|
29
|
-
{:parent => 1, :tag => false, :value => 'abc', :elkey => 1, :block => false}, # parent -> open tag key
|
30
|
-
{:parent => 1, :tag => true, :value => 'pre', :elkey => 2, :opening => false}]}, # parent -> open tag key
|
31
|
-
'pre code Tag' => {:html => '<pre><code class="ruby">abc</code></pre>', :length => 4, # See. 'Dom pre tag test (code)'
|
32
|
-
:params => [{:parent => 0, :tag => false, :attribute => {}}, # parent -> Root
|
33
|
-
{:parent => 0, :tag => true, :value => 'pre', :elkey => 0, :opening => true, :attribute => {}},
|
34
|
-
{:parent => 1, :tag => false, :value => 'abc', :elkey => 1, :block => false}, # parent -> open tag key
|
35
|
-
{:parent => 1, :tag => true, :value => 'pre', :elkey => 2, :opening => false}]}, # parent -> open tag key
|
36
|
-
'pre code span Tag' => {:html => '<pre><code class="ruby syntaxhl"><span class="CodeRay">abc</span></code></pre>', :length => 6, # See. 'Dom pre tag test (code span)'
|
37
|
-
:params => [{:parent => 0, :tag => false, :attribute => {}}, # parent -> Root
|
38
|
-
{:parent => 0, :tag => true, :value => 'pre', :elkey => 0, :opening => true, :attribute => {}},
|
39
|
-
{:parent => 1, :tag => true, :value => 'span', :elkey => 1, :opening => true},
|
40
|
-
{:parent => 2, :tag => false, :value => 'abc', :elkey => 2, :block => false}, # parent -> open tag key
|
41
|
-
{:parent => 2, :tag => true, :value => 'span', :elkey => 3, :opening => false}, # parent -> open tag key
|
42
|
-
{:parent => 1, :tag => true, :value => 'pre', :elkey => 4, :opening => false}]}, # parent -> open tag key
|
43
|
-
'Error Tag (doble colse tag)' => {:html => '</ul></div>',
|
44
|
-
:validated_length => 1, # for Rails 4.2 later (no use Rails 3.x/4.0/4.1)
|
45
|
-
:params => [{:parent => 0, :tag => false, :attribute => {}}, # parent -> Root
|
46
|
-
{:parent => 0, :tag => true, :value => 'ul', :elkey => 0, :opening => false}, # parent -> Root key
|
47
|
-
{:parent => 0, :tag => true, :value => 'div', :elkey => 1, :opening => false}]}, # parent -> Root key
|
48
|
-
'Attribute' => {:html => '<p style="text-align:justify">abc</p>', :length => 4,
|
49
|
-
:params => [{:parent => 0, :tag => false, :attribute => {}}, # parent -> Root
|
50
|
-
{:parent => 0, :tag => true, :value => 'p', :elkey => 0, :opening => true, :align => 'J', :attribute => {:style => 'text-align:justify;'}}]},
|
51
|
-
'Table border' => {:html => '<table border="1"><tr><td>abc</td></tr></table>', :length => 9,
|
52
|
-
# -> '<table border="1"><tr><td>abc<marker style="font-size:0"/></td></tr></table>' ## added marker tag (by getHtmlDomArray()) ##
|
53
|
-
:params => [{:parent => 0, :tag => false, :attribute => {}}, # parent -> Root
|
54
|
-
{:parent => 0, :tag => true, :value => 'table', :elkey => 0, :opening => true, :attribute => {:border => 1}},
|
55
|
-
{},
|
56
|
-
{},
|
57
|
-
{},
|
58
|
-
# marker tag (by getHtmlDomArray())
|
59
|
-
{:parent => 3, :tag => true, :value => 'marker', :elkey => 4, :opening => true, :attribute => {:style => 'font-size:0'}}]},
|
60
|
-
'Table td Width' => {:html => '<table><tr><td width="10">abc</td></tr></table>', :length => 9,
|
61
|
-
# -> '<table><tr><td width="10">abc<marker style="font-size:0"/></td></tr></table>' ## added marker tag (by getHtmlDomArray()) ##
|
62
|
-
:params => [{},
|
63
|
-
{},
|
64
|
-
{},
|
65
|
-
{:parent => 2, :tag => true, :value => 'td', :elkey => 2, :opening => true, :width => '10'}]},
|
66
|
-
'Dom open angled bracket "<"' => {:html => "<p>AAA '<'-BBB << <<< '</' '<//' '<///' CCC.</p>", :length => 4,
|
67
|
-
:params => [{:parent => 0, :tag => false, :attribute => {}}, # parent -> Root
|
68
|
-
{:parent => 0, :tag => true, :value => 'p', :elkey => 0, :opening => true, :attribute => {}},
|
69
|
-
{:parent => 1, :tag => false, :value => "AAA '<'-BBB << <<< '</' '<//' '<///' CCC.", :elkey => 1},
|
70
|
-
{:parent => 1, :tag => true, :value => 'p', :elkey => 2, :opening => false}]},
|
71
|
-
'Dom self close tag' => {:html => '<b>ab<br>c</b>', :length => 6, # See. 'Dom self close tag test (Simple Tag)'
|
72
|
-
:params => [{:parent => 0, :tag => false, :attribute => {}}, # parent -> Root
|
73
|
-
{:parent => 0, :tag => true, :value => 'b', :elkey => 0, :opening => true, :attribute => {}}, # <b>
|
74
|
-
{:parent => 1, :tag => false, :value => 'ab', :elkey => 1, :block => false}, # ab
|
75
|
-
{:parent => 1, :tag => true, :value => 'br', :elkey => 2, :opening => true, :attribute => {}}, # <br>
|
76
|
-
{:parent => 1, :tag => false, :value => 'c', :elkey => 3, :block => false}, # c
|
77
|
-
{:parent => 1, :tag => true, :value => 'b', :elkey => 4, :opening => false}]}, # </b>
|
78
|
-
}
|
79
|
-
|
80
|
-
data(htmls)
|
81
|
-
test "Dom Basic test" do |data|
|
82
|
-
pdf = RBPDF.new
|
83
|
-
dom = pdf.send(:getHtmlDomArray, data[:html])
|
84
|
-
assert_equal data[:length], dom.length if data[:length]
|
85
|
-
data[:params].each_with_index {|param, i|
|
86
|
-
# validated length check (for Rails 4.2 later)
|
87
|
-
if dom[i].nil? and i >= data[:validated_length]
|
88
|
-
break
|
89
|
-
end
|
90
|
-
|
91
|
-
param.each {|key, val|
|
92
|
-
if (key == :attribute) and !val.empty?
|
93
|
-
val.each {|k, v|
|
94
|
-
if (k == :style) and !v.empty?
|
95
|
-
assert_equal("dom[#{i}][attribute]: #{k} => #{v}", "dom[#{i}][attribute]: #{k} => #{dom[i][key.to_s][k.to_s].gsub(' ', '')}")
|
96
|
-
else
|
97
|
-
assert_equal("dom[#{i}][attribute]: #{k} => #{v}", "dom[#{i}][attribute]: #{k} => #{dom[i][key.to_s][k.to_s]}")
|
98
|
-
end
|
99
|
-
}
|
100
|
-
else
|
101
|
-
assert_equal("dom[#{i}]: #{key} => #{val}", "dom[#{i}]: #{key} => #{dom[i][key.to_s]}")
|
102
|
-
end
|
103
|
-
}
|
104
|
-
}
|
105
|
-
end
|
106
|
-
|
107
|
-
test "Dom pre tag test" do
|
108
|
-
pdf = RBPDF.new
|
109
|
-
|
110
|
-
# No Text
|
111
|
-
dom = pdf.send(:getHtmlDomArray, "<pre></pre>")
|
112
|
-
dom2 = pdf.send(:getHtmlDomArray, "<pre>\n</pre>")
|
113
|
-
assert_equal dom, dom2
|
114
|
-
|
115
|
-
# Simple Tag
|
116
|
-
dom = pdf.send(:getHtmlDomArray, "<pre>abc</pre>")
|
117
|
-
dom2 = pdf.send(:getHtmlDomArray, "<pre>\nabc\n</pre>")
|
118
|
-
assert_equal dom, dom2
|
119
|
-
dom2 = pdf.send(:getHtmlDomArray, "<pre>\nabc</pre>")
|
120
|
-
assert_equal dom, dom2
|
121
|
-
dom2 = pdf.send(:getHtmlDomArray, "<pre>abc\n</pre>")
|
122
|
-
assert_equal dom, dom2
|
123
|
-
dom2 = pdf.send(:getHtmlDomArray, "<pre>abc<br /></pre>")
|
124
|
-
assert_equal dom, dom2
|
125
|
-
|
126
|
-
# with line feed
|
127
|
-
dom = pdf.send(:getHtmlDomArray, "<pre>abc\ndef</pre>")
|
128
|
-
dom2 = pdf.send(:getHtmlDomArray, "<pre>\nabc\ndef\n</pre>")
|
129
|
-
assert_equal dom, dom2
|
130
|
-
dom2 = pdf.send(:getHtmlDomArray, "<pre>\nabc\ndef</pre>")
|
131
|
-
assert_equal dom, dom2
|
132
|
-
dom2 = pdf.send(:getHtmlDomArray, "<pre>abc\ndef\n</pre>")
|
133
|
-
assert_equal dom, dom2
|
134
|
-
|
135
|
-
# code Tag
|
136
|
-
dom = pdf.send(:getHtmlDomArray, '<pre><code class="ruby">abc</code></pre>')
|
137
|
-
dom2 = pdf.send(:getHtmlDomArray, "<pre><code class=\"ruby\">\nabc\n</code></pre>")
|
138
|
-
assert_equal dom, dom2
|
139
|
-
dom2 = pdf.send(:getHtmlDomArray, "<pre><code class=\"ruby\">\nabc</code></pre>")
|
140
|
-
assert_equal dom, dom2
|
141
|
-
dom2 = pdf.send(:getHtmlDomArray, "<pre><code class=\"ruby\">abc\n</code></pre>")
|
142
|
-
assert_equal dom, dom2
|
143
|
-
|
144
|
-
# code span Tag
|
145
|
-
dom = pdf.send(:getHtmlDomArray, '<pre><code class="ruby syntaxhl"><span class="CodeRay">abc</span></code></pre>')
|
146
|
-
dom2 = pdf.send(:getHtmlDomArray, "<pre><code class=\"ruby syntaxhl\"><span class=\"CodeRay\">\nabc\n</span></code></pre>")
|
147
|
-
assert_equal dom, dom2
|
148
|
-
dom2 = pdf.send(:getHtmlDomArray, "<pre><code class=\"ruby syntaxhl\"><span class=\"CodeRay\">\nabc</span></code></pre>")
|
149
|
-
assert_equal dom, dom2
|
150
|
-
dom2 = pdf.send(:getHtmlDomArray, "<pre><code class=\"ruby syntaxhl\"><span class=\"CodeRay\">abc\n</span></code></pre>")
|
151
|
-
assert_equal dom, dom2
|
152
|
-
dom2 = pdf.send(:getHtmlDomArray, "<pre><code class=\"ruby syntaxhl\"><span class=\"CodeRay\">abc</span>\n</code></pre>")
|
153
|
-
assert_equal dom, dom2
|
154
|
-
dom2 = pdf.send(:getHtmlDomArray, "<pre><code class=\"ruby syntaxhl\">\n<span class=\"CodeRay\">\nabc\n</span>\n</code></pre>")
|
155
|
-
assert_equal dom, dom2
|
156
|
-
end
|
157
|
-
|
158
|
-
test "Dom self close tag test" do
|
159
|
-
pdf = RBPDF.new
|
160
|
-
|
161
|
-
# Simple Tag
|
162
|
-
dom = pdf.send(:getHtmlDomArray, '<b>ab<br>c</b>')
|
163
|
-
dom2 = pdf.send(:getHtmlDomArray, '<b>ab<br/>c</b>')
|
164
|
-
assert_equal dom, dom2
|
165
|
-
|
166
|
-
htmlcontent = '<b><img src="/public/ng.png" alt="test alt attribute" width="30" height="30" border="0"/></b>'
|
167
|
-
dom1 = pdf.send(:getHtmlDomArray, htmlcontent)
|
168
|
-
htmlcontent = '<b><img src="/public/ng.png" alt="test alt attribute" width="30" height="30" border="0"></b>'
|
169
|
-
dom2 = pdf.send(:getHtmlDomArray, htmlcontent)
|
170
|
-
assert_equal dom1, dom2
|
171
|
-
|
172
|
-
dom1 = pdf.send(:getHtmlDomArray, '<b>ab<hr/>c</b>')
|
173
|
-
dom2 = pdf.send(:getHtmlDomArray, '<b>ab<hr>c</b>')
|
174
|
-
assert_equal dom1, dom2
|
175
|
-
end
|
176
|
-
|
177
|
-
test "Dom HTMLTagHandler Basic test" do
|
178
|
-
pdf = RBPDF.new
|
179
|
-
pdf.add_page
|
180
|
-
|
181
|
-
# Simple HTML
|
182
|
-
htmlcontent = '<h1>HTML Example</h1>'
|
183
|
-
dom1 = pdf.send(:getHtmlDomArray, htmlcontent)
|
184
|
-
dom2 = pdf.send(:openHTMLTagHandler, dom1, 1, false)
|
185
|
-
assert_equal dom1, dom2
|
186
|
-
end
|
187
|
-
|
188
|
-
htmls = {
|
189
|
-
'LTR' => {:lines => [{:html => '<p dir="ltr">HTML Example</p>', :length => 4,
|
190
|
-
:params => [{}, {:tag => true, :value => 'p', :opening => true, :attribute => {:dir => 'ltr'}, :temprtl => false}]},
|
191
|
-
{:html => '<p dir="rtl">HTML Example</p>', :length => 4,
|
192
|
-
:params => [{}, {:tag => true, :value => 'p', :opening => true, :attribute => {:dir => 'rtl'}, :temprtl => 'R'}]},
|
193
|
-
{:html => '<p dir="ltr">HTML Example</p>', :length => 4,
|
194
|
-
:params => [{}, {:tag => true, :value => 'p', :opening => true, :attribute => {:dir => 'ltr'}, :temprtl => false}]}
|
195
|
-
]},
|
196
|
-
'RTL' => {:rtl => true,
|
197
|
-
:lines => [{:html => '<p dir="ltr">HTML Example</p>', :length => 4,
|
198
|
-
:params => [{}, {:tag => true, :value => 'p', :opening => true, :attribute => {:dir => 'ltr'}, :temprtl => 'L'}]},
|
199
|
-
{:html => '<p dir="rtl">HTML Example</p>', :length => 4,
|
200
|
-
:params => [{}, {:tag => true, :value => 'p', :opening => true, :attribute => {:dir => 'rtl'}, :temprtl => false}]}
|
201
|
-
]},
|
202
|
-
}
|
203
|
-
|
204
|
-
data(htmls)
|
205
|
-
test "Dom HTMLTagHandler DIR test" do |data|
|
206
|
-
pdf = MYPDF.new
|
207
|
-
pdf.add_page
|
208
|
-
temprtl = pdf.get_temp_rtl
|
209
|
-
assert_equal false, temprtl
|
210
|
-
pdf.set_rtl(true) if data[:rtl]
|
211
|
-
|
212
|
-
data[:lines].each_with_index {|line, l|
|
213
|
-
dom = pdf.send(:getHtmlDomArray, line[:html])
|
214
|
-
dom = pdf.send(:openHTMLTagHandler, dom, 1, false)
|
215
|
-
|
216
|
-
assert_equal line[:length], dom.length if line[:length]
|
217
|
-
line[:params].each_with_index {|param, i|
|
218
|
-
param.each {|key, val|
|
219
|
-
if (key == :attribute) and !val.empty?
|
220
|
-
val.each {|k, v|
|
221
|
-
assert_equal("#{l}: dom[#{i}][attribute]: #{k} => #{v}", "#{l}: dom[#{i}][attribute]: #{k} => #{dom[i][key.to_s][k.to_s]}")
|
222
|
-
}
|
223
|
-
elsif (key == :temprtl)
|
224
|
-
temprtl = pdf.get_temp_rtl
|
225
|
-
assert_equal("#{l}: dom[#{i}]: temprtl => #{val}", "#{l}: dom[#{i}]: temprtl => #{temprtl.to_s}")
|
226
|
-
else
|
227
|
-
assert_equal("#{l}: dom[#{i}]: #{key} => #{val}", "#{l}: dom[#{i}]: #{key} => #{dom[i][key.to_s]}")
|
228
|
-
end
|
229
|
-
}
|
230
|
-
}
|
231
|
-
}
|
232
|
-
end
|
233
|
-
|
234
|
-
test "Dom HTMLTagHandler img y position with height attribute test" do
|
235
|
-
pdf = RBPDF.new
|
236
|
-
pdf.add_page
|
237
|
-
|
238
|
-
# Image Error HTML
|
239
|
-
htmlcontent = '<img src="/public/ng.png" alt="test alt attribute" width="30" height="30" border="0"/>'
|
240
|
-
dom1 = pdf.send(:getHtmlDomArray, htmlcontent)
|
241
|
-
#y1 = pdf.get_y
|
242
|
-
|
243
|
-
dom2 = pdf.send(:openHTMLTagHandler, dom1, 1, false)
|
244
|
-
y2 = pdf.get_y
|
245
|
-
assert_equal dom1, dom2
|
246
|
-
assert_equal pdf.get_image_rby - (12 / pdf.get_scale_factor) , y2
|
247
|
-
end
|
248
|
-
|
249
|
-
test "Dom HTMLTagHandler img y position without height attribute test" do
|
250
|
-
pdf = RBPDF.new
|
251
|
-
pdf.add_page
|
252
|
-
|
253
|
-
# Image Error HTML
|
254
|
-
htmlcontent = '<img src="/public/ng.png" alt="test alt attribute" border="0"/>'
|
255
|
-
dom1 = pdf.send(:getHtmlDomArray, htmlcontent)
|
256
|
-
y1 = pdf.get_y
|
257
|
-
|
258
|
-
dom2 = pdf.send(:openHTMLTagHandler, dom1, 1, false)
|
259
|
-
y2 = pdf.get_y
|
260
|
-
assert_equal dom1, dom2
|
261
|
-
assert_equal y1, y2
|
262
|
-
end
|
263
|
-
|
264
|
-
test "getHtmlDomArray encoding test" do
|
265
|
-
return unless 'test'.respond_to?(:force_encoding)
|
266
|
-
|
267
|
-
pdf = RBPDF.new('P', 'mm', 'A4', true, "UTF-8", true)
|
268
|
-
htmlcontent = 'test'.force_encoding('ASCII-8BIT')
|
269
|
-
pdf.send(:getHtmlDomArray, htmlcontent)
|
270
|
-
assert_equal 'ASCII-8BIT', htmlcontent.encoding.to_s
|
271
|
-
end
|
272
|
-
end
|
data/test/rbpdf_examples_test.rb
DELETED
@@ -1,83 +0,0 @@
|
|
1
|
-
# Copyright (c) 2011-2018 NAITOH Jun
|
2
|
-
# Released under the MIT license
|
3
|
-
# http://www.opensource.org/licenses/MIT
|
4
|
-
|
5
|
-
require 'test_helper'
|
6
|
-
|
7
|
-
def logger
|
8
|
-
require 'logger'
|
9
|
-
return Logger.new(STDOUT)
|
10
|
-
end
|
11
|
-
|
12
|
-
if !defined? ApplicationController
|
13
|
-
class ApplicationController
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
class RbpdfTest < Test::Unit::TestCase
|
18
|
-
htmls = {
|
19
|
-
'001 : Default Header and Footer' => '001',
|
20
|
-
'002 : Removing Header and Footer' => '002',
|
21
|
-
'003 : Custom Header and Footer' => '003',
|
22
|
-
'004 : Cell stretching' => '004',
|
23
|
-
'005 : Multicell' => '005',
|
24
|
-
'006 : write_html and RTL support' => '006',
|
25
|
-
'007 : Two independent columns with write_htmlcell()' => '007',
|
26
|
-
'008 : Include external UTF-8 text file' => '008',
|
27
|
-
'009 : Test Image' => '009',
|
28
|
-
'011 : Colored Table' => '011',
|
29
|
-
'012 : Graphic Functions' => '012',
|
30
|
-
'015 : Bookmarks (Table of Content)' => '015',
|
31
|
-
'017 : Two independent columns with MultiCell' => '017',
|
32
|
-
'018 : RTL document with Persian language' => '018',
|
33
|
-
'020 : Two columns composed by MultiCell of different' => '020',
|
34
|
-
'021 : write_html text flow' => '021',
|
35
|
-
'022 : CMYK colors' => '022',
|
36
|
-
'023 : Page Groups' => '023',
|
37
|
-
'024 : Object Visibility' => '024',
|
38
|
-
'025 : Object Transparency' => '025',
|
39
|
-
'026 : Text Rendering Modes and Text Clipping' => '026',
|
40
|
-
'028 : Changing page formats' => '028',
|
41
|
-
'029 : Set PDF viewer display preferences.' => '029',
|
42
|
-
'031 : Pie Chart' => '031',
|
43
|
-
'033 : Mixed font types' => '033',
|
44
|
-
'034 : Clipping' => '034',
|
45
|
-
'035 : Line styles with cells and multicells' => '035',
|
46
|
-
'036 : Annotations' => '036',
|
47
|
-
'038 : CID-0 CJK unembedded font' => '038',
|
48
|
-
'039 : HTML justification' => '039',
|
49
|
-
'040 : Booklet mode (double-sided pages)' => '040',
|
50
|
-
'041 : Annotation - FileAttachment' => '041',
|
51
|
-
'042 : Test Image with alpha channel' => '042',
|
52
|
-
'043 : Disk caching' => '043',
|
53
|
-
'044 : Move, copy and delete pages' => '044',
|
54
|
-
'045 : Bookmarks and Table of Content' => '045',
|
55
|
-
'047 : Transactions' => '047',
|
56
|
-
'048 : HTML tables and table headers' => '048',
|
57
|
-
# '051 : Full page background' => '051',
|
58
|
-
'055 : Display all characters available on core fonts.' => '055',
|
59
|
-
'057 : Cell vertical alignments' => '057',
|
60
|
-
'059 : Table Of Content using HTML templates.' => '059',
|
61
|
-
'060 : Advanced page settings.' => '060',
|
62
|
-
'061 : XHTML + CSS' => '061',
|
63
|
-
}
|
64
|
-
|
65
|
-
data(htmls)
|
66
|
-
test "Examples test" do |data|
|
67
|
-
$LOAD_PATH << File.join(File.dirname(File.expand_path(__FILE__)), '../example/rails/app/controllers/')
|
68
|
-
|
69
|
-
require "example#{data}_controller"
|
70
|
-
|
71
|
-
content = []
|
72
|
-
test = Object.const_get("Example#{data}Controller").new
|
73
|
-
|
74
|
-
contents = test.index
|
75
|
-
# contents = assert_nothing_raised do
|
76
|
-
# test.index
|
77
|
-
# end
|
78
|
-
contents.each_line {|line| content.push line.chomp }
|
79
|
-
|
80
|
-
assert_not_equal 0, content.length
|
81
|
-
assert_equal '%PDF-1.7', content[0]
|
82
|
-
end
|
83
|
-
end
|
@@ -1,45 +0,0 @@
|
|
1
|
-
# Copyright (c) 2011-2017 NAITOH Jun
|
2
|
-
# Released under the MIT license
|
3
|
-
# http://www.opensource.org/licenses/MIT
|
4
|
-
|
5
|
-
require 'test_helper'
|
6
|
-
|
7
|
-
class RbpdfFontFuncTest < Test::Unit::TestCase
|
8
|
-
class MYPDF < RBPDF
|
9
|
-
def putAPXObject(w=0, h=0, stream='')
|
10
|
-
super
|
11
|
-
end
|
12
|
-
end
|
13
|
-
test "Font get_font_descent function test 1" do
|
14
|
-
pdf = RBPDF.new
|
15
|
-
fontdescent = pdf.get_font_descent('times', '', 18)
|
16
|
-
assert_in_delta 0.95, fontdescent, 0.01
|
17
|
-
end
|
18
|
-
|
19
|
-
test "Font get_font_descent function test 2" do
|
20
|
-
pdf = RBPDF.new
|
21
|
-
fontdescent = pdf.get_font_descent('freesans', '', 18)
|
22
|
-
assert_in_delta 1.91, fontdescent, 0.01
|
23
|
-
end
|
24
|
-
|
25
|
-
test "Font get_font_ascent function test 1" do
|
26
|
-
pdf = RBPDF.new
|
27
|
-
fontascent = pdf.get_font_ascent('times', '', 18)
|
28
|
-
assert_in_delta 5.39, fontascent, 0.01
|
29
|
-
end
|
30
|
-
|
31
|
-
test "Font get_font_ascent function test 2" do
|
32
|
-
pdf = RBPDF.new
|
33
|
-
fontascent = pdf.get_font_ascent('freesans', '', 18)
|
34
|
-
assert_in_delta 6.35, fontascent, 0.01
|
35
|
-
end
|
36
|
-
|
37
|
-
test "putAPXObject test" do
|
38
|
-
pdf = MYPDF.new
|
39
|
-
|
40
|
-
apxo_obj_id = pdf.putAPXObject
|
41
|
-
assert_equal 400001, apxo_obj_id
|
42
|
-
apxo_obj_id = pdf.putAPXObject
|
43
|
-
assert_equal 400002, apxo_obj_id
|
44
|
-
end
|
45
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
# Copyright (c) 2011-2017 NAITOH Jun
|
2
|
-
# Released under the MIT license
|
3
|
-
# http://www.opensource.org/licenses/MIT
|
4
|
-
|
5
|
-
require 'test_helper'
|
6
|
-
|
7
|
-
class RbpdfFontStyleTest < Test::Unit::TestCase
|
8
|
-
class MYPDF < RBPDF
|
9
|
-
def dounderline(x, y, txt)
|
10
|
-
super
|
11
|
-
end
|
12
|
-
def dolinethrough(x, y, txt)
|
13
|
-
super
|
14
|
-
end
|
15
|
-
def dooverline(x, y, txt)
|
16
|
-
super
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
test "Font dounderline function test 1" do
|
21
|
-
pdf = MYPDF.new
|
22
|
-
line = pdf.dounderline(10, 10, "test")
|
23
|
-
assert_equal '28.35 812.94 19.34 -0.60 re f', line
|
24
|
-
end
|
25
|
-
|
26
|
-
test "Font dolinethrough function test 1" do
|
27
|
-
pdf = MYPDF.new
|
28
|
-
line = pdf.dolinethrough(10, 10, "test")
|
29
|
-
assert_equal '28.35 816.94 19.34 -0.60 re f', line
|
30
|
-
end
|
31
|
-
|
32
|
-
test "Font dooverline function test 1" do
|
33
|
-
pdf = MYPDF.new
|
34
|
-
line = pdf.dooverline(10, 10, "test")
|
35
|
-
assert_equal '28.35 824.34 19.34 -0.60 re f', line
|
36
|
-
end
|
37
|
-
end
|
data/test/rbpdf_font_test.rb
DELETED
@@ -1,308 +0,0 @@
|
|
1
|
-
# Copyright (c) 2011-2017 NAITOH Jun
|
2
|
-
# Released under the MIT license
|
3
|
-
# http://www.opensource.org/licenses/MIT
|
4
|
-
|
5
|
-
require 'test_helper'
|
6
|
-
|
7
|
-
class RbpdfFontTest < Test::Unit::TestCase
|
8
|
-
class MYPDF < RBPDF
|
9
|
-
def putfonts()
|
10
|
-
super
|
11
|
-
end
|
12
|
-
|
13
|
-
def getFontBuffer(font)
|
14
|
-
super
|
15
|
-
end
|
16
|
-
|
17
|
-
def getFontsList()
|
18
|
-
super
|
19
|
-
end
|
20
|
-
|
21
|
-
def fontlist()
|
22
|
-
@fontlist
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
test "Font subsetting enable/disable test" do
|
27
|
-
pdf = MYPDF.new
|
28
|
-
subsetting = pdf.get_font_subsetting
|
29
|
-
assert_equal true, subsetting
|
30
|
-
|
31
|
-
pdf.set_font_subsetting(false)
|
32
|
-
subsetting = pdf.get_font_subsetting
|
33
|
-
assert_equal false, subsetting
|
34
|
-
|
35
|
-
pdf.set_font_subsetting(true)
|
36
|
-
subsetting = pdf.get_font_subsetting
|
37
|
-
assert_equal true, subsetting
|
38
|
-
end
|
39
|
-
|
40
|
-
test "Font getFontsList" do
|
41
|
-
pdf = MYPDF.new
|
42
|
-
pdf.getFontsList()
|
43
|
-
fonts = pdf.fontlist()
|
44
|
-
assert fonts.include?('kozminproregular')
|
45
|
-
end
|
46
|
-
|
47
|
-
test "core Font test" do
|
48
|
-
pdf = MYPDF.new
|
49
|
-
|
50
|
-
pdf.set_font('helvetica', '', 18)
|
51
|
-
pdf.set_font('helvetica', 'B', 18)
|
52
|
-
pdf.set_font('helvetica', 'I', 18)
|
53
|
-
pdf.set_font('helvetica', 'BI', 18)
|
54
|
-
|
55
|
-
font = pdf.getFontBuffer('helvetica')
|
56
|
-
assert_equal 'Helvetica', font['name']
|
57
|
-
assert_equal 556, font['dw']
|
58
|
-
font = pdf.getFontBuffer('helveticaB')
|
59
|
-
assert_equal 'Helvetica-Bold', font['name']
|
60
|
-
assert_equal 556, font['dw']
|
61
|
-
font = pdf.getFontBuffer('helveticaI')
|
62
|
-
assert_equal 'Helvetica-Oblique', font['name']
|
63
|
-
assert_equal 556, font['dw']
|
64
|
-
font = pdf.getFontBuffer('helveticaBI')
|
65
|
-
assert_equal 'Helvetica-BoldOblique', font['name']
|
66
|
-
assert_equal 556, font['dw']
|
67
|
-
|
68
|
-
pdf.set_font('times', '', 18)
|
69
|
-
pdf.set_font('times', 'B', 18)
|
70
|
-
pdf.set_font('times', 'I', 18)
|
71
|
-
pdf.set_font('times', 'BI', 18)
|
72
|
-
|
73
|
-
font = pdf.getFontBuffer('times')
|
74
|
-
assert_equal 'Times-Roman', font['name']
|
75
|
-
font = pdf.getFontBuffer('timesB')
|
76
|
-
assert_equal 'Times-Bold', font['name']
|
77
|
-
font = pdf.getFontBuffer('timesI')
|
78
|
-
assert_equal 'Times-Italic', font['name']
|
79
|
-
font = pdf.getFontBuffer('timesBI')
|
80
|
-
assert_equal 'Times-BoldItalic', font['name']
|
81
|
-
|
82
|
-
pdf.set_font('courier', '', 18)
|
83
|
-
pdf.set_font('courier', 'B', 18)
|
84
|
-
pdf.set_font('courier', 'I', 18)
|
85
|
-
pdf.set_font('courier', 'BI', 18)
|
86
|
-
|
87
|
-
font = pdf.getFontBuffer('courier')
|
88
|
-
assert_equal 'Courier', font['name']
|
89
|
-
font = pdf.getFontBuffer('courierB')
|
90
|
-
assert_equal 'Courier-Bold', font['name']
|
91
|
-
font = pdf.getFontBuffer('courierI')
|
92
|
-
assert_equal 'Courier-Oblique', font['name']
|
93
|
-
font = pdf.getFontBuffer('courierBI')
|
94
|
-
assert_equal 'Courier-BoldOblique', font['name']
|
95
|
-
|
96
|
-
pdf.set_font('symbol', '', 18)
|
97
|
-
font = pdf.getFontBuffer('symbol')
|
98
|
-
assert_equal 'Symbol', font['name']
|
99
|
-
|
100
|
-
pdf.set_font('zapfdingbats', '', 18)
|
101
|
-
font = pdf.getFontBuffer('zapfdingbats')
|
102
|
-
assert_equal 'ZapfDingbats', font['name']
|
103
|
-
|
104
|
-
pdf.putfonts()
|
105
|
-
end
|
106
|
-
|
107
|
-
test "TrueTypeUnicode Subset Font test" do
|
108
|
-
pdf = MYPDF.new
|
109
|
-
pdf.set_font_subsetting(true)
|
110
|
-
|
111
|
-
pdf.set_font('freesans', '', 18)
|
112
|
-
pdf.set_font('freesans', 'B', 18)
|
113
|
-
pdf.set_font('freesans', 'I', 18)
|
114
|
-
pdf.set_font('freesans', 'BI', 18)
|
115
|
-
|
116
|
-
pdf.set_font('freeserif', '', 18)
|
117
|
-
pdf.set_font('freeserif', 'B', 18)
|
118
|
-
pdf.set_font('freeserif', 'I', 18)
|
119
|
-
pdf.set_font('freeserif', 'BI', 18)
|
120
|
-
|
121
|
-
pdf.set_font('freemono', '', 18)
|
122
|
-
pdf.set_font('freemono', 'B', 18)
|
123
|
-
pdf.set_font('freemono', 'I', 18)
|
124
|
-
pdf.set_font('freemono', 'BI', 18)
|
125
|
-
|
126
|
-
pdf.set_font('dejavusans', '', 18)
|
127
|
-
pdf.set_font('dejavusans', 'B', 18)
|
128
|
-
pdf.set_font('dejavusans', 'I', 18)
|
129
|
-
pdf.set_font('dejavusans', 'BI', 18)
|
130
|
-
|
131
|
-
pdf.set_font('dejavusanscondensed', '', 18)
|
132
|
-
pdf.set_font('dejavusanscondensed', 'B', 18)
|
133
|
-
pdf.set_font('dejavusanscondensed', 'I', 18)
|
134
|
-
pdf.set_font('dejavusanscondensed', 'BI', 18)
|
135
|
-
|
136
|
-
pdf.set_font('dejavusansmono', '', 18)
|
137
|
-
pdf.set_font('dejavusansmono', 'B', 18)
|
138
|
-
pdf.set_font('dejavusansmono', 'I', 18)
|
139
|
-
pdf.set_font('dejavusansmono', 'BI', 18)
|
140
|
-
|
141
|
-
pdf.set_font('dejavuserif', '', 18)
|
142
|
-
pdf.set_font('dejavuserif', 'B', 18)
|
143
|
-
pdf.set_font('dejavuserif', 'I', 18)
|
144
|
-
pdf.set_font('dejavuserif', 'BI', 18)
|
145
|
-
|
146
|
-
pdf.set_font('dejavuserifcondensed', '', 18)
|
147
|
-
pdf.set_font('dejavuserifcondensed', 'B', 18)
|
148
|
-
pdf.set_font('dejavuserifcondensed', 'I', 18)
|
149
|
-
pdf.set_font('dejavuserifcondensed', 'BI', 18)
|
150
|
-
|
151
|
-
pdf.set_font('dejavusansextralight', '', 18)
|
152
|
-
|
153
|
-
pdf.putfonts()
|
154
|
-
end
|
155
|
-
|
156
|
-
test "TrueTypeUnicode Font test" do
|
157
|
-
pdf = MYPDF.new
|
158
|
-
pdf.set_font_subsetting(false)
|
159
|
-
|
160
|
-
pdf.set_font('freesans', '', 18)
|
161
|
-
pdf.set_font('freesans', 'B', 18)
|
162
|
-
pdf.set_font('freesans', 'I', 18)
|
163
|
-
pdf.set_font('freesans', 'BI', 18)
|
164
|
-
|
165
|
-
pdf.set_font('freeserif', '', 18)
|
166
|
-
pdf.set_font('freeserif', 'B', 18)
|
167
|
-
pdf.set_font('freeserif', 'I', 18)
|
168
|
-
pdf.set_font('freeserif', 'BI', 18)
|
169
|
-
|
170
|
-
pdf.set_font('freemono', '', 18)
|
171
|
-
pdf.set_font('freemono', 'B', 18)
|
172
|
-
pdf.set_font('freemono', 'I', 18)
|
173
|
-
pdf.set_font('freemono', 'BI', 18)
|
174
|
-
|
175
|
-
pdf.set_font('dejavusans', '', 18)
|
176
|
-
pdf.set_font('dejavusans', 'B', 18)
|
177
|
-
pdf.set_font('dejavusans', 'I', 18)
|
178
|
-
pdf.set_font('dejavusans', 'BI', 18)
|
179
|
-
|
180
|
-
pdf.set_font('dejavusanscondensed', '', 18)
|
181
|
-
pdf.set_font('dejavusanscondensed', 'B', 18)
|
182
|
-
pdf.set_font('dejavusanscondensed', 'I', 18)
|
183
|
-
pdf.set_font('dejavusanscondensed', 'BI', 18)
|
184
|
-
|
185
|
-
pdf.set_font('dejavusansmono', '', 18)
|
186
|
-
pdf.set_font('dejavusansmono', 'B', 18)
|
187
|
-
pdf.set_font('dejavusansmono', 'I', 18)
|
188
|
-
pdf.set_font('dejavusansmono', 'BI', 18)
|
189
|
-
|
190
|
-
pdf.set_font('dejavuserif', '', 18)
|
191
|
-
pdf.set_font('dejavuserif', 'B', 18)
|
192
|
-
pdf.set_font('dejavuserif', 'I', 18)
|
193
|
-
pdf.set_font('dejavuserif', 'BI', 18)
|
194
|
-
|
195
|
-
pdf.set_font('dejavuserifcondensed', '', 18)
|
196
|
-
pdf.set_font('dejavuserifcondensed', 'B', 18)
|
197
|
-
pdf.set_font('dejavuserifcondensed', 'I', 18)
|
198
|
-
pdf.set_font('dejavuserifcondensed', 'BI', 18)
|
199
|
-
|
200
|
-
pdf.set_font('dejavusansextralight', '', 18)
|
201
|
-
|
202
|
-
pdf.putfonts()
|
203
|
-
end
|
204
|
-
|
205
|
-
test "cidfont0 Font test" do
|
206
|
-
pdf = MYPDF.new
|
207
|
-
|
208
|
-
pdf.set_font('cid0cs', '', 18)
|
209
|
-
pdf.set_font('cid0cs', 'B', 18)
|
210
|
-
pdf.set_font('cid0cs', 'I', 18)
|
211
|
-
pdf.set_font('cid0cs', 'BI', 18)
|
212
|
-
|
213
|
-
pdf.set_font('cid0ct', '', 18)
|
214
|
-
pdf.set_font('cid0ct', 'B', 18)
|
215
|
-
pdf.set_font('cid0ct', 'I', 18)
|
216
|
-
pdf.set_font('cid0ct', 'BI', 18)
|
217
|
-
|
218
|
-
pdf.set_font('cid0jp', '', 18)
|
219
|
-
pdf.set_font('cid0jp', 'B', 18)
|
220
|
-
pdf.set_font('cid0jp', 'I', 18)
|
221
|
-
pdf.set_font('cid0jp', 'BI', 18)
|
222
|
-
|
223
|
-
pdf.set_font('cid0kr', '', 18)
|
224
|
-
pdf.set_font('cid0kr', 'B', 18)
|
225
|
-
pdf.set_font('cid0kr', 'I', 18)
|
226
|
-
pdf.set_font('cid0kr', 'BI', 18)
|
227
|
-
|
228
|
-
pdf.set_font('kozgopromedium', '', 18)
|
229
|
-
pdf.set_font('kozgopromedium', 'B', 18)
|
230
|
-
pdf.set_font('kozgopromedium', 'I', 18)
|
231
|
-
pdf.set_font('kozgopromedium', 'BI', 18)
|
232
|
-
|
233
|
-
font = pdf.getFontBuffer('kozgopromedium')
|
234
|
-
assert_equal 99, font['desc']['StemV']
|
235
|
-
assert_equal 0, font['desc']['ItalicAngle']
|
236
|
-
assert_equal 'KozGoPro-Medium-Acro', font['name']
|
237
|
-
|
238
|
-
font = pdf.getFontBuffer('kozgopromediumB')
|
239
|
-
assert_equal 99 * 2, font['desc']['StemV']
|
240
|
-
assert_equal 0, font['desc']['ItalicAngle']
|
241
|
-
assert_equal 'KozGoPro-Medium-Acro,Bold', font['name']
|
242
|
-
|
243
|
-
font = pdf.getFontBuffer('kozgopromediumI')
|
244
|
-
assert_equal 99, font['desc']['StemV']
|
245
|
-
assert_equal(-11, font['desc']['ItalicAngle'])
|
246
|
-
assert_equal 'KozGoPro-Medium-Acro,Italic', font['name']
|
247
|
-
|
248
|
-
font = pdf.getFontBuffer('kozgopromediumBI')
|
249
|
-
assert_equal 99 * 2, font['desc']['StemV']
|
250
|
-
assert_equal(-11, font['desc']['ItalicAngle'])
|
251
|
-
assert_equal 'KozGoPro-Medium-Acro,BoldItalic', font['name']
|
252
|
-
|
253
|
-
pdf.set_font('kozminproregular', '', 18)
|
254
|
-
pdf.set_font('kozminproregular', 'B', 18)
|
255
|
-
pdf.set_font('kozminproregular', 'I', 18)
|
256
|
-
pdf.set_font('kozminproregular', 'BI', 18)
|
257
|
-
|
258
|
-
pdf.set_font('msungstdlight', '', 18)
|
259
|
-
pdf.set_font('msungstdlight', 'B', 18)
|
260
|
-
pdf.set_font('msungstdlight', 'I', 18)
|
261
|
-
pdf.set_font('msungstdlight', 'BI', 18)
|
262
|
-
|
263
|
-
pdf.set_font('stsongstdlight', '', 18)
|
264
|
-
pdf.set_font('stsongstdlight', 'B', 18)
|
265
|
-
pdf.set_font('stsongstdlight', 'I', 18)
|
266
|
-
pdf.set_font('stsongstdlight', 'BI', 18)
|
267
|
-
|
268
|
-
pdf.set_font('hysmyeongjostdmedium', '', 18)
|
269
|
-
pdf.set_font('hysmyeongjostdmedium', 'B', 18)
|
270
|
-
pdf.set_font('hysmyeongjostdmedium', 'I', 18)
|
271
|
-
pdf.set_font('hysmyeongjostdmedium', 'BI', 18)
|
272
|
-
|
273
|
-
pdf.putfonts()
|
274
|
-
end
|
275
|
-
|
276
|
-
test "Set Font fontname test" do
|
277
|
-
pdf = MYPDF.new
|
278
|
-
pdf.set_font('helvetica', '', 18, pdf.send(:getfontpath, 'helvetica.rb'))
|
279
|
-
pdf.set_font('helvetica', 'B', 18, pdf.send(:getfontpath, 'helveticab.rb'))
|
280
|
-
pdf.set_font('helvetica', 'I', 18, pdf.send(:getfontpath, 'helveticai.rb'))
|
281
|
-
pdf.set_font('helvetica', 'BI', 18, pdf.send(:getfontpath, 'helveticabi.rb'))
|
282
|
-
pdf.putfonts()
|
283
|
-
end
|
284
|
-
|
285
|
-
test "Font Error test" do
|
286
|
-
pdf = RBPDF.new
|
287
|
-
RBPDF.k_path_fonts = File.join File.dirname(__FILE__)
|
288
|
-
|
289
|
-
err = assert_raises(RBPDFError) {
|
290
|
-
pdf.set_font('err_font', '', 18)
|
291
|
-
}
|
292
|
-
assert_equal 'RBPDF error: Could not include font definition file: err_font', err.message
|
293
|
-
|
294
|
-
err = assert_raises(RBPDFError) {
|
295
|
-
pdf.set_font('err_font1', '', 18)
|
296
|
-
}
|
297
|
-
assert_match(/RBPDF error: The font definition file has a bad format: .*err_font1.rb/, err.message)
|
298
|
-
|
299
|
-
err = assert_raises(RBPDFError) {
|
300
|
-
pdf.set_font('err_font2', '', 18)
|
301
|
-
}
|
302
|
-
assert_equal 'RBPDF error: Unknow font type: Type0', err.message
|
303
|
-
|
304
|
-
# Font path reset test
|
305
|
-
pdf = RBPDF.new
|
306
|
-
pdf.set_font('helvetica', '', 18)
|
307
|
-
end
|
308
|
-
end
|