speech-rule-engine
Version:
A standalone speech rule engine for XML structures, based on the original engine from ChromeVox.
287 lines • 11.7 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.localePath = exports.file = exports.localeLoader = exports.version = void 0;
exports.setupEngine = setupEngine;
exports.engineSetup = engineSetup;
exports.resetEngine = resetEngine;
exports.engineReady = engineReady;
exports.toSpeech = toSpeech;
exports.toSemantic = toSemantic;
exports.toJson = toJson;
exports.toDescription = toDescription;
exports.toEnriched = toEnriched;
exports.number = number;
exports.ordinal = ordinal;
exports.numericOrdinal = numericOrdinal;
exports.vulgar = vulgar;
exports.processFile = processFile;
exports.walk = walk;
exports.move = move;
exports.exit = exit;
exports.toSpeechStructure = toSpeechStructure;
exports.workerSpeech = workerSpeech;
exports.workerNextRules = workerNextRules;
exports.workerNextStyle = workerNextStyle;
exports.workerLocalePreferences = workerLocalePreferences;
exports.workerRelevantPreferences = workerRelevantPreferences;
const engine_js_1 = require("./engine.js");
const engine_setup_js_1 = require("./engine_setup.js");
const EngineConst = __importStar(require("./engine_const.js"));
const FileUtil = __importStar(require("./file_util.js"));
const ProcessorFactory = __importStar(require("./processor_factory.js"));
const system_external_js_1 = require("./system_external.js");
const variables_js_1 = require("./variables.js");
const math_map_js_1 = require("../speech_rules/math_map.js");
const SpeechGeneratorUtil = __importStar(require("../speech_generator/speech_generator_util.js"));
const rebuild_stree_js_1 = require("../walker/rebuild_stree.js");
const DomUtil = __importStar(require("./dom_util.js"));
const clearspeak_preferences_js_1 = require("../speech_rules/clearspeak_preferences.js");
exports.version = variables_js_1.Variables.VERSION;
function setupEngine(feature) {
return __awaiter(this, void 0, void 0, function* () {
return (0, engine_setup_js_1.setupEngine)(feature);
});
}
function engineSetup() {
return (0, engine_setup_js_1.engineSetup)();
}
function resetEngine() {
return engine_js_1.Engine.getInstance().reset();
}
function engineReady() {
return __awaiter(this, void 0, void 0, function* () {
return setupEngine({}).then(() => engine_js_1.EnginePromise.getall());
});
}
exports.localeLoader = math_map_js_1.standardLoader;
function toSpeech(expr) {
return processString('speech', expr);
}
function toSemantic(expr) {
return processString('semantic', expr);
}
function toJson(expr) {
return processString('json', expr);
}
function toDescription(expr) {
return processString('description', expr);
}
function toEnriched(expr) {
return processString('enriched', expr);
}
function number(expr) {
return processString('number', expr);
}
function ordinal(expr) {
return processString('ordinal', expr);
}
function numericOrdinal(expr) {
return processString('numericOrdinal', expr);
}
function vulgar(expr) {
return processString('vulgar', expr);
}
function processString(processor, input) {
return ProcessorFactory.process(processor, input);
}
exports.file = {};
exports.file.toSpeech = function (input, opt_output) {
return processFile('speech', input, opt_output);
};
exports.file.toSemantic = function (input, opt_output) {
return processFile('semantic', input, opt_output);
};
exports.file.toJson = function (input, opt_output) {
return processFile('json', input, opt_output);
};
exports.file.toDescription = function (input, opt_output) {
return processFile('description', input, opt_output);
};
exports.file.toEnriched = function (input, opt_output) {
return processFile('enriched', input, opt_output);
};
function processFile(processor, input, opt_output) {
switch (engine_js_1.Engine.getInstance().mode) {
case EngineConst.Mode.ASYNC:
return processFileAsync(processor, input, opt_output);
case EngineConst.Mode.SYNC:
return processFileSync(processor, input, opt_output);
default:
throw new engine_js_1.SREError(`Can process files in ${engine_js_1.Engine.getInstance().mode} mode`);
}
}
function processFileSync(processor, input, opt_output) {
const expr = inputFileSync_(input);
const result = ProcessorFactory.output(processor, expr);
if (opt_output) {
try {
system_external_js_1.SystemExternal.fs.writeFileSync(opt_output, result);
}
catch (_err) {
throw new engine_js_1.SREError('Can not write to file: ' + opt_output);
}
}
return result;
}
function inputFileSync_(file) {
let expr;
try {
expr = system_external_js_1.SystemExternal.fs.readFileSync(file, { encoding: 'utf8' });
}
catch (_err) {
throw new engine_js_1.SREError('Can not open file: ' + file);
}
return expr;
}
function processFileAsync(processor, file, output) {
return __awaiter(this, void 0, void 0, function* () {
const expr = yield system_external_js_1.SystemExternal.fs.promises.readFile(file, {
encoding: 'utf8'
});
const result = ProcessorFactory.output(processor, expr);
if (output) {
try {
system_external_js_1.SystemExternal.fs.promises.writeFile(output, result);
}
catch (_err) {
throw new engine_js_1.SREError('Can not write to file: ' + output);
}
}
return result;
});
}
function walk(expr) {
return ProcessorFactory.output('walker', expr);
}
function move(direction) {
return ProcessorFactory.keypress('move', direction);
}
function exit(opt_value) {
const value = opt_value || 0;
engine_js_1.EnginePromise.getall().then(() => process.exit(value));
}
function toSpeechStructure(expr) {
return processString('speechStructure', expr);
}
const locale_js_1 = require("../l10n/locale.js");
function workerSpeech(expr, options) {
return __awaiter(this, void 0, void 0, function* () {
const mml = DomUtil.parseInput(expr);
const rebuilt = new rebuild_stree_js_1.RebuildStree(mml);
const styles = SpeechGeneratorUtil.toStyles(options);
options.domain2style = SpeechGeneratorUtil.fromStyles(styles);
return assembleWorkerStructure(mml, rebuilt.stree.xml(), options);
});
}
function workerNextRules(expr, options) {
return __awaiter(this, void 0, void 0, function* () {
const mml = DomUtil.parseInput(expr);
const rebuilt = new rebuild_stree_js_1.RebuildStree(mml);
const styles = SpeechGeneratorUtil.toStyles(options);
options = SpeechGeneratorUtil.nextRules(options, styles);
options.domain2style = SpeechGeneratorUtil.fromStyles(styles);
return assembleWorkerStructure(mml, rebuilt.stree.xml(), options);
});
}
function workerNextStyle(expr, options, id) {
return __awaiter(this, void 0, void 0, function* () {
const mml = DomUtil.parseInput(expr);
const rebuilt = new rebuild_stree_js_1.RebuildStree(mml);
const styles = SpeechGeneratorUtil.toStyles(options);
options.style = SpeechGeneratorUtil.nextStyle(rebuilt.nodeDict[id], options);
styles[options.domain] = options.style;
options.domain2style = SpeechGeneratorUtil.fromStyles(styles);
return assembleWorkerStructure(mml, rebuilt.stree.xml(), options);
});
}
function workerLocalePreferences(options) {
return __awaiter(this, void 0, void 0, function* () {
return clearspeak_preferences_js_1.ClearspeakPreferences.getLocalePreferences()[options.locale];
});
}
function workerRelevantPreferences(expr, id) {
return __awaiter(this, void 0, void 0, function* () {
var _a;
const mml = DomUtil.parseInput(expr);
const rebuilt = new rebuild_stree_js_1.RebuildStree(mml);
const query = (_a = rebuilt.stree.root.querySelectorAll((x) => x.id.toString() === id)[0]) !== null && _a !== void 0 ? _a : rebuilt.stree.root;
return clearspeak_preferences_js_1.ClearspeakPreferences.relevantPreferences(query);
});
}
function assembleWorkerStructure(mml, sxml, options) {
return __awaiter(this, void 0, void 0, function* () {
var _a;
yield setupEngine(options);
engine_js_1.Engine.getInstance().options.automark = true;
const json = {};
json.options = options;
json.mactions = SpeechGeneratorUtil.connectMactionSelections(mml, sxml);
json.speech = SpeechGeneratorUtil.computeSpeechStructure(sxml);
const root = (_a = sxml.childNodes[0]) === null || _a === void 0 ? void 0 : _a.getAttribute('id');
json.label = json.speech[root]['speech-none'];
json.ssml = json.speech[root]['speech-ssml'];
json.translations = Object.assign({}, locale_js_1.LOCALE.MESSAGES.navigate);
if (options.braille === 'none') {
return json;
}
yield setupEngine({
modality: 'braille',
locale: options.braille,
domain: 'default',
style: 'default'
});
json.braille = SpeechGeneratorUtil.computeBrailleStructure(sxml);
json.braillelabel = json.braille[root]['braille-none'];
return json;
});
}
exports.localePath = FileUtil.localePath;
if (system_external_js_1.SystemExternal.documentSupported || system_external_js_1.SystemExternal.webworker) {
setupEngine({ mode: EngineConst.Mode.HTTP }).then(() => setupEngine({}));
}
else {
setupEngine({ mode: EngineConst.Mode.SYNC }).then(() => setupEngine({ mode: EngineConst.Mode.ASYNC }));
}
//# sourceMappingURL=system.js.map