speech-rule-engine
Version:
A standalone speech rule engine for XML structures, based on the original engine from ChromeVox.
191 lines • 7.54 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.loadLocale = loadLocale;
exports.standardLoader = standardLoader;
const engine_js_1 = require("../common/engine.js");
const EngineConst = __importStar(require("../common/engine_const.js"));
const FileUtil = __importStar(require("../common/file_util.js"));
const system_external_js_1 = require("../common/system_external.js");
const dynamic_cstr_js_1 = require("../rule_engine/dynamic_cstr.js");
const MathCompoundStore = __importStar(require("../rule_engine/math_compound_store.js"));
const speech_rule_engine_js_1 = require("../rule_engine/speech_rule_engine.js");
const l10n_js_1 = require("../l10n/l10n.js");
const AlphabetGenerator = __importStar(require("./alphabet_generator.js"));
const addSymbols = {
functions: MathCompoundStore.addFunctionRules,
symbols: MathCompoundStore.addSymbolRules,
units: MathCompoundStore.addUnitRules,
si: (x) => x.forEach(MathCompoundStore.setSiPrefixes),
messages: l10n_js_1.completeLocale,
rules: speech_rule_engine_js_1.SpeechRuleEngine.addStore,
characters: MathCompoundStore.addCharacterRules
};
let _init = false;
function loadLocale() {
return __awaiter(this, arguments, void 0, function* (locale = engine_js_1.Engine.getInstance().options.locale) {
if (!_init) {
AlphabetGenerator.generateBase();
_loadLocale(dynamic_cstr_js_1.DynamicCstr.BASE_LOCALE);
_init = true;
}
return engine_js_1.EnginePromise.promises[dynamic_cstr_js_1.DynamicCstr.BASE_LOCALE].then(() => __awaiter(this, void 0, void 0, function* () {
const defLoc = engine_js_1.Engine.getInstance().defaultLocale;
if (defLoc) {
_loadLocale(defLoc);
return engine_js_1.EnginePromise.promises[defLoc].then(() => __awaiter(this, void 0, void 0, function* () {
_loadLocale(locale);
return engine_js_1.EnginePromise.promises[locale];
}));
}
_loadLocale(locale);
return engine_js_1.EnginePromise.promises[locale];
}));
});
}
function _loadLocale(locale = engine_js_1.Engine.getInstance().options.locale) {
if (!engine_js_1.EnginePromise.loaded[locale]) {
engine_js_1.EnginePromise.loaded[locale] = [false, false];
MathCompoundStore.reset();
retrieveMaps(locale);
}
}
function loadMethod() {
if (engine_js_1.Engine.getInstance().customLoader) {
return engine_js_1.Engine.getInstance().customLoader;
}
return standardLoader();
}
function standardLoader() {
switch (engine_js_1.Engine.getInstance().mode) {
case EngineConst.Mode.ASYNC:
return loadFile;
case EngineConst.Mode.HTTP:
return loadAjax;
case EngineConst.Mode.SYNC:
default:
return loadFileSync;
}
}
function retrieveMaps(locale) {
const loader = loadMethod();
const promise = new Promise((res) => {
const inner = loader(locale);
inner.then((str) => {
parseMaps(str);
engine_js_1.EnginePromise.loaded[locale] = [true, true];
res(locale);
}, (_err) => {
engine_js_1.EnginePromise.loaded[locale] = [true, false];
console.error(`Unable to load locale: ${locale}`);
engine_js_1.Engine.getInstance().options.locale = engine_js_1.Engine.getInstance().defaultLocale;
res(locale);
});
});
engine_js_1.EnginePromise.promises[locale] = promise;
}
function parseMaps(json) {
const js = typeof json === 'string'
? JSON.parse(json)
: json;
addMaps(js);
}
function addMaps(json, opt_locale) {
let generate = true;
for (let i = 0, key; (key = Object.keys(json)[i]); i++) {
const info = key.split('/');
if (opt_locale && opt_locale !== info[0]) {
continue;
}
if (generate && info[1] === 'symbols' && info[0] !== 'base') {
AlphabetGenerator.generate(info[0]);
generate = false;
}
addSymbols[info[1]](json[key]);
}
}
function loadFile(locale) {
const file = FileUtil.localePath(locale);
return new Promise((res, rej) => {
system_external_js_1.SystemExternal.fs.readFile(file, 'utf8', (err, json) => {
if (err) {
return rej(err);
}
res(json);
});
});
}
function loadFileSync(locale) {
const file = FileUtil.localePath(locale);
return new Promise((res, rej) => {
let str = '{}';
try {
str = system_external_js_1.SystemExternal.fs.readFileSync(file, 'utf8');
}
catch (err) {
return rej(err);
}
res(str);
});
}
function loadAjax(locale) {
const file = FileUtil.localePath(locale);
const httpRequest = new XMLHttpRequest();
return new Promise((res, rej) => {
httpRequest.onreadystatechange = function () {
if (httpRequest.readyState === 4) {
const status = httpRequest.status;
if (status === 0 || (status >= 200 && status < 400)) {
res(httpRequest.responseText);
}
else {
rej(status);
}
}
};
httpRequest.open('GET', file, true);
httpRequest.send();
});
}
//# sourceMappingURL=math_map.js.map