original-brownbear/php-transpiler

View on GitHub
src/PhpTranspiler/Framework/PhpSourceSanitization.php

Summary

Maintainability
A
3 hrs
Test Coverage
<?php
namespace PhpTranspiler\Framework;

use PhpParser\Node;
use PhpParser\Parser;

class PhpSourceSanitization
{
    /** @var  string $source */
    private $source;

    /** @var Parser $parser */
    private $parser;

    public function __construct($parser, $source)
    {
        $this->parser = $parser;
        $this->source = $source;
    }

    /**
     * @return string
     */
    public function stringContent()
    {
        $this->stripWhiteSpaces();

        return $this->source;
    }

    /**
     * @return null|Node[]
     */
    public function asNodes()
    {

        return $this->parser->parse($this->stringContent());
    }

    /**
     * Removes all unnecessary whitespaces from @see source
     */
    private function stripWhiteSpaces()
    {
        $hasOpeningTag   = strpos($this->source, '<?php') === false;
        $tokens          = token_get_all(($hasOpeningTag ? '<?php ' : '') . $this->source);
        $sanitizedTokens = array();
        foreach ($tokens as $index => $token) {
            if (isset($token[1]) && in_array($token[0],
                    array(T_WHITESPACE, T_LINE, T_OPEN_TAG, T_INLINE_HTML))
            ) {
                $token[1] = str_replace("\n", ' ', $token[1]);
                $token[1] = str_replace("\t", ' ', $token[1]);
                $token[1] = preg_replace('#\s+#', ' ', $token[1]);
                if (isset($tokens[$index - 1]) && (in_array($tokens[$index - 1],
                            array('{', ';', '}'),
                            true) || (isset(end($sanitizedTokens)[1]) && end($sanitizedTokens)[1] === '<?php '))
                ) {
                    continue;
                }
                if (isset($tokens[$index + 1]) && in_array($tokens[$index + 1],
                        array('{', ';', '}'), true)
                ) {
                    $token[1] = str_replace(' ', '', $token[1]);
                }
            }
            $sanitizedTokens[] = $token;
        }
        $output = '';
        foreach ($sanitizedTokens as $key => $token) {
            $output .= (is_array($token) ? $token[1] : $token);
        }

        $this->source = $hasOpeningTag ? substr($output, 6) : $output;
    }
}