srgs 0.0.1 → 0.5.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 479330b95858e11b3e45f52889d103d99b43b31a
4
- data.tar.gz: 0b097d07fc1b72b0a6c49fec84e5cef74facd9c7
3
+ metadata.gz: 390a6193c41c0b64138ec62e9398d204b92fd56f
4
+ data.tar.gz: 82d27e46aaafceae8313531e052c747dfc1e1825
5
5
  SHA512:
6
- metadata.gz: 8c0c0c5a51828ee910f260ffef4803b37e96edfc550a2199eb3fa5a356f6ff179509728be285da512fd1817000907c516df2a9e9ec8847901634559ca8ac0f69
7
- data.tar.gz: debfaa559c9b3dc78a7dee28625f7c78087e8bfe455b675f70a8c58c4071a57b6e8362c2796e48869a6fd574f9f8041eb3034a1f545d3ab4ca5faefa25927bb0
6
+ metadata.gz: 2815041a09db82312bb0284c31fef3ae0380d4a367333adaa5bf6c52c664c9dae83a23898decf84d65601a3edc32c0d706af4e5e2ab663070f62ecfc4d31cb62
7
+ data.tar.gz: e2ed6e86daef6652ba3c29485cbd353b9ef747dca3ec2dd1de30edab23e4391aa70a060af02321b9a574d55deb045d5df1702721778552b96724df3e3eeba906
data/README.md CHANGED
@@ -1,12 +1,12 @@
1
1
  # SRGS
2
2
 
3
- TODO: Write a gem description
3
+ A tool for building srgs documents
4
4
 
5
5
  ## Installation
6
6
 
7
7
  Add this line to your application's Gemfile:
8
8
 
9
- gem 'srgs_builder'
9
+ gem 'srgs'
10
10
 
11
11
  And then execute:
12
12
 
@@ -14,11 +14,67 @@ And then execute:
14
14
 
15
15
  Or install it yourself as:
16
16
 
17
- $ gem install srgs_builder
17
+ $ gem install srgs
18
18
 
19
19
  ## Usage
20
20
 
