<?php 
/** 
 * Created by PhpStorm. 
 * User: Micha? (majkel) Kowalik <[email protected]> 
 * Date: 1/17/2015 
 * Time: 20:44 
 */ 
 
namespace org\majkel\tcpdfwarper\generator; 
 
/** 
 * Class Generator 
 * @package org\majkel\tcpdfwarper\generator 
 */ 
class Generator { 
 
    /** @var string */ 
    protected $configFile; 
    /** @var string */ 
    protected $classTemplateFile; 
    /** @var string */ 
    protected $traitTemplateFile; 
 
    /** @var array */ 
    protected $config; 
 
    /** @var string */ 
    protected $date; 
    /** @var string */ 
    protected $time; 
 
    /** 
     * @param array $config 
     */ 
    public function __construct($config) { 
        $this->configFile = $config['configFile']; 
        $this->classTemplateFile = $config['classTemplateFile']; 
        $this->traitTemplateFile = $config['traitTemplateFile']; 
        $now = time(); 
        $this->date = date('Y-m-d', $now); 
        $this->time = date('H:i:s', $now); 
    } 
 
    /** 
     * @return ConfigItem[] 
     * @throws GeneratorException 
     */ 
    protected function getConfig() { 
        if (is_null($this->config)) { 
            $this->config = array(); 
            if (!file_exists($this->configFile)) { 
                throw new GeneratorException("Config file `{$this->configFile}` does not exists."); 
            } 
            $config = require $this->configFile; 
            if (!isset($config) || !is_array($config)) { 
                throw new GeneratorException("Invalid configuration file `{$this->configFile}`"); 
            } 
            foreach ($config as $method => $classDef) { 
                if (is_array($classDef)) { 
                    if (!is_integer($method) && !isset($classDef['method'])) { 
                        $classDef['method'] = $method; 
                    } 
                } 
                else { 
                    $classDef = array( 
                            'method' => $classDef, 
                    ); 
                } 
                $this->config[] = ConfigItem::fromArray($classDef); 
            } 
        } 
        return $this->config; 
    } 
 
    /** 
     * @param string $text 
     * @return string 
     */ 
    protected static function removeTrailingSpaces($text) { 
        return rtrim(preg_replace('#[ \t]+[\r\n]#', "\n", $text), " \t\0\x0B"); 
    } 
 
    /** 
     * @param string $tpl 
     * @param array $variables 
     * @return string 
     */ 
    protected function render($tpl, array $variables) { 
        ob_start(); 
        extract($variables, EXTR_SKIP); 
        require $tpl; 
        $result = ob_get_contents(); 
        ob_end_clean(); 
        return self::removeTrailingSpaces($result); 
    } 
 
    /** 
     * @param ClassDefinition $class 
     * @return string 
     */ 
    protected function generateClass($class) { 
        return $this->render($this->classTemplateFile, [ 
            'class' => $class, 
        ]); 
    } 
 
    /** 
     * @param ClassDefinition[] $classes 
     * @return string 
     */ 
    protected function generateTrait($classes) { 
        return $this->render($this->traitTemplateFile, [ 
            'classes' => $classes, 
        ]); 
    } 
 
    /** 
     * @param string $outputDirectory 
     * @throws GeneratorException 
     */ 
    public function generate($outputDirectory) { 
        if (!is_dir($outputDirectory)) { 
            throw new GeneratorException("`$outputDirectory` is not valid directory"); 
        } 
        $classes = array(); 
        $config = $this->getConfig(); 
        foreach ($config as $classDef) { 
            $class = ClassDefinition::fromConfigItem($classDef); 
            $classes[] = $class; 
            file_put_contents($outputDirectory.'/'.$classDef->className.'.php', $this->generateClass($class)); 
        } 
        file_put_contents($outputDirectory.'/TCPDFWarperTrait.php', $this->generateTrait($classes)); 
    } 
 
} 
 
 |