badeball/xpath-analyzer

View on GitHub
lib/parsers/path_expr.ts

Summary

Maintainability
C
7 hrs
Test Coverage
import XPathLexer from "xpath-lexer";

import { ExprParser, ExprNode } from "./expr";

import { StepNode } from "./step";

import { DESCENDANT_OR_SELF } from "../axis_specifier";

import { PATH, NODE_TYPE_TEST } from "../expr_type";

import { NODE } from "../node_type";

import * as FilterExpr from "./filter_expr";

import * as LocationPath from "./location_path";

import * as Step from "./step";

export interface PathNode {
  type: typeof PATH;
  filter: ExprNode;
  steps: StepNode[];
}

export function parse (rootParser: ExprParser, lexer: XPathLexer): ExprNode {
  if (FilterExpr.isValidOp(lexer)) {
    var filter = FilterExpr.parse(rootParser, lexer);

    if (!lexer.empty() && lexer.peak()[0] === "/") {
      var path: PathNode = {
        type: PATH,
        filter: filter,
        steps: []
      };

      while (!lexer.empty() && lexer.peak()[0] === "/") {
        if (lexer.next() === "//") {
          path.steps.push({
            axis: DESCENDANT_OR_SELF,
            test: {
              type: NODE_TYPE_TEST,
              name: NODE
            },
            predicates: []
          });
        }

        path.steps.push(Step.parse(rootParser, lexer));
      }

      return path;
    } else {
      return filter;
    }
  } else {
    return LocationPath.parse(rootParser, lexer);
  }
}