focus.js 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import * as WalkerUtil from './walker_util.js';
  2. export class Focus {
  3. static factory(primaryId, nodeIds, rebuilt, dom) {
  4. const idFunc = (id) => WalkerUtil.getBySemanticId(dom, id);
  5. const dict = rebuilt.nodeDict;
  6. const node = idFunc(primaryId);
  7. const nodes = nodeIds.map(idFunc);
  8. const snodes = nodeIds.map(function (primaryId) {
  9. return dict[primaryId];
  10. });
  11. const focus = new Focus(snodes, dict[primaryId]);
  12. focus.domNodes = nodes;
  13. focus.domPrimary_ = node;
  14. focus.allNodes = Focus.generateAllVisibleNodes_(nodeIds, nodes, dict, dom);
  15. return focus;
  16. }
  17. static generateAllVisibleNodes_(ids, nodes, dict, domNode) {
  18. let result = [];
  19. for (let i = 0, l = ids.length; i < l; i++) {
  20. if (nodes[i]) {
  21. const allNodes = Focus.getAllVisibleNodes([ids[i]], domNode);
  22. if (allNodes.length) {
  23. result = result.concat(allNodes);
  24. }
  25. else {
  26. result.push(nodes[i]);
  27. }
  28. continue;
  29. }
  30. const virtual = dict[ids[i]];
  31. if (!virtual) {
  32. continue;
  33. }
  34. const childIds = virtual.childNodes.map((x) => x.id.toString());
  35. const children = Focus.getAllVisibleNodes(childIds, domNode);
  36. result = result.concat(Focus.generateAllVisibleNodes_(childIds, children, dict, domNode));
  37. }
  38. return result;
  39. }
  40. static getAllVisibleNodes(ids, domNode) {
  41. let result = [];
  42. for (const id of ids) {
  43. result = result.concat(WalkerUtil.getAllBySemanticId(domNode, id));
  44. }
  45. return result;
  46. }
  47. constructor(nodes, primary) {
  48. this.nodes = nodes;
  49. this.primary = primary;
  50. this.domNodes = [];
  51. this.domPrimary_ = null;
  52. this.allNodes = [];
  53. }
  54. getSemanticPrimary() {
  55. return this.primary;
  56. }
  57. getSemanticNodes() {
  58. return this.nodes;
  59. }
  60. getNodes() {
  61. return this.allNodes;
  62. }
  63. getDomNodes() {
  64. return this.domNodes;
  65. }
  66. getDomPrimary() {
  67. return this.domPrimary_;
  68. }
  69. toString() {
  70. return 'Primary:' + this.domPrimary_ + ' Nodes:' + this.domNodes;
  71. }
  72. clone() {
  73. const focus = new Focus(this.nodes, this.primary);
  74. focus.domNodes = this.domNodes;
  75. focus.domPrimary_ = this.domPrimary_;
  76. focus.allNodes = this.allNodes;
  77. return focus;
  78. }
  79. }