class AlexaModelMd

Public Class Methods

new(wiki=nil, keywords={}) click to toggle source
Calls superclass method
# File lib/alexa_modelmd.rb, line 39
  def initialize(wiki=nil, keywords={})
    
    wcis = keywords.delete :whatcanisay
    puts 'wcis: ' + wcis.inspect if @debug
    
    super(wiki, keywords)
    
    if wcis then
      
      found = self.find 'What can I say'

      if not found then
        
        s=<<EOF        
# What can I say

## WhatCanISay
        
* what can I say
* give me some examples

`
#rsc.alexamodelmd.sample_utterances '#{self.title}'
"Not yet enabled."
`

+ help whatcanisay
EOF

        self.create_section s
        
      end

    end
  end

Public Instance Methods

endpoint() click to toggle source
# File lib/alexa_modelmd.rb, line 92
def endpoint()      @dxsx.dx.endpoint       end
endpoint=(s) click to toggle source
# File lib/alexa_modelmd.rb, line 93
def endpoint=(s)    @dxsx.dx.endpoint = s   end
entries() click to toggle source
Calls superclass method
# File lib/alexa_modelmd.rb, line 75
def entries()

  r = super()

  r.map do |entry|

    def entry.intents()
      puts 'entries | x: ' + x.inspect if @debug
      self.body().split(/(?=^## )/).map {|x| Intent.new(x, debug: @debug)}
    end

    entry

  end

end
invocation() click to toggle source
# File lib/alexa_modelmd.rb, line 94
def invocation()    @dxsx.dx.invocation     end
invocation=(s) click to toggle source
# File lib/alexa_modelmd.rb, line 95
def invocation=(s)  @dxsx.dx.invocation = s end
save_rsf() click to toggle source
# File lib/alexa_modelmd.rb, line 97
def save_rsf()
  if @dxsx.dx.respond_to? :rsf_file then
    FileX.write @dxsx.dx.rsf_file, to_rsf()
  else
    raise AMSummaryExceptiom, 'no rsf_file summary field found'
  end
end
save_txt() click to toggle source
# File lib/alexa_modelmd.rb, line 105
def save_txt()
  if @dxsx.dx.respond_to? :txt_file then
    FileX.write @dxsx.dx.txt_file, to_txt()
  else
    raise AMSummaryExceptiom, 'no txt_file summary field found'
  end
end
to_doc() click to toggle source

note: An intent or an utterance can't contain numbers

# File lib/alexa_modelmd.rb, line 134
def to_doc()

  a = RexleBuilder.build do |xml|

    xml.model do

      xml.summary do
        xml.title @dxsx.dx.title
        xml.invocation @dxsx.dx.invocation
        xml.endpoint @dxsx.dx.endpoint
      end

      xml.entries do 
        entries.each do |entry|

          xml.entry do
            xml.topic entry.heading.strip

            xml.intents do
              entry.intents.each do |intent|

                xml.intent do

                  xml.name intent.name.gsub(/\d+/, '')

                  xml.utterances do
                    intent.utterances.each do |utterance|
                      xml.utterance utterance.gsub(/\d+/, '')
                    end
                  end

                  xml.code do              
                    xml.cdata! intent.code
                  end
                end #/intent
              end
            end #/intents

            xml.tags do
              entry.tags.each do |tag|
                xml.tag tag
              end
            end
            
          end
        end 
      end #/entries

    end #/model
  end

  Rexle.new(a)

end
to_md() click to toggle source

Transforms the document into an Alexa_modelmd formatted document

# File lib/alexa_modelmd.rb, line 115
def to_md
  Rexslt.new(md_xslt(), to_xml(), debug: @debug).to_s
end
to_modelb() click to toggle source

This generates a plain text file representing the Alexa Model to be built using the alexa_modelbuilder gem

# File lib/alexa_modelmd.rb, line 122
def to_modelb
  Rexslt.new(modelbuilder_xslt(), to_xml()).to_s    
end
Also aliased as: to_txt
to_rsf() click to toggle source
# File lib/alexa_modelmd.rb, line 128
def to_rsf
  Rexslt.new(rsf_xslt(), to_xml(), debug: @debug).to_s
end
to_txt()
Alias for: to_modelb
to_xml() click to toggle source
# File lib/alexa_modelmd.rb, line 189
def to_xml()
  to_doc.xml pretty: true
end
utterances() click to toggle source
# File lib/alexa_modelmd.rb, line 193
def utterances()
  to_doc.root.xpath('//entries/entry/intents/intent/' + 
                               'utterances/utterance').map(&:text)
end

Private Instance Methods

md_xslt() click to toggle source
# File lib/alexa_modelmd.rb, line 295
  def md_xslt()
<<EOF    
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />

  <xsl:template match='model'>
<xsl:text disable-output-escaping="yes">&lt;?dynarex schema="sections[title, invocation, endpoint]/section(x)" format_mask="[!x]"?&gt;</xsl:text>
title: <xsl:value-of select='summary/title'/>
invocation: <xsl:value-of select='summary/invocation'/>
endpoint: <xsl:value-of select='summary/endpoint'/>
--#
      <xsl:apply-templates select='entries/entry' />
<xsl:text>
</xsl:text>

  </xsl:template>

  <xsl:template match='entries/entry'>
<xsl:text>
</xsl:text>
<xsl:text>#  </xsl:text><xsl:value-of select='topic' /><xsl:text>  </xsl:text>

  <xsl:apply-templates select='intents/intent' /><xsl:text>
  
+</xsl:text>
<xsl:apply-templates select='tags/tag' />
<xsl:text>
</xsl:text>

  </xsl:template>

  <xsl:template match='intents/intent'><xsl:text>  </xsl:text>
    
<xsl:text>

##  </xsl:text><xsl:value-of select='name' /><xsl:text>
    </xsl:text>

  <xsl:apply-templates select='utterances/utterance' /><xsl:text>
</xsl:text>

<xsl:text>
`</xsl:text>
      <xsl:value-of select='code' />
<xsl:text>`</xsl:text>

  </xsl:template>

<xsl:template match='utterances/utterance'>
* <xsl:value-of select='.'/>
</xsl:template>

<xsl:template match='tags/tag'>
<xsl:text> </xsl:text><xsl:value-of select='.'/>
</xsl:template>
</xsl:stylesheet>
EOF
  end
modelbuilder_xslt() click to toggle source
# File lib/alexa_modelmd.rb, line 200
  def modelbuilder_xslt()
<<EOF
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />

  <xsl:template match='model'>name: <xsl:value-of select='summary/title' />
invocation: <xsl:value-of select='summary/invocation' />
<xsl:text>
</xsl:text>
      <xsl:apply-templates select='entries/entry' />
endpoint: <xsl:value-of select='summary/endpoint' />

  </xsl:template>

  <xsl:template match='entries/entry'>
# <xsl:value-of select='topic' /><xsl:text>
</xsl:text>
  <xsl:apply-templates select='intents/intent' />
  </xsl:template>

  <xsl:template match='intents/intent'>
<xsl:text>
</xsl:text>
<xsl:value-of select='name' />
  <xsl:apply-templates select='utterances/utterance' />
<xsl:text>
</xsl:text>
  </xsl:template>

  <xsl:template match='utterances/utterance'>
<xsl:text>
  </xsl:text>
  <xsl:value-of select='.' />

  </xsl:template>


</xsl:stylesheet>
EOF
  end
rsf_xslt() click to toggle source
# File lib/alexa_modelmd.rb, line 241
  def rsf_xslt()
<<EOF    
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />

  <xsl:template match='model'>
<xsl:element name='skill'>
<xsl:text>
</xsl:text>
      <xsl:apply-templates select='entries/entry' />
<xsl:text>
</xsl:text>
</xsl:element>
  </xsl:template>

  <xsl:template match='entries/entry'>
<xsl:text>
  </xsl:text>
  <xsl:comment><xsl:text>  </xsl:text><xsl:value-of select='topic' /><xsl:text>  </xsl:text></xsl:comment><xsl:text>
</xsl:text>

  <xsl:apply-templates select='intents/intent' />
  <xsl:text>  </xsl:text><xsl:comment><xsl:text>  // </xsl:text><xsl:value-of select='topic' /><xsl:text>  </xsl:text></xsl:comment><xsl:text>
</xsl:text>

  </xsl:template>

  <xsl:template match='intents/intent'><xsl:text>  </xsl:text>
    <xsl:element name='response'>
   <xsl:attribute name='id'><xsl:value-of select='name' /></xsl:attribute><xsl:text>
    </xsl:text>
    <xsl:element name='script'>
<xsl:text disable-output-escaping="yes">
    &lt;![CDATA[
</xsl:text>
      <xsl:value-of select='code' />
<xsl:text disable-output-escaping="yes">
    ]]&gt;</xsl:text>

<xsl:text>
    </xsl:text>
      </xsl:element>

<xsl:text>
  </xsl:text>
 </xsl:element><xsl:text>
</xsl:text>
  </xsl:template>


</xsl:stylesheet>
EOF
  end