speech-rule-engine
Version:
A standalone speech rule engine for XML structures, based on the original engine from ChromeVox.
163 lines • 5.3 kB
JavaScript
"use strict";
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;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.SemanticMeaningCollator = exports.SemanticNodeCollator = exports.SemanticDefault = void 0;
const SemanticAttr = __importStar(require("./semantic_attr.js"));
const semantic_ordering_js_1 = require("./semantic_ordering.js");
function key(symbol, font) {
return symbol.match(/^.+:.+$/) || !font ? symbol : symbol + ':' + font;
}
class SemanticDefault extends Map {
set(symbol, meaning) {
super.set(key(symbol, meaning.font), meaning);
return this;
}
setNode(node) {
this.set(node.textContent, node.meaning());
}
get(symbol, font = null) {
return super.get(key(symbol, font));
}
getNode(node) {
return this.get(node.textContent, node.font);
}
}
exports.SemanticDefault = SemanticDefault;
class SemanticCollator extends Map {
add(symbol, entry) {
const list = this.get(symbol);
if (list) {
list.push(entry);
}
else {
super.set(symbol, [entry]);
}
}
get(symbol, font = null) {
return super.get(key(symbol, font));
}
getNode(node) {
return this.get(node.textContent, node.font);
}
minimize() {
for (const [key, entry] of this) {
if (entry.length === 1) {
this.delete(key);
}
}
}
isMultiValued() {
for (const value of this.values()) {
if (value.length > 1) {
return true;
}
}
return false;
}
}
class SemanticNodeCollator extends SemanticCollator {
add(symbol, entry) {
super.add(key(symbol, entry.font), entry);
}
addNode(node) {
this.add(node.textContent, node);
}
toString() {
const outer = [];
for (const [key, nodes] of this) {
const length = Array(key.length + 3).join(' ');
const inner = nodes.map((node) => node.toString()).join('\n' + length);
outer.push(key + ': ' + inner);
}
return outer.join('\n');
}
collateMeaning() {
const collator = new SemanticMeaningCollator();
for (const [key, val] of this) {
collator.set(key, val.map((node) => node.meaning()));
}
return collator;
}
}
exports.SemanticNodeCollator = SemanticNodeCollator;
class SemanticMeaningCollator extends SemanticCollator {
add(symbol, entry) {
const list = this.get(symbol, entry.font);
if (!list ||
!list.find(function (x) {
return SemanticAttr.equal(x, entry);
})) {
super.add(key(symbol, entry.font), entry);
}
}
addNode(node) {
this.add(node.textContent, node.meaning());
}
toString() {
const outer = [];
for (const [key, nodes] of this) {
const length = Array(key.length + 3).join(' ');
const inner = nodes
.map((node) => `{type: ${node.type}, role: ${node.role}, font: ${node.font}}`)
.join('\n' + length);
outer.push(key + ': ' + inner);
}
return outer.join('\n');
}
reduce() {
for (const [key, val] of this) {
if (val.length !== 1) {
this.set(key, (0, semantic_ordering_js_1.reduce)(val));
}
}
}
default() {
const def = new SemanticDefault();
for (const [key, val] of this) {
if (val.length === 1) {
def.set(key, val[0]);
}
}
return def;
}
newDefault() {
const oldDefault = this.default();
this.reduce();
const newDefault = this.default();
return oldDefault.size !== newDefault.size ? newDefault : null;
}
}
exports.SemanticMeaningCollator = SemanticMeaningCollator;
//# sourceMappingURL=semantic_default.js.map