fontoxpath
Version:
A minimalistic XPath 3.1 engine in JavaScript
56 lines (47 loc) • 1.35 kB
JavaScript
import Selector from '../Selector';
import Sequence from '../dataTypes/Sequence';
import createNodeValue from '../dataTypes/createNodeValue';
import { DONE_TOKEN, ready } from '../util/iterators';
function createSiblingGenerator (domFacade, node) {
return {
next: () => {
node = node && domFacade.getPreviousSibling(node);
if (!node) {
return DONE_TOKEN;
}
return ready(createNodeValue(node));
}
};
}
/**
* @extends {Selector}
*/
class PrecedingSiblingAxis extends Selector {
/**
* @param {Selector} siblingSelector
*/
constructor (siblingSelector) {
super(siblingSelector.specificity, {
resultOrder: Selector.RESULT_ORDERINGS.REVERSE_SORTED,
subtree: false,
peer: true,
canBeStaticallyEvaluated: false
});
this._siblingSelector = siblingSelector;
}
/**
* @param {../DynamicContext} dynamicContext
* @return {Sequence}
*/
evaluate (dynamicContext) {
const contextItem = dynamicContext.contextItem;
if (contextItem === null) {
throw new Error('XPDY0002: context is absent, it needs to be present to use axes.');
}
const domFacade = dynamicContext.domFacade;
return new Sequence(createSiblingGenerator(domFacade, contextItem.value)).filter(item=> {
return this._siblingSelector.evaluateToBoolean(dynamicContext, item);
});
}
}
export default PrecedingSiblingAxis;