<?php
/**
*
* This software is distributed under the GNU GPL v3.0 license.
* @author Gemorroj
* @copyright 2008-2011 http://wapinet.ru
* @license http://www.gnu.org/licenses/gpl-3.0.txt
* @link http://wapinet.ru/gmanager/
* @version 0.8 beta
*
* PHP version >= 5.2.1
*
*/
class Beautifier_PHP implements Beautifier_Interface
{
public static $tab = ' ';
/**
* Beautifier
*
* @param string $str Code
* @return string
*/
public static function beautify ($str)
{
$out = null;
$tab = 0;
$str = str_split(str_replace("\r", '', $str), 1);
$all = sizeof($str);
$block = array(false, false, false, false, false);
$array = false;
for ($i = 0; $i < $all; ++$i) {
switch ($str[$i]) {
case "'":
$prev = iconv_substr($out, -1);
if ($prev != '\\' && $block[0] === false && $block[1] === false && $block[2] === false && $block[3] === false && $block[4] === false) {
$block[0] = true;
if (!in_array($prev, array('[', '(', ' ', "\n"))) {
$out .= ' ';
}
} else {
$block[0] = false;
}
$out .= $str[$i];
break;
case '"':
$prev = iconv_substr($out, -1);
if ($prev != '\\' && $block[0] === false && $block[1] === false && $block[2] === false && $block[3] === false && $block[4] === false) {
$block[1] = true;
if (!in_array($prev, array('[', '(', ' ', "\n"))) {
$out .= ' ';
}
} else {
$block[1] = false;
}
$out .= $str[$i];
break;
case '#':
if ($block[0] === false && $block[1] === false && $block[2] === false && $block[3] === false) {
$block[4] = true;
}
$out .= $str[$i];
break;
case '*':
$prev = iconv_substr($out, -1);
if ($prev == '/' && $block[0] === false && $block[1] === false && $block[3] === false && $block[4] === false) {
$block[2] = true;
}
$out .= $str[$i];
break;
case '/':
$prev = iconv_substr($out, -1);
if ($prev == '*' && $block[0] === false && $block[1] === false && $block[2] === true && $block[3] === false && $block[4] === false) {
$block[2] = false;
}
if ($prev == '/' && $block[0] === false && $block[1] === false && $block[2] === false && $block[4] === false) {
$block[3] = true;
}
$out .= $str[$i];
break;
case "\t":
$out .= self::$tab;
break;
case "\n":
$block[3] = $block[4] = false;
if (!$block[0] && !$block[1] && !$block[2] && !$block[3]) {
$rep = str_repeat(self::$tab, $tab);
$len = strlen($rep);
if (iconv_substr($out, -$len) != $rep) {
$out .= $str[$i] . $rep;
while (true) {
if (@$str[$i + 1] != ' ' && @$str[$i + 1] != "\n") {
break;
}
$i++;
}
}
} else if ($block[0] || $block[1] || $block[2] || $block[3] || $block[4] || iconv_substr($out, -(2 + iconv_strlen(str_repeat(self::$tab, $tab)))) != '{' . "\n" . str_repeat(self::$tab, $tab)) {
$out .= $str[$i];
}
break;
case ' ':
if (!$block[0] && !$block[1] && !$block[2] && !$block[3] && !$block[4] && (iconv_substr($out, -2) == ', ') || iconv_substr($out, -3) == ' . ' || iconv_substr($out, -3) == ' = ') {
break;
} else if ($block[0] || $block[1] || $block[2] || $block[3] || $block[4] || (iconv_substr($out, -(2 + iconv_strlen(str_repeat(self::$tab, $tab)))) != '{' . "\n" . str_repeat(self::$tab, $tab) && iconv_substr($out, -(2 + iconv_strlen(str_repeat(self::$tab, $tab)))) != '(' . "\n" . str_repeat(self::$tab, $tab))) {
$out .= $str[$i];
}
break;
case '{':
if ($block[0] || $block[1] || $block[2] || $block[3] || $block[4]) {
$out .= $str[$i];
break;
} else if (!in_array(iconv_substr($out, -1), array(' ', "\n"))) {
$out .= ' ';
}
$tab++;
$out .= $str[$i] . "\n" . str_repeat(self::$tab, $tab);
break;
case '}':
if (!$block[0] && !$block[1] && !$block[2] || $block[3] || $block[4]) {
$tab--;
$out = rtrim($out) . "\n" . str_repeat(self::$tab, $tab) . $str[$i] . "\n";
} else {
$out .= $str[$i];
}
break;
case '(':
if (!$block[0] && !$block[1] && !$block[2] && !$block[3] && !$block[4]) {
$out = rtrim($out);
if (strtoupper(iconv_substr($out, -5)) == 'ARRAY') {
$tab++;
$out .= ' ' . $str[$i] . "\n" . str_repeat(self::$tab, $tab);
$array = true;
} else {
$out .= ' ' . $str[$i];
}
} else {
$out .= $str[$i];
}
break;
case ')':
if (!$block[0] && !$block[1] && !$block[2] && !$block[3] && !$block[4] && $array) {
$tab--;
$array = false;
$out = rtrim($out) . "\n" . str_repeat(self::$tab, $tab) . $str[$i];
} else {
$out .= $str[$i];
}
break;
case ',':
$out .= $str[$i];
if (!$block[0] && !$block[1] && !$block[2] && !$block[3] && !$block[4]) {
$out .= ' ';
}
break;
case '.':
if (!$block[0] && !$block[1] && !$block[2] && !$block[3] && !$block[4]) {
if (iconv_substr($out, -1) != ' ') {
$out .= ' ';
}
$out .= $str[$i] . ' ';
} else {
$out .= $str[$i];
}
break;
case '=':
if (!$block[0] && !$block[1] && !$block[2] && !$block[3] && !$block[4]) {
$prev = iconv_substr($out, -1);
if ($prev != ' ' && $prev != '=') {
$out .= ' ';
}
$out .= $str[$i];
if ($str[$i + 1] != '=' && $str[$i + 1] != ' ') {
$out .= ' ';
}
} else {
$out .= $str[$i];
}
break;
case 'E':
case 'e':
if (!$block[0] && !$block[1] && !$block[2] && !$block[3] && !$block[4]) {
if (strtoupper(iconv_substr($out, -3)) == 'ELS' && in_array(iconv_substr($out, -4, 1), array("\n", ' '))) {
$out = rtrim(iconv_substr($out, 0, -4)) . ' ' . iconv_substr($out, -3);
}
}
$out .= $str[$i];
break;
default:
$out .= $str[$i];
break;
}
}
return $out;
}
}
?>