Automattic\WooCommerce\Vendor\Symfony\Component\CssSelector\XPath\Extension

FunctionExtension::translateNthChildpublicWC 1.0

Method of the class: FunctionExtension{}

No Hooks.

Returns

null. Nothing (null).

Usage

$FunctionExtension = new FunctionExtension();
$FunctionExtension->translateNthChild( $xpath, $function, $last, $addNameTest ): XPathExpr;
$xpath(XPathExpr) (required)
.
$function(FunctionNode) (required)
.
$last(true|false)
.
Default: false
$addNameTest(true|false)
.
Default: true

FunctionExtension::translateNthChild() code WC 10.5.0

public function translateNthChild(XPathExpr $xpath, FunctionNode $function, bool $last = false, bool $addNameTest = true): XPathExpr
{
    try {
        [$a, $b] = Parser::parseSeries($function->getArguments());
    } catch (SyntaxErrorException $e) {
        throw new ExpressionErrorException(sprintf('Invalid series: "%s".', implode('", "', $function->getArguments())), 0, $e);
    }

    $xpath->addStarPrefix();
    if ($addNameTest) {
        $xpath->addNameTest();
    }

    if (0 === $a) {
        return $xpath->addCondition('position() = '.($last ? 'last() - '.($b - 1) : $b));
    }

    if ($a < 0) {
        if ($b < 1) {
            return $xpath->addCondition('false()');
        }

        $sign = '<=';
    } else {
        $sign = '>=';
    }

    $expr = 'position()';

    if ($last) {
        $expr = 'last() - '.$expr;
        --$b;
    }

    if (0 !== $b) {
        $expr .= ' - '.$b;
    }

    $conditions = [sprintf('%s %s 0', $expr, $sign)];

    if (1 !== $a && -1 !== $a) {
        $conditions[] = sprintf('(%s) mod %d = 0', $expr, $a);
    }

    return $xpath->addCondition(implode(' and ', $conditions));

    // todo: handle an+b, odd, even
    // an+b means every-a, plus b, e.g., 2n+1 means odd
    // 0n+b means b
    // n+0 means a=1, i.e., all elements
    // an means every a elements, i.e., 2n means even
    // -n means -1n
    // -1n+6 means elements 6 and previous
}