Вход Регистрация
Файл: onlinepoisk.wm-scripts.ru/vendor/silex/silex/silex/src/Silex/Util/Compiler.php
Строк: 254
<?php

/*
 * This file is part of the Silex framework.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace SilexUtil;

use 
SymfonyComponentFinderFinder;
use 
SymfonyComponentHttpKernelKernel;
use 
SymfonyComponentProcessProcess;

/**
 * The Compiler class compiles the Silex framework.
 *
 * This is deprecated. Use composer instead.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class Compiler
{
    protected 
$version;

    
/**
     * Compiles the Silex source code into one single Phar file.
     *
     * @param string $pharFile Name of the output Phar file
     */
    
public function compile($pharFile = 'silex.phar')
    {
        if (
file_exists($pharFile)) {
            
unlink($pharFile);
        }

        
$process = new Process('git log --pretty="%h %ci" -n1 HEAD');
        if (
$process->run() > 0) {
            throw new 
RuntimeException('The git binary cannot be found.');
        }
        
$this->version = trim($process->getOutput());

        
$phar = new Phar($pharFile, 0, 'silex.phar');
        
$phar->setSignatureAlgorithm(Phar::SHA1);

        
$phar->startBuffering();

        
$root = __DIR__.'/../../..';

        
$finder = new Finder();
        
$finder->files()
            ->
ignoreVCS(true)
            ->
name('*.php')
            ->
notName('Compiler.php')
            ->
exclude('Tests')
            ->
in($root.'/src')
            ->
in($root.'/vendor/pimple/pimple/lib')
            ->
in($root.'/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher')
            ->
in($root.'/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation')
            ->
in($root.'/vendor/symfony/http-kernel/Symfony/Component/HttpKernel')
            ->
in($root.'/vendor/symfony/routing/Symfony/Component/Routing')
            ->
in($root.'/vendor/symfony/browser-kit/Symfony/Component/BrowserKit')
            ->
in($root.'/vendor/symfony/css-selector/Symfony/Component/CssSelector')
            ->
in($root.'/vendor/symfony/dom-crawler/Symfony/Component/DomCrawler')
        ;

        foreach (
$finder as $file) {
            
$this->addFile($phar, $file);
        }

        
$this->addFile($phar, new SplFileInfo($root.'/LICENSE'), false);
        
$this->addFile($phar, new SplFileInfo($root.'/vendor/autoload.php'));
        
$this->addFile($phar, new SplFileInfo($root.'/vendor/composer/ClassLoader.php'));
        
$this->addFile($phar, new SplFileInfo($root.'/vendor/composer/autoload_namespaces.php'));
        
$this->addFile($phar, new SplFileInfo($root.'/vendor/composer/autoload_classmap.php'));

        
// Stubs
        
$phar->setStub($this->getStub());

        
$phar->stopBuffering();

        
// FIXME: phar compression feature is not yet implemented
        //$phar->compressFiles(Phar::GZ);

        
unset($phar);
    }

    protected function 
addFile($phar, $file, $strip = true)
    {
        
$path = str_replace(dirname(dirname(dirname(__DIR__))).DIRECTORY_SEPARATOR, '', $file->getRealPath());

        
$content = file_get_contents($file);
        if (
$strip) {
            
$content = self::stripWhitespace($content);
        }

        
$content = preg_replace("/const VERSION = '.*?';/", "const VERSION = '".$this->version."';", $content);

        
$phar->addFromString($path, $content);
    }

    protected function 
getStub()
    {
        return <<<'EOF'
<?php
/*
 * This file is part of the Silex framework.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * This source file is subject to the MIT license that is bundled
 * with this source code in the file LICENSE.
 */

Phar::mapPhar('silex.phar');

require_once 'phar://silex.phar/vendor/autoload.php';

if ('cli' === php_sapi_name() && basename(__FILE__) === basename($_SERVER['argv'][0]) && isset($_SERVER['argv'][1])) {
    switch ($_SERVER['argv'][1]) {
        case 'update':
            $remoteFilename = 'http://silex.sensiolabs.org/get/silex.phar';
            $localFilename = __DIR__.'/silex.phar';

            file_put_contents($localFilename, file_get_contents($remoteFilename));
            break;

        case 'check':
            $latest = trim(file_get_contents('http://silex.sensiolabs.org/get/version'));

            if ($latest != SilexApplication::VERSION) {
                printf("A newer Silex version is available (%s).n", $latest);
            } else {
                print("You are using the latest Silex version.n");
            }
            break;

        case 'version':
            printf("Silex version %sn", SilexApplication::VERSION);
            break;

        default:
            printf("Unknown command '%s' (available commands: version, check, and update).n", $_SERVER['argv'][1]);
    }

    exit(0);
}

__HALT_COMPILER();
EOF;
    }

    
/**
     * Removes whitespace from a PHP source string while preserving line numbers.
     *
     * Based on Kernel::stripComments(), but keeps line numbers intact.
     *
     * @param string $source A PHP string
     *
     * @return string The PHP string with the whitespace removed
     */
    
public static function stripWhitespace($source)
    {
        if (!
function_exists('token_get_all')) {
            return 
$source;
        }

        
$output = '';
        foreach (
token_get_all($source) as $token) {
            if (
is_string($token)) {
                
$output .= $token;
            } elseif (
in_array($token[0], array(T_COMMENT, T_DOC_COMMENT))) {
                
$output .= str_repeat("n", substr_count($token[1], "n"));
            } elseif (
T_WHITESPACE === $token[0]) {
                
// reduce wide spaces
                
$whitespace = preg_replace('{[ t]+}', ' ', $token[1]);
                
// normalize newlines to n
                
$whitespace = preg_replace('{(?:rn|r|n)}', "n", $whitespace);
                
// trim leading spaces
                
$whitespace = preg_replace('{n +}', "n", $whitespace);
                
$output .= $whitespace;
            } else {
                
$output .= $token[1];
            }
        }

        return 
$output;
    }
}
Онлайн: 2
Реклама