Эта тема на forum.dklab.ru


Ksnk: Убрать символы табуляции
Вот прыгал с редактора на редактор... Дример, far, notepad, phpExpertEditor... и на каком-то этапе обнаружил, что разный "размер" символов табуляции в текстах не дают нормально смотреть исходники. А уж автоматическая бездумная замена их редактором может и совсем убить читабельность... Засел и написал программку, заменяющую табуляцию на пару пробелов (2 пробела - это Дример меня научил :)).
Я осознаю, что алгоритм замены табуляции у меня, мягко говоря, далек от совершенства, но в классическом случае - когда табуляция размещается с начала строки - вполне даже коректен... К тому-же при длине 2 совсем не страшно ошибиться.
Вот. может кому пригодится...
Оно рекурсивно перебирает все PHP от каталога и вниз по дереву и перезаписывает файлы. Так что для тестирования лучше поместить его в тестовый каталог.
<?php
$directory='.';
$tabreplace=" " ; // string of spaces to replace a single tab ;
//*********************************************************
$fcount =0;
//*********************************************************
// create array with directory structure.
// $key - filename is_string($val) - filename with path ;
// is_array($val) - subdirectory with same structure
function getdir($dir,$match='/.*/'){
$s=array();$d=array() ;
if (substr($dir,-1)!="/") $dir.="/";
if (is_dir($dir))
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false)
if (($file!=".")&&($file!=".."))
if (is_dir($dir.$file)) $d[$file]=getdir($dir.$file,$match);
else if (preg_match($match,$file)) $s[$file]=$dir.$file;
closedir($dh);
}
// ksort($s); ksort($d); // do your really need sorting?
return array_merge($d,$s);
} ;
//*********************************************************
// relacement for file_put_contents
function file_write($filename,$somecontent)
{
if (is_writable($filename))
if ($handle = fopen($filename, 'w')) {
fwrite($handle, $somecontent);
fclose($handle);
return TRUE;
} ;
return FALSE ;
}
//*********************************************************
// very simple. not really correct, but fast tab-replacement procedure
function untab_array($d)
{
foreach($d as $key=>$val)
{
if (is_array($val)) untab_array($val) ;
else {
$my_cont=file_get_contents($val);
if (strpos($my_cont,"\t") !== false) {
echo $val."\n";$fcount++;
file_write($val,str_replace("\t",$tabreplace,$my_cont));
}
}
}
};
//*********************************************************
echo "<pre>\nProcessing directory".$directory."\n";
untab_array(getdir($directory,"/\.php$/i"));
echo $fcount." files processed.</pre>" ;
?>
pav:
Ksnk
Извениет, а вы 11 наблу читали?
Ksnk:
Ksnk
Извениет, а вы 11 наблу читали?
Прочитал. И что прикажете далать, если сначала тексты правились Дримером (2 пробела на таб), потом частично notepad'ом (8), потом частично еще какой-то ерундой (??), а потом phpExpertEditor захотел вернуть все табуляции к пробелам и тут ТАКОЕ началось... :)
Кстати, у меня ошибочка! Нужно писать function untab_array($d)
{
global $tabreplace,$fcount ; // вот эта строчка отсутствовала
foreach($d as $key=>$val)

Дмитрий Котеров: HackerConsole
Вот код, который заменяет табуляторы в любом месте строки на КОРРЕКТНОЕ число пробелов (выравнивая по позиции, кратной $tabSize). Собственно, для того-то табуляторы и придумывали, чтобы выравнивать.

/**
* string expandTabs($text, $tabSize=4)
* Correctly convert tabulators to spaces.
*/
function expandTabs($text, $tabSize=4)
{
$GLOBALS['expandTabs_tabSize'] = $tabSize;
while (1) {
$old = $text;
$text = preg_replace_callback('/^(.*?)\t(\t*)(.*)/m', 'expandTabs_callback', $text);
if ($old === $text) return $text;
}
}

function expandTabs_callback($m)
{
$tabSize = $GLOBALS['expandTabs_tabSize'];
$n =
intval((strlen($m[1]) + $tabSize) / $tabSize) * $tabSize - strlen($m[1])
+ strlen($m[2]) * $tabSize;
return $m[1] . str_repeat(' ', $n) . $m[3];
}

Код из библиотеки HackerConsole (http://forum.dklab.ru/viewtopic.php?p=92910#92910)

Эта тема на forum.dklab.ru