Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. Parser.php

function Parser::parseJSXElement

Parses a jsx element

Return value

\Peast\Syntax\Node\JSX\JSXElement|null

2 calls to Parser::parseJSXElement()
Parser::parseJSXAttribute in vendor/mck89/peast/lib/Peast/Syntax/JSX/Parser.php
Parses a jsx spread attribute
Parser::parseJSXChild in vendor/mck89/peast/lib/Peast/Syntax/JSX/Parser.php
Parses a jsx child

File

vendor/mck89/peast/lib/Peast/Syntax/JSX/Parser.php, line 160

Class

Parser
JSX parser trait

Namespace

Peast\Syntax\JSX

Code

protected function parseJSXElement() {
    $startOpeningToken = $this->scanner
        ->getToken();
    if (!$startOpeningToken || $startOpeningToken->value !== "<") {
        return null;
    }
    $nextToken = $this->scanner
        ->getNextToken();
    if ($nextToken && $nextToken->value === "/") {
        return null;
    }
    $this->scanner
        ->consumeToken();
    if (!($name = $this->parseJSXIdentifierOrMemberExpression())) {
        $this->error();
    }
    $attributes = $this->parseJSXAttributes();
    $selfClosing = $this->scanner
        ->consume("/");
    $endOpeningToken = $this->scanner
        ->reconsumeCurrentTokenInJSXMode();
    if (!$endOpeningToken || $endOpeningToken->value !== ">") {
        $this->error();
    }
    $this->scanner
        ->consumeToken();
    if (!$selfClosing) {
        $children = $this->parseJSXChildren();
        if (($startClosingToken = $this->scanner
            ->consume("<")) && $this->scanner
            ->consume("/") && ($closingName = $this->parseJSXIdentifierOrMemberExpression()) && ($endClosingToken = $this->scanner
            ->reconsumeCurrentTokenInJSXMode()) && $endClosingToken->value === ">") {
            $this->scanner
                ->consumeToken();
            if (!$this->isSameJSXElementName($name, $closingName)) {
                $this->error("Closing tag does not match opening tag");
            }
        }
        else {
            $this->error();
        }
    }
    
    //Opening tag
    $openingNode = $this->createJSXNode("JSXOpeningElement", $startOpeningToken);
    $openingNode->setName($name);
    $openingNode->setSelfClosing($selfClosing);
    if ($attributes) {
        $openingNode->setAttributes($attributes);
    }
    $this->completeNode($openingNode, $endOpeningToken->location->end);
    
    //Closing tag
    $closingNode = null;
    if (!$selfClosing) {
        $closingNode = $this->createJSXNode("JSXClosingElement", $startClosingToken);
        $closingNode->setName($closingName);
        $this->completeNode($closingNode);
    }
    
    //Element
    $node = $this->createJSXNode("JSXElement", $startOpeningToken);
    $node->setOpeningElement($openingNode);
    if ($closingNode) {
        $node->setClosingElement($closingNode);
        if ($children) {
            $node->setChildren($children);
        }
    }
    return $this->completeNode($node);
}

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal