Анимация
JavaScript
|
Главная Библионтека Это удобно для коротких однострочн1х блоков, особенно расположенн1х в файлах .htaccess. Из того, что было выведено программой в стандартный поток, будут удалены начальные и концевые пробелы, а также вызовутся все функции-фильтры. Окончанием вывода, принадлежащего указанному блоку, считается конец файла либо начало другого блока ( то есть еще один вызов Block()). function Block($name=false, $value=false) { global $BLOCK,$bSingleLine,$CURBLOCK URL; Объявляем некоторые флаги состояния static $Handled=false; в прошлый раз вывод был перехвачен static $CurBlock=false; имя текущего обрабатываемого блока Если имя блока задано, перевести его в нижний регистр if($name!==false) $name=strtolower(trim($name)); Вывод был перехвачен. Значит, что до этого вызова уже б1ла запущена функция Block(). Теперь блок, котор1Й она обрабатывала, закончился, и его надо добавить в массив блоков ( или же проигнорировать этот вывод). if($Handled) { Имя предыдущего блока было задано? if($CurBlock!==false) { Добавляем в массив блоков. $BLOCK[$CurBlock]=trim(ob get contents()); Если блок однострочный ( из файла .htaccess), то удаляем все строки, кроме первой. if(@$bSingleLine) $BLOCK[$CurBlock]=ereg Replace("[\r\n].*","",$BLOCK[$CurBlock]); Запускаем фильтры ProcessContent($CurBlock,$BLOCK[$CurBlock],$CURBLOCK URL); Завершаем перехват потока вывода ob end clean(); $Handled=0; Если имя блока задано ( а это происходит практически всегда), значит, функция была вызвана нормальным образом, а не только для того, чтобы завершить вывод последнего блока ( см. функцию Load()). if($name!==false) { Перехватываем поток вывода ob start(); $Handled=1; Тело явно не задано, значит, нужно его получить путем перехвата выходного потока. Фактически, сейчас мы просто говорим системе, что текущий блок - $name, и что как только она встретит другой блок или конец файла, следует принять выведенные данные и записать их в массив. if($value===false) { $CurBlock=$name; } else { Тело задано явно. Записать блок в массив, но все равно перехватить выходной поток ( чтобы потом его проигнорировать). ProcessContent($name,$value,$CURBLOCK URL); $BLOCK[$name]=$value; $CurBlock=false; Загружает файл с URL $name и добавляет блоки, которые в нем находились, к списку существующих блоков. Параметр $name может задавать относительный URL, в этом случае производится его поиск в глобальном массиве $INC ( том же самом, который использует библиотекарь). Если в качестве $name задано не имя файла, а имя каталога, то анализируется файл .htaccess, расположенный в этом каталоге. На момент загрузки файла текущий каталог изменяется на тот, в котором расположен файл. function Load($name) { global $BLOCK,$bSingleLine,$CURBLOCK URL,$BLOCK INC; Перевести все пути в $INC в абсолютные AbsolutizeINC(); Если путь относительный, ищем по $BLOCK INC $fname=false; if($name[0]!=/) { Перебираем все каталоги включения foreach($BLOCK INC as $v) { $fname=Url2Path("$v/$name"); Определяем имя файла if(file exists($fname)) { $name="$v/$name"; break; } Если не нашли, $fname остается равной false } else { Абсолютн1й URL - перевести его в имя файла $fname=Url2Path($name); Обрабатываем файл, имя которого вычислено по URL. Сначала проверяем, существует ли такой файл. if($fname===false !file exists($fname)) die("Couldnt open \"$name\"!"); Это каталог - значит, используем .htaccess $Single=false; if(@is dir($fname)) { $name.="/".Htaccess Name; $fname.="/".Htaccess Name; $Single=1; Если файла до сих пор не существует ( это может случиться, когда мы предписали использовать .htaccess, а его в каталоге нет), "мирно" в1ходим. Ничего страшного, если в каталоге нет .htaccessа. if(!file exists($fname)) return; Запускаем файл. Для этого сначала запоминаем текущее состояние и каталог, затем загружаем блоки файла ( просто выполняем файл), а в конце восстанавливаем состояние. $PrevSingle=$bSingleLine; $bSingleLine=@$Single; $SaveDir=getcwd(); chdir(dirname($fname)); $SaveCBU=$CURBLOCK URL; $CURBLOCK URL=$name; Возможно, в файле присутствуют начальные пробелы или другие нежелательные символы ( например, в .htaccess это может быть знак комментария). Все они включатся в блок с именем PreBlockText (его вряд ли целесообразно использовать). Block(" PreBlockText"); Делаем доступными все глобальные переменные. foreach($GLOBALS as $k=>$v) if(!@Isset($$k)) global $$k; Запускаем файл. include $fname; Сигнализируем, что блоки закончились ( достигнут конец файла). При этом чаще всего будет осуществлена запись данных последнего блока файла в массив. Block(); chdir($SaveDir); $CURBLOCK URL=$SaveCBU; $bSingleLine=$PrevSingle; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 [ 147 ] 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 |