gost_frames 0.1.0.0

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/LICENSE.rdoc ADDED
@@ -0,0 +1,6 @@
1
+ GostFrames is copyrighted free software produced by Alexey Pavlyukov along with
2
+ community contributions.
3
+
4
+ GostFrames library distributed under GPL license.
5
+
6
+ The font mipgost.ttf (in folder data/fonts/) distributed with an unknown to me free license. Source of the font http://dwg.ru/dnl/147.
data/README.rdoc ADDED
@@ -0,0 +1,14 @@
1
+ = GostFrames: Russian GOST Frames PDF Generation For Ruby
2
+
3
+ == English
4
+ GostFrames is a extension of Prawn PDF generation library (http://prawn.majesticseacreature.com)
5
+ for generation documents with Russian GOST standard frames.
6
+ Excuse me, but other documentation is written in Russian.
7
+
8
+ == Russian
9
+
10
+ GostFrames расширение библиотеки Prawn PDF (http://prawn.majesticseacreature.com)
11
+ для генерации документов в соответствии со стандартами ГОСТ.
12
+
13
+
14
+
data/Rakefile.rb ADDED
@@ -0,0 +1,61 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rake/testtask'
4
+ require "rake/rdoctask"
5
+ require "rake/gempackagetask"
6
+
7
+ GOST_FRAMES_VERSION = "0.1.0.0"
8
+
9
+ task :default => [:test]
10
+
11
+ desc "Run all tests"
12
+ Rake::TestTask.new do |test|
13
+ test.libs << "lib"
14
+ test.test_files = Dir[ "test/*_test.rb" ]
15
+ test.verbose = true
16
+ end
17
+
18
+ desc "genrates documentation"
19
+ Rake::RDocTask.new do |rdoc|
20
+ rdoc.rdoc_files.include( "README.textile",
21
+ "lib/" )
22
+ rdoc.main = "README.textile"
23
+ rdoc.rdoc_dir = "doc/html"
24
+ rdoc.title = "GostFrames Documentation"
25
+ rdoc.options = ['--charset=utf-8']
26
+ end
27
+
28
+ desc "run all examples"
29
+ task :examples do
30
+ mkdir_p "examples_output"
31
+ examples = Dir["examples/**/*.rb"]
32
+ t = Time.now
33
+ puts "Running Examples"
34
+ examples.each { |file| `ruby -Ilib #{file}` }
35
+ puts "Ran in #{Time.now - t} s"
36
+ `mv *.pdf examples_output`
37
+ end
38
+
39
+ spec = Gem::Specification.new do |s|
40
+ s.name = 'gost_frames'
41
+ s.version = GOST_FRAMES_VERSION
42
+ s.date = '2009-09-23'
43
+
44
+ s.summary = 'Library for creation page frames of Russian GOST standard.'
45
+ s.email = 'lexaficus@list.ru'
46
+ s.authors = ['Alexey Pavlyukov']
47
+ s.has_rdoc = false
48
+ s.rdoc_options = ["--main", "README.textile", "--title", "GostFrames Documentation"]
49
+ s.extra_rdoc_files = ["README.rdoc", "LICENSE.rdoc"]
50
+ s.rdoc_options = ["--charset=utf-8"]
51
+ s.require_paths = ["lib"]
52
+ s.add_dependency("prawn",">=0.4.0")
53
+
54
+ s.files = Dir.glob("{examples,lib,data}/**/**/*") + ["Rakefile.rb"] + s.extra_rdoc_files
55
+ s.test_files = Dir[ "test/*_test.rb" ]
56
+ end
57
+
58
+ Rake::GemPackageTask.new(spec) do |pkg|
59
+ pkg.need_zip = true
60
+ pkg.need_tar = true
61
+ end
Binary file
@@ -0,0 +1,9 @@
1
+ require 'rubygems'
2
+ require 'prawn'
3
+ require 'prawn/core'
4
+ require 'prawn/table'
5
+ require 'prawn/measurements'
6
+ require 'prawn/font'
7
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
8
+ require 'prawn/gost'
9
+ #Prawn.debug = true
@@ -0,0 +1,60 @@
1
+ # encoding: utf-8
2
+ require "#{File.dirname(__FILE__)}/../example_helper.rb"
3
+
4
+ page_text = IO.readlines( "#{File.dirname(__FILE__)}/text_of_pages.txt", '----')
5
+
6
+ Prawn::Document.generate("generate_document.pdf", :skip_page_creation => true ) do
7
+
8
+ gost_initialize
9
+ gost_duplex
10
+
11
+ gost_set_font "#{File.dirname(__FILE__)}/../../data/fonts/mipgost.ttf" # download from http://dwg.ru/dnl/147
12
+
13
+ attribute2 "АВВГ.000000.000"
14
+ attribute11_1 "Иванов"
15
+ attribute11_2 "Петров"
16
+ attribute11_4 "Сидоров"
17
+ attribute1 [
18
+ " УНИВЕРСАЛЬНЫЙ СТАНОК ",
19
+ " НАРЕЗКИ КОЛБАСЫ "]
20
+
21
+ attribute8 "ООО \"Рога и Копыта\""
22
+ attribute19 ['1', '2', '3']
23
+
24
+ page_count = 7
25
+ page_counter = 0
26
+ attribute7 page_count
27
+
28
+ gost_page :gost_page_type => :title, :size => "A4", :layout => :portrait do
29
+ text page_text[page_counter]
30
+ end
31
+
32
+ gost_page :gost_page_type => :first_text, :size => "A4", :layout => :portrait do
33
+ attribute6 page_counter+= 1
34
+ text page_text[page_counter]
35
+ end
36
+
37
+ gost_page(:gost_page_type => :normal, :size => 'A4', :layout => :portrait) {
38
+ attribute6 page_counter+= 1
39
+ text page_text[page_counter]
40
+ }
41
+
42
+ gost_page(:gost_page_type => :normal, :size => 'A4', :layout => :landscape) {
43
+ attribute6 page_counter+= 1
44
+ text page_text[page_counter]
45
+ }
46
+
47
+ gost_page(:gost_page_type => :normal, :size => 'A3', :layout => :portrait) {
48
+ attribute6 page_counter+= 1
49
+ text page_text[page_counter]
50
+ }
51
+
52
+ gost_page(:gost_page_type => :normal, :size => 'A3', :layout => :landscape) {
53
+ attribute6 page_counter+= 1
54
+ text page_text[page_counter]
55
+ }
56
+
57
+ gost_change_list_page{
58
+ attribute6 page_counter+= 1
59
+ }
60
+ end
@@ -0,0 +1,41 @@
1
+
2
+ Материалл из WikiPedia (http://ru.wikipedia.org/wiki/%D0%95%D0%A1%D0%9A%D0%94)
3
+
4
+ Единая система конструкторской документации (ЕСКД)[1] — комплекс государственных стандартов,
5
+ устанавливающих взаимосвязанные правила,
6
+ требования и нормы по разработке, оформлению и обращению конструкторской документации[2],
7
+ разрабатываемой и применяемой на всех стадиях жизненного цикла изделия
8
+ (при проектировании, разработке, изготовлении, контроле, приемке, эксплуатации, ремонте, утилизации).
9
+ ----
10
+ Основное назначение стандартов ЕСКД состоит в установлении единых оптимальных правил,
11
+ требований и норм выполнения, оформления и обращения конструкторской документации, которые обеспечивают[1]:
12
+ ----
13
+ 1. применение современных методов и средств на всех стадиях жизненного цикла изделия;
14
+ ----
15
+ 2. возможность взаимообмена конструкторской документацией без ее переоформления;
16
+ ----
17
+ 3. оптимальную комплектность конструкторской документации;
18
+ ----
19
+ 4. механизацию и автоматизацию обработки конструкторских документов и содержащейся в них информации;
20
+ ----
21
+ 5. высокое качество изделий;
22
+ ----
23
+ 6. наличие в конструкторской документации требований, обеспечивающих безопасность использования изделий для жизни и здоровья потребителей, окружающей среды, а также предотвращение причинения вреда имуществу;
24
+ ----
25
+ 7. возможность расширения унификации и стандартизации при проектировании изделий и разработке конструкторской документации;
26
+ ----
27
+ 8. возможность проведения сертификации изделий;
28
+ ----
29
+ 9. сокращение сроков и снижение трудоемкости подготовки производства;
30
+ ----
31
+ 10. правильную эксплуатацию изделий;
32
+ ----
33
+ 11. оперативную подготовку документации для быстрой переналадки действующего производства;
34
+ ----
35
+ 12. упрощение форм конструкторских документов и графических изображений;
36
+ ----
37
+ 13. возможность создания и ведения единой информационной базы;
38
+ ----
39
+ 14. возможность гармонизации стандартов ЕСКД с международными стандартами (ИСО, МЭК) в области конструкторской документации;
40
+ ----
41
+ 15. возможность информационного обеспечения поддержки жизненного цикла изделия.
@@ -0,0 +1,2 @@
1
+ # encoding: utf-8
2
+ require "#{File.dirname(__FILE__)}/../example_helper.rb"
Binary file
@@ -0,0 +1,346 @@
1
+ module GOST::Drawers
2
+
3
+ def gost_get_optimal_font_size(text, w, h)
4
+
5
+ coeff = w / width_of(text)
6
+ f_s = font_size * coeff
7
+ coeff *= [f_s, h].min / f_s
8
+ f_s = [f_s, h].min
9
+ # длина текста
10
+ t_w = width_of(text) * coeff
11
+ return { :f_s => f_s, :w => t_w , :h => h}
12
+ end
13
+
14
+ SimpleAttributeDrawer = lambda { |pdf, atr_value, options|
15
+
16
+ str = atr_value.to_s
17
+
18
+ if str.empty?
19
+ return
20
+ end
21
+
22
+ h = options[:h] - pdf.mm(1)
23
+ w = options[:w] - pdf.mm(1)
24
+ t_w = options[:orientation] == :vertical ? h : w
25
+ t_h = options[:orientation] == :vertical ? w : h
26
+
27
+ pos = options[:pos]
28
+ pos[0] += pdf.mm(0.5)
29
+ pos[1] += pdf.mm(0.5)
30
+
31
+ f_s = 12
32
+
33
+
34
+ if o_f_s = options[:font_size]
35
+ t_h = o_f_s
36
+ t_w = pdf.width_of(str) * o_f_s / pdf.font_size
37
+ f_s = o_f_s
38
+ else
39
+ t_s = pdf.gost_get_optimal_font_size str, t_w, t_h
40
+
41
+ f_s = t_s[:f_s]
42
+ t_w = t_s[:w]
43
+ t_h = t_s[:h]
44
+ end
45
+
46
+
47
+
48
+
49
+ if options[:orientation] == :vertical
50
+ posx = pos[0] + w - w/2.0 + t_h / 2.0
51
+ posy = pos[1] - h + h/2.0 - t_w/2.0
52
+ pdf.text(str, {:align => :center, :size => f_s, :at => [posx, posy], :rotate => 90})
53
+ else
54
+ posx = pos[0] + w/2.0 - t_w/2.0
55
+ posy = pos[1] - h + h/2.0 - f_s/2.0
56
+ pdf.text(str, {:align => :center, :size => f_s, :at => [posx, posy]})
57
+ end
58
+
59
+ }
60
+
61
+
62
+ AttributeDrawer = lambda { |pdf, atr_value, options|
63
+
64
+ case atr_value
65
+ when Array
66
+ w = options[:w]
67
+ h = options[:h] / atr_value.size
68
+
69
+ f_s = options[:font_size]
70
+ if ! f_s
71
+ font_sizes = []
72
+ atr_value.each { |val|
73
+ font_sizes << pdf.gost_get_optimal_font_size(val.to_s, w, h)[:f_s]
74
+ }
75
+
76
+ f_s = font_sizes.min
77
+ end
78
+
79
+ pos = options[:pos].dup
80
+ if (f_s * atr_value.size) < (options[:h] - f_s) then
81
+ h = f_s*1.1
82
+ pos[1] = pos[1] - options[:h] / 2.0 + h * atr_value.size / 2.0
83
+ end
84
+
85
+ atr_value.each { |val|
86
+ a_options = {:w => w, :h => h, :pos => pos.dup, :font_size => f_s}
87
+ SimpleAttributeDrawer.call pdf, val.to_s, a_options
88
+ pos[1] = pos[1] - h
89
+ }
90
+ else
91
+ SimpleAttributeDrawer.call pdf, atr_value.to_s, options
92
+ end
93
+ }
94
+
95
+ DefaultDrawer = lambda { |pdf, section, options|
96
+
97
+ ps = section[:pos].dup
98
+ w = section[:w]
99
+ h = section[:h]
100
+
101
+ if options[:align] == :left
102
+ ps[0] = ps[0] + w
103
+ w = -w
104
+ end
105
+
106
+ pdf.stroke do
107
+ pdf.polygon ps, [ps[0] + w, ps[1]]
108
+ pdf.polygon ps, [ps[0], ps[1] - h]
109
+ end
110
+
111
+ if lines = options[:lines]
112
+ lines.each { |type|
113
+ case type
114
+ when :bottom
115
+ p1 = [section[:pos][0], section[:pos][1] - section[:h]]
116
+ p2 = [p1[0] + section[:w], p1[1]]
117
+ pdf.stroke do
118
+ pdf.polygon p1, p2
119
+ end
120
+ end
121
+ }
122
+ end
123
+
124
+ text = section[:text]
125
+
126
+ if (attribute = section[:attribute]) && ! options[:no_attribute]
127
+ text = pdf.get_attribute(attribute.id2name)
128
+ end
129
+
130
+ f_s = options[:font_size]
131
+ f_s = pdf.mm(f_s) if f_s
132
+
133
+ if text
134
+ a_options = {:w => w.abs, :h => h, :pos => section[:pos].dup, :font_size => f_s}
135
+ AttributeDrawer.call pdf, text, a_options
136
+ end
137
+ }
138
+
139
+
140
+ Section4Drawer = lambda { |pdf, section, options|
141
+ options[:no_attribute] = true
142
+ DefaultDrawer.call(pdf, section, options)
143
+
144
+ ps = section[:pos].dup
145
+ w = section[:w]
146
+ h = section[:h]
147
+ step = pdf.mm(5)
148
+ top = ps[1] - step
149
+ h2 = h - step
150
+
151
+ pdf.stroke do
152
+ pdf.polygon [ps[0], top], [ps[0]+w, top]
153
+ pdf.polygon [ps[0] + step, top], [ps[0]+step, top - h2]
154
+ pdf.polygon [ps[0] + step*2, top], [ps[0]+step*2, top - h2]
155
+ end
156
+
157
+ lit_options = {:w => w.abs, :h => step, :pos => section[:pos].dup}
158
+ AttributeDrawer.call pdf, 'Лит.', lit_options
159
+
160
+ if attribute = section[:attribute]
161
+ atr_val = pdf.get_attribute(attribute.id2name)
162
+ if Array === atr_val
163
+ a_pos = [ps[0], top]
164
+ atr_val.each { |val|
165
+ a_options = {:w => step, :h => h2, :pos => a_pos.dup}
166
+ AttributeDrawer.call pdf, val, a_options
167
+ a_pos[0] = a_pos[0] + step
168
+ }
169
+ end
170
+ end
171
+ }
172
+
173
+ Section7Drawer_fpt = lambda { |pdf, section, options|
174
+ options[:no_attribute] = true
175
+ DefaultDrawer.call(pdf, section, options)
176
+
177
+ ps = section[:pos].dup
178
+ w = section[:w]
179
+ h = section[:h]
180
+ head_h = pdf.mm(5)
181
+ top = ps[1] - head_h
182
+ h2 = h - head_h
183
+
184
+ pdf.stroke do
185
+ pdf.polygon [ps[0], top], [ps[0]+w, top]
186
+ end
187
+
188
+ lit_options = {:w => w, :h => head_h, :pos => section[:pos].dup}
189
+ AttributeDrawer.call pdf, 'Лист', lit_options
190
+
191
+ if attribute = section[:attribute]
192
+ atr_val = pdf.get_attribute(attribute.id2name)
193
+ a_pos = [ps[0], top]
194
+ a_options = {:w => w, :h => h2, :pos => a_pos.dup}
195
+ AttributeDrawer.call pdf, atr_val, a_options
196
+ end
197
+ }
198
+
199
+ Section8Drawer_fpt = lambda { |pdf, section, options|
200
+ options[:no_attribute] = true
201
+ DefaultDrawer.call(pdf, section, options)
202
+
203
+ ps = section[:pos].dup
204
+ w = section[:w]
205
+ h = section[:h]
206
+ head_h = pdf.mm(5)
207
+ top = ps[1] - head_h
208
+ h2 = h - head_h
209
+
210
+ pdf.stroke do
211
+ pdf.polygon [ps[0], top], [ps[0]+w, top]
212
+ end
213
+
214
+ lit_options = {:w => w, :h => head_h, :pos => section[:pos].dup}
215
+ AttributeDrawer.call pdf, 'Листов', lit_options
216
+
217
+ if attribute = section[:attribute]
218
+ atr_val = pdf.get_attribute(attribute.id2name)
219
+ a_pos = [ps[0], top]
220
+ a_options = {:w => w, :h => h2, :pos => a_pos.dup}
221
+ AttributeDrawer.call pdf, atr_val, a_options
222
+ end
223
+ }
224
+
225
+ Section7Drawer = lambda { |pdf, section, options|
226
+ options[:no_attribute] = true
227
+ DefaultDrawer.call(pdf, section, options)
228
+
229
+ ps = section[:pos].dup
230
+ w = section[:w]
231
+ h = section[:h]
232
+ head_h = pdf.mm(7)
233
+ top = ps[1] - head_h
234
+ h2 = h - head_h
235
+
236
+ pdf.stroke do
237
+ pdf.polygon [ps[0], top], [ps[0]+w, top]
238
+ end
239
+
240
+ lit_options = {:w => w, :h => head_h, :pos => section[:pos].dup}
241
+ AttributeDrawer.call pdf, 'Лист', lit_options
242
+
243
+ if attribute = section[:attribute]
244
+ atr_val = pdf.get_attribute(attribute.id2name)
245
+ a_pos = [ps[0], top]
246
+ a_options = {:w => w, :h => h2, :pos => a_pos.dup}
247
+ AttributeDrawer.call pdf, atr_val, a_options
248
+ end
249
+ }
250
+
251
+ MultiLineSectionDrawer = lambda { |pdf, section, options|
252
+ options[:no_attribute] = true
253
+ DefaultDrawer.call(pdf, section, options)
254
+
255
+ if m_fields = options[:m_fields]
256
+ f_pos = section[:pos].dup
257
+ w = section[:w]
258
+
259
+ f_s = options[:font_size]
260
+ f_s = pdf.mm(f_s) if f_s
261
+
262
+ m_fields.each { |field|
263
+
264
+ f_size = pdf.mm(field[:size])
265
+
266
+ text = field[:text]
267
+ if attribute = field[:attribute]
268
+ if att_value = pdf.get_attribute(attribute.id2name)
269
+ text = att_value
270
+ end
271
+ end
272
+
273
+ if text
274
+ a_options = {:w => w, :h => f_size, :pos => f_pos.dup, :font_size => f_s}
275
+ AttributeDrawer.call pdf, text, a_options
276
+ end
277
+
278
+ f_pos[1] -= f_size
279
+ pdf.stroke do
280
+ pdf.polygon f_pos, [f_pos[0]+w, f_pos[1]]
281
+ end
282
+
283
+ }
284
+ end
285
+ }
286
+
287
+ MultiLineVertSectionDrawer = lambda { |pdf, section, options|
288
+ options[:no_attribute] = true
289
+ DefaultDrawer.call(pdf, section, options)
290
+
291
+ if lines = options[:lines]
292
+ lines.each { |type|
293
+ case type
294
+ when :bottom
295
+ p1 = [section[:pos][0], section[:pos][1] - section[:h]]
296
+ p2 = [p1[0] + section[:w], p1[1]]
297
+ pdf.stroke do
298
+ pdf.polygon p1, p2
299
+ end
300
+ end
301
+ }
302
+ end
303
+
304
+ if m_fields = options[:m_fields]
305
+ f_pos = section[:pos].dup
306
+ h = section[:h]
307
+
308
+ f_s = options[:font_size]
309
+ f_s = pdf.mm(f_s) if f_s
310
+
311
+ m_fields.each { |field|
312
+
313
+ f_size = pdf.mm(field[:size])
314
+
315
+ text = field[:text]
316
+ if attribute = field[:attribute]
317
+ if att_value = pdf.get_attribute(attribute.id2name)
318
+ text = att_value
319
+ end
320
+ end
321
+
322
+ if text
323
+ a_options = {:w => f_size, :h => h, :pos => f_pos.dup, :orientation => :vertical, :font_size => f_s}
324
+ AttributeDrawer.call pdf, text, a_options
325
+ end
326
+
327
+ f_pos[0] += f_size
328
+ pdf.stroke do
329
+ pdf.polygon f_pos, [f_pos[0], f_pos[1] - h]
330
+ end
331
+
332
+ }
333
+ end
334
+ }
335
+
336
+ # class GostSection4Drawer
337
+ # def draw(section, pdf, options = {})
338
+ # GostSectionDrawer.new.draw(section, pdf, options)
339
+
340
+ # pdf.bounding_box ps, :width => w, :height => step do
341
+ # pdf.section_text "Лит."
342
+ # end
343
+ # end
344
+ # end
345
+
346
+ end
@@ -0,0 +1,446 @@
1
+ module GOST::Sections
2
+ require 'prawn/GOST/drawers'
3
+ include GOST::Drawers
4
+ # :align относительно какого края отсчитывать по умолчанию правого
5
+ # :w ширина, мм
6
+ # :h высота, мм
7
+ # :pos [x, y] - позиция левого верхнего угла в мм
8
+ # :drawer специфический отрисовщик, по умолчанию GostSectionDrawer
9
+ # :dep зависимость от другой секции
10
+ # :noreq необязательная секция
11
+ # :drawer_opt опции для отрисовщика
12
+
13
+ GOST_SECTIONS_19_25 = {
14
+ :section23 => {:w => 12, :h => 35, :pos => [-12, 145], :align => :left,
15
+ :drawer => MultiLineVertSectionDrawer,
16
+ :drawer_opt => {
17
+ :m_fields => [
18
+ { :size=>5, :text => 'Подп. и дата' },
19
+ { :size=>7 }
20
+ ]
21
+ }
22
+ },
23
+
24
+ :section22 => {:w => 12, :h => 25, :pos => [-12, 110], :align => :left,
25
+ :drawer => MultiLineVertSectionDrawer,
26
+ :drawer_opt => {
27
+ :m_fields => [
28
+ { :size=>5, :text => 'Инв. № дубл.' },
29
+ { :size=>7 }
30
+ ]
31
+ }
32
+ },
33
+
34
+ :section21 => {:w => 12, :h => 25, :pos => [-12, 85], :align => :left,
35
+ :drawer => MultiLineVertSectionDrawer,
36
+ :drawer_opt => {
37
+ :m_fields => [
38
+ { :size=>5, :text => 'Взам. инв. №' },
39
+ { :size=>7 }
40
+ ]
41
+ }
42
+ },
43
+
44
+ :section20 => {:w => 12, :h => 35, :pos => [-12, 60], :align => :left,
45
+ :drawer => MultiLineVertSectionDrawer,
46
+ :drawer_opt => {
47
+ :m_fields => [
48
+ { :size=>5, :text => 'Подп. и дата' },
49
+ { :size=>7 }
50
+ ]
51
+ }
52
+ },
53
+
54
+ :section19 => {:w => 12, :h => 25, :pos => [-12, 25], :align => :left,
55
+ :drawer => MultiLineVertSectionDrawer,
56
+ :drawer_opt => {
57
+ :m_fields => [
58
+ { :size=>5, :text => 'Инв. № подл.' },
59
+ { :size=>7 }
60
+ ],
61
+ :lines => [:bottom]
62
+ }
63
+ },
64
+
65
+ :section25 => {:w => 12, :h => 60, :pos => [-12, 287], :align => :left,
66
+ :drawer => MultiLineVertSectionDrawer,
67
+ :draw_request => true,
68
+ :drawer_opt => {
69
+ :m_fields => [
70
+ { :size=>5, :text => 'Перв. примен.' },
71
+ { :size=>7 }
72
+ ]
73
+ }
74
+ },
75
+
76
+ :section24 => {:w => 12, :h => 60, :pos => [-12, 227], :align => :left,
77
+ :drawer => MultiLineVertSectionDrawer,
78
+ :draw_request => true,
79
+ :drawer_opt => {
80
+ :m_fields => [
81
+ { :size=>5, :text => 'Справ. №' },
82
+ { :size=>7 }
83
+ ],
84
+ :lines => [:bottom]
85
+ }
86
+ }
87
+ }
88
+
89
+
90
+ GOST_SECTIONS_FIRST_PAGE = {
91
+ :section1 => {:w=> 70, :h => 25, :pos => [-120, 40], :attribute => :attribute1 },
92
+ :section2 => {:w=> 120, :h => 15, :pos => [-120, 55], :attribute => :attribute2 },
93
+ :section3 => {:w=> 70, :h => 15, :pos => [-120, 15]},
94
+ :section4 => {:w=> 15, :h => 20, :pos => [-50, 40], :attribute => :attribute19 },
95
+ :section5 => {:w=> 17, :h => 20, :pos => [-35, 40]},
96
+ :section6 => {:w=> 18, :h => 20, :pos => [-18, 40]},
97
+ :section7 => {:w=> 20, :h => 5, :pos => [-50, 20]},
98
+ :section8 => {:w=> 30, :h => 5, :pos => [-30, 20], :attribute => :attribute7 },
99
+ :section9 => {:w=> 50, :h=>15, :pos => [-50, 15], :attribute => :attribute8 },
100
+ :section10 => {},
101
+ :section11 => {},
102
+ :section12 => {},
103
+ :section13 => {},
104
+ :section14 => {},
105
+ :section15 => {},
106
+ :section16 => {},
107
+ :section17 => {},
108
+ :section18 => {},
109
+ :section26 => {}
110
+ }
111
+
112
+ GOST_SECTIONS_FIRST_PAGE.update(GOST_SECTIONS_19_25)
113
+
114
+ GOST_SECTIONS_FIRST_TEXT_PAGE = {
115
+ :section1 => {:w=> 70, :h => 25, :pos => [-120, 25], :attribute => :attribute1 },
116
+ :section2 => {:w=> 120, :h => 15, :pos => [-120, 40], :attribute => :attribute2 },
117
+ :section4 => {:w=> 15, :h => 10, :pos => [-50, 25], :drawer => Section4Drawer, :attribute => :attribute19 },
118
+ :section7 => {:w=> 15, :h => 10, :pos => [-35, 25], :drawer => Section7Drawer_fpt, :attribute => :attribute6 },
119
+ :section8 => {:w=> 20, :h => 10, :pos => [-20, 25], :drawer => Section8Drawer_fpt, :attribute => :attribute7 },
120
+ :section9 => {:w=> 50, :h=> 15, :pos => [-50, 15], :attribute => :attribute8 },
121
+ :section13 => {:w => 10, :h => 25, :pos => [-130, 25], :drawer => MultiLineSectionDrawer,
122
+ :drawer_opt => {
123
+ :m_fields => [
124
+ { :size=>5 },
125
+ { :size=>5 },
126
+ { :size=>5 },
127
+ { :size=>5 },
128
+ { :size=>5 }
129
+ ]
130
+ }
131
+ },
132
+
133
+ :section12 => {:w => 15, :h => 25, :pos => [-145, 25], :drawer => MultiLineSectionDrawer,
134
+ :drawer_opt => {
135
+ :m_fields => [
136
+ { :size=>5 },
137
+ { :size=>5 },
138
+ { :size=>5 },
139
+ { :size=>5 },
140
+ { :size=>5 }
141
+ ]
142
+ }
143
+ },
144
+
145
+ :section11 => {:w => 23, :h => 25, :pos => [-168, 25], :drawer => MultiLineSectionDrawer,
146
+ :drawer_opt => {
147
+ :m_fields => [
148
+ { :size=>5, :attribute => :attribute11_1 },
149
+ { :size=>5, :attribute => :attribute11_2 },
150
+ { :size=>5, :attribute => :attribute11_3 },
151
+ { :size=>5, :attribute => :attribute11_4 },
152
+ { :size=>5, :attribute => :attribute11_5 }
153
+ ]
154
+ }
155
+ },
156
+
157
+ :section10 => {:w => 17, :h => 25, :pos => [-185, 25], :drawer => MultiLineSectionDrawer,
158
+ :drawer_opt => {
159
+ :m_fields => [
160
+ { :size=>5, :text => 'Разраб.' },
161
+ { :size=>5, :text => 'Пров.' },
162
+ { :size=>5 },
163
+ { :size=>5, :text => 'Н.контр.' },
164
+ { :size=>5, :text => 'Утв.' }
165
+ ]
166
+ }
167
+ },
168
+
169
+ :section18 => {:w => 10, :h => 15, :pos => [-130, 40], :drawer => MultiLineSectionDrawer,
170
+ :drawer_opt => {
171
+ :m_fields => [
172
+ { :size=>5 },
173
+ { :size=>5 },
174
+ { :size=>5, :text => 'Дата' }
175
+ ]
176
+ }
177
+ },
178
+
179
+ :section17 => {:w => 15, :h => 15, :pos => [-145, 40], :drawer => MultiLineSectionDrawer,
180
+ :drawer_opt => {
181
+ :m_fields => [
182
+ { :size=>5 },
183
+ { :size=>5 },
184
+ { :size=>5, :text => 'Подп.' }
185
+ ]
186
+ }
187
+ },
188
+
189
+ :section16 => {:w => 23, :h => 15, :pos => [-168, 40], :drawer => MultiLineSectionDrawer,
190
+ :drawer_opt => {
191
+ :m_fields => [
192
+ { :size=>5 },
193
+ { :size=>5 },
194
+ { :size=>5, :text => '№ докум.' }
195
+ ]
196
+ }
197
+ },
198
+
199
+ :section15 => {:w => 10, :h => 15, :pos => [-178, 40], :drawer => MultiLineSectionDrawer,
200
+ :drawer_opt => {
201
+ :m_fields => [
202
+ { :size=>5 },
203
+ { :size=>5, :attribute => :attribute6 },
204
+ { :size=>5, :text => 'Лист' }
205
+ ]
206
+ }
207
+ },
208
+
209
+ :section14 => {:w => 7, :h => 15, :pos => [-185, 40], :drawer => MultiLineSectionDrawer,
210
+ :drawer_opt => {
211
+ :m_fields => [
212
+ { :size=>5 },
213
+ { :size=>5 },
214
+ { :size=>5, :text => 'Изм.' }
215
+ ]
216
+ }
217
+ }
218
+ }
219
+
220
+ GOST_SECTIONS_FIRST_TEXT_PAGE.update(GOST_SECTIONS_19_25)
221
+
222
+ GOST_SECTIONS_EVEN_PAGE = {
223
+ :section2 => {:w=> 110, :h => 15, :pos => [10, 15], :attribute => :attribute2, :align => :left },
224
+ :section7 => {:w=> 10, :h => 15, :pos => [0, 15], :drawer => Section7Drawer, :attribute => :attribute6, :align => :left },
225
+
226
+ :section18 => {:w => 10, :h => 15, :pos => [175, 15], :drawer => MultiLineSectionDrawer, :align => :left,
227
+ :drawer_opt => {
228
+ :m_fields => [
229
+ { :size=>5 },
230
+ { :size=>5 },
231
+ { :size=>5, :text => 'Дата' }
232
+ ]
233
+ }
234
+ },
235
+
236
+ :section17 => {:w => 15, :h => 15, :pos => [160, 15], :drawer => MultiLineSectionDrawer, :align => :left,
237
+ :drawer_opt => {
238
+ :m_fields => [
239
+ { :size=>5 },
240
+ { :size=>5 },
241
+ { :size=>5, :text => 'Подп.' }
242
+ ]
243
+ }
244
+ },
245
+
246
+ :section16 => {:w => 23, :h => 15, :pos => [137, 15], :drawer => MultiLineSectionDrawer, :align => :left,
247
+ :drawer_opt => {
248
+ :m_fields => [
249
+ { :size=>5 },
250
+ { :size=>5 },
251
+ { :size=>5, :text => '№ докум.' }
252
+ ]
253
+ }
254
+ },
255
+
256
+ :section15 => {:w => 10, :h => 15, :pos => [127, 15], :drawer => MultiLineSectionDrawer, :align => :left,
257
+ :drawer_opt => {
258
+ :m_fields => [
259
+ { :size=>5 },
260
+ { :size=>5 },
261
+ { :size=>5, :text => 'Лист' }
262
+ ]
263
+ }
264
+ },
265
+
266
+ :section14 => {:w => 7, :h => 15, :pos => [120, 15], :drawer => MultiLineSectionDrawer, :align => :left,
267
+ :drawer_opt => {
268
+ :m_fields => [
269
+ { :size=>5 },
270
+ { :size=>5 },
271
+ { :size=>5, :text => 'Изм.' }
272
+ ]
273
+ }
274
+ }
275
+ }
276
+
277
+ GOST_SECTIONS_NORMAL_PAGE = {
278
+ :section2 => {:w=> 110, :h => 15, :pos => [-120, 15], :attribute => :attribute2 },
279
+ :section7 => {:w=> 10, :h => 15, :pos => [-10, 15], :drawer => Section7Drawer, :attribute => :attribute6 },
280
+
281
+ :section18 => {:w => 10, :h => 15, :pos => [-130, 15], :drawer => MultiLineSectionDrawer,
282
+ :drawer_opt => {
283
+ :m_fields => [
284
+ { :size=>5 },
285
+ { :size=>5 },
286
+ { :size=>5, :text => 'Дата' }
287
+ ]
288
+ }
289
+ },
290
+
291
+ :section17 => {:w => 15, :h => 15, :pos => [-145, 15], :drawer => MultiLineSectionDrawer,
292
+ :drawer_opt => {
293
+ :m_fields => [
294
+ { :size=>5 },
295
+ { :size=>5 },
296
+ { :size=>5, :text => 'Подп.' }
297
+ ]
298
+ }
299
+ },
300
+
301
+ :section16 => {:w => 23, :h => 15, :pos => [-168, 15], :drawer => MultiLineSectionDrawer,
302
+ :drawer_opt => {
303
+ :m_fields => [
304
+ { :size=>5 },
305
+ { :size=>5 },
306
+ { :size=>5, :text => '№ докум.' }
307
+ ]
308
+ }
309
+ },
310
+
311
+ :section15 => {:w => 10, :h => 15, :pos => [-178, 15], :drawer => MultiLineSectionDrawer,
312
+ :drawer_opt => {
313
+ :m_fields => [
314
+ { :size=>5 },
315
+ { :size=>5 },
316
+ { :size=>5, :text => 'Лист' }
317
+ ]
318
+ }
319
+ },
320
+
321
+ :section14 => {:w => 7, :h => 15, :pos => [-185, 15], :drawer => MultiLineSectionDrawer,
322
+ :drawer_opt => {
323
+ :m_fields => [
324
+ { :size=>5 },
325
+ { :size=>5 },
326
+ { :size=>5, :text => 'Изм.' }
327
+ ]
328
+ }
329
+ }
330
+ }
331
+
332
+ GOST_SECTIONS_NORMAL_PAGE.update(GOST_SECTIONS_19_25)
333
+
334
+ GOST_SECTIONS_TITLE_PAGE = { }
335
+ GOST_SECTIONS_TITLE_PAGE.update(GOST_SECTIONS_19_25)
336
+
337
+ GOST_ADA_SPECIFICATION = {
338
+
339
+ :zone => {:w => 8, :h => 15, :pos => [0, 0], :align => :left, :valign => :top,
340
+ :drawer => MultiLineVertSectionDrawer,
341
+ :drawer_opt => {
342
+ :font_size => 5,
343
+ :lines => [:bottom],
344
+ :m_fields => [
345
+ { :size=>8, :text => 'Зона' }
346
+ ]
347
+ }
348
+ },
349
+
350
+ :poz_oboz => {:w => 20, :h => 15, :pos => [8, 0], :align => :left, :valign => :top,
351
+ :drawer_opt => {
352
+ :font_size => 5,
353
+ :lines => [:bottom]
354
+ },
355
+ :text => ['Поз.', 'обозна-', 'чение']
356
+ },
357
+
358
+ :name => {:w => 110, :h => 15, :pos => [28, 0], :align => :left, :valign => :top,
359
+ :drawer_opt => {
360
+ :font_size => 5,
361
+ :lines => [:bottom]
362
+ },
363
+ :text => 'Наименование'
364
+ },
365
+
366
+ :count => {:w => 10, :h => 15, :pos => [138, 0], :align => :left, :valign => :top,
367
+ :drawer_opt => {
368
+ :font_size => 5,
369
+ :lines => [:bottom]
370
+ },
371
+ :text => 'Кол'
372
+ },
373
+
374
+ :note => {:w => 37, :h => 15, :pos => [148, 0], :align => :left, :valign => :top,
375
+ :drawer_opt => {
376
+ :font_size => 5,
377
+ :lines => [:bottom]
378
+ },
379
+ :text => 'Примечание'
380
+ },
381
+ }
382
+
383
+ GOST_CHANGE_LIST_SPECIFICATION = {
384
+
385
+ :header => {:w => 185, :h => 15, :pos => [0, 0], :align => :left, :valign => :top,
386
+ :drawer => MultiLineSectionDrawer,
387
+ :drawer_opt => {
388
+ :font_size => 8,
389
+ :lines => [:bottom],
390
+ :m_fields => [
391
+ { :size=>15, :text => 'ЛИСТ РЕГИСТРАЦИИ ИЗМЕНЕНИЙ' }
392
+ ]
393
+ }
394
+ },
395
+
396
+ :s1 => {:w => 10, :h => 35, :pos => [0, -15], :align => :left, :valign => :top,
397
+ :drawer => MultiLineVertSectionDrawer,
398
+ :drawer_opt => {
399
+ :font_size => 6,
400
+ :lines => [:bottom],
401
+ :m_fields => [
402
+ { :size=>10, :text => 'Изм.' }
403
+ ]
404
+ }
405
+ },
406
+ :s2 => {:w => 80, :h => 10, :pos => [10, -15], :align => :left, :valign => :top,
407
+ :drawer => MultiLineSectionDrawer,
408
+ :drawer_opt => {
409
+ :font_size => 6,
410
+ #:lines => [:bottom],
411
+ :m_fields => [
412
+ { :size=>10, :text => 'Номера листов (страниц)' }
413
+ ]
414
+ }
415
+ },
416
+
417
+ :s3 => {:w => 80, :h => 25, :pos => [10, -25], :align => :left, :valign => :top,
418
+ :drawer => MultiLineVertSectionDrawer,
419
+ :drawer_opt => {
420
+ :font_size => 6,
421
+ :lines => [:bottom],
422
+ :m_fields => [
423
+ { :size=>20, :text => ['изме-','ненных'] },
424
+ { :size=>20, :text => ['заме','ненных'] },
425
+ { :size=>20, :text => ['новых'] },
426
+ { :size=>20, :text => ['аннулир','ованных'] }
427
+ ]
428
+ }
429
+ },
430
+
431
+ :s4 => {:w => 95, :h => 35, :pos => [90, -15], :align => :left, :valign => :top,
432
+ :drawer => MultiLineVertSectionDrawer,
433
+ :drawer_opt => {
434
+ :font_size => 6,
435
+ :lines => [:bottom],
436
+ :m_fields => [
437
+ { :size=>20, :text => ['Всего', 'листов', '(стра-', 'ниц)', 'в докум.'] },
438
+ { :size=>20, :text => ['Номер', 'докум.'] },
439
+ { :size=>25, :text => ['Входящий', '№ сопро-', 'водитель-', 'ного', 'докум.', 'и дата'] },
440
+ { :size=>15, :text => ['Под-', 'пись'] },
441
+ { :size=>15, :text => ['Дата'] },
442
+ ]
443
+ }
444
+ },
445
+ }
446
+ end
@@ -0,0 +1,2 @@
1
+ module Settings
2
+ end
data/lib/prawn/gost.rb ADDED
@@ -0,0 +1,279 @@
1
+ module GOST
2
+
3
+ require 'prawn/GOST/sections'
4
+ include Sections
5
+
6
+ def gost_set_font(fnt)
7
+ puts "FONTTTT #{fnt}"
8
+ @gost_font = fnt
9
+ end
10
+
11
+ def GOST.mm(x)
12
+ return x * 72.0 / 25.4
13
+ end
14
+ #mm to pt
15
+ def mm(x)
16
+ return GOST::mm(x)
17
+ end
18
+
19
+ def gost_page(options = {}, &block)
20
+
21
+ @gost_in_page_constructor = true
22
+
23
+ @gost_cur_sections = GOST_SECTIONS_NORMAL_PAGE
24
+ @gost_cur_attributes = {}
25
+
26
+ options[:left_margin]= mm 20
27
+ options[:right_margin]= mm 5
28
+
29
+ options[:top_margin]= mm 5
30
+ options[:bottom_margin]= mm 5
31
+
32
+ page_type = options[:gost_page_type]
33
+ page_type = :auto if ! page_type
34
+
35
+ if page_type == :auto
36
+ if page_count == 0
37
+ page_type = :first_text
38
+ else
39
+ if @gost_duplex
40
+ page_type = (page_count % 2) == 0 ? :normal : :even
41
+ else
42
+ page_type = :normal
43
+ end
44
+
45
+ end
46
+ end
47
+
48
+ case page_type
49
+ when :even
50
+ options[:left_margin]= mm 5
51
+ options[:right_margin]= mm 20
52
+ options[:top_margin]= mm 5
53
+ options[:bottom_margin]= mm 5
54
+ @gost_cur_sections = GOST_SECTIONS_EVEN_PAGE
55
+ when :first_text
56
+ @gost_cur_sections = GOST_SECTIONS_FIRST_TEXT_PAGE
57
+ when :first
58
+ @gost_cur_sections = GOST_SECTIONS_FIRST_PAGE
59
+ when :title
60
+ @gost_cur_sections = GOST_SECTIONS_TITLE_PAGE
61
+ else
62
+ @gost_cur_sections = GOST_SECTIONS_NORMAL_PAGE
63
+ end
64
+
65
+ start_new_page(options)
66
+ stroke do
67
+ polygon bounds.bottom_left, bounds.bottom_right, bounds.top_right, bounds.top_left, bounds.bottom_left
68
+ end
69
+
70
+
71
+ rect = gost_calc_bounds(@gost_cur_sections)
72
+ pos = [rect[:left], rect[:top]]
73
+ w = rect[:right] - rect[:left]
74
+ h = rect[:top] - rect[:bottom]
75
+
76
+
77
+ font(@gost_font.dup) if @gost_font
78
+
79
+ bounding_box(pos, :width => w, :height => h, &block)
80
+
81
+ font(@gost_font) if @gost_font
82
+ gost_draw_sections(@gost_cur_sections)
83
+
84
+ @gost_in_page_constructor = false
85
+ end
86
+
87
+
88
+ def gost_component_list_page(data = [], &block)
89
+
90
+ gost_page(:size => "A4", :layout => :portrait, :gost_page_type => :auto) {
91
+ gost_draw_sections(GOST_ADA_SPECIFICATION)
92
+ l_w = line_width
93
+ line_width mm(0.2)
94
+ pos = bounds.top_left
95
+ bottom = bounds.bottom + mm(8)
96
+ w = bounds.width
97
+ pos[1] -= mm(15)
98
+ while pos[1] > bottom
99
+ stroke do
100
+ line pos, [pos[0] + w, pos[1]]
101
+ end
102
+ pos[1] -= mm(8)
103
+ end
104
+
105
+ line_width l_w
106
+
107
+ x_coord = [mm(8), mm(28), mm(138), mm(148)]
108
+
109
+ stroke do
110
+ x_coord.each { |x|
111
+ p1 = [bounds.left + x, bounds.top - mm(15)]
112
+ p2 = [p1[0], bounds.bottom]
113
+ line p1, p2
114
+ }
115
  end
116
+
117
+ yield self
118
+ }
119
+ end
120
+
121
+ def gost_change_list_page(data = [], &block)
122
+
123
+ gost_page(:size => "A4", :layout => :portrait, :gost_page_type => :normal) {
124
+ gost_draw_sections(GOST_CHANGE_LIST_SPECIFICATION)
125
+
126
+ l_w = line_width
127
+ line_width mm(0.2)
128
+ pos = bounds.top_left
129
+ bottom = bounds.bottom + mm(8)
130
+ w = bounds.width
131
+ pos[1] -= mm(15+35)
132
+ while pos[1] > bottom
133
+ stroke do
134
+ line pos, [pos[0] + w, pos[1]]
135
+ end
136
+ pos[1] -= mm(8.9)
137
+ end
138
+
139
+ line_width l_w
140
+
141
+ x_coord = [mm(10), mm(30), mm(50), mm(70), mm(90), mm(110), mm(130), mm(155), mm(170)]
142
+
143
+ stroke do
144
+ x_coord.each { |x|
145
+ p1 = [bounds.left + x, bounds.top - mm(15+35)]
146
+ p2 = [p1[0], bounds.bottom]
147
+ line p1, p2
148
+ }
149
+ end
150
+
151
+ yield self
152
+ }
153
+ end
154
+
155
+
156
+ alias prawn_method_missing method_missing;
157
+
158
+ def gost_initialize
159
+ @gost_global_attributes = {}
160
+ @gost_cur_attributes = {}
161
+ @gost_duplex = false
162
+ @gost_in_page_constructor = false
163
+ end
164
+
165
+ def method_missing(sym, *args, &block)
166
+ if mh = /attribute\d+(?:_\d+)?/.match(sym.id2name)
167
+ gost_attribute(sym, *args)
168
+ else
169
+ prawn_method_missing sym, *args, &block
170
+ end
171
+ end
172
+
173
+ def gost_duplex
174
+ @gost_duplex = true
175
+ end
176
+
177
+ def get_attribute(name)
178
+ if @gost_in_page_constructor && (val = @gost_cur_attributes[name])
179
+ return val
180
+ else
181
+ return @gost_global_attributes[name]
182
+ end
183
+ end
184
+
185
+ protected
186
+ def gost_attribute(sym, *args)
187
+ if args.empty?
188
+ return get_attribute(sym.id2name)
189
+ else
190
+ attributes = @gost_in_page_constructor ? @gost_cur_attributes : @gost_global_attributes
191
+ attributes[sym.id2name] = args.size == 1 ? args[0] : args
192
+ end
193
+ end
194
+
195
+ def sec_descr2pt(section)
196
+ sec_descr = section.dup
197
+ pos = sec_descr[:pos].dup
198
+ pos[0] = mm(pos[0])
199
+ pos[1] = mm(pos[1])
200
+
201
+ if section[:align] == :left
202
+ pos[0] = bounds.left + pos[0]
203
+ else
204
+ pos[0] = bounds.right + pos[0]
205
+ end
206
+
207
+ if section[:valign] == :top
208
+ pos[1] = bounds.top + pos[1]
209
+ else
210
+ pos[1] = bounds.bottom + pos[1]
211
+ end
212
+
213
+ sec_descr[:pos] = pos
214
+ sec_descr[:w] = mm(sec_descr[:w])
215
+ sec_descr[:h] = mm(sec_descr[:h])
216
+
217
+ if f_s = sec_descr[:font_size]
218
+ sec_descr[:font_size] = mm(f_s)
219
+ end
220
+
221
+ return sec_descr
222
+ end
223
+
224
+ def gost_draw_sections(sections)
225
+
226
+ l_w = line_width
227
+ line_width mm(0.5)
228
+
229
+ sections.each { |sec_code, section|
230
+ if Hash === section
231
+ drawer_proc = section[:drawer] ? section[:drawer] : DefaultDrawer
232
+ options = {}
233
+
234
+ if opts = section[:drawer_opt]
235
+ options.update opts
236
+ end
237
+
238
+ options[:align] = section[:pos][0] >= 0 ? :left : :right
239
+
240
+ drawer_proc.call(self, sec_descr2pt(section), options) unless section[:draw_request]
241
+ #drawer = drawer_class.new()
242
+ #drawer.draw(section.dup, self) if section && !section.empty?
243
+ end
244
+ }
245
+
246
+ line_width l_w
247
+ end
248
+
249
+
250
+
251
+ def gost_calc_bounds(sections)
252
+ left = bounds.left
253
+ right = bounds.right
254
+ top = bounds.top
255
+ bottom = bounds.bottom
256
+
257
+ sections.each { |sec_code, section|
258
+ if Hash === section
259
+ sect = sec_descr2pt(section)
260
+
261
+ posx = sect[:align] == :left ? sect[:pos][0] + sect[:w] : sect[:pos][0]
262
+ posy = sect[:valign] == :top ? sect[:pos][1] - sect[:h] : sect[:pos][1]
263
+
264
+ if (posx > left) && (posx < right) && (posy < top) && (posy > bottom)
265
+ if sect[:valign] == :top
266
+ top = posy
267
+ else
268
+ bottom = posy
269
+ end
270
+ end
271
+ end
272
+ }
273
+ return {:left => left, :right => right, :top => top, :bottom => bottom}
274
+ end
275
+
276
+ end
277
+
278
+ class Prawn::Document
279
+ include GOST
280
+ end
metadata ADDED
@@ -0,0 +1,80 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gost_frames
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Alexey Pavlyukov
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-09-23 00:00:00 +04:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: prawn
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 0.4.0
24
+ version:
25
+ description:
26
+ email: lexaficus@list.ru
27
+ executables: []
28
+
29
+ extensions: []
30
+
31
+ extra_rdoc_files:
32
+ - README.rdoc
33
+ - LICENSE.rdoc
34
+ files:
35
+ - examples/merge
36
+ - examples/merge/merge.rb
37
+ - examples/merge/source_doc.pdf
38
+ - examples/example_helper.rb
39
+ - examples/generate_document
40
+ - examples/generate_document/generate_document.rb
41
+ - examples/generate_document/text_of_pages.txt
42
+ - lib/prawn
43
+ - lib/prawn/gost.rb
44
+ - lib/prawn/GOST
45
+ - lib/prawn/GOST/sections.rb
46
+ - lib/prawn/GOST/drawers.rb
47
+ - lib/prawn/GOST/settings.rb
48
+ - data/fonts
49
+ - data/fonts/mipgost.ttf
50
+ - Rakefile.rb
51
+ - README.rdoc
52
+ - LICENSE.rdoc
53
+ has_rdoc: false
54
+ homepage:
55
+ post_install_message:
56
+ rdoc_options:
57
+ - --charset=utf-8
58
+ require_paths:
59
+ - lib
60
+ required_ruby_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: "0"
65
+ version:
66
+ required_rubygems_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: "0"
71
+ version:
72
+ requirements: []
73
+
74
+ rubyforge_project:
75
+ rubygems_version: 1.3.1
76
+ signing_key:
77
+ specification_version: 2
78
+ summary: Library for creation page frames of Russian GOST standard.
79
+ test_files: []
80
+