|
version 1.21, 2002/03/22 11:25:05
|
version 1.64, 2002/08/07 07:32:52
|
|
Line 15 Xне сделано, видимо, не будет сделано
|
Line 15 Xне сделано, видимо, не будет сделано
|
| пустая таблица не defined |
пустая таблица не defined |
| пустой hash не defined |
пустой hash не defined |
| !eq ne lt gt le ge для сравнения строк, |
!eq ne lt gt le ge для сравнения строк, |
| !in "/dir/" для проверки[раньше ^start] |
!in "/dir/" для проверки |
| ["внутри не допустимы, если надо сравнить со сложным, |
["внутри не допустимы, если надо сравнить со сложным, |
| пусть это будет переменная]. |
пусть это будет переменная]. |
| !is 'type' для проверки типа левого операнда, |
!is 'type' для проверки типа левого операнда, |
|
Line 68 Xне сделано, видимо, не будет сделано
|
Line 68 Xне сделано, видимо, не будет сделано
|
| $exception.file $exception.lineno [если не запрещены при компиляции] |
$exception.file $exception.lineno [если не запрещены при компиляции] |
| $exception.source = вася |
$exception.source = вася |
| $exception.comment = болван |
$exception.comment = болван |
| ^if($exception.type eq connect){^cache[read]} |
|
| } |
} |
| ^case[_default]{ |
^case[_default]{ |
| код, обрабатывающий другую ошибку |
код, обрабатывающий другую ошибку |
|
Line 86 Xне сделано, видимо, не будет сделано
|
Line 85 Xне сделано, видимо, не будет сделано
|
| default as-is |
default as-is |
| !^taint[[lang]][код] |
!^taint[[lang]][код] |
| default "just tainted, language unknown" |
default "just tainted, language unknown" |
| !^process[строка, которая будет process-ed, как код] |
!^process{строка, которая будет process-ed, как код} |
| !^connect[protocol://строка соединения]]{код с ^sql[...]-ями} |
!^connect[protocol://строка соединения]]{код с ^sql[...]-ями} |
| !mysql://user:pass@{host[:port]|[/unix/socket]}/database? |
!mysql://user:pass@{host[:port]|[/unix/socket]}/database? |
| charset=cp1251_koi8& |
charset=cp1251_koi8& |
|
Line 94 Xне сделано, видимо, не будет сделано
|
Line 93 Xне сделано, видимо, не будет сделано
|
| compress=1& |
compress=1& |
| named_pipe=1 |
named_pipe=1 |
| |
|
| !pgsql://user:pass@{host[:port]|[local]}/database |
!pgsql://user:pass@{host[:port]|[local]}/database? |
| |
client_encoding=win,[to-find-out]& |
| |
datestyle=ISO,SQL,Postgres,European,NonEuropean=US,German,DEFAULT=ISO |
| |
|
| oracle://user:pass@service? |
!oracle://user:pass@service? |
| NLS_LANG=RUSSIAN_AMERICA.CL8MSWIN1251& |
NLS_LANG=RUSSIAN_AMERICA.CL8MSWIN1251& |
| NLS_LANGUAGE language-dependent conventions |
NLS_LANGUAGE language-dependent conventions |
| NLS_TERRITORY territory-dependent conventions |
NLS_TERRITORY territory-dependent conventions |
|
Line 140 odbc c:\drives\y\parser3project\odbc\
|
Line 141 odbc c:\drives\y\parser3project\odbc\
|
| /**имя_поля**/'literal' |
/**имя_поля**/'literal' |
| !^rem{} |
!^rem{} |
| !^cache[файл](секунд){код} |
!^cache[файл](секунд){код} |
| |
!относительное задание времени |
| !скэшировать строку, которая получается при выполнении кода на 'секунд' секунд |
!скэшировать строку, которая получается при выполнении кода на 'секунд' секунд |
| !если 0секунд, значит не кэшировать, а старый такой стереть |
!если 0секунд, значит не кэшировать, а старый такой стереть |
| ^cache[delete] |
!^cache[файл][expires date]{код} |
| сигнализирует вышестоящему ^cache "не кэшировать, старое забыть" |
!абсолютное задание времени |
| ^cache[read] |
X^cache[файл] удалить файл [не ругает, если его нет] // такое было, больше не будет, делать ^cache(0) |
| сигнализирует вышестоящему ^cache "взять скэшированное насильно, игнорируя expires", <br> |
!^cache(секунд) |
| выдаёт bool "получилось/нет" |
!^cache[expires date] |
| |
!сигнализирует вышестоящему ^cache "уменьши до стольких-то 'секунд'/'expires'" |
| |
!в пределе: ^cache(0) отменить кэширование |
| |
X^cache[read] |
| |
сигнализирует вышестоящему ^cache "взять скэшированное насильно, игнорируя expires", <br> |
| |
выдаёт bool "получилось/нет" |
| |
|
| |
|
| Xесть глобальный флажок в свойствах/командной строке "не оптимизировать" |
Xесть глобальный флажок в свойствах/командной строке "не оптимизировать" |
| !и есть исключение: ^untaint[html]{код} не оптимизируется безотностительно флажка |
!и есть исключение: ^untaint[html]{код} не оптимизируется |
| |
Xбезотностительно флажка |
| |
|
| !у всех макросов есть локальная переменная $result, если в неё что положить, |
!у всех макросов есть локальная переменная $result, если в неё что положить, |
| !то _это_ будет результатом макроса, а не его тело |
!то _это_ будет результатом макроса, а не его тело |
|
Line 223 odbc c:\drives\y\parser3project\odbc\
|
Line 231 odbc c:\drives\y\parser3project\odbc\
|
| !^имя.div(на сколько /) |
!^имя.div(на сколько /) |
| !^имя.mod(на сколько %) |
!^имя.mod(на сколько %) |
| !^имя.format[формат] |
!^имя.format[формат] |
| !^int/double:sql{query}[[$.limit(2) $.offset(4) $.default(0)]] |
!^int/double:sql{query}[[$.limit(2) $.offset(4) $.default{0}]] |
| запрос, результат которого должен быть один столбец/одна строка |
запрос, результат которого должен быть один столбец/одна строка |
| |
|
| !string |
!string |
|
Line 235 odbc c:\drives\y\parser3project\odbc\
|
Line 243 odbc c:\drives\y\parser3project\odbc\
|
| пример: |
пример: |
| ^if(def $form:name) не пуста? |
^if(def $form:name) не пуста? |
| ^if($user.isAlive) истина? [автопреобразование к числу, не ноль?] |
^if($user.isAlive) истина? [автопреобразование к числу, не ноль?] |
| !^string::sql{query}[[$.limit(2) $.offset(4) $.default[n/a]]] |
!^string::sql{query}[[$.limit(2) $.offset(4) $.default{n/a}]] |
| результат запроса должен быть один столбец/одна строка |
результат запроса должен быть один столбец/одна строка |
| !^имя.int[] .int(default) целочисленное значение строки. |
!^имя.int[] .int(default) целочисленное значение строки. |
| если ломается преобразование, берётся default |
если ломается преобразование, берётся default |
|
Line 264 odbc c:\drives\y\parser3project\odbc\
|
Line 272 odbc c:\drives\y\parser3project\odbc\
|
| <0 = не найдено |
<0 = не найдено |
| !^строка.replace[$таблица_подстановок_строка_на_строку] |
!^строка.replace[$таблица_подстановок_строка_на_строку] |
| !^строка.save[[append;]путь] |
!^строка.save[[append;]путь] |
| |
!^строка.normalize[] выдает другую строку, в которой фрагменты на одном языке объединены |
| |
полезно делать перед сложными match операциями, если вы знаете, что входная строка |
| |
состоит из большого числа фрагментов |
| |
|
| !table |
!table |
| в выражении |
в выражении |
| логическое значение равно "не пуста?" |
логическое значение равно "не пуста?" |
| числовое значение равно count[] |
числовое значение равно count[] |
| !^table::create[[nameless]]{данные} старое имя "set" |
!^table::create[[nameless]]{данные} старое имя "set" |
| !^table::create[table] |
!^table::create[table][[$.limit(1) $.offset(5) $.offset[cur]]] |
| клонирует таблицу |
клонирует таблицу |
| !^table::load[[nameless;]путь] |
!^table::load[[nameless;]путь] |
| !если не nameless, названия колонок берутся из первой строки |
!если не nameless, названия колонок берутся из первой строки |
| !пустые строки, и строки в первой колонке содержащие '#', игнорируются |
!пустые строки, и строки в первой колонке содержащие '#', игнорируются |
| !^table::sql{query}[[$.limit(2) $.offset(4)]] |
!^table::sql{query}[[$.limit(2) $.offset(4) todo:$.default{ ^table::create[...] }]] |
| !^таблица.save[[nameless|append;]путь] |
!^таблица.save[[nameless|append;]путь] |
| !$таблица.поле |
!$таблица.поле |
| !$таблица.fields+ из named таблицы выдаёт текущую запись как Hash |
!$таблица.fields+ из named таблицы выдаёт текущую запись как Hash |
|
Line 292 odbc c:\drives\y\parser3project\odbc\
|
Line 303 odbc c:\drives\y\parser3project\odbc\
|
| X^таблица.remove(position[;count]) - стирает запись |
X^таблица.remove(position[;count]) - стирает запись |
| из текущей позиции [стирает запись из конкретной позиции] |
из текущей позиции [стирает запись из конкретной позиции] |
| [стирает count записей] |
[стирает count записей] |
| !^таблица.join[таблица] - добавляет записи из таблицы. |
!^таблица.join[таблица][$.limit(1) $.offset(5) $.offset[cur]] - добавляет записи из таблицы. |
| таблицы должны иметь одинаковую структуру. |
таблицы должны иметь одинаковую структуру. |
| !^таблица.flip[] выдаёт транспонированную, надо куда-то сложить, потом пользовать |
!^таблица.flip[] выдаёт транспонированную, надо куда-то сложить, потом пользовать |
| !^таблица.locate[поле;значение] передвигает текущую строку, если найдёт. выдаёт bool |
!^таблица.locate[поле;значение] передвигает текущую строку, если найдёт. выдаёт bool |
|
Line 301 odbc c:\drives\y\parser3project\odbc\
|
Line 312 odbc c:\drives\y\parser3project\odbc\
|
| значением $hash.ключ будет hash в котором поля значений будут ключами |
значением $hash.ключ будет hash в котором поля значений будут ключами |
| поля значений могут быть не указаны, тогда ими будут все столбцы, включая ключевой |
поля значений могут быть не указаны, тогда ими будут все столбцы, включая ключевой |
| !^таблица.columns[]+ таблица из одного столбца $column |
!^таблица.columns[]+ таблица из одного столбца $column |
| |
!$отобранное[^таблица.select(выражение)] = таблица из тех же столбцов и строк, у которых условие совпало |
| |
$adults[^man.select($man.age>=18)] |
| |
^таблица.color[цвет1;цвет2] |
| |
|
| |
|
| !hash |
!hash |
| !в выражении |
!в выражении |
|
Line 319 odbc c:\drives\y\parser3project\odbc\
|
Line 334 odbc c:\drives\y\parser3project\odbc\
|
| !^a.intersection[b] = пересечение |
!^a.intersection[b] = пересечение |
| значения a |
значения a |
| !^a.intersects[b] = bool |
!^a.intersects[b] = bool |
| !^hash::sql{запрос}[[$.limit(2) $.offset(4)]] |
!^hash::sql{запрос}[[$.limit(2) $.offset(4) todo:$.default{$.field[]...}]] |
| получается hash(ключи=значения первая колонка ответа) |
получается hash(ключи=значения первая колонка ответа) |
| of hash(ключи=названия остальных колонкок ответа) |
of hash(ключи=названия остальных колонкок ответа) |
| !^hash._keys[]+ таблица из одного столбца $key |
!^hash._keys[]+ таблица из одного столбца $key |
|
Line 402 Xhashfile
|
Line 417 Xhashfile
|
| ^code.cache[заголовки новостей](35){....} |
^code.cache[заголовки новостей](35){....} |
| |
|
| !mail |
!mail |
| |
!$mail.received=MESSAGE: |
| |
.from |
| |
.reply-to |
| |
.subject |
| |
.date класса date |
| |
.message-id |
| |
.raw[ |
| |
.СЫРОЕ_ПОЛЬЗОВАТЕЛЬСКОЕ-ПОЛЕ-ЗАГОЛОВКА |
| |
] |
| |
$.{text|html|file#}[ << нумеруется как и в mail:send (text, text2, ...) (file, file2, ...) |
| |
$.content-type[ |
| |
$.value[{text|...|x-unknown}/{plain|html|...|x-unknown}] |
| |
[$.charset[windows-1251]] << в каком пришло, сейчас уже перекодировано |
| |
$.ПОЛЬЗОВАТЕЛЬСКИЙ-ПАРАМЕТР-ЗАГОЛОВКА |
| |
] |
| |
$.description |
| |
$.content-id |
| |
$.content-md5 |
| |
$.content-location |
| |
.raw[ |
| |
.СЫРОЕ_ПОЛЬЗОВАТЕЛЬСКОЕ-ПОЛЕ-ЗАГОЛОВКА |
| |
] |
| |
$.value[строка|FILE] |
| |
] |
| |
$.message#[MESSAGE] (message, message2, ...) |
| |
|
| |
!^mail:send[ |
| |
$.charset[кодировка заголовка и текстовых блоков] |
| |
$.any-header-field |
| |
$.text[string] |
| |
$.text[ |
| |
$.any-header-field |
| |
$.value[string] |
| |
] |
| |
$.html{string} |
| |
$.html[ |
| |
$.any-header-field |
| |
$.value{string} |
| |
] |
| |
$.file#[FILE] |
| |
$.file#[ |
| |
$.any-header-field |
| |
$value[FILE] |
| |
] |
| |
] |
| |
!если charset указан, письмо перекодируется в этот charset |
| |
!content-type.charset не влияет на перекодирование |
| |
!после имени части может идти # число |
| |
^mail:send[ |
| |
# по-умолчанию, совпадает с source encoding. |
| |
# задаёт кодировку body |
| |
$.charset[windows-1251] |
| |
# нет умолчания |
| |
$.content-type[$.value[text/plain] $.charset[windows-1251]] |
| |
$.from["вася" <vasya@design.ru>] |
| |
$.to["петя" <petya@design.ru>] |
| |
$.subject[пойдём пивка] |
| |
$.body[ |
| |
слова |
| |
] |
| |
] |
| !:send[$.header-field[] $.charset[кодировка письма] $.body[когда body не строка, |
!:send[$.header-field[] $.charset[кодировка письма] $.body[когда body не строка, |
| а hash, отсылается multipart письмо]] |
а hash, отсылается multipart письмо]] |
| !если charset указан, письмо перекодируется в этот charset |
!если charset указан, письмо перекодируется в этот charset |
| !content-type.charset не влияет на перекодирование |
!content-type.charset не влияет на перекодирование |
| |
!после имени части может идти целое число, части пойдут в порядке чисел. |
| !если body указан строкой, то это текст письма, никаких вложений. |
!если body указан строкой, то это текст письма, никаких вложений. |
| !если body указан hash, то это части, будут собраны текстовые блоки, затем вложения |
!если body указан hash, то это части, будут собраны текстовые блоки, затем вложения |
| |
!это старый формат, поддерживается для обратной совместимости |
| !если имя части начинается со слова text, то это текстовый блок. |
!если имя части начинается со слова text, то это текстовый блок. |
| !если имя части начинается со слова attach, то это вложение, формат задания:: |
!если имя части начинается со слова attach, то это вложение, формат задания:: |
| !$attach[$.format[!uue|Xbase64] $.value[DATA] $.file-name[user-file-name]] |
!$attach[$.format[!uue|Xbase64] $.value[DATA] $.file-name[user-file-name]] |
| !после имени части может идти целое число, части пойдут в порядке чисел. |
|
| !важно: при multipart не указывать content-type |
!важно: при multipart не указывать content-type |
| ^mail:send[ |
^mail:send[ |
| # по-умолчанию, совпадает с source encoding. |
# по-умолчанию, совпадает с source encoding. |
|
Line 514 Xhashfile
|
Line 591 Xhashfile
|
| возвращённый заголовок рассыпается на $поля |
возвращённый заголовок рассыпается на $поля |
| $status |
$status |
| $stderr |
$stderr |
| !^file::exec[имя файла[;env hash[;1cmd[;2line[;3ar[;4g[;5s;...under win32 max 10 args]]]]]]] |
!^file::exec[имя файла[;env hash $.stdin[текст][;1cmd[;2line[;3ar[;4g[;5s;...under win32 max 10 args]]]]]]] |
| !^file:move[старое имя файла;новое имя файла] |
!^file:move[старое имя файла;новое имя файла] |
| можно переименовывать и двигать каталоги[win32: но не через границу дисков] |
можно переименовывать и двигать каталоги[win32: но не через границу дисков] |
| каталоги для dest создаются с правами 775 |
каталоги для dest создаются с правами 775 |
|
Line 524 Xhashfile
|
Line 601 Xhashfile
|
| блокируется |
блокируется |
| выполняется код |
выполняется код |
| разблокируется |
разблокируется |
| |
Xchmod[...] НЕТ И НЕ БУДЕТ, ЧТОБЫ НЕ МОГЛИ СДЕЛАТЬ executable и запустить, даже если ftp запрещает chmod. |
| |
!^file:dirname[/a/some.tar.gz]=/a |
| |
!^file:dirname[/a/b/]=/a |
| |
!^file:basename[/a/some.tar.gz]=some.tar.gz |
| |
!^file:justname[/a/some.tar.gz]=some.tar |
| |
!^file:justext[/a/some.tar.gz]=gz |
| |
|
| !math |
math |
| !$math:PI |
!$math:PI |
| !^math:round floor ceiling |
!^math:round floor ceiling |
| !^math:trunc frac |
!^math:trunc frac |
|
Line 535 Xhashfile
|
Line 618 Xhashfile
|
| !^math:degrees radians |
!^math:degrees radians |
| !^math:pow sqrt |
!^math:pow sqrt |
| !^math:random(ширина диапазона) |
!^math:random(ширина диапазона) |
| |
^math:GUID {C2C0983C-E26E-4169-BD07-77ECE9405BA5} |
| |
!^math:crypt[password;salt] |
| |
salt prefix $apr1$ вызывает встроенный MD5 алгоритм, |
| |
если нет тела salt, оно создаётся случайным |
| |
$1$ вызывает MD5 алгоритм функции OS 'crypt', если поддерживается [заведомо нет на solaris]. |
| |
другие salt читайте документацию по функции OS 'crypt'. |
| |
|
| !date |
!date |
| !время типа time можно использовать в выражениях, подставляет |
!время типа time можно использовать в выражениях, подставляет |
|
Line 542 Xhashfile
|
Line 631 Xhashfile
|
| !всё происходит в localtime, |
!всё происходит в localtime, |
| !временная зона задаётся вне parser средствами OS |
!временная зона задаётся вне parser средствами OS |
| !^date::now[] |
!^date::now[] |
| |
!^date::now(смещение в днях) выдаёт сейчас+смещение |
| !^date::create(дней с epoch) // старое имя set |
!^date::create(дней с epoch) // старое имя set |
| !^date::create(year;month;day[;hour[;minute[;second]]]) // старое имя set |
!^date::create(year;month[;day[;hour[;minute[;second]]]]) // старое имя set |
| !$date.year month day hour minute second weekday read-only |
!^date::create[дата в формате %Y-%m-%d %H:%M:%S] |
| !^date.roll[year|month|day](+/- 1) сдвигает дату |
для удобного создания по значению из базы |
| |
формат1: %Y[-%m[-%d[ %H[:%M[:%S]]]]] |
| |
формат2: %H:%M[:%S] |
| |
!$date.year month day hour minute second weekday todo:yearday |
| |
read-only |
| |
!^date.roll[year|month|day](+-смещение) сдвигает дату |
| |
возможно, флажок, подправляющий день |
| !^date.sql-string[] %Y-%m-%d %H:%M:%S |
!^date.sql-string[] %Y-%m-%d %H:%M:%S |
| where published='$дата.sql-string[]' |
where published='$дата.sql-string[]' |
| !^date:calendar[rus|eng;год;месяц] выдаёт неименованную таблицу |
!^date:calendar[rus|eng;год;месяц] выдаёт неименованную таблицу |
| столбцы: 0..6 |
столбцы: 0..6, week |
| !^date:calendar[rus|eng;год;месяц;день] выдаёт именнованную таблицу |
!^date:calendar[rus|eng;год;месяц;день] выдаёт именнованную таблицу |
| столбцы: year, month, day, weekday |
столбцы: year, month, day, weekday |
| |
|
|
Line 581 xdoc(xnode)
|
Line 677 xdoc(xnode)
|
| !равно текущей кодировке выходной страницы, |
!равно текущей кодировке выходной страницы, |
| $response:charset |
$response:charset |
| ::sql{...} |
::sql{...} |
| !::create{<string/>} старое имя 'set' |
!::create[[URI]]{<?xml?><string/>} старое имя 'set' |
| !::create[qualifiedName] |
!::create[[URI]][qualifiedName] |
| |
URI default = disk path to requested document |
| |
для каталогов конечный / обязателен |
| !::load[file.xml] |
!::load[file.xml] |
| !.transform[rules.xsl][[params hash]] выдаёт dom |
!.transform[rules.xsl|xdoc][[params hash]] выдаёт dom |
| шаблон кэшируется, кэш обновляется при изменении даты файла шаблона, |
шаблон кэшируется, кэш обновляется при изменении даты файла шаблона, |
| или изменении даты файла "имя шаблона.stamp"[проверка даты stamp приоритетнее] |
или изменении даты файла "имя шаблона.stamp"[проверка даты stamp приоритетнее] |
| <xsl:output |
<xsl:output |
|
Line 600 xdoc(xnode)
|
Line 698 xdoc(xnode)
|
| !cdata-section-elements = qnames |
!cdata-section-elements = qnames |
| !indent = "yes" | "no" |
!indent = "yes" | "no" |
| !media-type = string /> |
!media-type = string /> |
| |
!параметры передаются как есть, не xpath выражения |
| |
|
| !.string[output options] |
!.string[[output options]] |
| !.save[file.xml;output options] с шапкой |
!.save[file.xml[;output options]] с шапкой |
| !.file[output options] = file |
!.file[[output options]] = file |
| output options идентичны атрибутам xsl:output |
output options идентичны атрибутам xsl:output |
| [исключение: игнорируется cdata-section-elements, нужно будет, сделаю] |
[исключение: игнорируется cdata-section-elements, нужно будет, сделаю] |
| выдаёт media-type при подстановке $response:body[сюда] |
выдаёт media-type при подстановке $response:body[сюда] |
|
Line 640 xdoc(xnode)
|
Line 739 xdoc(xnode)
|
| true if the attribute received its value explicitly in the XML document, |
true if the attribute received its value explicitly in the XML document, |
| or if a value was assigned programatically with the setValue function. |
or if a value was assigned programatically with the setValue function. |
| false if the attribute value came from the default value declared in the document's DTD. |
false if the attribute value came from the default value declared in the document's DTD. |
| |
!$attribute_node.name |
| |
!$attribute_node.value |
| $text_node/cdata_node/comment_node.substringData |
$text_node/cdata_node/comment_node.substringData |
| !$pi_node.target = target of this processing instruction |
!$pi_node.target = target of this processing instruction |
| XML defines this as being the first token following the markup |
XML defines this as being the first token following the markup |
| that begins the processing instruction. |
that begins the processing instruction. |
| |
!$pi_node.data = The content of this processing instruction |
| |
This is from the first non white space character after the target |
| |
to the character immediately preceding the ?>. |
| document_node. |
document_node. |
| readonly attribute DocumentType doctype |
readonly attribute DocumentType doctype |
| readonly attribute DOMImplementation implementation |
readonly attribute DOMImplementation implementation |
|
Line 670 xdoc(xnode)
|
Line 774 xdoc(xnode)
|
| !void removeAttribute(in DOMString name) raises(DOMException) |
!void removeAttribute(in DOMString name) raises(DOMException) |
| !Attr getAttributeNode(in DOMString name) |
!Attr getAttributeNode(in DOMString name) |
| !Attr setAttributeNode(in Attr newAttr) raises(DOMException) |
!Attr setAttributeNode(in Attr newAttr) raises(DOMException) |
| !/*Attr*/ removeAttributeNode(in Attr oldAttr) raises(DOMException) |
!Attr removeAttributeNode(in Attr oldAttr) raises(DOMException) |
| !NodeList getElementsByTagName(in DOMString name) |
!NodeList getElementsByTagName(in DOMString name) |
| !void normalize() |
!void normalize() |
| |
|
|
Line 683 xdoc(xnode)
|
Line 787 xdoc(xnode)
|
| !^node.select[xpath/query/expression] = array of nodes, |
!^node.select[xpath/query/expression] = array of nodes, |
| empty array if nothing found |
empty array if nothing found |
| !^node.selectSingle[xpath/query/expression] = first node if any |
!^node.selectSingle[xpath/query/expression] = first node if any |
| !^node.selectBool[xpath/query/expression] = bool if any |
!^node.selectBool[xpath/query/expression] = bool if any or die |
| !^node.selectNumber[xpath/query/expression] = double if any |
!^node.selectNumber[xpath/query/expression] = double if any or die |
| !^node.selectString[xpath/query/expression] = string if any |
!^node.selectString[xpath/query/expression] = string if any or die |
| |
|
| !error codes(пока придут как текст в случае соответствующих ошибок): |
!error codes(пока придут как текст в случае соответствующих ошибок): |
| INDEX_SIZE_ERR |
INDEX_SIZE_ERR |
|
Line 760 xdoc(xnode)
|
Line 864 xdoc(xnode)
|
| !idrss integral unshared data size |
!idrss integral unshared data size |
| !isrss integral unshared stack size |
!isrss integral unshared stack size |
| |
|
| |
!DATA::=string | file |
| |
|
| !MAIN |
!MAIN |
| это класс, загружаемый на автомате из parser3.conf, |
это класс, загружаемый на автомате из parser3.conf, |
| кучи auto.p и запрашиваемого документа: |
кучи auto.p и запрашиваемого документа: |
| !parser3.conf |
!parser3.conf |
| cgi: |
cgi: |
| 1.0) полный путь из переменной окружения PARSER_ROOT_CONFIG |
1. или полный путь из переменной окружения CGI_PARSER_SITE_CONFIG |
| 1.1) configure sysconfdir|windows directory |
или рядом с бинарником parser'а |
| 2)рядом с бинарником parser'а |
|
| isapi: windows directory |
isapi: windows directory |
| apache module: |
apache module: |
| 1) ParserRootConfig [httpd.conf only] |
1) ParserConfig [can be in .htaccess] |
| 2) ParserSiteConfig [can be in .htaccess] |
|
| !auto.p вниз от DOCUMENT_ROOT/ по дереву до каталога с обрабатываемым файлом включительно |
!auto.p вниз от DOCUMENT_ROOT/ по дереву до каталога с обрабатываемым файлом включительно |
| класс собирается из всех этих файлов, последующие становятся родителями предыдущих |
класс собирается из всех этих файлов, последующие становятся родителями предыдущих |
| имя последнего загруженного MAIN, имён у предыдущих нет |
имя последнего загруженного MAIN, имён у предыдущих нет |
|
Line 780 xdoc(xnode)
|
Line 884 xdoc(xnode)
|
| !результат которого передаётся в его @post-process[data] if($data is string) ... |
!результат которого передаётся в его @post-process[data] if($data is string) ... |
| !результат которого отдаётся пользователю |
!результат которого отдаётся пользователю |
| |
|
| !если встречается ошибка и try не задан, её можно красиво сообщить пользователю, |
!если встречается ошибка и try не задан, её можно красиво сообщить пользователю, |
| !определив |
!определив |
| !@unhandled_exception[exception;stack] |
!@unhandled_exception[exception;stack] |
| !$exception.type строка "тип проблемы" |
!$exception.type строка "тип проблемы" |
|
Line 791 xdoc(xnode)
|
Line 895 xdoc(xnode)
|
| там лежат в обратном порядке имена[name] и места вызовов[file line] |
там лежат в обратном порядке имена[name] и места вызовов[file line] |
| операторов/методов, приведших к ошибке. |
операторов/методов, приведших к ошибке. |
| |
|
| !нужно выключить русский apache: CharsetDisable on |
!системные типы ошибок: |
| |
!parser.compile ^test[} компиляция (непарная скобка, ...) |
| |
!parser.runtime ^if(0). параметры (больше/меньше, чем нужно, не тех типов, ...) |
| !DATA::=string | file |
!number.zerodivision ^eval(1/0) ^eval(1%0) |
| |
!number.format ^eval(abc*5) |
| |
!file.lock shared/exclusive lock error |
| |
!file.missing ^file:delete[delme] not found |
| |
!file.access ^table::load[.] no rights |
| |
!image.format ^image::measure[index.html] not gif/jpg |
| |
!sql.connect ^connect[mysql://baduser:pass@host/db]{} not found/timeout |
| |
!sql.execute ^void:sql{select bad} syntax error |
| |
sql.duplicate |
| |
sql.access |
| |
sql.missing |
| |
sql.xxx [serge asked] |
| |
!xml ^xdoc::create{<forgot?>} any error in xml/xslt libs |
| |
!smtp.connect not found/timeout |
| |
!smtp.execute communication error |
| |
!email.format hren tam@null.ru wrong email format(bad chars/empty) |
| |
|
| |
!нужно выключить русский apache: CharsetDisable on |
| |
|
| --- |
!если в MAIN будет определён флаг $ORIGINS(1) то вместо обычного вывода страницы будет |
| если в MAIN будет определён флаг $ORIGINS(1) то вместо обычного вывода страницы будет |
|
| выдан список фрагментов результата с указанием их происхождения |
выдан список фрагментов результата с указанием их происхождения |