speech_rule_context.js 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.SpeechRuleContext = void 0;
  4. const span_js_1 = require("../audio/span.js");
  5. const XpathUtil = require("../common/xpath_util.js");
  6. const srf = require("./speech_rule_functions.js");
  7. class SpeechRuleContext {
  8. constructor() {
  9. this.customQueries = new srf.CustomQueries();
  10. this.customStrings = new srf.CustomStrings();
  11. this.contextFunctions = new srf.ContextFunctions();
  12. this.customGenerators = new srf.CustomGenerators();
  13. }
  14. applyCustomQuery(node, funcName) {
  15. const func = this.customQueries.lookup(funcName);
  16. return func ? func(node) : null;
  17. }
  18. applySelector(node, expr) {
  19. const result = this.applyCustomQuery(node, expr);
  20. return result || XpathUtil.evalXPath(expr, node);
  21. }
  22. applyQuery(node, expr) {
  23. const results = this.applySelector(node, expr);
  24. if (results.length > 0) {
  25. return results[0];
  26. }
  27. return null;
  28. }
  29. applyConstraint(node, expr) {
  30. const result = this.applyQuery(node, expr);
  31. return !!result || XpathUtil.evaluateBoolean(expr, node);
  32. }
  33. constructString(node, expr) {
  34. const result = this.constructString_(node, expr);
  35. return Array.isArray(result)
  36. ? result.map((x) => x.speech).join('')
  37. : result;
  38. }
  39. constructSpan(node, expr, def) {
  40. const result = this.constructString_(node, expr);
  41. if (Array.isArray(result)) {
  42. const last = result[result.length - 1];
  43. last.attributes = Object.assign({}, def, last.attributes);
  44. return result;
  45. }
  46. else {
  47. return [span_js_1.Span.node(result, node, def)];
  48. }
  49. }
  50. constructString_(node, expr) {
  51. if (!expr) {
  52. return '';
  53. }
  54. if (expr.charAt(0) === '"') {
  55. return expr.slice(1, -1);
  56. }
  57. const func = this.customStrings.lookup(expr);
  58. if (func) {
  59. return func(node);
  60. }
  61. return XpathUtil.evaluateString(expr, node);
  62. }
  63. parse(functions) {
  64. const functs = Array.isArray(functions)
  65. ? functions
  66. : Object.entries(functions);
  67. for (const func of functs) {
  68. const kind = func[0].slice(0, 3);
  69. switch (kind) {
  70. case 'CQF':
  71. this.customQueries.add(func[0], func[1]);
  72. break;
  73. case 'CSF':
  74. this.customStrings.add(func[0], func[1]);
  75. break;
  76. case 'CTF':
  77. this.contextFunctions.add(func[0], func[1]);
  78. break;
  79. case 'CGF':
  80. this.customGenerators.add(func[0], func[1]);
  81. break;
  82. default:
  83. console.error('FunctionError: Invalid function name ' + func[0]);
  84. }
  85. }
  86. }
  87. }
  88. exports.SpeechRuleContext = SpeechRuleContext;