21
- TODO: Write usage instructions here
21
+ Here's an example file. It will be documented better later
22
+
23
+ [This](http://msdn.microsoft.com/en-us/library/hh361653(v=office.14).aspx) is a good
24
+ reference on how srgs grammars work.
25
+
26
+ In the future, I plan to create a dsl for this but for now this is how it works.
27
+ ```ruby
28
+ require 'srgs'
29
+
30
+ grammar = Srgs::Grammar.new
31
+
32
+ sunriseset = Srgs::Rule.new('riseset')
33
+ sunriseset_choices = Srgs::OneOf.new << Srgs::Item.new('rise') << Srgs::Item.new('set')
34
+ sunriseset << sunriseset_choices
35
+ sunriseset.scope = 'private'
36
+
37
+ sunriseset_ref = Srgs::RuleRef.new(sunriseset)
38
+
39
+ days = Srgs::Rule.new('days')
40
+ days_choices = Srgs::OneOf.new << Srgs::Item.new('today') << Srgs::Item.new('tomorrow') << Srgs::Item.new('currently')
41
+ days << days_choices
42
+ days.scope = 'private'
43
+
44
+ days_ref = Srgs::RuleRef.new(days)
45
+
46
+ weather = Srgs::Rule.new('weather')
47
+ sun = Srgs::Rule.new('sun')
48
+
49
+ question1 = Srgs::Item.new("Mycroft what is the weather");
50
+ question2 = Srgs::Item.new("Mycroft When is sun");
51
+
52
+ weather << question1
53
+ weather << days_ref
54
+ weather << Srgs::Tag.new("out.day=rules.days;")
55
+ weather.scope = 'public'
56
+
57
+ sun << question2
58
+ sun << sunriseset_ref
59
+ sun << Srgs::Tag.new("out.rise_or_set=rules.riseset;")
60
+ sun << days_ref
61
+ sun << Srgs::Tag.new("out.day=rules.days;")
62
+ sun.scope = 'public'
63
+
64
+ top_level = Srgs::Rule.new("toplevel");
65
+ top_level_choices = Srgs::OneOf.new
66
+ item1 = Srgs::Item.new Srgs::RuleRef.new(weather)
67
+ item2 = Srgs::Item.new Srgs::RuleRef.new(sun)
68
+ top_level_choices << item1
69
+ top_level_choices << item2
70
+ top_level << top_level_choices
71
+
72
+ grammar << top_level << weather << sun << days << sunriseset
73
+
74
+ grammar.root = "toplevel"
75
+
76
+ puts Srgs.build(grammar)
77
+ ```
22
78
 
23
79
  ## Contributing
24
80
 
@@ -0,0 +1,11 @@
1
+ module Srgs
2
+ class Example
3
+
4
+ attr_accessor :text
5
+
6
+ def initialize(text)
7
+ @text = text
8
+ end
9
+
10
+ end
11
+ end
@@ -0,0 +1,21 @@
1
+ module Srgs
2
+ class Grammar
3
+
4
+ attr_accessor :root, :lexicon, :rules, :metas
5
+
6
+ def initialize(root = '')
7
+ @root = root
8
+ @lexicon = nil
9
+ @metas = Array.new
10
+ @rules = Array.new
11
+ end
12
+
13
+ def <<(element)
14
+ @rules << element if element.is_a? Rule
15
+ @lexicon = element if element.is_a? Lexicon
16
+ @metas << element if element.is_a? Meta
17
+ self
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,15 @@
1
+ module Srgs
2
+ class Item
3
+
4
+ attr_accessor :element, :repeat, :repeat_prob, :weight, :tag
5
+
6
+ def initialize(element, tag=nil, repeat=nil, repeat_prob = nil, weight = nil)
7
+ @element = element
8
+ @tag = tag
9
+ @repeat = repeat
10
+ @repeat_prob = repeat_prob
11
+ @weight = weight
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ module Srgs
2
+ class Lexicon
3
+
4
+ attr_accessor :uri, :type
5
+
6
+ def initialize(uri, type=nil)
7
+ @uri = uri
8
+ @type = type
9
+ end
10
+
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ module Srgs
2
+ class Meta
3
+
4
+ attr_accessor :name, :http_equiv, :content
5
+
6
+ def initialize(content, name=nil, http_equiv=nil)
7
+ @name = name
8
+ @content = content
9
+ @http_equiv = http_equiv
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,11 @@
1
+ module Srgs
2
+ class Metadata
3
+
4
+ attr_accessor :text
5
+
6
+ def initialize(text)
7
+ @text = text
8
+ end
9
+
10
+ end
11
+ end
@@ -0,0 +1,16 @@
1
+ module Srgs
2
+ class OneOf
3
+
4
+ attr_accessor :items
5
+
6
+ def initialize
7
+ @items = Array.new
8
+ end
9
+
10
+ def <<(item)
11
+ @items << item
12
+ self
13
+ end
14
+
15
+ end
16
+ end
@@ -0,0 +1,19 @@
1
+ module Srgs
2
+ class Rule
3
+
4
+ attr_accessor :id, :scope, :dynamic, :elements
5
+
6
+ def initialize(id, scope = 'private', dynamic = nil)
7
+ @id = id
8
+ @elements = Array.new
9
+ @scope = scope
10
+ @dynamic = dynamic
11
+ end
12
+
13
+ def <<(element)
14
+ @elements << element
15
+ self
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,12 @@
1
+ module Srgs
2
+ class RuleRef
3
+
4
+ attr_accessor :uri, :special
5
+
6
+ def initialize(rule, special=nil)
7
+ @uri = "##{rule.id}"
8
+ @special =special
9
+ end
10
+
11
+ end
12
+ end
@@ -0,0 +1,11 @@
1
+ module Srgs
2
+ class Tag
3
+
4
+ attr_accessor :text
5
+
6
+ def initialize(text)
7
+ @text = text
8
+ end
9
+
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ module Srgs
2
+ class Token
3
+
4
+ attr_accessor :text, :display, :pron
5
+
6
+ def initialize(text, display = nil, pron = nil)
7
+ @text = text
8
+ @display = display
9
+ @pron = pron
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,114 @@
1
+ require 'nokogiri'
2
+
3
+ module Srgs
4
+ extend self
5
+
6
+ def build(grammar)
7
+ builder = Nokogiri::XML::Builder.new do |xml|
8
+ xml.grammar do
9
+ lexicon(grammar.lexicon, xml) unless grammar.lexicon.nil?
10
+ grammar.metas.each do |meta|
11
+ meta(meta, xml)
12
+ end
13
+ grammar.rules.each do |rule|
14
+ rule(rule, xml)
15
+ end
16
+ end
17
+ end.to_xml
18
+ end
19
+
20
+ def example(example, xml)
21
+ xml.example example.text
22
+ end
23
+
24
+ def item(item, xml)
25
+ att = {}
26
+ set(:repeat, att, item.repeat)
27
+ set(:'repeat-prob', att, item.repeat_prob)
28
+ set(:weight, att, item.weight)
29
+ if item.element.is_a? Token
30
+ xml.item(att) do
31
+ tag(item.tag, xml) unless item.tag.nil?
32
+ token(item.element, xml)
33
+ end
34
+ elsif item.element.is_a? RuleRef
35
+ xml.item(att) do
36
+ tag(item.tag, xml) unless item.tag.nil?
37
+ rule_ref(item.element, xml)
38
+ end
39
+ else
40
+ xml.item(item.element, att) do
41
+ tag(item.tag, xml) unless item.tag.nil?
42
+ end
43
+ end
44
+ end
45
+
46
+ def lexicon(lexicon, xml)
47
+ att = {uri: lexicon.uri }
48
+ set(:type, att, lexicon.type)
49
+ xml.lexicon(att)
50
+ end
51
+
52
+ def meta(meta, xml)
53
+ att = { content: meta.content }
54
+ set(:'http-equiv', att, meta.http_equiv)
55
+ set(:name, att, meta.name)
56
+ xml.meta(att)
57
+ end
58
+
59
+ def metadata(metadata, xml)
60
+ #TODO
61
+ raise "Not yet implemented"
62
+ end
63
+
64
+ def one_of(one_of, xml)
65
+ xml.send('one-of') do
66
+ one_of.items.each do |item|
67
+ item(item, xml)
68
+ end
69
+ end
70
+ end
71
+
72
+ def rule(rule, xml)
73
+ att = {id: rule.id}
74
+ set(:scope, att, rule.scope)
75
+ set(:'sapi:dynamic', att, rule.dynamic)
76
+ xml.rule(att) do
77
+ rule.elements.each do |element|
78
+ if element.is_a? Item
79
+ item(element, xml)
80
+ elsif element.is_a? RuleRef
81
+ rule_ref(element, xml)
82
+ elsif element.is_a? OneOf
83
+ one_of(element, xml)
84
+ elsif element.is_a? Token
85
+ token(element, xml)
86
+ elsif element.is_a? Tag
87
+ tag(element, xml)
88
+ end
89
+ end
90
+ end
91
+ end
92
+
93
+ def rule_ref(rule_ref, xml)
94
+ att = { uri: rule_ref.uri }
95
+ set(:special, att, rule_ref.special)
96
+ xml.ruleref(att)
97
+ end
98
+
99
+ def tag(tag, xml)
100
+ xml.tag tag.text
101
+ end
102
+
103
+ def token(token, xml)
104
+ att = {}
105
+ att(:'sapi:display', att, token.display)
106
+ att(:'sapi:pron', att, token.pron)
107
+ xml.token(token.text, att)
108
+ end
109
+
110
+ def set(sym, att, value)
111
+ att[sym] = value unless value.nil?
112
+ end
113
+
114
+ end
data/lib/srgs/test.rb ADDED
@@ -0,0 +1,49 @@
1
+ require 'srgs'
2
+
3
+ grammar = Srgs::Grammar.new
4
+
5
+ sunriseset = Srgs::Rule.new('riseset')
6
+ sunriseset_choices = Srgs::OneOf.new << Srgs::Item.new('rise') << Srgs::Item.new('set')
7
+ sunriseset << sunriseset_choices
8
+ sunriseset.scope = 'private'
9
+
10
+ sunriseset_ref = Srgs::RuleRef.new(sunriseset)
11
+
12
+ days = Srgs::Rule.new('days')
13
+ days_choices = Srgs::OneOf.new << Srgs::Item.new('today') << Srgs::Item.new('tomorrow') << Srgs::Item.new('currently')
14
+ days << days_choices
15
+ days.scope = 'private'
16
+
17
+ days_ref = Srgs::RuleRef.new(days)
18
+
19
+ weather = Srgs::Rule.new('weather')
20
+ sun = Srgs::Rule.new('sun')
21
+
22
+ question1 = Srgs::Item.new("Mycroft what is the weather");
23
+ question2 = Srgs::Item.new("Mycroft When is sun");
24
+
25
+ weather << question1
26
+ weather << days_ref
27
+ weather << Srgs::Tag.new("out.day=rules.days;")
28
+ weather.scope = 'public'
29
+
30
+ sun << question2
31
+ sun << sunriseset_ref
32
+ sun << Srgs::Tag.new("out.rise_or_set=rules.riseset;")
33
+ sun << days_ref
34
+ sun << Srgs::Tag.new("out.day=rules.days;")
35
+ sun.scope = 'public'
36
+
37
+ top_level = Srgs::Rule.new("toplevel");
38
+ top_level_choices = Srgs::OneOf.new
39
+ item1 = Srgs::Item.new Srgs::RuleRef.new(weather)
40
+ item2 = Srgs::Item.new Srgs::RuleRef.new(sun)
41
+ top_level_choices << item1
42
+ top_level_choices << item2
43
+ top_level << top_level_choices
44
+
45
+ grammar << top_level << weather << sun << days << sunriseset
46
+
47
+ grammar.root = "toplevel"
48
+
49
+ puts Srgs.build(grammar)
data/lib/srgs/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Srgs
2
- VERSION = "0.0.1"
2
+ VERSION = "0.5.0"
3
3
  end
data/lib/srgs.rb CHANGED
@@ -1,5 +1,16 @@
1
- require "srgs/version"
1
+ require 'srgs/version'
2
+ require 'srgs/elements/grammar'
3
+ require 'srgs/elements/item'
4
+ require 'srgs/elements/example'
5
+ require 'srgs/elements/lexicon'
6
+ require 'srgs/elements/meta'
7
+ require 'srgs/elements/metadata'
8
+ require 'srgs/elements/one_of'
9
+ require 'srgs/elements/rule'
10
+ require 'srgs/elements/rule_ref'
11
+ require 'srgs/elements/tag'
12
+ require 'srgs/elements/token'
13
+ require 'srgs/grammar_builder'
2
14
 
3
15
  module Srgs
4
- # Your code goes here...
5
- end
16
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: srgs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - kristenmills
@@ -65,6 +65,19 @@ files:
65
65
  - README.md
66
66
  - Rakefile
67
67
  - lib/srgs.rb
68
+ - lib/srgs/elements/example.rb
69
+ - lib/srgs/elements/grammar.rb
70
+ - lib/srgs/elements/item.rb
71
+ - lib/srgs/elements/lexicon.rb
72
+ - lib/srgs/elements/meta.rb
73
+ - lib/srgs/elements/metadata.rb
74
+ - lib/srgs/elements/one_of.rb
75
+ - lib/srgs/elements/rule.rb
76
+ - lib/srgs/elements/rule_ref.rb
77
+ - lib/srgs/elements/tag.rb
78
+ - lib/srgs/elements/token.rb
79
+ - lib/srgs/grammar_builder.rb
80
+ - lib/srgs/test.rb
68
81
  - lib/srgs/version.rb
69
82
  - srgs.gemspec
70
83
  homepage: https://github.com/kristenmills/srgs