summaryrefslogtreecommitdiff
path: root/src/GF
diff options
context:
space:
mode:
authorbringert <bringert@cs.chalmers.se>2006-03-03 10:40:23 +0000
committerbringert <bringert@cs.chalmers.se>2006-03-03 10:40:23 +0000
commit11cba226ea8027fcbb9918ff1dfd4bcafe9f279e (patch)
tree7fca68b7a23d6a2da572678ed4e19f1ede7a44b5 /src/GF
parentcbcdc01380546e505a30ed1713c1c5829a8a79d7 (diff)
Towards a working VoiceXML generator.
Diffstat (limited to 'src/GF')
-rw-r--r--src/GF/Speech/GrammarToVoiceXML.hs66
1 files changed, 59 insertions, 7 deletions
diff --git a/src/GF/Speech/GrammarToVoiceXML.hs b/src/GF/Speech/GrammarToVoiceXML.hs
index 488ff0a37..1e3916953 100644
--- a/src/GF/Speech/GrammarToVoiceXML.hs
+++ b/src/GF/Speech/GrammarToVoiceXML.hs
@@ -56,14 +56,49 @@ updateSkeleton cat skel rule =
skel2vxml :: String -> VIdent -> VSkeleton -> XML
skel2vxml name start skel =
- vxml ([startForm] ++ concatMap (uncurry (catForms gr)) skel)
+ vxml (prelude ++ [startForm] ++ concatMap (uncurry (catForms gr)) skel)
where
gr = grammarURI name
- startForm = Tag "form" [] [subdialog "sub" [("src","#"++start)] []]
+ prelude = scriptLib
+ startForm = Tag "form" [] [subdialog "sub" [("srcexpr","'#'+"++string start)] []]
grammarURI :: String -> String
grammarURI name = name ++ ".grxml"
+scriptLib :: [XML]
+scriptLib = [script (unlines s)]
+ where
+ s = ["function dump(r, p) {",
+ " if (isUndefined(p)) { p = 0 }",
+ " if (isUndefined(r)) {",
+ " return 'undefined';",
+ " } else if (isArray(r)) {",
+ " var s = '[';",
+ " for (var i = 0; i < r.length; r++) {",
+ " s += dump(r[0], 0);",
+ " if (i < r.length-1) { s += ',' }",
+ " }",
+ " s += ']';",
+ " return s;",
+ " } else if (r == '?') {",
+ " return '?';",
+ " } else {",
+ " var s = r.name;",
+ " var i;",
+ " for (i = 0; ; i++) {",
+ " var c = r['arg'+i];",
+ " if (c == undefined) { break; }",
+ " s += ' ' + dump(c, 1);",
+ " }",
+ " if (i > 0 && p > 0) { s = '(' + s + ')'; }",
+ " return s;",
+ " }",
+ "}",
+ "function isArray(a) { return a && typeof a == 'object' && a.constructor == Array; }",
+ "function isUndefined(a) { return typeof a == 'undefined'; }"
+ ]
+
+
catForms :: String -> VIdent -> [(VIdent, [VIdent])] -> [XML]
catForms gr cat fs =
comments [cat ++ " category."]
@@ -72,31 +107,34 @@ catForms gr cat fs =
cat2form :: String -> VIdent -> [(VIdent, [VIdent])] -> XML
cat2form gr cat fs =
- form cat [var "value" (Just "'?'"),
+ form cat [var "value" (Just "'?'"), formDebug cat,
block [if_ "value != '?'" [assign cat "value"]],
field cat [] [promptString ("quest_"++cat),
grammar (gr++"#"++cat),
nomatch [Data "I didn't understand you.", reprompt],
help [Data ("help_"++cat)],
filled [] [if_else (cat ++ " == '?'") [reprompt] feedback]],
+ block [prompt [Data (cat ++ " = "), value ("dump("++cat++")")]],
subdialog "sub" [("srcexpr","'#'+"++cat++".name")]
[param "value" cat, filled [] subDone]]
where subDone = [assign cat "sub.value", return_ [cat]]
- feedback = [Data "Constructor: ", value (cat++".name")]
+ feedback = []
fun2form :: String -> VIdent -> [VIdent] -> XML
fun2form gr fun args =
- form fun ([var "value" Nothing]
+ form fun ([var "value" Nothing] ++ [formDebug fun]
++ ss
++ [ret])
where
argNames = zip ["arg"++show n | n <- [0..]] args
ss = map (uncurry mkSub) argNames
- mkSub a t = subdialog a [("src","#"++t)]
+ mkSub a t = subdialog a [("srcexpr","'#'+"++string t)]
[param "value" ("value."++a),
filled [] [assign ("value."++a) (a++"."++t)]]
ret = block [return_ ["value"]]
+formDebug id = block [prompt [Data ("Entering form " ++ id ++ ". value = "), value "dump(value)"]]
+
--
-- * VoiceXML stuff
--
@@ -105,7 +143,7 @@ vxml :: [XML] -> XML
vxml = Tag "vxml" [("version","2.0"),("xmlns","http://www.w3.org/2001/vxml")]
form :: String -> [XML] -> XML
-form id = Tag "form" [("id", id)]
+form id xs = Tag "form" [("id", id)] xs
field :: String -> [(String,String)] -> [XML] -> XML
field name attrs = Tag "field" ([("name",name)]++attrs)
@@ -170,6 +208,20 @@ var :: String -> Maybe String -> XML
var name expr = Tag "var" ([("name",name)]++e) []
where e = maybe [] ((:[]) . (,) "expr") expr
+script :: String -> XML
+script s = Tag "script" [] [CData s]
+
+scriptURI :: String -> XML
+scriptURI uri = Tag "script" [("uri", uri)] []
+
+--
+-- * ECMAScript stuff
+--
+
+string :: String -> String
+string s = "'" ++ concatMap esc s ++ "'"
+ where esc '\'' = "\\'"
+ esc c = [c]
--
-- * List stuff