ruby_speech 0.3.2 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ # 0.3.3
2
+ * Allow `SSML::Element.import` and `GRXML::Element.import` to take a string as well as a Nokogiri::XML::Node
3
+ * Allow importing GRXML/SSML documents via their respective modules (eg `RubySpeech::GRXML.import '<grammar ... />'`)
4
+
1
5
  # 0.3.2
2
6
  * Fix inheriting an `SSML::Speak`'s language. Previously an imported `<speak/>` would end up with a `lang` attribute in addition to `xml:lang`, and `xml:lang` would have the default value (`en-US`). This required a Niceogiri dependency update.
3
7
 
data/lib/ruby_speech.rb CHANGED
@@ -10,6 +10,7 @@ module RubySpeech
10
10
 
11
11
  autoload :Version
12
12
 
13
+ autoload :GenericElement
13
14
  autoload :SSML
14
15
  autoload :GRXML
15
16
  autoload :XML
@@ -0,0 +1,111 @@
1
+ require 'active_support/core_ext/class/attribute'
2
+
3
+ module RubySpeech
4
+ module GenericElement
5
+
6
+ def self.included(klass)
7
+ klass.class_attribute :registered_ns, :registered_name
8
+ klass.extend ClassMethods
9
+ end
10
+
11
+ module ClassMethods
12
+ @@registrations = {}
13
+
14
+ # Register a new stanza class to a name and/or namespace
15
+ #
16
+ # This registers a namespace that is used when looking
17
+ # up the class name of the object to instantiate when a new
18
+ # stanza is received
19
+ #
20
+ # @param [#to_s] name the name of the node
21
+ #
22
+ def register(name)
23
+ self.registered_name = name.to_s
24
+ self.registered_ns = namespace
25
+ @@registrations[[self.registered_name, self.registered_ns]] = self
26
+ end
27
+
28
+ # Find the class to use given the name and namespace of a stanza
29
+ #
30
+ # @param [#to_s] name the name to lookup
31
+ #
32
+ # @return [Class, nil] the class appropriate for the name
33
+ def class_from_registration(name)
34
+ @@registrations[[name.to_s, namespace]]
35
+ end
36
+
37
+ # Import an XML::Node to the appropriate class
38
+ #
39
+ # Looks up the class the node should be then creates it based on the
40
+ # elements of the XML::Node
41
+ # @param [XML::Node] node the node to import
42
+ # @return the appropriate object based on the node name and namespace
43
+ def import(node)
44
+ node = Nokogiri::XML.parse(node, nil, nil, Nokogiri::XML::ParseOptions::NOBLANKS).root unless node.is_a?(Nokogiri::XML::Node)
45
+ return node.content if node.is_a?(Nokogiri::XML::Text)
46
+ klass = class_from_registration(node.element_name)
47
+ if klass && klass != self
48
+ klass.import node
49
+ else
50
+ new.inherit node
51
+ end
52
+ end
53
+
54
+ def new(element_name, atts = {}, &block)
55
+ blk_proc = lambda do |new_node|
56
+ atts.each_pair { |k, v| new_node.send :"#{k}=", v }
57
+ block_return = new_node.instance_eval &block if block_given?
58
+ new_node << new_node.encode_special_chars(block_return) if block_return.is_a?(String)
59
+ end
60
+
61
+ case RUBY_VERSION.split('.')[0,2].join.to_i
62
+ when 18
63
+ super(element_name).tap do |n|
64
+ blk_proc[n]
65
+ end
66
+ else
67
+ super(element_name) do |n|
68
+ blk_proc[n]
69
+ end
70
+ end
71
+ end
72
+ end
73
+
74
+ def children
75
+ super.map { |c| self.class.import c }
76
+ end
77
+
78
+ def embed(other)
79
+ case other
80
+ when String
81
+ self << encode_special_chars(other)
82
+ when self.class.root_element
83
+ other.children.each do |child|
84
+ self << child
85
+ end
86
+ when self.class.module::Element
87
+ self << other
88
+ else
89
+ raise ArgumentError, "Can only embed a String or an SSML element"
90
+ end
91
+ end
92
+
93
+ def method_missing(method_name, *args, &block)
94
+ const_name = method_name.to_s.sub('ssml', '').titleize.gsub(' ', '')
95
+ const = self.class.module.const_get const_name
96
+ if const && self.class::VALID_CHILD_TYPES.include?(const)
97
+ if const == String
98
+ self << encode_special_chars(args.first)
99
+ else
100
+ self << const.new(*args, &block)
101
+ end
102
+ else
103
+ super
104
+ end
105
+ end
106
+
107
+ def eql?(o, *args)
108
+ super o, :content, :children, *args
109
+ end
110
+ end # Element
111
+ end # RubySpeech
@@ -21,5 +21,9 @@ module RubySpeech
21
21
  grammar << block_return if block_return.is_a?(String)
