obf 0.6.4 → 0.6.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8454639e83fc8b2def96962a5ba2e31791a362e5
4
- data.tar.gz: 7e1abb111236636a50c09a0304810513ab4d30f2
3
+ metadata.gz: b79ac939f92a647ac73653cccb8609eebc16aace
4
+ data.tar.gz: 0b710379e5f53177b90aebbbe93de11809ec0b21
5
5
  SHA512:
6
- metadata.gz: 288c13639fdf253583cc2c826c0d52cc9e57a21937207883c70618ca4f7837d23920169806811b3f6fcfd827335336a395290393810160648f91e079fe859411
7
- data.tar.gz: 14418e8801345139b24dee027718e2a4ad6a9b11ab0112a8485b17f8e206dba3f5d75913a0a551f93de38018e0967aaa654685911081390b3ee1933617d7b3be
6
+ metadata.gz: 7d1090c6ca796b367d744564a6acf250ee0c57f4c380d4a3f10d365d23dd6cd854b33727fb721bc5cfd5c9e415346f0d089559847aeca6d86597be1790448214
7
+ data.tar.gz: d6ec22573bb37ac5eee8d7320894764317eda2e9039094413a04cd3093a1a415da089c7fd0566be60cbd40c502787466bcd3928e91dfdb759c98d35529a69214
data/lib/obf.rb CHANGED
@@ -17,5 +17,6 @@ module OBF
17
17
  require 'obf/picto4me'
18
18
  require 'obf/avz'
19
19
  require 'obf/sfy'
20
+ require 'obf/sgrid'
20
21
  require 'obf/unknown_file'
21
22
  end
data/lib/obf/external.rb CHANGED
@@ -120,11 +120,12 @@ module OBF::External
120
120
  'duration' => original_sound['duration'],
121
121
  'license' => OBF::Utils.parse_license(original_sound['license']),
122
122
  'url' => original_sound['url'],
123
+ 'data' => original_sound['data'],
123
124
  'data_url' => original_sound['data_url'],
124
125
  'content_type' => original_sound['content_type']
125
126
  }
126
127
  if !path_hash
127
- sound['data'] = OBF::Utils.sound_base64(sound['url'])
128
+ sound['data'] = OBF::Utils.sound_base64(sound['url']) if sound['url']
128
129
  else
129
130
  if path_hash['sounds'] && path_hash['sounds'][sound['id']]
130
131
  sound['path'] = path_hash['sounds'][sound['id']]['path']
data/lib/obf/sgrid.rb ADDED
@@ -0,0 +1,148 @@
1
+ module OBF::Sgrid
2
+ EXT_PREFIX = 'ext_sgrid_'
3
+
4
+ def self.html_at(elem, css)
5
+ res = elem.css(css)[0]
6
+ if res && res.inner_html && res.inner_html.length > 0
7
+ res.inner_html
8
+ else
9
+ nil
10
+ end
11
+ end
12
+
13
+ def self.to_external(path)
14
+ xml = Nokogiri::XML(File.open(path))
15
+ grid = xml.css('sensorygrid grid')[0]
16
+ puts grid.to_s
17
+ puts grid.css('rows')[0].to_s
18
+ rows = html_at(grid, 'rows').to_i
19
+ columns = html_at(grid, 'cols').to_i
20
+ board = {
21
+ 'id' => 'sgrid'
22
+ }
23
+ ['selfclosing', 'titlebartext', 'customblockscan', 'predictionsource', 'oskcellratio', 'workspace_x', 'workspace_y', 'eyegazemonitor_x', 'eyegazemonitor_y'].each do |attr|
24
+ res = html_at(grid, attr)
25
+ board[EXT_PREFIX + attr] = res if res
26
+ end
27
+ if grid.css('background')[0]
28
+ bg = grid.css('background')[0]
29
+ board['ext_sgrid_background'] = {
30
+ 'style' => bg['style'],
31
+ 'backcolour' => html_at(bg, 'backcolour'),
32
+ 'backcolour2' => html_at(bg, 'backcolour2'),
33
+ 'picformat' => html_at(bg, 'picformat'),
34
+ 'tilepicture' => html_at(bg, 'tilepicture')
35
+ }
36
+ end
37
+ commands = grid.children.detect{|c| c.name == 'commands'}
38
+ if commands
39
+ board['ext_sgrid_commands'] = []
40
+ commands.css('command').each do |command|
41
+
42
+ id = html_at(command, 'id')
43
+ board[EXT_PREFIX + 'commands'] << id if id
44
+ end
45
+ end
46
+
47
+ board['name'] = board[EXT_PREFIX + 'titlebartext'] || "board"
48
+ board['grid'] = {
49
+ 'rows' => rows,
50
+ 'columns' => columns,
51
+ 'order' => []
52
+ }
53
+ rows.times do |i|
54
+ row = []
55
+ columns.times do |j|
56
+ row << nil
57
+ end
58
+ board['grid']['order'] << row
59
+ end
60
+
61
+ buttons = []
62
+ images = []
63
+ button_id = 0
64
+ image_id = 0
65
+ grid.css('cells cell').each do |cell|
66
+ button = {
67
+ 'id' => button_id
68
+ }
69
+ button_id += 1
70
+ row = cell['x'].to_i - 1
71
+ col = cell['y'].to_i - 1
72
+ ['stylepreset', 'scanblock', 'magnifyx', 'magnifyy', 'tooltip', 'directactivate'].each do |attr|
73
+ res = html_at(cell, attr)
74
+ button[EXT_PREFIX + attr] = res if res
75
+ end
76
+ preset = button[EXT_PREFIX + 'stylepreset']
77
+ if preset == 'Blank cell (no style)'
78
+ button['background_color'] = 'rgb(255, 255, 255)'
79
+ button['border_color'] = 'rgb(150, 150, 150)'
80
+ elsif preset == 'Jump cell'
81
+ button['background_color'] = 'rgb(200, 225, 255)'
82
+ button['border_color'] = 'rgb(95, 135, 185)'
83
+ elsif preset == 'Action cell'
84
+ button['background_color'] = 'rgb(255, 200, 200)'
85
+ button['border_color'] = 'rgb(155, 75, 75)'
86
+ elsif preset == 'Vocab cell'
87
+ button['background_color'] = 'rgb(255, 255, 155)'
88
+ button['border_color'] = 'rgb(150, 135, 32)'
89
+ end
90
+
91
+ button['label'] = html_at(cell, 'caption')
92
+ button[EXT_PREFIX + 'commands'] = []
93
+ cell.css('commands command').each do |command|
94
+ type = html_at(command, 'id')
95
+ params = []
96
+ command.css('parameter').each do |param|
97
+ idx = param['index'].to_i - 1
98
+ val = param.inner_html
99
+ params[idx] = val
100
+ end
101
+ button[EXT_PREFIX + 'commands'] << {
102
+ 'type' => type,
103
+ 'parameters' => params
104
+ }
105
+ if type == 'type'
106
+ button['vocalization'] = params[0]
107
+ elsif type == 'action.clear'
108
+ button['action'] = ':clear'
109
+ else
110
+ button['action'] = ":" + EXT_PREFIX + type
111
+ end
112
+ end
113
+ button.delete(EXT_PREFIX + 'commands') if button[EXT_PREFIX + 'commands'].length == 0
114
+ hidden = html_at(cell, 'hidden')
115
+ button['hidden'] = true if hidden == 'true'
116
+ picture = html_at(cell, 'picture')
117
+ if picture
118
+ image = {
119
+ 'id' => image_id
120
+ }
121
+ image_id += 1
122
+ puts picture.to_json
123
+ match = picture.match(/^(\[\w+\])?(.+)$/)
124
+ symbol_set = match && match[1][1..-2]
125
+ filename = match && match[2]
126
+ if symbol_set
127
+ image['symbol'] = {
128
+ 'set' => symbol_set,
129
+ 'filename' => filename
130
+ }
131
+ else
132
+ image[EXT_PREFIX + 'filename'] = filename
133
+ end
134
+ images << image
135
+ button['image_id'] = image['id']
136
+ end
137
+
138
+ col = cell['x'].to_i - 1
139
+ row = cell['y'].to_i - 1
140
+ buttons << button
141
+ board['grid']['order'][row][col] = button['id']
142
+ end
143
+ board['buttons'] = buttons
144
+ board['images'] = images
145
+ board['sounds'] = []
146
+ return board
147
+ end
148
+ end
@@ -11,6 +11,8 @@ module OBF::UnknownFile
11
11
  OBF::Picto4me.to_external(path)
