1*04fd306cSNickeau<?php 2*04fd306cSNickeau/** 3*04fd306cSNickeau* Abstract superclass for all scanner status implementations 4*04fd306cSNickeau* 5*04fd306cSNickeau* @license http://www.opensource.org/licenses/mit-license.php The MIT License 6*04fd306cSNickeau* @copyright Copyright 2010-2014 PhpCss Team 7*04fd306cSNickeau*/ 8*04fd306cSNickeaunamespace PhpCss\Scanner { 9*04fd306cSNickeau 10*04fd306cSNickeau /** 11*04fd306cSNickeau * Abstract superclass for all scanner status implementations 12*04fd306cSNickeau * 13*04fd306cSNickeau * It defines the API and provides basic logic to match patterns. 14*04fd306cSNickeau */ 15*04fd306cSNickeau abstract class Status { 16*04fd306cSNickeau 17*04fd306cSNickeau /** 18*04fd306cSNickeau * Try to get token in buffer at offset position. 19*04fd306cSNickeau * 20*04fd306cSNickeau * @param string $buffer 21*04fd306cSNickeau * @param integer $offset 22*04fd306cSNickeau * @return Token 23*04fd306cSNickeau */ 24*04fd306cSNickeau abstract public function getToken(string $buffer, int $offset): ?Token; 25*04fd306cSNickeau 26*04fd306cSNickeau /** 27*04fd306cSNickeau * Check if token ends status 28*04fd306cSNickeau * 29*04fd306cSNickeau * @param Token $token 30*04fd306cSNickeau * @return bool 31*04fd306cSNickeau */ 32*04fd306cSNickeau abstract public function isEndToken(Token $token): bool; 33*04fd306cSNickeau 34*04fd306cSNickeau /** 35*04fd306cSNickeau * Get new (sub)status if needed. 36*04fd306cSNickeau * 37*04fd306cSNickeau * @param Token $token 38*04fd306cSNickeau * @return Status|NULL 39*04fd306cSNickeau */ 40*04fd306cSNickeau abstract public function getNewStatus(Token $token): ?Status; 41*04fd306cSNickeau 42*04fd306cSNickeau /** 43*04fd306cSNickeau * Checks if the given offset position matches the pattern. 44*04fd306cSNickeau * 45*04fd306cSNickeau * @param string $buffer 46*04fd306cSNickeau * @param integer $offset 47*04fd306cSNickeau * @param string $pattern 48*04fd306cSNickeau * @return string|NULL 49*04fd306cSNickeau */ 50*04fd306cSNickeau protected function matchPattern(string $buffer, int $offset, string $pattern): ?string { 51*04fd306cSNickeau $found = preg_match( 52*04fd306cSNickeau $pattern, $buffer, $match, PREG_OFFSET_CAPTURE, $offset 53*04fd306cSNickeau ); 54*04fd306cSNickeau if ( 55*04fd306cSNickeau $found && 56*04fd306cSNickeau isset($match[0][1]) && 57*04fd306cSNickeau $match[0][1] === $offset 58*04fd306cSNickeau ) { 59*04fd306cSNickeau return $match[0][0]; 60*04fd306cSNickeau } 61*04fd306cSNickeau return NULL; 62*04fd306cSNickeau } 63*04fd306cSNickeau 64*04fd306cSNickeau protected function matchPatterns(string $buffer, int $offset, array $patterns): ?Token { 65*04fd306cSNickeau foreach ($patterns as $type => $pattern) { 66*04fd306cSNickeau $tokenString = $this->matchPattern( 67*04fd306cSNickeau $buffer, $offset, $pattern 68*04fd306cSNickeau ); 69*04fd306cSNickeau if (!empty($tokenString)) { 70*04fd306cSNickeau return new Token( 71*04fd306cSNickeau $type, $tokenString, $offset 72*04fd306cSNickeau ); 73*04fd306cSNickeau } 74*04fd306cSNickeau } 75*04fd306cSNickeau return NULL; 76*04fd306cSNickeau } 77*04fd306cSNickeau 78*04fd306cSNickeau protected function matchCharacters(string $buffer, int $offset, array $chars): ?Token { 79*04fd306cSNickeau if (isset($buffer[$offset])) { 80*04fd306cSNickeau $char = $buffer[$offset]; 81*04fd306cSNickeau foreach ($chars as $type => $expectedChar) { 82*04fd306cSNickeau if ($char === $expectedChar) { 83*04fd306cSNickeau return new Token($type, $char, $offset); 84*04fd306cSNickeau } 85*04fd306cSNickeau } 86*04fd306cSNickeau } 87*04fd306cSNickeau return NULL; 88*04fd306cSNickeau } 89*04fd306cSNickeau } 90*04fd306cSNickeau} 91