obf 0.9.9.1 → 0.9.9.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/obf/external.rb +82 -69
- data/lib/obf/pdf.rb +80 -77
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 49734c92d9d154f254416ecff17f6a04503b5afc2d340d3ceb7f94ec89b6f82b
|
4
|
+
data.tar.gz: bfff105ec7b48a2eeb746b8d437c3f6d245d75b499bbc4feae142548a2b43f82
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cc6e780f1b371e4c87dbb42e039410605a27c1bc6ee8753a907badb3953a841b26f0c907ac1c530f1c2344dd4186e59d194b76fb179c6ae2bbe8516665bfbbde
|
7
|
+
data.tar.gz: dacb2ff2fdcebabbbb918ff047c241efe6c36d1d35710f0c1cfa2f9c2c16015cb39796fe984a131e7d8320dc7f221492a9b104e7917253392ea5d69f22fbf5ae
|
data/lib/obf/external.rb
CHANGED
@@ -41,81 +41,85 @@ module OBF::External
|
|
41
41
|
buttons = hash['buttons'] #board.settings['buttons']
|
42
42
|
button_count = buttons.length
|
43
43
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
if original_button['load_board']
|
59
|
-
button['load_board'] = {
|
60
|
-
'id' => original_button['load_board']['id'],
|
61
|
-
'url' => original_button['load_board']['url'],
|
62
|
-
'data_url' => original_button['load_board']['data_url']
|
44
|
+
OBF::Utils.as_progress_percent(0.0, 0.3) do
|
45
|
+
buttons.each_with_index do |original_button, idx|
|
46
|
+
button = {
|
47
|
+
'id' => original_button['id'],
|
48
|
+
'label' => original_button['label'],
|
49
|
+
'vocalization' => original_button['vocalization'],
|
50
|
+
'action' => original_button['action'],
|
51
|
+
'actions' => original_button['actions'],
|
52
|
+
'left' => original_button['left'],
|
53
|
+
'top' => original_button['top'],
|
54
|
+
'width' => original_button['width'],
|
55
|
+
'height' => original_button['height'],
|
56
|
+
'border_color' => OBF::Utils.fix_color(original_button['border_color'] || "#aaa", 'rgb'),
|
57
|
+
'background_color' => OBF::Utils.fix_color(original_button['background_color'] || "#fff", 'rgb')
|
63
58
|
}
|
64
|
-
if
|
65
|
-
button['load_board']
|
59
|
+
if original_button['load_board']
|
60
|
+
button['load_board'] = {
|
61
|
+
'id' => original_button['load_board']['id'],
|
62
|
+
'url' => original_button['load_board']['url'],
|
63
|
+
'data_url' => original_button['load_board']['data_url']
|
64
|
+
}
|
65
|
+
if path_hash && path_hash['included_boards'] && path_hash['included_boards'][original_button['load_board']['id']]
|
66
|
+
button['load_board']['path'] = "board_#{original_button['load_board']['id']}.obf"
|
67
|
+
end
|
66
68
|
end
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
69
|
+
if original_button['translations']
|
70
|
+
original_button['translations'].each do |loc, hash|
|
71
|
+
next unless hash.is_a?(Hash)
|
72
|
+
button['translations'] ||= {}
|
73
|
+
button['translations'][loc] ||= {}
|
74
|
+
button['translations'][loc]['label'] = hash['label'].to_s if hash['label']
|
75
|
+
button['translations'][loc]['vocalization'] = hash['vocalization'].to_s if hash['vocalization']
|
76
|
+
(hash['inflections'] || {}).each do |key, val|
|
77
|
+
if key.match(/^ext_/)
|
78
|
+
button['translations'][loc]['inflections'] ||= {}
|
79
|
+
button['translations'][loc]['inflections'][key] = val
|
80
|
+
else
|
81
|
+
button['translations'][loc]['inflections'] ||= {}
|
82
|
+
button['translations'][loc]['inflections'][key] = val.to_s
|
83
|
+
end
|
84
|
+
end
|
85
|
+
hash.keys.each do |key|
|
86
|
+
button['translations'][loc][key] = hash[key] if key.to_s.match(/^ext_/)
|
82
87
|
end
|
83
|
-
end
|
84
|
-
hash.keys.each do |key|
|
85
|
-
button['translations'][loc][key] = hash[key] if key.to_s.match(/^ext_/)
|
86
88
|
end
|
87
89
|
end
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
90
|
+
if original_button['hidden']
|
91
|
+
button['hidden'] = original_button['hidden']
|
92
|
+
end
|
93
|
+
if original_button['url']
|
94
|
+
button['url'] = original_button['url']
|
95
|
+
end
|
96
|
+
original_button.each do|key, val|
|
97
|
+
if key.match(/^ext_/)
|
98
|
+
button[key] = val
|
99
|
+
end
|
98
100
|
end
|
99
|
-
end
|
100
101
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
102
|
+
if original_button['image_id'] && hash['images']
|
103
|
+
image = hash['images'].detect{|i| i['id'] == original_button['image_id']}
|
104
|
+
if image
|
105
|
+
images << image
|
106
|
+
button['image_id'] = image['id']
|
107
|
+
end
|
106
108
|
end
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
109
|
+
if original_button['sound_id']
|
110
|
+
sound = hash['sounds'].detect{|s| s['id'] == original_button['sound_id']}
|
111
|
+
if sound
|
112
|
+
sounds << sound
|
113
|
+
button['sound_id'] = sound['id']
|
114
|
+
end
|
113
115
|
end
|
116
|
+
res['buttons'] << trim_empties(button)
|
117
|
+
OBF::Utils.update_current_progress(idx.to_f / button_count.to_f, "generated button #{button['id']} for #{res['id']}")
|
114
118
|
end
|
115
|
-
res['buttons'] << trim_empties(button)
|
116
|
-
OBF::Utils.update_current_progress(idx.to_f / button_count.to_f)
|
117
119
|
end
|
118
120
|
|
121
|
+
OBF::Utils.update_current_progress(0.35, "images for board #{res['id']}")
|
122
|
+
|
119
123
|
# board_id 1_527892 has some svg's still, not pre-rasterized versions
|
120
124
|
# 1_531854 convert-im6.q16: non-conforming drawing primitive definition `Helvetica''' @ error/draw.c/DrawImage/3265.
|
121
125
|
if to_include[:images]
|
@@ -215,6 +219,7 @@ module OBF::External
|
|
215
219
|
|
216
220
|
end
|
217
221
|
|
222
|
+
OBF::Utils.update_current_progress(0.75, "sounds for board #{res['id']}")
|
218
223
|
if to_include[:sounds]
|
219
224
|
sounds.each do |original_sound|
|
220
225
|
sound = {
|
@@ -266,6 +271,8 @@ module OBF::External
|
|
266
271
|
end
|
267
272
|
end
|
268
273
|
|
274
|
+
OBF::Utils.update_current_progress(0.85, "grid for board #{res['id']}")
|
275
|
+
|
269
276
|
res['grid'] = OBF::Utils.parse_grid(hash['grid']) # TODO: more robust parsing here
|
270
277
|
if path_hash && path_hash['zip']
|
271
278
|
zip_path = "board_#{res['id']}.obf"
|
@@ -278,6 +285,7 @@ module OBF::External
|
|
278
285
|
File.open(dest_path, 'w') {|f| f.write(JSON.pretty_generate(res)) }
|
279
286
|
end
|
280
287
|
OBF::Utils.log(" done compressing board #{res['name'] || res['id']}")
|
288
|
+
OBF::Utils.update_current_progress(1.0, "done for board #{res['id']}")
|
281
289
|
return dest_path
|
282
290
|
end
|
283
291
|
|
@@ -333,6 +341,8 @@ module OBF::External
|
|
333
341
|
content['images'] ||= boards.map{|b| b['images'] }.flatten.uniq
|
334
342
|
content['sounds'] ||= boards.map{|b| b['sounds'] }.flatten.uniq
|
335
343
|
root_board = boards[0]
|
344
|
+
incr = 1.0 / boards.length.to_f
|
345
|
+
tally = 0.0
|
336
346
|
OBF::Utils.build_zip(dest_path) do |zipper|
|
337
347
|
paths['zip'] = zipper
|
338
348
|
paths['included_boards'] = {}
|
@@ -340,12 +350,15 @@ module OBF::External
|
|
340
350
|
paths['included_boards'][b['id']] = b
|
341
351
|
end
|
342
352
|
boards.each do |b|
|
343
|
-
|
344
|
-
|
345
|
-
b
|
346
|
-
|
347
|
-
|
353
|
+
OBF::Utils.as_progress_percent(tally, tally + incr) do
|
354
|
+
b = paths['included_boards'][b['id']]
|
355
|
+
if b
|
356
|
+
b['images'] = content['images'] || []
|
357
|
+
b['sounds'] = content['sounds'] || []
|
358
|
+
to_obf(b, nil, paths, opts[:to_include])
|
359
|
+
end
|
348
360
|
end
|
361
|
+
tally += incr
|
349
362
|
end
|
350
363
|
manifest = {
|
351
364
|
'format' => OBF::OBF::FORMAT,
|
@@ -424,7 +437,7 @@ module OBF::External
|
|
424
437
|
end
|
425
438
|
tmp_path = OBF::Utils.temp_path("stash")
|
426
439
|
if opts['packet']
|
427
|
-
OBF::Utils.as_progress_percent(0, 0.3) do
|
440
|
+
OBF::Utils.as_progress_percent(0.1, 0.3) do
|
428
441
|
opts[:to_include] = {images: true}
|
429
442
|
OBF::External.to_obz(board, tmp_path, opts)
|
430
443
|
end
|
data/lib/obf/pdf.rb
CHANGED
@@ -63,84 +63,84 @@ module OBF::PDF
|
|
63
63
|
end
|
64
64
|
|
65
65
|
def self.build_pdf(obj, dest_path, zipper, opts={})
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
:
|
72
|
-
:Title => obj['name']
|
73
|
-
}
|
66
|
+
# parse obf, draw as pdf
|
67
|
+
doc_opts = {
|
68
|
+
:page_layout => :landscape,
|
69
|
+
:page_size => [8.5*72, 11*72],
|
70
|
+
:info => {
|
71
|
+
:Title => obj['name']
|
74
72
|
}
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
73
|
+
}
|
74
|
+
pdf = Prawn::Document.new(doc_opts)
|
75
|
+
default_font = load_fonts(pdf, opts)
|
76
|
+
|
77
|
+
multi_render_paths = []
|
78
|
+
if obj['boards']
|
79
|
+
multi_render = obj['boards'].length > 20 && `which gs`.length > 0
|
80
|
+
obj['backlinks'] = {}
|
81
|
+
if obj['pages']
|
82
|
+
obj['boards'].each do |board|
|
83
|
+
board['buttons'].each do |button|
|
84
|
+
if button['load_board'] && button['load_board']['id']
|
85
|
+
obj['backlinks'][button['load_board']['id']] ||= []
|
86
|
+
obj['backlinks'][button['load_board']['id']] << obj['pages'][board['id']] if obj['pages'][board['id']]
|
89
87
|
end
|
90
88
|
end
|
91
|
-
OBF::Utils.log "backlinks #{obj['backlinks'].to_json}"
|
92
89
|
end
|
93
|
-
obj['
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
90
|
+
OBF::Utils.log "backlinks #{obj['backlinks'].to_json}"
|
91
|
+
end
|
92
|
+
incr = 1.0 / obj['boards'].length.to_f
|
93
|
+
tally = 0
|
94
|
+
obj['boards'].each_with_index do |board, idx|
|
95
|
+
started = Time.now.to_i
|
96
|
+
OBF::Utils.log "starting pdf of board #{idx} #{board['name'] || board['id']} at #{started}"
|
97
|
+
pre = idx.to_f / obj['boards'].length.to_f
|
98
|
+
post = (idx + 1).to_f / obj['boards'].length.to_f
|
99
|
+
OBF::Utils.as_progress_percent(tally, tally + incr) do
|
100
|
+
# if more than 20 pages, build each page individually
|
101
|
+
# and combine them afterwards
|
102
|
+
if multi_render
|
103
|
+
path = OBF::Utils.temp_path("stash-#{idx}.pdf")
|
104
|
+
pdf = Prawn::Document.new(doc_opts)
|
105
|
+
load_fonts(pdf, opts)
|
106
|
+
else
|
107
|
+
pdf.start_new_page unless idx == 0
|
108
|
+
end
|
109
|
+
build_page(pdf, board, {
|
110
|
+
'zipper' => zipper,
|
111
|
+
'pages' => obj['pages'],
|
112
|
+
'backlinks' => obj['backlinks'][board['id']] || [],
|
113
|
+
'headerless' => !!opts['headerless'],
|
114
|
+
'font' => default_font,
|
115
|
+
'links' => false,
|
116
|
+
'text_on_top' => !!opts['text_on_top'],
|
117
|
+
'transparent_background' => !!opts['transparent_background'],
|
118
|
+
'symbol_background' => opts['symbol_background'],
|
119
|
+
'text_case' => opts['text_case']
|
120
|
+
})
|
121
|
+
if multi_render
|
122
|
+
pdf.render_file(path)
|
123
|
+
multi_render_paths << path
|
124
124
|
end
|
125
|
-
OBF::Utils.log " finished pdf of board #{idx}/#{obj['boards'].length} #{Time.now.to_i - started}s"
|
126
125
|
end
|
127
|
-
|
128
|
-
|
129
|
-
'headerless' => !!opts['headerless'],
|
130
|
-
'font' => default_font,
|
131
|
-
'text_on_top' => !!opts['text_on_top'],
|
132
|
-
'transparent_background' => !!opts['transparent_background'],
|
133
|
-
'symbol_background' => opts['symbol_background'],
|
134
|
-
'text_case' => opts['text_case']
|
135
|
-
})
|
126
|
+
tally += incr
|
127
|
+
OBF::Utils.log " finished pdf of board #{idx}/#{obj['boards'].length} #{Time.now.to_i - started}s"
|
136
128
|
end
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
129
|
+
else
|
130
|
+
build_page(pdf, obj, {
|
131
|
+
'headerless' => !!opts['headerless'],
|
132
|
+
'font' => default_font,
|
133
|
+
'text_on_top' => !!opts['text_on_top'],
|
134
|
+
'transparent_background' => !!opts['transparent_background'],
|
135
|
+
'symbol_background' => opts['symbol_background'],
|
136
|
+
'text_case' => opts['text_case']
|
137
|
+
})
|
138
|
+
end
|
139
|
+
if multi_render_paths.length > 0
|
140
|
+
# `cp #{multi_render_paths[0]} #{dest_path}`
|
141
|
+
`gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=#{dest_path} #{multi_render_paths.join(' ')}`
|
142
|
+
else
|
143
|
+
pdf.render_file(dest_path)
|
144
144
|
end
|
145
145
|
end
|
146
146
|
|
@@ -433,7 +433,7 @@ module OBF::PDF
|
|
433
433
|
end
|
434
434
|
end
|
435
435
|
index = col + (row * obj['grid']['columns'])
|
436
|
-
OBF::Utils.update_current_progress(index.to_f / (obj['grid']['rows'] * obj['grid']['columns']).to_f)
|
436
|
+
OBF::Utils.update_current_progress(index.to_f / (obj['grid']['rows'] * obj['grid']['columns']).to_f, "updated button #{button_id}")
|
437
437
|
end
|
438
438
|
end
|
439
439
|
end
|
@@ -448,6 +448,7 @@ module OBF::PDF
|
|
448
448
|
board['path'] = root
|
449
449
|
unvisited_boards = [board]
|
450
450
|
visited_boards = []
|
451
|
+
OBF::Utils.update_current_progress(0.2, "prepping for pdf")
|
451
452
|
while unvisited_boards.length > 0
|
452
453
|
board = unvisited_boards.shift
|
453
454
|
visited_boards << board
|
@@ -474,11 +475,13 @@ module OBF::PDF
|
|
474
475
|
pages[board['id']] = (idx + 1).to_s
|
475
476
|
end
|
476
477
|
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
478
|
+
OBF::Utils.as_progress_percent(0.2, 1.0) do
|
479
|
+
build_pdf({
|
480
|
+
'name' => 'Communication Board Set',
|
481
|
+
'boards' => visited_boards,
|
482
|
+
'pages' => pages
|
483
|
+
}, dest_path, zipper, opts)
|
484
|
+
end
|
482
485
|
end
|
483
486
|
# parse obz, draw as pdf
|
484
487
|
|