xpath_util.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.xpath = void 0;
  4. exports.resolveNameSpace = resolveNameSpace;
  5. exports.evalXPath = evalXPath;
  6. exports.evaluateBoolean = evaluateBoolean;
  7. exports.evaluateString = evaluateString;
  8. exports.updateEvaluator = updateEvaluator;
  9. const engine_js_1 = require("./engine.js");
  10. const EngineConst = require("../common/engine_const.js");
  11. const system_external_js_1 = require("./system_external.js");
  12. function xpathSupported() {
  13. if (typeof XPathResult === 'undefined') {
  14. return false;
  15. }
  16. return true;
  17. }
  18. exports.xpath = {
  19. currentDocument: null,
  20. evaluate: xpathSupported()
  21. ? document.evaluate
  22. : system_external_js_1.SystemExternal.xpath.evaluate,
  23. result: xpathSupported() ? XPathResult : system_external_js_1.SystemExternal.xpath.XPathResult,
  24. createNSResolver: xpathSupported()
  25. ? document.createNSResolver
  26. : system_external_js_1.SystemExternal.xpath.createNSResolver
  27. };
  28. const nameSpaces = {
  29. xhtml: 'http://www.w3.org/1999/xhtml',
  30. mathml: 'http://www.w3.org/1998/Math/MathML',
  31. mml: 'http://www.w3.org/1998/Math/MathML',
  32. svg: 'http://www.w3.org/2000/svg'
  33. };
  34. function resolveNameSpace(prefix) {
  35. return nameSpaces[prefix] || null;
  36. }
  37. class Resolver {
  38. constructor() {
  39. this.lookupNamespaceURI = resolveNameSpace;
  40. }
  41. }
  42. function evaluateXpath(expression, rootNode, type) {
  43. return engine_js_1.Engine.getInstance().mode === EngineConst.Mode.HTTP &&
  44. !engine_js_1.Engine.getInstance().isIE &&
  45. !engine_js_1.Engine.getInstance().isEdge
  46. ? exports.xpath.currentDocument.evaluate(expression, rootNode, resolveNameSpace, type, null)
  47. : exports.xpath.evaluate(expression, rootNode, new Resolver(), type, null);
  48. }
  49. function evalXPath(expression, rootNode) {
  50. let iterator;
  51. try {
  52. iterator = evaluateXpath(expression, rootNode, exports.xpath.result.ORDERED_NODE_ITERATOR_TYPE);
  53. }
  54. catch (_err) {
  55. return [];
  56. }
  57. const results = [];
  58. for (let xpathNode = iterator.iterateNext(); xpathNode; xpathNode = iterator.iterateNext()) {
  59. results.push(xpathNode);
  60. }
  61. return results;
  62. }
  63. function evaluateBoolean(expression, rootNode) {
  64. let result;
  65. try {
  66. result = evaluateXpath(expression, rootNode, exports.xpath.result.BOOLEAN_TYPE);
  67. }
  68. catch (_err) {
  69. return false;
  70. }
  71. return result.booleanValue;
  72. }
  73. function evaluateString(expression, rootNode) {
  74. let result;
  75. try {
  76. result = evaluateXpath(expression, rootNode, exports.xpath.result.STRING_TYPE);
  77. }
  78. catch (_err) {
  79. return '';
  80. }
  81. return result.stringValue;
  82. }
  83. function updateEvaluator(node) {
  84. if (engine_js_1.Engine.getInstance().mode !== EngineConst.Mode.HTTP)
  85. return;
  86. let parent = node;
  87. while (parent && !parent.evaluate) {
  88. parent = parent.parentNode;
  89. }
  90. if (parent && parent.evaluate) {
  91. exports.xpath.currentDocument = parent;
  92. }
  93. else if (node.ownerDocument) {
  94. exports.xpath.currentDocument = node.ownerDocument;
  95. }
  96. }