Hi. I just made a php "compiler" class and I fell to share it. By compiler, I mean a class which will merge all files into one, removing comments, unwanted spaces and unwanted carriage-return. It it very usefull if you always include/require a lot of files to increase speed.
here's the class :
How to use it :PHP Code:<?php
// +---------------------------------------------------------------------------+
// | Framework for Php4 |
// |---------------------------------------------------------------------------+
// | Author : Jean-Philippe Déry <jeanphilippe_dery@hotmail.com> |
// +---------------------------------------------------------------------------+
// | This program is free software; you can redistribute it and/or modify |
// | it under the terms of the GNU General Public License as published by |
// | the Free Software Foundation; either version 2 of the License, or |
// | (at your option) any later version. |
// +---------------------------------------------------------------------------+
define('ROOT', '../');
define('LINEBREAK', "\n");
define('BRACKET_ON_SAME_LINE', 1);
/**
* "Compiler" Class. This class reads all files from a directory and merge them
* into a big one. Very usefull to get some speed if, in each pages, you
* include a lot of differents files.
*
* @author Jean-Philippe Déry <jeanphilippe_dery@hotmail.com>
* @version 1.0
*/
class Compiler
{
/**
* Compile each files from this directory.
*
* @type string
* @access private
* @since 1.0
*/
var $dir = 'lib/';
/**
* Compiled file.
*
* @type string
* @access private
* @since 1.0
*/
var $file = 'include/all.php';
/**
* Constructeur. Compile
*
* @access public
* @since 1.0
*/
function Compiler()
{
$this->compile();
}
/**
* Compile all files into a single one
*
* @access private
* @since 1.0
*/
function compile()
{
$this->file = ROOT . $this->file;
$this->dir = ROOT . $this->dir;
$files = '';
// Reads all files
if (!$dp = opendir($this->dir))
{
trigger_error('Cannot open directory ' . $this->dir);
}
while ($file = readdir($dp))
{
if (($file != '..') && ($file != '.') && (!is_dir($this->dir . $file)))
{
echo '<code>Compile file ' . $file . ' ';
$filelines = file($this->dir . $file);
// Remove end of line comments
foreach ($filelines as $i => $line)
{
$filelines[$i] = trim($filelines[$i]);
$filelines[$i] = preg_replace('/\/\/.*$/m', '', $line);
if ($i % 10 == 0)
{
echo '.';
}
}
$files .= implode('', $filelines);
echo ' <b>done</b><br>';
}
}
@closedir($dp);
// Remove php tags
$files = str_replace('<?php', '', $files);
$files = str_replace('?>', '', $files);
// Remove block comments
$files = preg_replace('/\/\*(.*?)\*\//s', '', $files);
// Remove unwanted \n
$files = preg_replace("/(\r\n)+/s", "\n", $files);
$files = preg_replace("/((\r\n)+(\t)+(\r\n)+)/s", "\n", $files);
$files = preg_replace("/((\r\n)+(\s)+(\r\n)+)/s", "\n", $files);
$files = preg_replace("/(\n)+/s", "\n", $files);
$files = preg_replace("/((\n)+(\t)+(\n)+)/s", "\n", $files);
$files = preg_replace("/((\n)+(\s)+(\n)+)/s", "\n", $files);
if (defined('BRACKET_ON_SAME_LINE'))
{
$files = preg_replace("/(\n)+(\s)*\{/s", "{", $files);
$files = preg_replace("/(\r\n)+(\s)*\{/s", "{", $files);
}
// Remove unwanted spaces
$files = preg_replace("/( )+/s", " ", $files);
// Compiled files' header
$files = '<?php' . LINEBREAK .
'// This is a generated files which contains all files from ' . $this->dir . LINEBREAK .
'// Compiled for a speed issue ' . LINEBREAK .
'// Do not edit this file. Instead, edit the file into ' . $this->dir . ' and recompile all' . LINEBREAK .
$files . LINEBREAK .
'?>';
// Put all files into a single one
if (!$fp = fopen($this->file, 'w+'))
{
trigger_error('Cannot open file ' . $this->file);
}
fwrite($fp, $files, strlen($files));
fclose($fp);
// Finished
echo '<h5 style="font-family : Verdana">Compilation succeeded</h5>';
}
}
// Compile
$compiler =& new Compiler();
?>
1. Change the ROOT constant value to your root relative path.
2. Edit the dir attribute to your lib directory.
3. Edit the file attribute to the file which will contain all classes.
Here's the result:
Before
AfterPHP Code:/**
* Compile et retourne le code html compilé.
*
* @return string Le code qui vient d'être compilé.
*
* @access public
* @since 1.0
*/
function parse()
{
$template = $this->uncompiled;
// Pré-compilation
$this->preParse($template);
// Compile les mots
$this->parseLang($template);
// Compile les variables simples
foreach ($this->vars as $handle => $value)
{
$template = str_replace('{' . $handle . '}', $value, $template);
}
// Toute les définitions et les remplacements sont stoqués dans des
// tableau pour simplement tous les passer dans str_replace question
// de gagner de la rapidité
$defs = array();
$repl = array();
// Compile uniquement les bloques qui ont eut des variables assignées
foreach ($this->blockVars as $name => $instances)
{
// Cherche un bloque qui a comme nom le contenu de $name et retourne
// sa définition et le contenu du code.
if ($this->getBlock($template, $name, $def, $code))
{
// Liste des instances du bloque compilée
$list = array();
$size = sizeof($instances);
// Compile toute les instances du bloque
for ($i = 0; $i < $size; $i++)
{
$list[$i] = $code;
foreach ($instances[$i] as $handle => $value)
{
$list[$i] = str_replace('{' . $name . '.' . $handle . '}', $value, $list[$i]);
}
}
$defs[] = $def;
$repl[] = implode('', $list);
}
}
// Remplace toutes des définitions de bloque par leur remplacements
// c'est à dire leur remplacement compilés
$template = str_replace($defs, $repl, $template);
$this->clean($template);
$this->reset();
return $template;
}
Fell free to post any commentsPHP Code:function parse(){
$template = $this->uncompiled;
$this->preParse($template);
$this->parseLang($template);
foreach ($this->vars as $handle => $value){
$template = str_replace('{' . $handle . '}', $value, $template);
}
$defs = array();
$repl = array();
foreach ($this->blockVars as $name => $instances){
if ($this->getBlock($template, $name, $def, $code)){
$list = array();
$size = sizeof($instances);
for ($i = 0; $i < $size; $i++){
$list[$i] = $code;
foreach ($instances[$i] as $handle => $value){
$list[$i] = str_replace('{' . $name . '.' . $handle . '}', $value, $list[$i]);
}
}
$defs[] = $def;
$repl[] = implode('', $list);
}
}
$template = str_replace($defs, $repl, $template);
$this->clean($template);
$this->reset();
return $template;
}




Bookmarks