22
22
  end
23
23
  end
24
+
25
+ def self.import(other)
26
+ Element.import other
27
+ end
24
28
  end # GRXML
25
29
  end # RubySpeech
@@ -3,116 +3,19 @@ require 'active_support/core_ext/class/attribute'
3
3
  module RubySpeech
4
4
  module GRXML
5
5
  class Element < Niceogiri::XML::Node
6
- @@registrations = {}
7
-
8
- class_attribute :registered_ns, :registered_name
9
-
10
- # Register a new stanza class to a name and/or namespace
11
- #
12
- # This registers a namespace that is used when looking
13
- # up the class name of the object to instantiate when a new
14
- # stanza is received
15
- #
16
- # @param [#to_s] name the name of the node
17
- #
18
- def self.register(name)
19
- self.registered_name = name.to_s
20
- self.registered_ns = GRXML_NAMESPACE
21
- @@registrations[[self.registered_name, self.registered_ns]] = self
22
- end
23
-
24
- # Find the class to use given the name and namespace of a stanza
25
- #
26
- # @param [#to_s] name the name to lookup
27
- #
28
- # @return [Class, nil] the class appropriate for the name
29
- def self.class_from_registration(name)
30
- @@registrations[[name.to_s, GRXML_NAMESPACE]]
31
- end
32
-
33
- # Import an XML::Node to the appropriate class
34
- #
35
- # Looks up the class the node should be then creates it based on the
36
- # elements of the XML::Node
37
- # @param [XML::Node] node the node to import
38
- # @return the appropriate object based on the node name and namespace
39
- def self.import(node)
40
- return node.content if node.is_a?(Nokogiri::XML::Text)
41
- klass = class_from_registration(node.element_name)
42
- if klass && klass != self
43
- klass.import node
44
- else
45
- new.inherit node
46
- end
47
- end
48
-
49
- # Inherit the attributes and children of an XML::Node
50
- #
51
- # @param [XML::Node] node the node to inherit
52
- # @return [self]
53
- def inherit(node)
54
- inherit_attrs node.attributes
55
- node.children.each do |c|
56
- self << c.dup
57
- end
58
- self
59
- end
60
-
61
- def self.new(element_name, atts = {}, &block)
62
- blk_proc = lambda do |new_node|
63
- atts.each_pair { |k, v| new_node.send :"#{k}=", v }
64
- block_return = new_node.instance_eval &block if block_given?
65
- new_node << new_node.encode_special_chars(block_return) if block_return.is_a?(String)
66
- end
67
-
68
- case RUBY_VERSION.split('.')[0,2].join.to_i
69
- when 18
70
- super(element_name).tap do |n|
71
- blk_proc[n]
72
- end
73
- else
74
- super(element_name) do |n|
75
- blk_proc[n]
76
- end
77
- end
6
+ def self.namespace
7
+ GRXML_NAMESPACE
78
8
  end
79
9
 
80
- def children
81
- super.map { |c| Element.import c }
10
+ def self.root_element
11
+ Grammar
82
12
  end
83
13
 
84
- def embed(other)
85
- case other
86
- when String
87
- self << encode_special_chars(other)
88
- when Grammar
89
- other.children.each do |child|
90
- self << child
91
- end
92
- when Element
93
- self << other
94
- else
95
- raise ArgumentError, "Can only embed a String or an GRXML element"
96
- end
14
+ def self.module
15
+ GRXML
97
16
  end
98
17
 
99
- def method_missing(method_name, *args, &block)
100
- const_name = method_name.to_s.sub('ssml', '').titleize.gsub(' ', '')
101
- const = GRXML.const_get const_name
102
- if const && self.class::VALID_CHILD_TYPES.include?(const)
103
- if const == String
104
- self << encode_special_chars(args.first)
105
- else
106
- self << const.new(*args, &block)
107
- end
108
- else
109
- super
110
- end
111
- end
112
-
113
- def eql?(o, *args)
114
- super o, :content, :children, *args
115
- end
18
+ include GenericElement
116
19
  end # Element
117
20
  end # GRXML
118
21
  end # RubySpeech
@@ -21,5 +21,9 @@ module RubySpeech
21
21
  speak << block_return if block_return.is_a?(String)
22
22
  end
23
23
  end
24
+
25
+ def self.import(other)
26
+ Element.import other
27
+ end
24
28
  end # SSML
25
29
  end # RubySpeech
@@ -3,104 +3,19 @@ require 'active_support/core_ext/class/attribute'
3
3
  module RubySpeech
4
4
  module SSML
5
5
  class Element < Niceogiri::XML::Node
6
- @@registrations = {}
7
-
8
- class_attribute :registered_ns, :registered_name
9
-
10
- # Register a new stanza class to a name and/or namespace
11
- #
12
- # This registers a namespace that is used when looking
13
- # up the class name of the object to instantiate when a new
14
- # stanza is received
15
- #
16
- # @param [#to_s] name the name of the node
17
- #
18
- def self.register(name)
19
- self.registered_name = name.to_s
20
- self.registered_ns = SSML_NAMESPACE
21
- @@registrations[[self.registered_name, self.registered_ns]] = self
22
- end
23
-
24
- # Find the class to use given the name and namespace of a stanza
25
- #
26
- # @param [#to_s] name the name to lookup
27
- #
28
- # @return [Class, nil] the class appropriate for the name
29
- def self.class_from_registration(name)
30
- @@registrations[[name.to_s, SSML_NAMESPACE]]
31
- end
32
-
33
- # Import an XML::Node to the appropriate class
34
- #
35
- # Looks up the class the node should be then creates it based on the
36
- # elements of the XML::Node
37
- # @param [XML::Node] node the node to import
38
- # @return the appropriate object based on the node name and namespace
39
- def self.import(node)
40
- return node.content if node.is_a?(Nokogiri::XML::Text)
41
- klass = class_from_registration(node.element_name)
42
- if klass && klass != self
43
- klass.import node
44
- else
45
- new.inherit node
46
- end
6
+ def self.namespace
7
+ SSML_NAMESPACE
47
8
  end
48
9
 
49
- def self.new(element_name, atts = {}, &block)
50
- blk_proc = lambda do |new_node|
51
- atts.each_pair { |k, v| new_node.send :"#{k}=", v }
52
- block_return = new_node.instance_eval &block if block_given?
53
- new_node << new_node.encode_special_chars(block_return) if block_return.is_a?(String)
54
- end
55
-
56
- case RUBY_VERSION.split('.')[0,2].join.to_i
57
- when 18
58
- super(element_name).tap do |n|
59
- blk_proc[n]
60
- end
61
- else
62
- super(element_name) do |n|
63
- blk_proc[n]
64
- end
65
- end
66
- end
67
-
68
- def children
69
- super.map { |c| Element.import c }
10
+ def self.root_element
11
+ Speak
70
12
  end
71
13
 
72
- def embed(other)
73
- case other
74
- when String
75
- self << encode_special_chars(other)
76
- when Speak
77
- other.children.each do |child|
78
- self << child
79
- end
80
- when Element
81
- self << other
82
- else
83
- raise ArgumentError, "Can only embed a String or an SSML element"
84
- end
14
+ def self.module
15
+ SSML
85
16
  end
86
17
 
87
- def method_missing(method_name, *args, &block)
88
- const_name = method_name.to_s.sub('ssml', '').titleize.gsub(' ', '')
89
- const = SSML.const_get const_name
90
- if const && self.class::VALID_CHILD_TYPES.include?(const)
91
- if const == String
92
- self << encode_special_chars(args.first)
93
- else
94
- self << const.new(*args, &block)
95
- end
96
- else
97
- super
98
- end
99
- end
100
-
101
- def eql?(o, *args)
102
- super o, :content, :children, *args
103
- end
18
+ include GenericElement
104
19
  end # Element