12
12
  elsif type == :sfy
13
13
  OBF::Sfy.to_external(path)
14
+ elsif type == :sgrid
15
+ OBF::Sgrid.to_external(path)
14
16
  else
15
17
  raise "unrecognized file type"
16
18
  end
data/lib/obf/utils.rb CHANGED
@@ -56,6 +56,14 @@ module OBF::Utils
56
56
  rescue CFFormatError => e
57
57
  end
58
58
 
59
+ xml = Nokogiri::XML(File.open(path)) rescue nil
60
+ if xml && xml.children.length > 0
61
+ if xml.children[0].name == 'sensorygrid'
62
+ return :sgrid
63
+ end
64
+ return :unknown
65
+ end
66
+
59
67
  begin
60
68
  type = nil
61
69
  load_zip(path) do |zipper|
@@ -73,8 +81,7 @@ module OBF::Utils
73
81
  end
74
82
  end
75
83
  return type if type
76
- rescue => e
77
- return :unknown
84
+ rescue Zip::Error => e
78
85
  end
79
86
  end
80
87
  return :unknown
data/lib/obf/validator.rb CHANGED
@@ -518,7 +518,7 @@ module OBF
518
518
  err "button.action must start with either : or + if defined"
519
519
  end
520
520
 
521
- attrs = ['id', 'label', 'vocalization', 'image_id', 'hidden', 'background_color', 'border_color', 'action', 'load_board', 'top', 'left', 'width', 'height']
521
+ attrs = ['id', 'label', 'vocalization', 'image_id', 'sound_id', 'hidden', 'background_color', 'border_color', 'action', 'load_board', 'top', 'left', 'width', 'height']
522
522
  button.keys.each do |key|
523
523
  if !attrs.include?(key) && !key.match(/^ext_/)
524
524
  warn "button.#{key} attribute is not defined in the spec, should be prefixed with ext_yourapp_"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: obf
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.4
4
+ version: 0.6.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Whitmer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-05 00:00:00.000000000 Z
11
+ date: 2014-12-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: nokogiri
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: rspec
99
113
  requirement: !ruby/object:Gem::Requirement
@@ -140,6 +154,7 @@ files:
140
154
  - lib/obf/picto4me.rb
141
155
  - lib/obf/png.rb
142
156
  - lib/obf/sfy.rb
157
+ - lib/obf/sgrid.rb
143
158
  - lib/obf/unknown_file.rb
144
159
  - lib/obf/utils.rb
145
160
  - lib/obf/validator.rb