Annotation of win32/dist/other/ru/_test.html, revision 1.1

1.1     ! misha       1: #<!--
        !             2: ###########################################################################
        !             3: @main[]
        !             4: <h1>Parser 3.x test page</h1>
        !             5: <p>Если вы видите эту страницу, значит вы установили парсер и пытаетесь его протестировать :)</p>
        !             6: <p>Чтобы увидеть полные пути к конфигурационным файлам и DOCUMENT_ROOT - закоментируйте метод postprocess[]</p>
        !             7: <p>Если что-либо выделено красным цветом, значит или что-то настроено неверно или автоматическое определение невозможно 
        !             8: (это относится к поиску файлов библиотек и кодовых таблиц при заданных относительных путях).</p>
        !             9: <hr />
        !            10: 
        !            11: ^try{
        !            12:        $status_rusage_begin[$status:rusage]
        !            13:        $status_memory_begin[$status:memory]
        !            14: }{
        !            15:        $exception.handled(1)
        !            16: }
        !            17: 
        !            18: <h2>Глобальные переменные, заданые в конфигурационном auto.p</h2>
        !            19: 
        !            20: <h3>^$CHARSETS:</h3>
        !            21: ^if($CHARSETS && $CHARSETS is "hash"){
        !            22:        <table cellpadding="5" cellspacing="0" border="1">
        !            23:        ^CHARSETS.foreach[sKey;sValue]{
        !            24:                <tr>
        !            25:                        <td>$sKey</td>
        !            26:                        <td>$sValue (^check_system_file[$sValue])</td>
        !            27:                </tr>
        !            28:        }
        !            29:        </table>
        !            30: }{
        !            31:        ^error[Не определен хеш с кодовыми таблицами (^$CHARSETS).]
        !            32:        <br />Возможно у вас не обрабатывается конфигурационный auto.p (тот что по умолчанию должен находится рядом с исполняемым файлом).
        !            33:        <br />Чтобы убедиться в том, что он обрабатывается, добавьте инструкцию
        !            34:        ^^throw[^;check auto.p execution] в его метод &#64^;auto[] и перезагрузите страницу.
        !            35:        Появление ошибки после её перезагрузки будет свидетельствовать о том, что он обрабатывается.
        !            36: }
        !            37: 
        !            38: <h3>^$SQL:</h3>
        !            39: ^if($SQL && $SQL.drivers && $SQL.drivers is "table"){
        !            40:        ^try{
        !            41:                <table cellpadding="5" cellspacing="0" border="1">
        !            42:                <tr>
        !            43:                        <th>protocol</th>
        !            44:                        <th>parser driver</th>
        !            45:                        <th>sql client library</th>
        !            46:                </tr>
        !            47:                ^SQL.drivers.menu{
        !            48:                        <tr>
        !            49:                                <td>$SQL.drivers.protocol</td>
        !            50:                                <td>^if(def $SQL.drivers.driver){$SQL.drivers.driver (^check_system_file[$SQL.drivers.driver])^if(!^check_p3_sql_lib_name[$SQL.drivers.driver;parser3]){<br />^error[уверены, что указан верный файл?]}}{<br />}</td>
        !            51:                                <td>^if(def $SQL.drivers.client){$SQL.drivers.client (^check_system_file[$SQL.drivers.client])}{<br />}</td>
        !            52:                        </tr>
        !            53:                }
        !            54:                </table>
        !            55:        }{
        !            56:                $exception.handled(1)
        !            57:                ^error[Неверная структура таблицы ^$SQL.drivers]
        !            58:                <br />Возможно Вы редактировали конфигурационный файл и у Вас символы табуляции заменились пробелами.
        !            59:                <br />Содержимое таблицы:
        !            60:                ^printTable[$SQL.drivers]
        !            61:        }
        !            62: }{
        !            63:        ^error[Не определена таблица с драйверами (^$SQL.drivers)]
        !            64:        <br />Возможно у вас не обрабатывается конфигурационный auto.p
        !            65: }
        !            66: 
        !            67: <p>
        !            68: ^info[DOCUMENT_ROOT]: ^if(^trim[$env:DOCUMENT_ROOT;/] eq $script_dir){совпадает с директорией тестового скрипта}{^error[^if(!def $env:DOCUMENT_ROOT){не определен}{&laquo^;кривой&raquo^; или скрипт находится не в корне веб пространства}]}^if(def $env:DOCUMENT_ROOT){ ($env:DOCUMENT_ROOT)}<br />
        !            69: ^info[Путь к скрипту]: $script_dir<br />
        !            70: ^info[^$response:charset]: ^if(def $response:charset){$response:charset}{^error[Не задан. Вы работаете в UTF8?]}<br />
        !            71: ^info[^$request:charset]: ^if(def $request:charset){$request:charset}{^error[Не задан. Вы работаете в UTF8?]}<br />
        !            72: ^info[^$request:uri]: $request:uri<br />
        !            73: ^info[^$request:query]: $request:query^if(def $request:query){ (для получения параметров пользователя используйте ^$form)}<br />
        !            74: ^info[^$SQL.connect-string]: ^if(def ${SQL.connect-string}){определена}{^info[не определена]}<br />
        !            75: ^info[^$MAIL.SMTP]: ^if(def $MAIL.SMTP){определена}{не определена}<br />
        !            76: ^info[^$CLASS_PATH]:
        !            77: ^if($CLASS_PATH is "table"){
        !            78:        <br />
        !            79:        ^try{
        !            80:                <table cellpadding="5" cellspacing="0" border="1">
        !            81:                ^CLASS_PATH.menu{
        !            82:                        <tr>
        !            83:                                <td>$CLASS_PATH.path</td>
        !            84:                                <td>^check_dir[$CLASS_PATH.path]</td>
        !            85:                        </tr>
        !            86:                }
        !            87:                </table>
        !            88:        }{
        !            89:                $exception.handled(1)
        !            90:                ^error[Неверная структура переменной ^$CLASS_PATH.]<br />В этой переменной должна быть строка или именованая таблица со столбцом path.<br />
        !            91:        }
        !            92: }{
        !            93:        ^if(def $CLASS_PATH){$CLASS_PATH &mdash^; ^check_dir[$CLASS_PATH]}{^info[не определен]}<br />
        !            94: }
        !            95: </p>
        !            96: 
        !            97: 
        !            98: 
        !            99: <h2>Демонстрация работы парсера</h2>
        !           100: 
        !           101: <h3>Демонстрация работы с cookie (класс <a href="http://www.parser.ru/docs/lang/cookieclass.htm">^$cookie</a>)</h3>
        !           102: <p>
        !           103: Чтение ^$cookie:test: ^if(def $cookie:test){$cookie:test}{не определена}<br />
        !           104: Запись в cookie значения ABC ^$cookie:test[ABC]$cookie:test[ABC] (нажмите Reload для проверки)<br />
        !           105: </p>
        !           106: 
        !           107: 
        !           108: 
        !           109: <h3>Демонстрация работы математических операторов (класс <a href="http://www.parser.ru/docs/lang/mathclass.htm">^$math</a>)</h3>
        !           110: <p>
        !           111: $math_string[СтРоКа]
        !           112: $math_salt[^$apr1^$]
        !           113: 
        !           114: $iNum1(^math:random(9)+1)
        !           115: $iNum2(^math:random(9)+1)
        !           116: ^^eval($iNum1+$iNum2): ^eval($iNum1+$iNum2)<br />
        !           117: ^^math:random(1000): ^math:random(1000)<br />
        !           118: ^^math:log(1000): ^try_exec{^math:log(1000)}<br />
        !           119: ^^math:log10(1000): ^try_exec{^math:log10(1000)}<br />
        !           120: ^^math:uuid[]: ^try_exec{^math:uuid[]}<br />
        !           121: ^^math:uid64[]: ^try_exec{^math:uid64[]}<br />
        !           122: ^^math:md5[$math_string]: ^try_exec{^math:md5[$math_string]}<br />
        !           123: ^^math:crypt[$math_string;$math_salt]: ^try_exec{^math:crypt[$math_string;$math_salt]}<br />
        !           124: ^^math:crc32[$math_string]: ^try_exec{^math:crc32[$math_string]}<br />
        !           125: </p>
        !           126: 
        !           127: 
        !           128: 
        !           129: <h3>Работа со строками (класс <a href="http://www.parser.ru/docs/lang/stringclass.htm">^$string</a>)</h3>
        !           130: <p>
        !           131: $upper[ББ]
        !           132: $lower[бб]
        !           133: $mixed[Бб]
        !           134: Задание ^$str[АбвГде]$str[АбвГде]<br />
        !           135: Длина строки ^^str.length[]: ^str.length[]<br />
        !           136: Строка в верхнем регистре ^^str.upper[]: ^str.upper[]^if(^mixed.upper[] ne $upper){ [^error[некорректное преобразование к верхнему регистру]]}<br />
        !           137: Строка в нижнем регистре ^^str.lower[]: ^str.lower[]^if(^mixed.lower[] ne $lower){ [^error[некорректное преобразование к нижнему регистру]]}<br />
        !           138: Первые 2 символа строки ^^str.left(2): ^str.left(2)<br />
        !           139: Последние 3 символа строки ^^str.right(3): ^str.right(3)<br />
        !           140: 2-4 символы строки ^^str.mid(1^;3): ^str.mid(1;3)<br />
        !           141: Поиск символа 'б' в строке ^^str.pos[б]: ^str.pos[б]<br />
        !           142: Поиск символа 'б' в строке начиная со 2 позиции ^^str.pos[б](2): ^try_exec{^str.pos[б](2)}<br />
        !           143: Поиск символа 'X' в строке ^^str.pos[X]: ^str.pos[X]<br />
        !           144: Замена комбинации символов 'вГ' на XX с помощью  ^^str.match[вГ][]{XX}: ^str.match[вГ][]{XX}<br />
        !           145: $repl[^table::create{a b
        !           146: в      Y
        !           147: Г      Z}]
        !           148: Замена комбинации символов 'в' на 'Y', 'Г' на 'Z' с помощью ^^str.replace[^$repl]: ^str.replace[$repl]<br />
        !           149: ^^str.trim[both;е]: ^try_exec{^str.trim[both;е]}<br />
        !           150: ^^str.trim[start;е]: ^try_exec{^str.trim[start;е]}<br />
        !           151: ^^str.trim[end;е]: ^try_exec{^str.trim[end;е]}<br />
        !           152: ^^str.trim[left;е]: ^try_exec{^str.trim[left;е]}<br />
        !           153: ^^str.trim[right;е]: ^try_exec{^str.trim[right;е]}<br />
        !           154: ^^str.base64[]: ^try_exec{$sBase64[^str.base64[]]$sBase64}<br />
        !           155: ^if(def $sBase64){
        !           156: #      ^^string:base64[$sBase64]: ^try_exec{^string:base64[$sBase64]}
        !           157: }
        !           158: ^^str.js-escape[]: ^try_exec{$sEscaped[^str.js-escape[]]$sEscaped}<br />
        !           159: ^if(def $sEscaped){
        !           160:        ^^str:js-unescape[$sEscaped]: ^try_exec{^string:js-unescape[$sEscaped]}<br />
        !           161: }
        !           162: </p>
        !           163: 
        !           164: 
        !           165: <h3>Работа с классом <a href="http://www.parser.ru/docs/lang/inetclass.htm">^$inet</a></h3>
        !           166: ^^inet:aton[10.0.0.2]: ^try_exec{^inet:aton[10.0.0.2]}<br />
        !           167: ^^inet:aton[192.168.1.5]: ^try_exec{^inet:aton[192.168.1.5]}<br />
        !           168: ^^inet:ntoa(167772162): ^try_exec{^inet:ntoa(167772162)}<br />
        !           169: ^^inet:ntoa(3232235781): ^try_exec{^inet:ntoa(3232235781)}<br />
        !           170: 
        !           171: 
        !           172: <h3><a name="forms">Чтение</a> значений из формы (класс <a href="http://www.parser.ru/docs/lang/formclass.htm">^$form</a>)</h3>
        !           173: <p>
        !           174: ^$form:a: ^if(def $form:a){$form:a}{не определено}<br />
        !           175: Safe преобразование ^$form:a в целое число: ^^form:a.int(1): ^form:a.int(1)<br />
        !           176: ^if($form:tables.b){
        !           177:        ^form:tables.b.menu{
        !           178:                ^form:tables.b.line[] значение ^$form:b: $form:tables.b.field
        !           179:        }[<br />]
        !           180: }{
        !           181:        ^$form:b не определено
        !           182: }
        !           183: <br />
        !           184: ^$form:qtail: ^if(def $form:qtail){$form:qtail}{не определено}<br />
        !           185: ^if(!def $form:a){
        !           186:        <a href="?a=321&b=^taint[uri][А]&b=^taint[uri][Б]&b=^taint[uri][ВГД]?ABC#forms">идем сюда чтобы проверить чтение значений формы</a>
        !           187: }
        !           188: </p>
        !           189: 
        !           190: <h3>Задание и вывод значений у объекта-хэша (класс <a href="http://www.parser.ru/docs/lang/hashclass.htm">^$hash</a>)</h3>
        !           191: <p>
        !           192: <pre>
        !           193: ^$hash1[
        !           194: &nbsp^; &nbsp^;^$.a[1]
        !           195: &nbsp^; &nbsp^;^$.b[2]
        !           196: &nbsp^; &nbsp^;^$.c[3]
        !           197: ]
        !           198: ^^hash1.foreach[key;value]{
        !           199: &nbsp^;&nbsp^;^$key=^$value
        !           200: }[&lt^;br /&gt^;]
        !           201: </pre>
        !           202: $hash1[
        !           203:        $.a[1]
        !           204:        $.b[2]
        !           205:        $.c[3]
        !           206: ]
        !           207: ^hash1.foreach[key;value]{
        !           208:        $key=$value
        !           209: }[<br />]
        !           210: 
        !           211: <br /><br />
        !           212: Проверка наличия в хеше элементов с ключём 'a' (^^hash1.contains[a]):
        !           213: ^try_exec{^if(^hash1.contains[a]){содержит элемент с ключем 'a'}{^error[не содержит элемент с ключем 'a']}}
        !           214: </p>
        !           215: 
        !           216: 
        !           217: <h3>Задание и вывод значений у объекта-таблицы (класс <a href="http://www.parser.ru/docs/lang/tableclass.htm">^$table</a>)</h3>
        !           218: <pre>^$tbl1[^^table::create{name       col1    col2
        !           219: Вася   3       5
        !           220: Дима   4       14}]</pre>
        !           221: $tbl1[^table::create{name      col1    col2
        !           222: Вася   3       5
        !           223: Дима   4       14}]
        !           224: Количество строк таблицы ^$tbl1: ^tbl1.count[]<br />
        !           225: $col[^tbl1.columns[]]
        !           226: Количество столбцов таблицы ^$tbl1: ^col.count[]<br />
        !           227: Вывод названий столбцов таблицы:<br />
        !           228: ^printTable[$col]
        !           229: 
        !           230: <p>
        !           231: Вывод значений таблицы ^$tbl1:<br />
        !           232: ^printTable[$tbl1]
        !           233: </p>
        !           234: 
        !           235: <pre>^$tbl2[^^table::create{name       col1    col2
        !           236: Вова   3       44}]</pre>
        !           237: $tbl2[^table::create{name      col1    col2
        !           238: Вова   3       44}]
        !           239: Количество строк таблицы ^$tbl2: ^tbl2.count[]<br />
        !           240: 
        !           241: 
        !           242: <p>
        !           243: join таблицы ^$tbl1 к таблице ^$tbl2 [^^tbl2.join[^$tbl1]]<br />
        !           244: ^tbl2.join[$tbl1]
        !           245: Количество строк таблицы ^$tbl2 ^^tbl2.count[]: ^tbl2.count[]<br />
        !           246: Вывод полученой таблицы:<br />
        !           247: ^printTable[$tbl2]
        !           248: </p>
        !           249: 
        !           250: <p>select и вывод строк таблицы у которых значения в столбце col1 равны 3: ^^tbl2.select(^$tbl2.col1 == 3)<br />
        !           251: ^printTable[^tbl2.select($tbl2.col1 == 3)]
        !           252: </p>
        !           253: 
        !           254: 
        !           255: <p>Получение из таблицы - хеша таблиц, где в качестве ключа выступает значение col1: ^$hData[^^tbl2.hash[col1][^$.distinct[tables]]]<br />
        !           256: ^try{
        !           257:        $hData[^tbl2.hash[col1][$.distinct[tables]]]
        !           258:        <p>Вывод полученного хеша таблиц:
        !           259:        <table cellpadding="2" cellspacing="0" border="1" width="35%">
        !           260:        <tr align="center">
        !           261:                <th>Ключ</th>
        !           262:                <th>Значение</th>
        !           263:        </tr>
        !           264:        ^hData.foreach[sKey;tValue]{
        !           265:                <tr>
        !           266:                        <td>$sKey</td>
        !           267:                        <td>^printTable[$tValue;100%]</td>
        !           268:                </tr>
        !           269:        }
        !           270:        </table>
        !           271:        </p>
        !           272: }{
        !           273:        $exception.handled(1)
        !           274:        ^error[Используется версия парсера до 3.0.8, которая не имеет данного метода]
        !           275: }
        !           276: </p>
        !           277: 
        !           278: 
        !           279: <p>Получение из таблицы - хеша строк, где в качестве ключа выступает значение столбца col2, а в качестве значения &mdash^; name: ^$hData[^^tbl2.hash[col2^;name][^$.type[string]]]<br />
        !           280: ^try{
        !           281:        $hData[^tbl2.hash[col2;name][$.type[string]]]
        !           282:        <p>Вывод полученного хеша строк:
        !           283:        <table cellpadding="2" cellspacing="0" border="1">
        !           284:        <tr align="center">
        !           285:                <th>Ключ</th>
        !           286:                <th>Значение</th>
        !           287:        </tr>
        !           288:        ^hData.foreach[sKey;sValue]{
        !           289:                <tr>
        !           290:                        <td>$sKey</td>
        !           291:                        <td>$sValue</td>
        !           292:                </tr>
        !           293:        }
        !           294:        </table>
        !           295:        </p>
        !           296: }{
        !           297:        $exception.handled(1)
        !           298:        ^error[Используется версия парсера до 3.2.2, которая не имеет данного метода]
        !           299: }
        !           300: </p>
        !           301: 
        !           302: 
        !           303: <h3>Работа с датами (класс <a href="http://www.parser.ru/docs/lang/dateclass.htm">^$date</a>)</h3>
        !           304: <p>
        !           305: ^$now[^^date::now[]]<br />
        !           306: $now[^date::now[]]
        !           307: ^$now.day/^$now.month/^$now.year ^${now.hour}:^${now.minute}:^$now.second: $now.day/$now.month/$now.year ${now.hour}:${now.minute}:$now.second<br />
        !           308: ^$now.week: ^try_exec{$now.week}<br />
        !           309: ^$now.weekyear: ^try_exec{$now.weekyear}<br />
        !           310: Вывод сегодняшней даты в sql формате ^^now.sql-string[]: ^now.sql-string[]<br />
        !           311: Вывод сегодняшней даты в виде UNIX timestamp ^^now.unix-timestamp[]: ^try_exec{^now.unix-timestamp[]}<br />
        !           312: Вывод сегодняшней даты в виде строки в формате GMT ^^now.gmt-string[]: ^try_exec{^now.gmt-string[]}<br />
        !           313: Номер последнего дня текущего месяца ^^now.last-day[]: ^try_exec{^now.last-day[]}<br />
        !           314: ^now.roll[day](-5)
        !           315: Сдвиг даты на 5 дней назад ^^now.roll[day](-5): ^printDate[$now]<br />
        !           316: ^now.roll[day](30)
        !           317: Сдвиг полученой даты на 30 дней вперед ^^now.roll[day](30): ^printDate[$now]<br />
        !           318: </p>
        !           319: 
        !           320: 
        !           321: 
        !           322: 
        !           323: <h3>Работа с файлами (класс <a href="http://www.parser.ru/docs/lang/fileclass.htm">^$file</a>)</h3>
        !           324: <p>
        !           325: $save_table_name[_test.cfg]
        !           326: $fname[$save_table_name]
        !           327: Запись таблицы ^$tbl1 в файл $save_table_name (^^tbl1.save[$fname]):
        !           328: $no_file(0)
        !           329: ^try{
        !           330:        ^tbl1.save[$fname]
        !           331:        ^info[файл успешно создан]
        !           332: }{
        !           333:        ^if($exception.type eq "file.access"){
        !           334:                $exception.handled(1)
        !           335:                $no_file(1)
        !           336:                ^error[нет доступа для записи файла]
        !           337:        }
        !           338: }
        !           339: <br />
        !           340: ^^file:dirname[/$save_table_name]: ^try_exec{^file:dirname[/$save_table_name]}<br />
        !           341: ^^file:basename[/$save_table_name]: ^try_exec{^file:basename[/$save_table_name]}<br />
        !           342: ^^file:justname[/$save_table_name]: ^try_exec{^file:justname[/$save_table_name]}<br />
        !           343: ^^file:justext[/$save_table_name]: ^try_exec{^file:justext[/$save_table_name]}<br />
        !           344: 
        !           345: </p>
        !           346: ^if(!$no_file){
        !           347:        <p>Получение параметров сохраненного файла ^$fstat[^^file::stat[$fname]]:<br />
        !           348:        $fstat[^file::stat[$fname]]
        !           349:        Размер файла, байт [^$fstat.size]: $fstat.size<br />
        !           350:        cdate: $fstat.cdate.day/$fstat.cdate.month/$fstat.cdate.year<br />
        !           351:        adate: ^printDate[$fstat.adate]<br />
        !           352:        mdate: ^printDate[$fstat.mdate]<br />
        !           353:        </p>
        !           354:                
        !           355:        <p>
        !           356:        Загрузка данных в таблицу ^$tbl3 из файла $save_table_name и вывод (^$tbl3[^^table::load[$fname]]):<br />
        !           357:        ^if(-f $fname){
        !           358:                $tbl3[^table::load[$fname]]
        !           359:                ^printTable[$tbl3]
        !           360:        }
        !           361:        </p>
        !           362:        
        !           363:        
        !           364:        <p>Копирование файла (^^file:copy[$fname^;_copy.cfg]):
        !           365:        ^try_exec{
        !           366:                ^file:copy[$fname;_copy.cfg]^info[выполнено]
        !           367:                ^try{
        !           368:                        ^file:delete[_copy.cfg]
        !           369:                }{
        !           370:                        $exception.handled(1)
        !           371:                }
        !           372:        }
        !           373:        </p>
        !           374:        
        !           375:        <p>Удаление файла (^^file:delete[$fname]):
        !           376:                ^try{
        !           377:                        ^file:delete[$fname]
        !           378:                        ^info[выполнено]
        !           379:                }{
        !           380:                        $exception.handled(1)
        !           381:                        ^error[ошибка удаления файла]
        !           382:                }
        !           383:        </p>
        !           384: }
        !           385: 
        !           386: 
        !           387: <h3>Работа с классом <a href="http://www.parser.ru/docs/lang/hashfileclass.htm">^$hashfile</a></h3>
        !           388: $hashfile_name[_test]
        !           389: <p>Создаем объект: ^$hf [^$hf[^^hashfile::open[$hashfile_name]]]: 
        !           390: ^try{
        !           391:        $hf[^hashfile::open[$hashfile_name]]
        !           392:        ^info[объект успешно создан]<br />
        !           393: 
        !           394:        $expires(3)
        !           395:        $hash1[^hf.hash[]]
        !           396:        Количество записей: ^hash1._count[]<br />
        !           397: 
        !           398:        ^try{
        !           399:                $key[^math:uuid[]]
        !           400:        }{
        !           401:                $exception.handled(1)
        !           402:                $key[^math:random(999999999)]
        !           403:        }
        !           404:        Добавление новой записи ($key) на $expires дня:
        !           405:        $value[^math:random(999999999)]
        !           406:        <pre>
        !           407:        ^$hf.[$key][
        !           408:         &nbsp^; &nbsp^;^$.value[$value]
        !           409:         &nbsp^; &nbsp^;^$.expires($expires)
        !           410:        ]
        !           411:        </pre>
        !           412:        $hf.[$key][
        !           413:                $.value[$value]
        !           414:                $.expires($expires)
        !           415:        ]
        !           416: 
        !           417:        Очистка hashfile от устаревших записей (^^hf.cleanup[]):
        !           418:        ^try_exec{^hf.cleanup[]^info[выполнено]}<br /><br />
        !           419: 
        !           420:        $limit(5)
        !           421:        Вывод содержимого (максимум $limit записей):<br />
        !           422:        $cnt(0)
        !           423:        ^hf.foreach[k;v]{^if($cnt < $limit){
        !           424:                $k=^v.format[%d]<br />
        !           425:                ^cnt.inc(1)
        !           426:        }}
        !           427:        <br />
        !           428:        
        !           429:        Закрытие файлов и снятие блокировок (^^hf.release[]):
        !           430:        ^try_exec{^hf.release[]^info[выполнено]}<br />
        !           431: }{
        !           432:        $exception.handled(1)
        !           433:        ^if($exception.type eq "file.access"){
        !           434:                ^error[нет доступа для записи файла]
        !           435:        }{
        !           436:                ^error[невозможно создать объект]
        !           437:        }
        !           438: }
        !           439: </p>
        !           440: 
        !           441: 
        !           442: <h3>Работа с переменными окружения (класс <a href="http://www.parser.ru/docs/lang/envclass.htm">^$env</a>)</h3>
        !           443: $env_table[^table::create{name description
        !           444: SERVER_NAME    DNS имя сервера
        !           445: QUERY_STRING   Для получения параметров используйте класс ^$form
        !           446: HTTP_REFERER   Откуда пришел посетитель (броузер может не передавать эту информацию)
        !           447: HTTP_USER_AGENT        Строка USER_AGENT броузера посетителя
        !           448: HTTP_X_FORWARDED_FOR   Обычно заполнена если пришли через прокси
        !           449: REMOTE_HOST
        !           450: REMOTE_ADDR    IP адрес посетителя
        !           451: PARSER_VERSION Версия парсера (если не определена, то до 3.1.5)
        !           452: }]
        !           453: 
        !           454: $is_env_defined(0)
        !           455: <table cellpadding="2" cellspacing="0" border="1">
        !           456:        <tr>
        !           457:                <th>Переменная</th>
        !           458:                <th>Значение</th>
        !           459:                <th><a href="http://hoohoo.ncsa.uiuc.edu/cgi/env.html">Комментарий</a></th>
        !           460:        </tr>
        !           461:        ^env_table.menu{
        !           462:                <tr>
        !           463:                        <td>$env_table.name</td>
        !           464:                        <td>^if(def $env:[$env_table.name]){$env:[$env_table.name]^is_env_defined.inc(1)}{<br />}</td>
        !           465:                        <td>^if(def $env_table.description){$env_table.description}{<br />}</td>
        !           466:                </tr>
        !           467:        }
        !           468: </table>
        !           469: ^if(!$is_env_defined){
        !           470:        <p>^error[Не определена ни одна из переменных окружения]</p>
        !           471: }
        !           472: 
        !           473: 
        !           474: 
        !           475: 
        !           476: <h3>Работа с SQL</h3>
        !           477: <p>
        !           478: ^if(def ${SQL.connect-string}){
        !           479:        $sSqlQuery[SELECT 2+2^if(^SQL.connect-string.left(6) eq "oracle"){ FROM DUAL}]
        !           480:        ^^int:sql{$sSqlQuery}:
        !           481:        ^try{
        !           482:                ^connect[$SQL.connect-string]{
        !           483:                        $iSqlResult(^int:sql{$sSqlQuery}[$.default{0}])
        !           484:                }
        !           485:                $iSqlResult^if($iSqlResult != 4){ [^error[Хм. Странно считает ваш SQL сервер 2+2...]]}<br />
        !           486:        
        !           487:                ^if(^SQL.connect-string.left(5) eq "mysql"){
        !           488:                        ^rem{ *** пробуем определить серверную кодировку у MySQL *** }
        !           489:                        <p>Определение серверной кодировки MySQL:
        !           490:                        ^try{
        !           491:                                $sSqlString[^SQL.connect-string.match[\?.*][]{}]
        !           492:                                ^connect[$sSqlString]{
        !           493:                                        $tVar[^table::sql{SHOW VARIABLES}]
        !           494:                                        $sRequestCharset[^request:charset.upper[]]
        !           495:                                        ^if(^tVar.locate(
        !           496:                                                (
        !           497:                                                        ^tVar.[Variable_name].upper[] eq "CHARACTER_SET"
        !           498:                                                        || ^tVar.[Variable_name].upper[] eq "CHARACTER_SET_CLIENT"
        !           499:                                                )
        !           500:                                                && def $tVar.Value
        !           501:                                        )){
        !           502:                                                $sServerCharset[^tVar.Value.upper[]]
        !           503:                                                $tReplaceCharset[^table::create{from    to^#0AKOI8_RU   KOI8-R}]
        !           504:                                                $sServerCharset[^sServerCharset.replace[$tReplaceCharset]]
        !           505:                                                ^if($sRequestCharset ne $sServerCharset){
        !           506:                                                        ^$request:charset ($request:charset) не совпадает с переменной MySQL сервера 
        !           507:                                                        character_set/character_set_client (SQL сервер вернул значение ^info[$tVar.Value]).<br />
        !           508:                                                        ^if($sServerCharset eq "LATIN1"){
        !           509:                                                                Кодировка сервера &laquo^;по умолчанию&raquo^; (latin1) не настроена для работы с русскими буквами.
        !           510:                                                                В случае, если вы планируете хранить в БД тексты на русском языке и используется MySQL сервер 
        !           511:                                                                версии 4.0 или выше, вы можете сами указывать кодировку после подключения согласно 
        !           512:                                                                <a href="http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html">документации</a>
        !           513:                                                                (выполняя после каждого соединения комманду "SET CHARACTER SET charset_name").
        !           514:                                                                Если используется более ранняя версия MySQL, то вам нужно попросить вашего администратора настроить MySQL сервер.
        !           515:                                                        }{
        !           516:                                                                Если вы уверены, что символы из кодировки $sRequestCharset могут быть без потери преобразованы
        !           517:                                                                в кодировку $sServerCharset и обратно, то в строке соединения вам нужно задать параметр: 
        !           518:                                                                ^info[?ClientCharset=$sServerCharset], при этом парсер будет перекодировать в указанную кодировку отправляемые MySQL серверу 
        !           519:                                                                запросы (из кодировки ^$request:charset), а также перекодировать полученные от него результаты обратно.
        !           520:                                                                ^if($sRequestCharset eq "WINDOWS-1251" && $sServerCharset eq "KOI8-R"){
        !           521:                                                                        <br />Однако вместо этого лучше использовать параметр ^info[?charset=cp1251_koi8], который 
        !           522:                                                                        заставит выполнять преобразования кодировок SQL сервер^if(^SQL.connect-string.match[charset=cp1251_koi8][i]){ (именно этот способ перекодирования используется в настоящий момент в строке соединения)}.
        !           523:                                                                }
        !           524:                                                        }
        !           525:                                                }{
        !           526:                                                        ^$request:charset ($request:charset) и SQL переменная character_set ($tVar.Value) совпадают,
        !           527:                                                        следовательно указывать дополнительные параметры в строке соединение не требуется.
        !           528:                                                }
        !           529:                                        }{
        !           530:                                                ^error[SQL сервер ничего не сообщает о наличии у него переменных с именами "character_set" или "character_set_client"]
        !           531:                                        }
        !           532:                                }
        !           533:                        }{
        !           534:                                $exception.handled(1)
        !           535:                                ^error[MySQL сервер неадекватно реагирует на комманду "SHOW VARIABLES"]
        !           536:                        }
        !           537:                        </p>
        !           538:                }
        !           539: 
        !           540:                ^rem{ *** пробуем преобразовать строку к верхнему регистру средствами SQL сервера *** }
        !           541:                $sLower[абвгдеёжзийклмнопрстуфхцчшщъыьэюя]
        !           542:                $sUpper[^sLower.upper[]]
        !           543:                <p>SQL преобразование строки с русским алфавитом к верхнему регистру:
        !           544:                ^try{
        !           545:                        ^connect[$SQL.connect-string]{
        !           546:                                $sSqlResult[^string:sql{SELECT UPPER('$sLower')^if(^SQL.connect-string.left(6) eq "oracle"){ FROM DUAL}}[$.default{}]]
        !           547:                        }
        !           548:                        ^if($sUpper eq $sSqlResult){
        !           549:                                преобразование прошло корректно, скорее всего кодировки настроены верно.
        !           550:                        }{
        !           551:                                ^error[преобразование было произведено не корректно.]
        !           552:                                <br />Результат: '$sSqlResult' (должно быть: '$sUpper').
        !           553:                        }
        !           554:                }{
        !           555:                        <b>синтаксис запроса не подходит для вашего SQL сервера.</b>
        !           556:                        $exception.handled(1)
        !           557:                }
        !           558:                
        !           559:                </p>
        !           560:                
        !           561:        }{
        !           562:                ^if($exception.type eq "sql.connect"){
        !           563:                        ^error[Не удается подсоединиться к SQL серверу.] Возможно неверно заданы имя/пароль в строке соединения.
        !           564:                        $exception.handled(1)
        !           565:                }{
        !           566:                        ^if($exception.type eq "sql.execute"){
        !           567:                                ^error[Не удается выполнить SQL запрос], хотя соединение прошло успешно. Непонятки, ибо запрос прост как 2+2
        !           568:                                $exception.handled(1)
        !           569:                        }{
        !           570:                                ^error[Что-то непонятное с SQL.] Возможно не положены куда надо драйвера.
        !           571:                                <br />Сообщение об ошибке:
        !           572:                                <blockquote>
        !           573:                                        ^taint[html][$exception.comment]
        !           574:                                        ^if(def $exception.source){<br /><b>^taint[html][$exception.source]</b>}
        !           575:                                </blockquote>
        !           576:                                $exception.handled(1)
        !           577:                        }
        !           578:                }
        !           579:        }
        !           580: }{
        !           581:        ^info[Не определена переменная ^$SQL.connect-string,] проверка корректности работы с базой данных невозможна.
        !           582: }
        !           583: </p>
        !           584: 
        !           585: 
        !           586: <h3>Работа с XML</h3>
        !           587: <p>
        !           588: Создание объекта типа xdoc:<br />
        !           589: ^try{
        !           590:        $xml_txt[<?xml version="1.0" encoding="$request:charset" ?>
        !           591: <document>
        !           592:        <t attr="привет" n="123"/>
        !           593:        <t attr="пока" n="234" n2="xxx"/>
        !           594:        <text>текст</text>
        !           595: </document>]
        !           596:        <pre>
        !           597:        ^taint[html][^$document[^^xdoc::create{$xml_txt}]]
        !           598:        </pre>
        !           599:        $document[^xdoc::create{$xml_txt}]
        !           600:        Объект xdoc ^info[успешно создан].<br />
        !           601:        
        !           602:        Достаем все элементы ^taint[html][<t />] ^$elements[^^document.select[//t]] :<br />
        !           603:        $elements[^document.select[//t]]
        !           604:        Количество найденых элементов: ^elements._count[]<br />
        !           605:        Вывод найденых элементов с помощью foreach (порядок произвольный):<br >
        !           606:        ^elements.foreach[key;node]{
        !           607:        nodeName: '$node.nodeName', nodeType: '$node.nodeType', кол-во аттрибутов: '^node.attributes._count[]', аттрибуты: ^node.attributes.foreach[akey;aval]{$akey='$aval.value'}[, ]
        !           608:     }[<br />]
        !           609: }{
        !           610:        ^if($exception.type eq "parser.runtime"){
        !           611:                ^error[Парсер-то надо ставить с поддержкой XML...] Или не подключены XML библиотеки... Это вам не хухры-мухры...
        !           612:                $exception.handled(1)
        !           613:        }
        !           614:        ^if($exception.type eq "xml"){
        !           615:                $no_file(1)
        !           616:                $exception.handled(1)
        !           617:                ^error[Что-то не срослось с XML-ем...] Возможно из-за кодировок...
        !           618:                <br />Сообщение об ошибке:
        !           619:                <blockquote>
        !           620:                        ^taint[html][$exception.comment]
        !           621:                        ^if(def $exception.source){<br /><b>^taint[html][$exception.source]</b>}
        !           622:                </blockquote>
        !           623:        }
        !           624: }
        !           625: </p>
        !           626: 
        !           627: 
        !           628: <h3>Работа с классами <a href="http://www.parser.ru/docs/lang/statusclass.htm">Status</a> и <a href="http://www.parser.ru/docs/lang/memoryclass.htm">Memory</a></h3>
        !           629: $fields[^table::create{section name    measure description
        !           630: rusage utime   сек     чистое время, затраченное текущим процессом
        !           631: rusage stime   сек     время, сколько система читала ваши файлы
        !           632: rusage maxrss  блоков  память, занимаемая процессом
        !           633: memory used    КБ      занято
        !           634: memory free    КБ      свободно (скорее всего фрагментирована)
        !           635: memory ever_allocated_since_compact    КБ      выделено с момента последней сборки мусора
        !           636: memory ever_allocated_since_start      КБ      выделено за все время обработки запроса
        !           637: }]
        !           638: 
        !           639: <p>
        !           640:        ^try{
        !           641:                <table cellpadding="2" cellspacing="0" border="1">
        !           642:                <tr>
        !           643:                        <th rowspan="2">Поле</th>
        !           644:                        <th rowspan="2">Описание</th>
        !           645:                        <th colspan="3">Значения</th>
        !           646:                </tr>
        !           647:                <tr>
        !           648:                        <th>на начало работы</th>
        !           649:                        <th>на текущий момент</th>
        !           650:                        <th>после ^^memory:compact[]</th>
        !           651:                </tr>
        !           652:                $status_rusage_now[$status:rusage]
        !           653:                $status_memory_now[$status:memory]
        !           654:                ^try{
        !           655:                        $tbl1[]
        !           656:                        $tbl2[]
        !           657:                        $tbl3[]
        !           658:                        $hash1[]
        !           659:                        $document[]
        !           660:                        $elements[]
        !           661:                        $tables_hash[]
        !           662:                        $hf[]
        !           663:                        $k[]
        !           664:                        $v[]
        !           665:                        
        !           666:                        ^memory:compact[]
        !           667:                        ^memory:compact[]
        !           668:                        $is_compact_work(1)
        !           669:                        $status_rusage_compact[$status:rusage]
        !           670:                        $status_memory_compact[$status:memory]
        !           671:                }{
        !           672:                        $exception.handled(1)
        !           673:                }
        !           674:                ^fields.menu{
        !           675:                        <tr>
        !           676:                                <td>^$status:${fields.section}.$fields.name^if(def $fields.measure){ ($fields.measure)}</td>
        !           677:                                <td>$fields.description</td>
        !           678:                                <td>^if($fields.section eq "rusage"){$status_rusage_begin.[$fields.name]}{$status_memory_begin.[$fields.name]}</td>
        !           679:                                <td>^if($fields.section eq "rusage"){$status_rusage_now.[$fields.name]}{$status_memory_now.[$fields.name]}</td>
        !           680:                                ^if(!$is_compact_work && ^fields.line[] == 1){
        !           681:                                        <td rowspan="^fields.count[]">^error[В установленной версии функция не реализована.]</td>
        !           682:                                }{
        !           683:                                        <td>^if($fields.section eq "rusage"){$status_rusage_compact.[$fields.name]}{$status_memory_compact.[$fields.name]}</td>
        !           684:                                }
        !           685:                        </tr>
        !           686:                }
        !           687:                </table>
        !           688:        }{
        !           689:                $exception.handled(1)
        !           690:                ^error[В установленной версии не работают ^$status:rusage или ^$status:memory]
        !           691:        }
        !           692: </p>
        !           693: #end @main[]
        !           694: 
        !           695: 
        !           696: 
        !           697: ###########################################################################
        !           698: @auto[filespec]
        !           699: ^if(def $filespec){
        !           700:        $script_dir[^trim[^filespec.match[/(?:\w+\.html?)?^$][i]{/};/]]
        !           701: }
        !           702: $document_root[^if(def $env:DOCUMENT_ROOT){$env:DOCUMENT_ROOT}{$script_dir}]
        !           703: #end @auto[]
        !           704: 
        !           705: 
        !           706: 
        !           707: 
        !           708: ###########################################################################
        !           709: # trim leading and trailing chars $char (spaces by default)
        !           710: @trim[str;char][chr;tbl]
        !           711: ^if(def $str){
        !           712:        $chr[^if(def $char){$char}{\s}]
        !           713:        $str[^str.match[^^$chr*][]{}]
        !           714:        $tbl[^str.match[^^(.*[^^$chr])$chr*^$]]
        !           715:        $result[$tbl.1]
        !           716: }{
        !           717:        $result[]
        !           718: }
        !           719: #end @trim[]
        !           720: 
        !           721: 
        !           722: 
        !           723: ###########################################################################
        !           724: @check_dir[dir]
        !           725: ^if(def $dir && -d $dir){каталог существует}{^error[каталога не существует]}
        !           726: #end @check_dir[]
        !           727: 
        !           728: 
        !           729: 
        !           730: ###########################################################################
        !           731: # get relative path to file
        !           732: @get_relative_path[from;to][ff;tt;f;t;p;up;ne;pos;i;down]
        !           733: $ff[^trim[^from.match[\\][g]{/};/]]
        !           734: $tt[^trim[^to.match[\\][g]{/};/]]
        !           735: $f[^ff.lsplit[/]]
        !           736: $t[^tt.lsplit[/]]
        !           737: 
        !           738: $p[]
        !           739: $up[/]
        !           740: $ne(0)
        !           741: $pos(0)
        !           742: ^for[i](1;^f.count[]){
        !           743:        ^if(!$ne && $f.piece eq $t.piece){
        !           744:                $p[${p}$f.piece/]
        !           745:                $pos($i)
        !           746:        }{
        !           747:                $ne($i)
        !           748:                $up[${up}../]
        !           749:        }
        !           750:        ^f.offset(1)
        !           751:        ^t.offset(1)
        !           752: }
        !           753: $down[]
        !           754: ^for[i]($pos;^t.count[]-1){
        !           755:        ^t.offset[set]($i)
        !           756:        $down[${down}$t.piece^if($i != ^t.count[]-1){/}]
        !           757: }
        !           758: $result[${up}$down]
        !           759: #end @get_relative_path[]
        !           760: 
        !           761: 
        !           762: 
        !           763: ###########################################################################
        !           764: # override unhandled_exception for show parser error (if occur) in this test
        !           765: @unhandled_exception[exception;stack]
        !           766: $response:status(500)
        !           767: <html>
        !           768: <head><title>Unhandled Exception</title></head>
        !           769: <body>
        !           770: <H1>Unhandled Exception</H1>
        !           771: <pre>^taint[html][$exception.comment]</pre>
        !           772: ^if(def $exception.source){
        !           773:        <b>$exception.source</b><br>
        !           774:        <pre>^taint[html][$exception.file^($exception.lineno^)]</pre>
        !           775: }
        !           776: ^if(def $exception.type){exception.type=$exception.type}
        !           777: ^if($stack){
        !           778:        <hr />
        !           779:        ^stack.menu{<tt>$stack.name</tt> $stack.file^($stack.lineno^)<br>}
        !           780: }
        !           781: #for [x] MSIE friendly
        !           782: <span style="font-size:1px">^for[i](0;512/7){&nbsp^;}</span>
        !           783: </body>
        !           784: #end @unhandled_exception[]
        !           785: 
        !           786: 
        !           787: 
        !           788: ###########################################################################
        !           789: @printDate[dtDate]
        !           790: $result[^if($dtDate is "date"){$dtDate.day/$dtDate.month/$dtDate.year}]
        !           791: #end @printDate[dt]
        !           792: 
        !           793: 
        !           794: 
        !           795: ###########################################################################
        !           796: @printTable[tTable;sTableWidth][tCols;sColumnWidth]
        !           797: ^if($tTable is "table" && $tTable){
        !           798:        <table cellpadding="3" cellspacing="0" border="1"^if(def $sTableWidth){ width="$sTableWidth"}>
        !           799:        $tCols[^tTable.columns[]]
        !           800:        $sColumnWidth[^eval(100/(^tCols.count[]+1))[%d]]
        !           801:        <tr>
        !           802:                <th width="^eval(100-$sColumnWidth*^tCols.count[])%">строка</th>
        !           803:                ^tCols.menu{<th width="$sColumnWidth%">$tCols.column</th>}
        !           804:        </tr>
        !           805:        ^tTable.menu{
        !           806:                <tr>
        !           807:                        <td>^tTable.line[]</td>
        !           808:                        ^tCols.menu{<td>$tTable.[$tCols.column]</td>}
        !           809:                </tr>
        !           810:        }
        !           811:        </table>
        !           812: }
        !           813: #end @printTable[]
        !           814: 
        !           815: 
        !           816: 
        !           817: ###########################################################################
        !           818: @update_pattern[text]
        !           819: ^if(def $text){
        !           820:        $result[^text.match[(\\|\.)][g]{\$match.1}]
        !           821: }{
        !           822:        $result[]
        !           823: }
        !           824: #end @update_pattern[]
        !           825: 
        !           826: 
        !           827: 
        !           828: ###########################################################################
        !           829: @error[text]
        !           830: $result[<b style="color:red">$text</b>]
        !           831: #end @error[]
        !           832: 
        !           833: 
        !           834: 
        !           835: ###########################################################################
        !           836: @info[text]
        !           837: $result[<b>$text</b>]
        !           838: #end @info[]
        !           839: 
        !           840: 
        !           841: 
        !           842: ###########################################################################
        !           843: # use postprocess for cut paths and don't show them to everyones
        !           844: @postprocess[sBody]
        !           845: $result[$sBody]
        !           846: ^if(def $sqldriversdir){$result[^result.match[^update_pattern[$sqldriversdir]][gi]{^$sqldriversdir}]}
        !           847: ^if(def $charsetsdir){$result[^result.match[^update_pattern[$charsetsdir]][gi]{^$charsetsdir}]}
        !           848: ^if(def $document_root){$result[^result.match[^update_pattern[$document_root]][gi]{закоментируйте postprocess чтобы увидеть}]}
        !           849: ^if(def $script_dir){$result[^result.match[^update_pattern[$script_dir]][gi]{закоментируйте postprocess чтобы увидеть}]}
        !           850: #end @postprocess[]
        !           851: 
        !           852: 
        !           853: 
        !           854: ###########################################################################
        !           855: # check file
        !           856: @check_system_file[path][relative_path;file_stat;path_drive;root_drive]
        !           857: ^if(def $path){
        !           858:        $path_drive[^get_drive_letter[$path]]
        !           859:        ^if(^path.left(1) ne "/" && !^path.match[^^[a-z]:\\][i]){
        !           860:                $result[относительный путь. ^info[проверка невозможна]]
        !           861:        }{
        !           862:                ^if(def $path_drive && $path_drive ne ^get_drive_letter[$document_root]){
        !           863:                        $result[^info[на другом диске, проверка невозможна]]
        !           864:                }{
        !           865:                        ^rem{ *** path начинается с X:\\ - пути win, case insensitive *** }
        !           866:                        $path[^path.match[^^[a-z]:\\(.+)][i]{^match.1.lower[]}]
        !           867:        
        !           868:                        $relative_path[^get_relative_path[$document_root;$path]]
        !           869:                        ^if(-f $relative_path){
        !           870:                                ^try{
        !           871:                                        $file_stat[^file::stat[$relative_path]]
        !           872:                                        $result[^if(!$file_stat.size){^error[$file_stat.size байт]}{$file_stat.size байт}]
        !           873:                                }{
        !           874:                                        $exception.handled(1)
        !           875:                                        $result[найден, но ^error[не доступен]]
        !           876:                                }
        !           877:                        }{
        !           878:                                $result[^error[не найден]]
        !           879:                        }
        !           880:                }
        !           881:        }
        !           882: }{
        !           883:        $result[]
        !           884: }
        !           885: #end @check_system_file[]
        !           886: 
        !           887: 
        !           888: 
        !           889: ###########################################################################
        !           890: @get_drive_letter[sPath]
        !           891: $result[]
        !           892: ^sPath.match[^^([a-z]):(?:\\|/).+][i]{$result[^match.1.lower[]]}
        !           893: #end @get_drive_letter[]
        !           894: 
        !           895: 
        !           896: 
        !           897: ###########################################################################
        !           898: # check parser3 sql lib name (many people write path to sql client lib but not parser3 lib)
        !           899: @check_p3_sql_lib_name[sFile;sPattern][tPart]
        !           900: $result(1)
        !           901: ^if(def $sFile){
        !           902:        $tPart[^sFile.rsplit[/]]
        !           903:        ^if(!^tPart.piece.match[$sPattern]){$result(0)}
        !           904: }
        !           905: #end @check_p3_sql_lib_name[]
        !           906: 
        !           907: 
        !           908: 
        !           909: ###########################################################################
        !           910: @try_exec[jCode;sErrorInfo]
        !           911: ^try{
        !           912:        $result[$jCode]
        !           913: }{
        !           914:        $exception.handled(1)
        !           915:        $result[^error[^if(def $sErrorInfo){$sErrorInfo}{Используемая версия Parser 3 не имеет данной возможности.}]]
        !           916: }
        !           917: #end @try_exec[]
        !           918: #--> Для того, чтобы данный тест заработал, в качестве обработчика документов с данным расширением должен быть установлен parser3, чего сейчас не наблюдается. #

E-mail: