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 +4 -0
- data/lib/ruby_speech.rb +1 -0
- data/lib/ruby_speech/generic_element.rb +111 -0
- data/lib/ruby_speech/grxml.rb +4 -0
- data/lib/ruby_speech/grxml/element.rb +7 -104
- data/lib/ruby_speech/ssml.rb +4 -0
- data/lib/ruby_speech/ssml/element.rb +7 -92
- data/lib/ruby_speech/version.rb +1 -1
- data/spec/ruby_speech/grxml_spec.rb +1 -1
- data/spec/ruby_speech/ssml_spec.rb +1 -1
- metadata +27 -20
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
@@ -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
|
data/lib/ruby_speech/grxml.rb
CHANGED
@@ -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
|
-
|
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
|
81
|
-
|
10
|
+
def self.root_element
|
11
|
+
Grammar
|
82
12
|
end
|
83
13
|
|
84
|
-
def
|
85
|
-
|
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
|
-
|
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
|
data/lib/ruby_speech/ssml.rb
CHANGED
@@ -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
|
-
|
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.
|
50
|
-
|
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
|
73
|
-
|
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
|
-
|
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
|
data/lib/ruby_speech/version.rb
CHANGED
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.
|
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-
|
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: &
|
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: *
|
24
|
+
version_requirements: *2157143800
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: activesupport
|
27
|
-
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: *
|
35
|
+
version_requirements: *2157143180
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: bundler
|
38
|
-
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: *
|
46
|
+
version_requirements: *2157142500
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rspec
|
49
|
-
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: *
|
57
|
+
version_requirements: *2157141800
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: ci_reporter
|
60
|
-
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: *
|
68
|
+
version_requirements: *2157141220
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: yard
|
71
|
-
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: *
|
79
|
+
version_requirements: *2157140600
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: rake
|
82
|
-
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: *
|
90
|
+
version_requirements: *2157140000
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: mocha
|
93
|
-
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: *
|
101
|
+
version_requirements: *2157139300
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: i18n
|
104
|
-
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: *
|
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
|