1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 /** 6 * @fileoverview Classes for custom functions for the speech rule engine. 7 * 8 */ 9 10 goog.provide('cvox.SpeechRuleFunctions'); 11 goog.provide('cvox.SpeechRuleFunctions.ContextFunctions'); 12 goog.provide('cvox.SpeechRuleFunctions.CustomQueries'); 13 goog.provide('cvox.SpeechRuleFunctions.CustomStrings'); 14 15 16 17 /** 18 * @constructor 19 */ 20 cvox.SpeechRuleFunctions = function() { }; 21 22 23 /** 24 * Private superclass of all the custom function stores. 25 * @constructor 26 * @param {string} prefix A prefix string for the function names. 27 * @param {Object.<string, Function>} store Storage object. 28 * @private 29 */ 30 cvox.SpeechRuleFunctions.Store_ = function(prefix, store) { 31 /** @private */ 32 this.prefix_ = prefix; 33 /** @private */ 34 this.store_ = store; 35 }; 36 37 38 /** 39 * Adds a new function for the function store. 40 * @param {string} name A name. 41 * @param {!Function} func A function. 42 */ 43 cvox.SpeechRuleFunctions.Store_.prototype.add = function(name, func) { 44 if (this.checkCustomFunctionSyntax_(name)) { 45 this.store_[name] = func; 46 } 47 }; 48 49 50 /** 51 * Retrieves a function with the given name if one exists. 52 * @param {string} name A name. 53 * @return {Function} The function if it exists. 54 */ 55 cvox.SpeechRuleFunctions.Store_.prototype.lookup = function(name) { 56 return this.store_[name]; 57 }; 58 59 60 /** 61 * Context function for use in speech rules. 62 * @typedef {function(!Node): Array.<Node>} 63 */ 64 cvox.SpeechRuleFunctions.CustomQuery; 65 66 67 /** 68 * @constructor 69 * @extends {cvox.SpeechRuleFunctions.Store_} 70 */ 71 cvox.SpeechRuleFunctions.CustomQueries = function() { 72 var store = 73 /** @type {Object.<string, cvox.SpeechRuleFunctions.CustomQuery>} */ ({}); 74 goog.base(this, 'CQF', store); 75 }; 76 goog.inherits(cvox.SpeechRuleFunctions.CustomQueries, 77 cvox.SpeechRuleFunctions.Store_); 78 79 80 /** 81 * Context function for use in speech rules. 82 * @typedef {function(!Node): string} 83 */ 84 cvox.SpeechRuleFunctions.CustomString; 85 86 87 /** 88 * @constructor 89 * @extends {cvox.SpeechRuleFunctions.Store_} 90 */ 91 cvox.SpeechRuleFunctions.CustomStrings = function() { 92 var store = 93 /** @type {Object.<string, cvox.SpeechRuleFunctions.CustomString>} */ ({}); 94 goog.base(this, 'CSF', store); 95 }; 96 goog.inherits(cvox.SpeechRuleFunctions.CustomStrings, 97 cvox.SpeechRuleFunctions.Store_); 98 99 100 /** 101 * Context function for use in speech rules. 102 * @typedef {function(Array.<Node>, ?string): (function(): string)} 103 */ 104 cvox.SpeechRuleFunctions.ContextFunction; 105 106 107 /** 108 * @constructor 109 * @extends {cvox.SpeechRuleFunctions.Store_} 110 */ 111 cvox.SpeechRuleFunctions.ContextFunctions = function() { 112 var store = 113 /** @type {Object.<string, cvox.SpeechRuleFunctions.ContextFunction>} */ 114 ({}); 115 goog.base(this, 'CTXF', store); 116 }; 117 goog.inherits(cvox.SpeechRuleFunctions.ContextFunctions, 118 cvox.SpeechRuleFunctions.Store_); 119 120 121 /** 122 * Checks validity for a custom function name. 123 * @param {string} name The name of the custom function. 124 * @return {!boolean} True if the name is valid. 125 * @private 126 */ 127 cvox.SpeechRuleFunctions.Store_.prototype. 128 checkCustomFunctionSyntax_ = function(name) { 129 var reg = new RegExp('^' + this.prefix_); 130 if (!name.match(reg)) { 131 console.log( 132 'FunctionError: Invalid function name. Expected prefix' + 133 this.prefix_); 134 return false; 135 } 136 return true; 137 }; 138