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

Breadcrumb

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

function Scanner::skipWhitespacesAndComments

Skips whitespaces and comments from the current scan position. If comments handling is enabled, the array of parsed comments

Return value

array

1 call to Scanner::skipWhitespacesAndComments()
Scanner::getToken in vendor/mck89/peast/lib/Peast/Syntax/Scanner.php
Returns the current token

File

vendor/mck89/peast/lib/Peast/Syntax/Scanner.php, line 1110

Class

Scanner
Base class for scanners.

Namespace

Peast\Syntax

Code

protected function skipWhitespacesAndComments() {
    $comments = [];
    $content = "";
    $secStartIdx = $this->index;
    while (($char = $this->charAt()) !== null) {
        
        //Whitespace
        if (in_array($char, $this->whitespaces)) {
            $content .= $char;
            $this->index++;
        }
        elseif ($char === "/" || $char === "#") {
            $nextChar = $this->charAt($this->index + 1);
            if ($char === "#") {
                
                //Hashbang comment. This will be parsed only if hashbang comments are enabled
                
                //and if it appears at the beginning of the code
                $valid = $nextChar === "!" && $this->features->hashbangComments && !$this->index;
            }
            else {
                $valid = $nextChar === "/" || $nextChar === "*";
            }
            
            //Comment
            if ($valid) {
                
                //If comments must be handled, empty the current content too
                
                //and get the comment start position
                if ($this->comments) {
                    if ($content !== "") {
                        $this->adjustColumnAndLine($content);
                        $content = "";
                    }
                    $start = $this->getPosition(true);
                }
                $inline = $nextChar !== "*";
                $this->index += 2;
                $content .= $char . $nextChar;
                while (true) {
                    $char = $this->charAt();
                    if ($char === null) {
                        if (!$inline) {
                            
                            //If the end of the source has been reached and
                            
                            //a multiline comment is still open, it's an
                            
                            //error
                            $this->error("Unterminated comment");
                        }
                        $isEnd = true;
                    }
                    else {
                        $content .= $char;
                        $this->index++;
                        $isEnd = $inline ? in_array($char, $this->lineTerminators) : $char === "*" && $this->charAt() === "/";
                    }
                    if ($isEnd) {
                        if (!$inline) {
                            $content .= "/";
                            $this->index++;
                        }
                        if ($this->comments) {
                            
                            //For inline comments the closing line
                            
                            //terminator must be excluded from comment text
                            if ($inline && $char !== null) {
                                $this->index--;
                                $content = substr($content, 0, -strlen($char));
                            }
                            $this->adjustColumnAndLine($content);
                            $token = new Token(Token::TYPE_COMMENT, $content);
                            $token->location->start = $start;
                            $token->location->end = $this->getPosition(true);
                            $comments[] = $token;
                            
                            //For inline comments the new content contains
                            
                            //the closing line terminator since the char has
                            
                            //already been processed
                            $content = "";
                            if ($inline && $char !== null) {
                                $content = $char;
                                $this->index++;
                            }
                        }
                        break;
                    }
                }
            }
            else {
                break;
            }
        }
        elseif (!$this->isModule && $char === "<" && $this->charAt($this->index + 1) === "!" && $this->charAt($this->index + 2) === "-" && $this->charAt($this->index + 3) === "-") {
            
            //If comments must be handled, empty the current content too
            
            //and get the comment start position
            if ($this->comments) {
                if ($content !== "") {
                    $this->adjustColumnAndLine($content);
                    $content = "";
                }
                $start = $this->getPosition(true);
            }
            
            //Open html comment
            $this->index += 4;
            $content .= "<!--";
            while (true) {
                $char = $this->charAt();
                if ($char === null) {
                    $isEnd = true;
                }
                else {
                    $content .= $char;
                    $this->index++;
                    $isEnd = in_array($char, $this->lineTerminators);
                }
                if ($isEnd) {
                    if ($this->comments) {
                        
                        //Remove the closing line terminator from the
                        
                        //comment text
                        if ($char !== null) {
                            $this->index--;
                            $content = substr($content, 0, -strlen($char));
                        }
                        $this->adjustColumnAndLine($content);
                        $token = new Token(Token::TYPE_COMMENT, $content);
                        $token->location->start = $start;
                        $token->location->end = $this->getPosition(true);
                        $comments[] = $token;
                        $content = "";
                        if ($char !== null) {
                            $content = $char;
                            $this->index++;
                        }
                    }
                    break;
                }
            }
        }
        elseif (!$this->isModule && $char === "-" && $this->charAt($this->index + 1) === "-" && $this->charAt($this->index + 2) === ">") {
            
            //Close html comment
            
            //Check if it is on it's own line
            $allow = false;
            if (!$secStartIdx) {
                $allow = true;
            }
            else {
                for ($index = $this->index - 1; $index >= $secStartIdx; $index--) {
                    if (in_array($this->charAt($index), $this->lineTerminators)) {
                        $allow = true;
                        break;
                    }
                }
            }
            if ($allow) {
                
                //If comments must be handled, empty the current content too
                
                //and get the comment start position
                if ($this->comments) {
                    if ($content !== "") {
                        $this->adjustColumnAndLine($content);
                        $content = "";
                    }
                    $start = $this->getPosition(true);
                }
                $this->index += 3;
                $content .= "-->";
                while (true) {
                    $char = $this->charAt();
                    if ($char === null) {
                        $isEnd = true;
                    }
                    else {
                        $content .= $char;
                        $this->index++;
                        $isEnd = in_array($char, $this->lineTerminators);
                    }
                    if ($isEnd) {
                        if ($this->comments) {
                            
                            //Remove the closing line terminator from the
                            
                            //comment text
                            if ($char !== null) {
                                $this->index--;
                                $content = substr($content, 0, -strlen($char));
                            }
                            $this->adjustColumnAndLine($content);
                            $token = new Token(Token::TYPE_COMMENT, $content);
                            $token->location->start = $start;
                            $token->location->end = $this->getPosition(true);
                            $comments[] = $token;
                            $content = "";
                            if ($char !== null) {
                                $content = $char;
                                $this->index++;
                            }
                        }
                        break;
                    }
                }
            }
            else {
                break;
            }
        }
        else {
            break;
        }
    }
    if ($content !== "") {
        $this->adjustColumnAndLine($content);
    }
    return $comments;
}

API Navigation

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