105
20
  end # SSML
106
21
  end # RubySpeech
@@ -1,3 +1,3 @@
1
1
  module RubySpeech
2
- VERSION = "0.3.2"
2
+ VERSION = "0.3.3"
3
3
  end
@@ -229,7 +229,7 @@ module RubySpeech
229
229
  GRXML::Grammar.new.tap { |doc| doc << rule }.to_s
230
230
  end
231
231
 
232
- let(:import) { GRXML::Element.import parse_xml(document).root }
232
+ let(:import) { GRXML.import document }
233
233
 
234
234
  subject { import }
235
235
 
@@ -238,7 +238,7 @@ module RubySpeech
238
238
  SSML::Speak.new.tap { |doc| doc << voice }.to_s
239
239
  end
240
240
 
241
- let(:import) { SSML::Element.import parse_xml(document).root }
241
+ let(:import) { SSML.import document }
242
242
 
243
243
  subject { import }
244
244
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_speech
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.3.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-11-25 00:00:00.000000000 Z
12
+ date: 2011-12-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: niceogiri
16
- requirement: &2151824760 !ruby/object:Gem::Requirement
16
+ requirement: &2157143800 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.1.1
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2151824760
24
+ version_requirements: *2157143800
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: activesupport
27
- requirement: &2151804040 !ruby/object:Gem::Requirement
27
+ requirement: &2157143180 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 3.0.7
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2151804040
35
+ version_requirements: *2157143180
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: bundler
38
- requirement: &2151801800 !ruby/object:Gem::Requirement
38
+ requirement: &2157142500 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 1.0.0
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *2151801800
46
+ version_requirements: *2157142500
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rspec
49
- requirement: &2151800400 !ruby/object:Gem::Requirement
49
+ requirement: &2157141800 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 2.7.0
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *2151800400
57
+ version_requirements: *2157141800
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: ci_reporter
60
- requirement: &2151798240 !ruby/object:Gem::Requirement
60
+ requirement: &2157141220 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 1.6.3
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *2151798240
68
+ version_requirements: *2157141220
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: yard
71
- requirement: &2151811840 !ruby/object:Gem::Requirement
71
+ requirement: &2157140600 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 0.7.0
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *2151811840
79
+ version_requirements: *2157140600
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: rake
82
- requirement: &2151809800 !ruby/object:Gem::Requirement
82
+ requirement: &2157140000 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *2151809800
90
+ version_requirements: *2157140000
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: mocha
93
- requirement: &2151808000 !ruby/object:Gem::Requirement
93
+ requirement: &2157139300 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '0'
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *2151808000
101
+ version_requirements: *2157139300
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: i18n
104
- requirement: &2151806660 !ruby/object:Gem::Requirement
104
+ requirement: &2157138760 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,7 +109,7 @@ dependencies:
109
109
  version: '0'
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *2151806660
112
+ version_requirements: *2157138760
113
113
  description: Prepare SSML and GRXML documents with ease
114
114
  email:
115
115
  - ben@langfeld.me
@@ -131,6 +131,7 @@ files:
131
131
  - assets/synthesis.xsd
132
132
  - assets/xml.xsd
133
133
  - lib/ruby_speech.rb
134
+ - lib/ruby_speech/generic_element.rb
134
135
  - lib/ruby_speech/grxml.rb
135
136
  - lib/ruby_speech/grxml/element.rb
136
137
  - lib/ruby_speech/grxml/grammar.rb
@@ -183,12 +184,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
183
184
  - - ! '>='
184
185
  - !ruby/object:Gem::Version
185
186
  version: '0'
187
+ segments:
188
+ - 0
189
+ hash: -3968593317999839588
186
190
  required_rubygems_version: !ruby/object:Gem::Requirement
187
191
  none: false
188
192
  requirements:
189
193
  - - ! '>='
190
194
  - !ruby/object:Gem::Version
191
195
  version: '0'
196
+ segments:
197
+ - 0
198
+ hash: -3968593317999839588
192
199
  requirements: []
193
200
  rubyforge_project: ruby_speech
194
201
  rubygems_version: 1.8.10