Home PHP А.Волос "PHP Практика " Глава 4 Делаем из файла - главу (VirtueMar) Listing_14_05
Listing_14_05 PDF Печать E-mail
Автор: А.Волос   


<?php
// Формирует отступы от начала строк
// Создает на странице список ссылок-имен функций
// Выделяет цветом имена функций, ставит метку
// возле каждой функции

//объявим массивы
$masNameFrom = array();
$masNameTo = array();

//объявим переменные
$flag1 = 0;

$tab_num_str = 0; //количество табуляторов
$gap_num_str = 0; //количество пробелов

$leks01 = "<DIV CLASS=\"block_2\">";
$leks02 = "</DIV CLASS=\"block_2\">";

$n=0;

$tempv = 0;
$leks1 = "function";
//$leks5 = "<p>";
$leks6 = "function <SPAN CLASS=\"gloss\">";
$leks7 = "</SPAN CLASS=\"gloss\">";

//-----------------------------
// откроем файл для записи ошибок
$filename = "error.txt";
if(!($myFile = fopen($filename, "w"))) {

print("Error: ");
print("'$filename' could not be created\n");
exit;
}
//-----------------------------
// open directory
$myDirectoryFrom = opendir("from1");
$n=0;
// считаем в массив имена файлов из from1
while(FALSE !== ($entryName = readdir($myDirectoryFrom))) {
$masNameFrom[$n] = $entryName;
$n++;
}
// сосчитаем количество элементов в массиве
$indexLimit = count($masNameFrom);

