obf 0.9.8.5 → 0.9.8.6
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.
- 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
|