semantic_walker.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.SemanticWalker = void 0;
  4. const semantic_meaning_js_1 = require("../semantic_tree/semantic_meaning.js");
  5. const abstract_walker_js_1 = require("./abstract_walker.js");
  6. const levels_js_1 = require("./levels.js");
  7. class SemanticWalker extends abstract_walker_js_1.AbstractWalker {
  8. constructor(node, generator, highlighter, xml) {
  9. super(node, generator, highlighter, xml);
  10. this.node = node;
  11. this.generator = generator;
  12. this.highlighter = highlighter;
  13. this.levels = null;
  14. this.restoreState();
  15. }
  16. initLevels() {
  17. const levels = new levels_js_1.Levels();
  18. levels.push([this.getFocus()]);
  19. return levels;
  20. }
  21. up() {
  22. super.up();
  23. const parent = this.previousLevel();
  24. if (!parent) {
  25. return null;
  26. }
  27. this.levels.pop();
  28. const found = this.levels.find(function (focus) {
  29. return focus.getSemanticNodes().some(function (node) {
  30. return node.id.toString() === parent;
  31. });
  32. });
  33. return found;
  34. }
  35. down() {
  36. super.down();
  37. const children = this.nextLevel();
  38. if (children.length === 0) {
  39. return null;
  40. }
  41. this.levels.push(children);
  42. return children[0];
  43. }
  44. combineContentChildren(type, role, content, children) {
  45. switch (type) {
  46. case semantic_meaning_js_1.SemanticType.RELSEQ:
  47. case semantic_meaning_js_1.SemanticType.INFIXOP:
  48. case semantic_meaning_js_1.SemanticType.MULTIREL:
  49. return this.makePairList(children, content);
  50. case semantic_meaning_js_1.SemanticType.PREFIXOP:
  51. return [this.focusFromId(children[0], content.concat(children))];
  52. case semantic_meaning_js_1.SemanticType.POSTFIXOP:
  53. return [this.focusFromId(children[0], children.concat(content))];
  54. case semantic_meaning_js_1.SemanticType.MATRIX:
  55. case semantic_meaning_js_1.SemanticType.VECTOR:
  56. case semantic_meaning_js_1.SemanticType.FENCED:
  57. return [
  58. this.focusFromId(children[0], [content[0], children[0], content[1]])
  59. ];
  60. case semantic_meaning_js_1.SemanticType.CASES:
  61. return [this.focusFromId(children[0], [content[0], children[0]])];
  62. case semantic_meaning_js_1.SemanticType.PUNCTUATED:
  63. if (role === semantic_meaning_js_1.SemanticRole.TEXT) {
  64. return children.map(this.singletonFocus.bind(this));
  65. }
  66. if (children.length === content.length) {
  67. return content.map(this.singletonFocus.bind(this));
  68. }
  69. return this.combinePunctuations(children, content, [], []);
  70. case semantic_meaning_js_1.SemanticType.APPL:
  71. return [
  72. this.focusFromId(children[0], [children[0], content[0]]),
  73. this.singletonFocus(children[1])
  74. ];
  75. case semantic_meaning_js_1.SemanticType.ROOT:
  76. return [
  77. this.singletonFocus(children[0]),
  78. this.singletonFocus(children[1])
  79. ];
  80. default:
  81. return children.map(this.singletonFocus.bind(this));
  82. }
  83. }
  84. combinePunctuations(children, content, prepunct, acc) {
  85. if (children.length === 0) {
  86. return acc;
  87. }
  88. const child = children.shift();
  89. const cont = content.shift();
  90. if (child === cont) {
  91. prepunct.push(cont);
  92. return this.combinePunctuations(children, content, prepunct, acc);
  93. }
  94. else {
  95. content.unshift(cont);
  96. prepunct.push(child);
  97. if (children.length === content.length) {
  98. acc.push(this.focusFromId(child, prepunct.concat(content)));
  99. return acc;
  100. }
  101. else {
  102. acc.push(this.focusFromId(child, prepunct));
  103. return this.combinePunctuations(children, content, [], acc);
  104. }
  105. }
  106. }
  107. makePairList(children, content) {
  108. if (children.length === 0) {
  109. return [];
  110. }
  111. if (children.length === 1) {
  112. return [this.singletonFocus(children[0])];
  113. }
  114. const result = [this.singletonFocus(children.shift())];
  115. for (let i = 0, l = children.length; i < l; i++) {
  116. result.push(this.focusFromId(children[i], [content[i], children[i]]));
  117. }
  118. return result;
  119. }
  120. left() {
  121. super.left();
  122. const index = this.levels.indexOf(this.getFocus());
  123. if (index === null) {
  124. return null;
  125. }
  126. const ids = this.levels.get(index - 1);
  127. return ids ? ids : null;
  128. }
  129. right() {
  130. super.right();
  131. const index = this.levels.indexOf(this.getFocus());
  132. if (index === null) {
  133. return null;
  134. }
  135. const ids = this.levels.get(index + 1);
  136. return ids ? ids : null;
  137. }
  138. findFocusOnLevel(id) {
  139. const focus = this.levels.find((x) => {
  140. const pid = x.getSemanticPrimary().id;
  141. return pid === id;
  142. });
  143. return focus;
  144. }
  145. }
  146. exports.SemanticWalker = SemanticWalker;