//////////////////////////////////////////////////////////////
////////////// Цикл for /////////////////////////////////
//////////////////////////////////////////////////////////////
// для каждого имени файла повторим цикл
for($index=2; $index < $indexLimit; $index++) {

//--------------------------- // откроем файл для чтения
$Temp = "from1/";
$filenameFrom = "$Temp$masNameFrom[$index]";
if(!($myFileFrom = fopen($filenameFrom, "r"))) {
fputs($myFile, "'$filenameFrom' could not be opened\n" );
exit;
}

//---------------------------
//откроем файл для записи
$Temp1 = "to1/";
$filenameTo = "$Temp1$masNameFrom[$index]";
if(!($myFileTo = fopen($filenameTo, "wa"))) { //запись с добавлением

fputs($myFile, "'$filenameTo' could not be created\n" );
exit;
}

//-----------------------------
// откроем файл для вывода
$filename = "fileOut.txt";
if(!($fileOut = fopen($filename, "wr+"))) //чтение и запись
{

fputs($errorFile, "'$filename' could not be created\n" );
exit;
}
//////////////////////////////////////////////////////////////
////////////// Цикл while //////////////////////////////////
//////////////////////////////////////////////////////////////
//---------------------------
$tempv = 0;
$tab_num_str = 0; //количество табуляторов
$gap_num_str = 0; //количество пробелов

//считаем построчно из файла from в файл to
while(!feof($myFileFrom)) {

//читаем строку из файла
$myLine = fgets($myFileFrom, 255);

///////////////////////////////////////////////////////////////
//////////////// Блок формирует отступы от начала строк /////
///////////////////////////////////////////////////////////////

//если строка пустая ставим тег <p> if(strlen($myLine) < 3){

fputs($fileOut, "<p>$myLine"); $flag1 = 1;
continue;
}

//определим количество табуляторов в начале строки.
$tab_num_temp = substr_count($myLine,"\t");

if($tab_num_temp > 0){

if($tab_num_temp == $tab_num_str){
if($flag1 == 0){
fputs($fileOut, "<br>");
}
$flag1 = 0;
}

$temp = $tab_num_temp - $tab_num_str;
if($temp < 0) $temp = -$temp;

if($tab_num_temp > $tab_num_str){

for($i = 0; $i < $temp; $i++)
fputs($fileOut, $leks01);//на 2 символа вправо
}
else{
if($tab_num_temp != $tab_num_str){
for($i = 0; $i < $temp; $i++)
fputs($fileOut, $leks02);//на 2 символа влево
}
}
$tab_num_str = $tab_num_temp;
}
else{

$mas_String = array(); $n = 0;

//превратим строку в массив
$mas_String = str_split($myLine);

// определим длину массива
$indexLimit2 = count($mas_String);

for($i = 0;$i < $indexLimit2; $i++){

$char_temp = $mas_String[$i];
if($char_temp == " "){
$n++;
}
else{
break;
}
}

//определим количество пробелов в начале строки.
$gap_num_temp = $n;
$n = 0;

//если колич пробелов в текущей и предыдущей строке одинаково, то <br>
if($gap_num_temp == $gap_num_str){

if($flag1 == 0){
fputs($fileOut, "<br>");
}
$flag1 = 0;
}

$temp = $gap_num_temp - $gap_num_str;
if($temp < 0) $temp = -$temp;
$temp = (int)$temp / 4;

if($gap_num_temp > $gap_num_str){

for($i = 0; $i < $temp; $i++)
fputs($fileOut, $leks01);//на 2 символа вправо
}
else{
if($gap_num_temp != $gap_num_str){
for($i = 0; $i < $temp; $i++)
fputs($fileOut, $leks02);//на 2 символа влево
}
}

$gap_num_str = $gap_num_temp;

}

/////////////////////////////////////////////////////////////////
//////////////// Выделяем цветом имя функции, ставим метку /////
/////////////////////////////////////////////////////////////////

//если в строке нет слова "function", скопировать без изменений
if(substr_count($myLine, $leks1) < 1) {

$myNewLine = htmlspecialchars($myLine);//обезвредим теги
fputs($fileOut, "$myNewLine");
continue;
}

fputs($fileOut, "<hr><code>");

$first_slovok = strtok($myLine," ");// отделим первое слово в строке
$first_slovo2k = trim($first_slovok);// убрать крайние пробелы

// если первое слово не равно "function", скопировать без изменений
if(strcmp($first_slovo2k, $leks1) != 0) {

$myNewLine = htmlspecialchars($myLine);//обезвредим теги
fputs($fileOut, "$myNewLine");
continue;
}

fputs($fileOut, $leks6); //function <SPAN CLASS="gloss">

// имеем искомую строку, требуется ее обработать
$slovl = strstr($myLine," "); // имя функции + (обрез слева)
$slovo1a = strtok($slovl,"("); // !!имя функции (обрез справа)
$slovo2a = strstr($myLine,"("); // параметр функции (обрез слева)
$slovo3 = strtok($slovo2a, "{"); // !!параметр функции (обрез справа)
$slovo4 = strstr($myLine,"{"); // остальная часть строки (справа от {)

$slovo1a1 = htmlspecialchars($slovo1a);//обезвредим теги
//$slovo1a //имя функции
//$leks_07 //лексема </SPAN CLASS="gloss">
//$slovo3a //параметр функции
//$slovo4a //остальная часть строки (справа от {)

$slovo3a = htmlspecialchars($slovo3);//обезвредим теги
$slovo4a = htmlspecialchars($slovo4);//обезвредим теги

$slovo5 = "$slovo1a1$leks7$slovo3a$slovo4a";
fputs($fileOut, $slovo5); //

$tempv++;

//обнулим переменные
$myLine = "";

/////////////////////////////////////////////////////////////

}//end while

fputs($fileOut, "</code><hr>");

//перейти на следующую позицию в файле с шагом 32 байта
fseek($fileOut,0);

//скопируем построчно в режиме дополнения из fileOut.txt в $myFileTo
while(!feof($fileOut)){

//читаем строку из файла $myLineQ = fgets($fileOut, 255);
fputs($myFileTo, $myLineQ); //
}

// закроем файлы
fclose($fileOut);
fclose($myFileFrom);
fclose($myFileTo);
/////////////////////////////////////////////////////////////

}//end for

//--------------------------------
// close directory
closedir($myDirectoryFrom);
fclose($myFile);
//--------------------------------

?>


Вверх

Обновлено 05.05.2011 08:00