obf 0.9.8.5 → 0.9.8.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/obf/c4v.rb +215 -0
- data/lib/obf/pdf.rb +23 -0
- data/lib/obf/utils.rb +9 -0
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b2c866158d28930becd902f17ed56e40e9fe7c42427a669e3059cc6e5c5e94e0
|
4
|
+
data.tar.gz: 335218803680fd6cf87cd36b862811c1af6e57e29972d129a491de926aa837c8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5cefe31a7fea80ef4e80f5a1e605a169f31db0e7bf684e9aba0a93ebb06913508cef8374aa994fe77965c34dbdda364c65f6815cb4b4cad0afc990b26636fdf4
|
7
|
+
data.tar.gz: 2d6ef0cc281351d3217864f3f07b55fc72adef71d5ced8653de7201bfac061c463a0e8f5224be366872c8ddc533f2c6d5ceba7b58fd54989725a94eb13ff7dc3
|
data/lib/obf/c4v.rb
ADDED
@@ -0,0 +1,215 @@
|
|
1
|
+
module OBF::C4v
|
2
|
+
def self.to_external(c4v_path)
|
3
|
+
# load the sqlite file, read the following into memory:
|
4
|
+
# - action_data
|
5
|
+
# - actions
|
6
|
+
# - button_box_cells
|
7
|
+
# - button_box_instances
|
8
|
+
# - button_boxes
|
9
|
+
# - button_set_modifiers
|
10
|
+
# - button_sets
|
11
|
+
# - button_styles
|
12
|
+
# - buttons
|
13
|
+
# - pages
|
14
|
+
# - resources
|
15
|
+
# - special_pages
|
16
|
+
|
17
|
+
# then use the munger code to convert to a hash of boards
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
# # buttons => id, label, message, resource_id, button_style_id
|
23
|
+
# # button_box_cells => button_box_id, resource_id (buttons), location
|
24
|
+
# # button_box_instances => page_id (pages), button_box_id
|
25
|
+
# # button_boxes => id, layout_x (cols), layout_y (rows)
|
26
|
+
# # button_styles => id, body_color, etc.
|
27
|
+
# # pages => id, resource_id, button_style_id (?)
|
28
|
+
# # actions => id, resource_id, code
|
29
|
+
# # action_data => action_id, value
|
30
|
+
# # resource => id, rid, name, type
|
31
|
+
|
32
|
+
# # buttons.resource_id == button_box_cells.resource_id (where buttons go in the layout)
|
33
|
+
# # buttons.resource_id == actions.resource_id (action for each button, code=8 is a link, code=13 is maybe an append?)
|
34
|
+
# # action_data.action_id == actions.id
|
35
|
+
# # action_data.value == resources.rid (where each button links to)
|
36
|
+
# # resources.id == pages.resource_id (page name for reference)
|
37
|
+
|
38
|
+
# # resources
|
39
|
+
# # type 7 == board
|
40
|
+
# # type 4 == button
|
41
|
+
# # type 5 == special button
|
42
|
+
|
43
|
+
# require 'json'
|
44
|
+
# require 'fileutils'
|
45
|
+
# require 'zip'
|
46
|
+
# require 'csv'
|
47
|
+
|
48
|
+
# Dir.glob('*')
|
49
|
+
# ["LAMP 84 Full"]
|
50
|
+
# Dir.glob('*').each do |dir|
|
51
|
+
# puts dir
|
52
|
+
# if dir
|
53
|
+
# refs = {}
|
54
|
+
# Dir.glob("./#{dir}/*.json").each do |json|
|
55
|
+
# puts " #{json}"
|
56
|
+
# type = json.split(/\//)[-1].split(/\./)[0]
|
57
|
+
# refs[type] = JSON.parse(File.read(json))
|
58
|
+
# end
|
59
|
+
# if refs.keys.length > 0
|
60
|
+
# root_path = "./#{dir}/output"
|
61
|
+
# FileUtils.mkdir_p root_path
|
62
|
+
|
63
|
+
# home_page_id = refs['special_pages'].detect{|p| p['name'] == 'HOME'}['page_id']
|
64
|
+
# manifest = {
|
65
|
+
# 'format' => 'open-board-0.1',
|
66
|
+
# 'root' => "boards/#{home_page_id}.obf",
|
67
|
+
# 'paths' => {
|
68
|
+
# 'boards' => {
|
69
|
+
# }
|
70
|
+
# }
|
71
|
+
# }
|
72
|
+
|
73
|
+
# home_page = refs['pages'].detect{|p| p['id'] == home_page_id }
|
74
|
+
# processed_pages = []
|
75
|
+
# pages_to_process = [home_page]
|
76
|
+
# bbis = {}
|
77
|
+
# refs['button_box_instances'].each{|bbi| bbis[bbi['page_id']] = bbi}
|
78
|
+
# rs = {}
|
79
|
+
# refs['resources'].each{|r| rs[r['id']] = r; rs[r['rid']] = r }
|
80
|
+
# btns = {}
|
81
|
+
# words = []
|
82
|
+
# refs['buttons'].each{|b| btns[b['resource_id']] = b; words << b['message'] }
|
83
|
+
# words = words.select{|w| w && w.length > 0 && w != ' '}.sort.uniq
|
84
|
+
# CSV.open(root_path + "/#{dir} words.csv", 'wb') do |csv|
|
85
|
+
# words.each{|w| csv << [w] }
|
86
|
+
# end
|
87
|
+
# File.write(root_path + "/#{dir} words.txt", words.join("\n"))
|
88
|
+
# acts = {}
|
89
|
+
# refs['actions'].each{|a| acts[a['resource_id']] ||= []; acts[a['resource_id']] << a }
|
90
|
+
# pgs = {}
|
91
|
+
# refs['pages'].each{|p| pgs[p['resource_id']] = p }
|
92
|
+
# ads = {}
|
93
|
+
# refs['action_data'].each{|d| ads[d['action_id']] ||= []; ads[d['action_id']] << d }
|
94
|
+
# cls = {}
|
95
|
+
# refs['button_box_cells'].each{|c| cls[c['button_box_id']] ||= []; cls[c['button_box_id']] << c }
|
96
|
+
# bxs = {}
|
97
|
+
# refs['button_boxes'].each{|b| bxs[b['id']] = b }
|
98
|
+
# bsts = {}
|
99
|
+
# refs['button_styles'].each{|b| bsts[b['id']] = b }
|
100
|
+
# btnsts = {}
|
101
|
+
# refs['button_sets'].each{|b| btnsts[b['resource_id']] = b }
|
102
|
+
# btnmd = {}
|
103
|
+
# refs['button_set_modifiers'].each{|b| btnmd[b['button_set_id']] = b if b['modifier'] == 0 }
|
104
|
+
|
105
|
+
# while pages_to_process.length > 0
|
106
|
+
# page = pages_to_process.shift
|
107
|
+
# manifest['paths']['boards'][page['id']] = "boards/#{page['id']}.obf"
|
108
|
+
# processed_pages.push(page['id'])
|
109
|
+
# page_name = rs[page['resource_id']]['name']
|
110
|
+
# page_name = dir if page['id'] == home_page_id
|
111
|
+
# board = {
|
112
|
+
# 'format' => 'open-board-0.1',
|
113
|
+
# 'id' => page['id'],
|
114
|
+
# 'locale' => 'en',
|
115
|
+
# 'name' => page_name,
|
116
|
+
# 'description' => "Auto-Generated",
|
117
|
+
# 'buttons' => [],
|
118
|
+
# 'grid' => {
|
119
|
+
# 'rows' => 0,
|
120
|
+
# 'columns' => 0,
|
121
|
+
# 'order' => []
|
122
|
+
# }
|
123
|
+
# }
|
124
|
+
# button_box_instance = bbis[page['id']] #refs['button_box_instances'].detect{|b| b['page_id'] == page['id'] }
|
125
|
+
# button_box_id = button_box_instance['button_box_id']
|
126
|
+
# puts " #{page_name} #{button_box_id}"
|
127
|
+
# button_box = bxs[button_box_id] #refs['button_boxes'].detect{|b| b['id'] == button_box_instance }
|
128
|
+
# columns = button_box['layout_x']
|
129
|
+
# rows = button_box['layout_y']
|
130
|
+
# board['grid']['rows'] = rows
|
131
|
+
# board['grid']['columns'] = columns
|
132
|
+
# cells = cls[button_box_id] #refs['button_box_cells'].select{|c| c['button_box_id'] == button_box_id }
|
133
|
+
# cells.each do |cell|
|
134
|
+
# # TODO: add coloring from button_styles
|
135
|
+
# col = cell['location'] % columns
|
136
|
+
# row = (cell['location'] - col) / columns
|
137
|
+
# resource_id = cell['resource_id']
|
138
|
+
# resource = rs[cell['resource_id']]
|
139
|
+
# if resource && resource['type'] == 5
|
140
|
+
# button_set = btnsts[resource_id]
|
141
|
+
# button_mod = button_set && btnmd[button_set['id']]
|
142
|
+
# button_id = button_mod && button_mod['button_id']
|
143
|
+
# button = refs['buttons'].detect{|b| b['id'] == button_id}
|
144
|
+
# resource_id = button['resource_id'] if button
|
145
|
+
# end
|
146
|
+
# cell['button'] = btns[resource_id] #refs['buttons'].detect{|b| b['resource_id'] == cell['resource_id'] }
|
147
|
+
# cell['style'] = cell['button'] && bsts[cell['button']['button_style_id']]
|
148
|
+
# label = (cell['button'] && cell['button']['label']) || rs[cell['resource_id']]['name']
|
149
|
+
# cell['actions'] = acts[cell['resource_id']] || []
|
150
|
+
# cell['actions'] += acts[resource_id] || [] #refs['actions'].select{|b| b['resource_id'] == cell['resource_id'] }
|
151
|
+
# link_id = nil
|
152
|
+
# verbose = button_box_id == 268 && row == 0 && col == 3
|
153
|
+
# cell['actions'].each do |action|
|
154
|
+
# if action && (action['code'] == 8 || action['code'] == 9 || action['code'] == 73 || (button_box_id == 268 && row == 0 && col == 2))
|
155
|
+
# action_data = ads[action['id']] #refs['action_data'].detect{|a| a['action_id'] == action['id'] }
|
156
|
+
# action['data'] = action_data
|
157
|
+
# (action_data || []).each do |ad|
|
158
|
+
# if ad && ad['value'] != '0' && ad['value'] != '1'
|
159
|
+
# action_resource = rs[ad['value']] #refs['resources'].detect{|r| r['rid'] == action_data['value'] }
|
160
|
+
# if !action_resource || action_resource['type'] != 7
|
161
|
+
# puts JSON.pretty_generate(cell)
|
162
|
+
# puts ad.to_json
|
163
|
+
# puts action_resource.to_json
|
164
|
+
# raise "wut"
|
165
|
+
# end
|
166
|
+
# puts ad['value'].to_json if !action_resource
|
167
|
+
# new_page = pgs[action_resource['id']] #refs['pages'].detect{|p| p['resource_id'] == action_resource['id'] }
|
168
|
+
# link_id = new_page['id']
|
169
|
+
# if !processed_pages.include?(new_page['id']) && !pages_to_process.detect{|p| p['id'] == new_page['id'] }
|
170
|
+
# pages_to_process.push(new_page)
|
171
|
+
# end
|
172
|
+
# end
|
173
|
+
# end
|
174
|
+
# end
|
175
|
+
# end
|
176
|
+
# puts JSON.pretty_generate(cell) if verbose
|
177
|
+
# if label && label != ''
|
178
|
+
# # puts " #{label.to_json} #{row} #{col}"
|
179
|
+
# button = {
|
180
|
+
# 'id' => cell['id'],
|
181
|
+
# 'label' => label
|
182
|
+
# }
|
183
|
+
# if cell['button'] && cell['button']['message']
|
184
|
+
# button['vocalization'] = cell['button']['message']
|
185
|
+
# end
|
186
|
+
# if link_id
|
187
|
+
# button['load_board'] = {
|
188
|
+
# 'id' => link_id,
|
189
|
+
# 'path' => "boards/#{link_id}.obf"
|
190
|
+
# }
|
191
|
+
# end
|
192
|
+
# if cell['style']
|
193
|
+
# button['background_color'] = "\##{cell['style']['body_color'].to_s(16).rjust(6, '0')}" if cell['style']['body_color']
|
194
|
+
# button['border_color'] = "\##{cell['style']['border_color'].to_s(16).rjust(6, '0')}" if cell['style']['border_coloor']
|
195
|
+
# end
|
196
|
+
# board['buttons'] << button
|
197
|
+
# board['grid']['order'][row] ||= []
|
198
|
+
# board['grid']['order'][row][col] = button['id']
|
199
|
+
# end
|
200
|
+
# end
|
201
|
+
# FileUtils.mkdir_p(root_path + "/boards")
|
202
|
+
# File.write(root_path + "/boards/#{page['id']}.obf", JSON.pretty_generate(board))
|
203
|
+
# end
|
204
|
+
|
205
|
+
# File.write(root_path + "/manifest.json", JSON.pretty_generate(manifest))
|
206
|
+
# File.unlink(root_path + "/#{dir}.obz") if File.exists?(root_path + "/#{dir}.obz")
|
207
|
+
# Zip::File.open(root_path + "/#{dir}.obz", Zip::File::CREATE) do |zipfile|
|
208
|
+
# zipfile.add("manifest.json", root_path + "/manifest.json")
|
209
|
+
# manifest['paths']['boards'].each do |id, path|
|
210
|
+
# zipfile.add(path, root_path + "/" + path)
|
211
|
+
# end
|
212
|
+
# end
|
213
|
+
# end
|
214
|
+
# end
|
215
|
+
# end
|
data/lib/obf/pdf.rb
CHANGED
@@ -183,6 +183,29 @@ module OBF::PDF
|
|
183
183
|
if obj['grid'] && obj['grid']['rows'] > 0 && obj['grid']['columns'] > 0
|
184
184
|
button_height = (grid_height - (padding * (obj['grid']['rows'] - 1))) / obj['grid']['rows'].to_f
|
185
185
|
button_width = (grid_width - (padding * (obj['grid']['columns'] - 1))) / obj['grid']['columns'].to_f
|
186
|
+
|
187
|
+
# Grab all the images per board in parallel
|
188
|
+
puts " batch-retrieving remote images"
|
189
|
+
hydra = Typhoeus::Hydra.hydra
|
190
|
+
grabs = []
|
191
|
+
obj['buttons'].each do |btn|
|
192
|
+
image = (obj['images_hash'] || {})[btn['image_id']]
|
193
|
+
if image && image['url'] && !image['data'] && !(image['path'] && optionns['zipper'])
|
194
|
+
url = image['url']
|
195
|
+
uri = url.match(/\%/) ? url : URI.escape(url)
|
196
|
+
uri = OBF::Utils.sanitize_url(uri)
|
197
|
+
req = Typhoeus::Request.new(uri, followlocation: true)
|
198
|
+
hydra.queue(req)
|
199
|
+
grabs << {url: url, req: req, image: image}
|
200
|
+
end
|
201
|
+
end
|
202
|
+
hydra.run
|
203
|
+
grabs.each do |grab|
|
204
|
+
grab[:image]['raw_data'] = grab[:req].response.body
|
205
|
+
grab[:image]['content_type'] = grab[:req].response.headers['Content-Type'] if grab[:req].response.headers['Content-Type']
|
206
|
+
end
|
207
|
+
puts " done with #{grabs.length} remote images!"
|
208
|
+
|
186
209
|
obj['grid']['order'].each_with_index do |buttons, row|
|
187
210
|
buttons.each_with_index do |button_id, col|
|
188
211
|
button = obj['buttons'].detect{|b| b['id'] == button_id }
|
data/lib/obf/utils.rb
CHANGED
@@ -40,6 +40,8 @@ module OBF::Utils
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def self.identify_file(path)
|
43
|
+
# TODO: .c4v files are sqlite databases that can be converted
|
44
|
+
# based on your munger.rb code (text-only)
|
43
45
|
name = File.basename(path) rescue nil
|
44
46
|
if name.match(/\.obf$/)
|
45
47
|
return :obf
|
@@ -135,6 +137,8 @@ module OBF::Utils
|
|
135
137
|
if !image['content_type']
|
136
138
|
image['content_type'] = image['data'].split(/;/)[0].split(/:/)[1]
|
137
139
|
end
|
140
|
+
elsif image['raw_data']
|
141
|
+
# already processed
|
138
142
|
elsif image['path'] && zipper
|
139
143
|
image['raw_data'] = zipper.read(image['path'])
|
140
144
|
if !image['content_type']
|
@@ -142,7 +146,9 @@ module OBF::Utils
|
|
142
146
|
image['content_type'] = types[0] && types[0].to_s
|
143
147
|
end
|
144
148
|
elsif image['url']
|
149
|
+
puts " retrieving #{image['url']}"
|
145
150
|
url_data = get_url(image['url'])
|
151
|
+
puts " done!"
|
146
152
|
image['raw_data'] = url_data['data']
|
147
153
|
image['content_type'] = url_data['content_type']
|
148
154
|
elsif image['symbol']
|
@@ -178,14 +184,17 @@ module OBF::Utils
|
|
178
184
|
size = 400
|
179
185
|
path = file.path
|
180
186
|
if image['content_type'] && image['content_type'].match(/svg/)
|
187
|
+
puts " convert -background \"#{background}\" -density 300 -resize #{size}x#{size} -gravity center -extent #{size}x#{size} #{file.path} -flatten #{file.path}.jpg"
|
181
188
|
`convert -background "#{background}" -density 300 -resize #{size}x#{size} -gravity center -extent #{size}x#{size} #{file.path} -flatten #{file.path}.jpg`
|
182
189
|
# `rsvg-convert -w #{size} -h #{size} -a #{file.path} > #{file.path}.png`
|
183
190
|
path = "#{file.path}.jpg"
|
184
191
|
else
|
192
|
+
puts " convert #{path} -density 300 -resize #{size}x#{size} -background "#{background}" -gravity center -extent #{size}x#{size} -flatten #{path}.jpg"
|
185
193
|
`convert #{path} -density 300 -resize #{size}x#{size} -background "#{background}" -gravity center -extent #{size}x#{size} -flatten #{path}.jpg`
|
186
194
|
path = "#{path}.jpg"
|
187
195
|
end
|
188
196
|
|
197
|
+
puts " finished image"
|
189
198
|
path
|
190
199
|
end
|
191
200
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: obf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.8.
|
4
|
+
version: 0.9.8.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Whitmer
|
@@ -150,6 +150,7 @@ files:
|
|
150
150
|
- lib/TimesNewRoman.ttf
|
151
151
|
- lib/obf.rb
|
152
152
|
- lib/obf/avz.rb
|
153
|
+
- lib/obf/c4v.rb
|
153
154
|
- lib/obf/external.rb
|
154
155
|
- lib/obf/obf.rb
|
155
156
|
- lib/obf/obz.rb
|