ruby_speech 0.3.2 → 0.3.3

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.
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