|
|
| version 1.63, 2002/08/06 14:25:36 | version 1.125, 2003/11/04 12:04:39 |
|---|---|
| Line 5 Xне сделано, видимо, не будет сделано | Line 5 Xне сделано, видимо, не будет сделано |
| операторы | операторы |
| !^eval(выражение)[формат] выражение, кроме обычных функций:: | !^eval(выражение)[формат] выражение, кроме обычных функций:: |
| !допустимы #комментарии | |
| работают до конца строки или закрывающейся круглой скобки | |
| внутри комментария допустимы вложенные круглые скобки | |
| !из неочевидных операторов: | !из неочевидных операторов: |
| # побитный xor | !| побитный xor |
| ## логический xor | !|| логический xor |
| ~ побитное отрицание | ~ побитное отрицание |
| \ целочисленное деление 10\3=3 | \ целочисленное деление 10\3=3 |
| !def для проверки defined, | !def для проверки defined, |
| пустая строка не defined | пустая строка не defined |
| пустая таблица не defined | пустая таблица не defined |
| пустой hash не defined | пустой hash не defined |
| ^if(method $hash.delete){yes} | |
| !eq ne lt gt le ge для сравнения строк, | !eq ne lt gt le ge для сравнения строк, |
| !in "/dir/" для проверки | !in "/dir/" для проверки |
| ["внутри не допустимы, если надо сравнить со сложным, | ["внутри не допустимы, если надо сравнить со сложным, |
| Line 27 Xне сделано, видимо, не будет сделано | Line 31 Xне сделано, видимо, не будет сделано |
| !числовой литерал бывает 0xABC | !числовой литерал бывает 0xABC |
| !приоритеты: | !приоритеты: |
| /* logical */ | /* logical */ |
| %left "##" | %left "!||" |
| %left "||" | %left "||" |
| %left "&&" | %left "&&" |
| %left '<' '>' "<=" ">=" "lt" "gt" "le" "ge" | %left '<' '>' "<=" ">=" "lt" "gt" "le" "ge" |
| %left "==" "!=" "eq" "ne" | %left "==" "!=" "eq" "ne" |
| %left "is" "def" "in" "-f" "-d" | %left "is" "def" "in" "-f" "-d" |
| %left '!' | %left '!' |
| условие ? когдаДа: когдаНет | |
| /* bitwise */ | /* bitwise */ |
| %left '#' | %left '!|' |
| %left '|' | %left '|' |
| %left '&' | %left '&' |
| %left '~' | %left '~' |
| Line 45 Xне сделано, видимо, не будет сделано | Line 50 Xне сделано, видимо, не будет сделано |
| %left '-' '+' | %left '-' '+' |
| %left '*' '/' '%' '\\' | %left '*' '/' '%' '\\' |
| %left NEG /* negation: unary - */ | %left NEG /* negation: unary - */ |
| !^if(условие){когда да}{когда нет} | !^if(условие){когда да}{когда нет} |
| !^switch[значение]{^case[вариант1[;вариант2...]]{действие}^case[DEFAULT]{действие по умолчанию}} | !^switch[значение]{^case[вариант1[;вариант2...]]{действие}^case[DEFAULT]{действие по умолчанию}} |
| !^while(условие){тело} | !^while(условие){тело} |
| Line 85 Xне сделано, видимо, не будет сделано | Line 92 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[[$caller.CLASS|$object|$КЛАСС:CLASS]]{строка, которая будет process-ed, как код}[во что переименовать @main] |
| !^process..[путь][во что переименовать @main] | |
| по умолчанию, методы компилируются в $self [в случае оператора, $self=$MAIN:CLASS] | |
| !^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 160 odbc c:\drives\y\parser3project\odbc\ | Line 169 odbc c:\drives\y\parser3project\odbc\ |
| !и есть исключение: ^untaint[html]{код} не оптимизируется | !и есть исключение: ^untaint[html]{код} не оптимизируется |
| Xбезотностительно флажка | Xбезотностительно флажка |
| !у всех макросов есть локальная переменная $result, если в неё что положить, | !у всех методов есть локальная переменная $result, если в неё что положить, |
| !то _это_ будет результатом макроса, а не его тело | !то _это_ будет результатом макроса, а не его тело |
| !у всех методов есть локальная переменная $caller, в ней лежит родительский stack frame, | |
| !если туда записать | |
| !use(^use или @USE) ищет файл... | !use(^use или @USE) ищет файл... |
| !1. ...если путь начинается с /, то считается, что это путь от корня веб пространства | !1. ...если путь начинается с /, то считается, что это путь от корня веб пространства |
| Line 216 odbc c:\drives\y\parser3project\odbc\ | Line 227 odbc c:\drives\y\parser3project\odbc\ |
| !void | !void |
| !^имя.length[] | |
| 0 | |
| !^имя.pos[...] | |
| -1 | |
| !^имя.int[] (default) | !^имя.int[] (default) |
| 0 или default | 0 или default |
| !^имя.double[] (default) | !^имя.double[] (default) |
| Line 243 odbc c:\drives\y\parser3project\odbc\ | Line 258 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(1) $.offset(4) $.default{n/a}]] |
| результат запроса должен быть один столбец/одна строка | результат запроса должен быть один столбец/одна строка |
| !^имя.int[] .int(default) целочисленное значение строки. | !^имя.int[] .int(default) целочисленное значение строки. |
| если ломается преобразование, берётся default | если ломается преобразование, берётся default |
| Line 257 odbc c:\drives\y\parser3project\odbc\ | Line 272 odbc c:\drives\y\parser3project\odbc\ |
| s singleline = $ считается концом всего текста | s singleline = $ считается концом всего текста |
| m multiline = $ считается концом строки[\n], не концом всего текста | m multiline = $ считается концом строки[\n], не концом всего текста |
| g найти все вхождения, а не одно | g найти все вхождения, а не одно |
| ' создавать столбцы prematch, match, postmatch | |
| !^строка.match[шаблон][опции поиска]{замена} | !^строка.match[шаблон][опции поиска]{замена} |
| опции поиска+= | опции поиска+= |
| g заменить все вхождения, а не одно | g заменить все вхождения, а не одно |
| !^строка.split[разделитель][[lrhv]] | |
| l слева направо [default] | |
| r справа налево | |
| h nameless таблица | |
| v таблица из столбца piece [default] | |
| !^строка.{l|r}split[разделитель] таблица из столбца $piece | !^строка.{l|r}split[разделитель] таблица из столбца $piece |
| оставлен для совместимости | |
| !^строка.upper|lower[] | !^строка.upper|lower[] |
| X^строка.truncate(предел терпенья) стиль :( | X^строка.truncate(предел терпенья) стиль :( |
| !^строка.length[] | !^строка.length[] |
| Line 281 odbc c:\drives\y\parser3project\odbc\ | Line 303 odbc c:\drives\y\parser3project\odbc\ |
| логическое значение равно "не пуста?" | логическое значение равно "не пуста?" |
| числовое значение равно count[] | числовое значение равно count[] |
| !^table::create[[nameless]]{данные} старое имя "set" | !^table::create[[nameless]]{данные} старое имя "set" |
| !^table::create[table][[$.limit(1) $.offset(5) $.offset[cur]]] | !^table::create[table][[$.limit(1) $.offset(5) $.offset[cur] $.reverse(1)]] |
| клонирует таблицу | клонирует таблицу |
| !^table::load[[nameless;]путь] | reverse << сзаду на перёд (работает пока только в locate, в table::create НЕ работает) |
| !^table::load[[nameless;]путь[;опции]] | |
| !если не nameless, названия колонок берутся из первой строки | !если не nameless, названия колонок берутся из первой строки |
| !пустые строки, и строки в первой колонке содержащие '#', игнорируются | !пустые строки, и строки в первой колонке содержащие '#', игнорируются |
| !$.separator[^#09] | |
| !$.encloser["] по-умолчанию, нет. | |
| !^table::sql{query}[[$.limit(2) $.offset(4) todo:$.default{ ^table::create[...] }]] | !^table::sql{query}[[$.limit(2) $.offset(4) todo:$.default{ ^table::create[...] }]] |
| !^таблица.save[[nameless|append;]путь] | !^таблица.save[[nameless|append;]путь[;опции, см. load]] |
| !$таблица.поле | !$таблица.поле |
| !$таблица.fields+ из named таблицы выдаёт текущую запись как Hash | !$таблица.fields из named таблицы выдаёт текущую запись как Hash |
| !^таблица.menu{тело}[разделитель] | !^таблица.menu{тело}[разделитель] |
| !^таблица.offset[[whence]](5) сдвигает; без параметра - печатает offset | !^таблица.offset[[whence]](5) сдвигает; без параметра - печатает offset |
| !whence=cur|set | !whence=cur|set |
| Line 303 odbc c:\drives\y\parser3project\odbc\ | Line 328 odbc c:\drives\y\parser3project\odbc\ |
| X^таблица.remove(position[;count]) - стирает запись | X^таблица.remove(position[;count]) - стирает запись |
| из текущей позиции [стирает запись из конкретной позиции] | из текущей позиции [стирает запись из конкретной позиции] |
| [стирает count записей] | [стирает count записей] |
| !^таблица.join[таблица][$.limit(1) $.offset(5) $.offset[cur]] - добавляет записи из таблицы. | !^таблица.join[таблица][$.limit(1) $.offset(5) $.offset[cur]] - добавляет записи из таблицы. |
| таблицы должны иметь одинаковую структуру. | таблицы должны иметь одинаковую структуру. |
| !^таблица.flip[] выдаёт транспонированную, надо куда-то сложить, потом пользовать | !^таблица.flip[] выдаёт транспонированную, надо куда-то сложить, потом пользовать |
| !^таблица.locate[поле;значение] передвигает текущую строку, если найдёт. выдаёт bool | !^таблица.locate[поле;значение][[$.limit(1) $.offset(5) $.offset[cur] $.reverse(1)]] |
| !^таблица.locate(логическое выражение) передвигает текущую строку, если найдёт. выдаёт bool | передвигает текущую строку, если найдёт. выдаёт bool |
| !^таблица.hash[поле, что будет ключом][[поле значений|table поля значений]]+ | !^таблица.locate(логическое выражение)[[$.limit(1) $.offset(5) $.offset[cur] $.reverse(1)]] |
| передвигает текущую строку, если найдёт. выдаёт bool | |
| !^таблица.hash{[поле]|{код}|(выражение)}[[поле значений|table поля значений]][[$.distinct(1) $.distinct[tables]]] | |
| значением $hash.ключ будет hash в котором поля значений будут ключами | значением $hash.ключ будет hash в котором поля значений будут ключами |
| поля значений могут быть не указаны, тогда ими будут все столбцы, включая ключевой | поля значений могут быть не указаны, тогда ими будут все столбцы, включая ключевой |
| если distinct содержит true, то не будет ошибки при повторяющихся ключах | |
| если distinct содержит tables, то будет создан hash из таблиц, содержащих строки с ключом | |
| !^таблица.columns[]+ таблица из одного столбца $column | !^таблица.columns[]+ таблица из одного столбца $column |
| !$отобранное[^таблица.select(выражение)] = таблица из тех же столбцов и строк, у которых условие совпало | !$отобранное[^таблица.select(выражение)] = таблица из тех же столбцов и строк, у которых условие совпало |
| $adults[^man.select($man.age>=18)] | $adults[^man.select($man.age>=18)] |
| ^таблица.color[цвет1;цвет2] | ^таблица.color[цвет1;цвет2] |
| !hash | !hash |
| Line 324 odbc c:\drives\y\parser3project\odbc\ | Line 353 odbc c:\drives\y\parser3project\odbc\ |
| !$hash.ключ | !$hash.ключ |
| !_default - специальный ключ, если задан, | !_default - специальный ключ, если задан, |
| то при обращении по ключу, которому нет соответствия, выдаётся _default значение | то при обращении по ключу, которому нет соответствия, выдаётся _default значение |
| !$hash.fields выдает $hash. чтобы класс hash был чуть больше похож на класс table | |
| !^hash::create[[!copy_from_hash|Xcopy_from_hashfile]] | !^hash::create[[!copy_from_hash|Xcopy_from_hashfile]] |
| создаёт новый hash, копию старого | создаёт новый hash, копию старого |
| !^hash.add[слагаемое] | !^hash.add[слагаемое] |
| Line 334 odbc c:\drives\y\parser3project\odbc\ | Line 364 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) todo:$.default{$.field[]...}]] | !^hash::sql{запрос}[[$.distinct(1) $.limit(2) $.offset(4) todo:$.default{$.field[]...}]] |
| получается hash(ключи=значения первая колонка ответа) | получается hash(ключи=значения первая колонка ответа) |
| of hash(ключи=названия остальных колонкок ответа) | of hash(ключи=названия остальных колонкок ответа) |
| !^hash._keys[]+ таблица из одного столбца $key | !^hash._keys[]+ таблица из одного столбца $key |
| Line 345 odbc c:\drives\y\parser3project\odbc\ | Line 375 odbc c:\drives\y\parser3project\odbc\ |
| !form | !form |
| [берётся первый элемент из одноимённых из GET, потом первый из POST] | [берётся первый элемент из одноимённых из GET, потом первый из POST] |
| !$form:поле = string/file | !$form:поле = string/file |
| !$form:nameless = поле со значением поля без имени "?value&...", "...&value&...", "...&value" | |
| !$form:qtail = строка со значением текста после второго "?xxxxx", если там не было ',' [imap] | |
| !$form:fields = hash со всеми полями формы | !$form:fields = hash со всеми полями формы |
| !$form:tables.поле = table с одним столбцом "field" со значениями "поля" | !$form:tables.поле = table с одним столбцом "field" со значениями "поля" |
| !$form:imap = хэш с ключами 'x' и 'y' | |
| со значением ?1,2 приписки при использовании server-site image map | |
| !env | !env |
| !$env:переменная | !$env:переменная |
| Line 354 odbc c:\drives\y\parser3project\odbc\ | Line 388 odbc c:\drives\y\parser3project\odbc\ |
| !cookie | !cookie |
| !$cookie:имя считать старое или свежезаданное | !$cookie:имя считать старое или свежезаданное |
| !$cookie:имя[значение] на 90 дней | !$cookie:имя[значение] на 90 дней |
| !$cookie:имя[$.value[значение] $.expires(дней, 0дней=session)] | !$cookie:имя[$.value[значение] $.expires ЗНАЧЕНИЕ ] |
| !значение поля expires может быть 'session', date, или число дней(0дней=session) | |
| ! если дата, она будет преобразована к формату "Sun, 25-Aug-2002 12:03:45 GMT" | |
| !request | !request |
| !$request:query | !$request:query |
| !$request:body unprocessed POST request body | |
| !$request:uri | !$request:uri |
| !$request:document-root | |
| каталог, относительно которого считаются пути в parser, по-умолчанию = $env:DOCUMENT_ROOT | |
| можно изменить, если на hosting что-то неудобно настроено | |
| X!$request:browser это hash, поля: | X!$request:browser это hash, поля: |
| !$type = ie/nn и !$version = номер, скажем 5.5 | !$type = ie/nn и !$version = номер, скажем 5.5 |
| X$request:user | X$request:user |
| Line 374 odbc c:\drives\y\parser3project\odbc\ | Line 414 odbc c:\drives\y\parser3project\odbc\ |
| !значение может быть string а может быть hash: | !значение может быть string а может быть hash: |
| ! $value[abc] field: {abc}<<часть | ! $value[abc] field: {abc}<<часть |
| ! $attribute[zzz] field: abc; {attribute=zzz}<<часть | ! $attribute[zzz] field: abc; {attribute=zzz}<<часть |
| !значение поля или атрибута может быть string или date | |
| ! если дата, она будет преобразована к формату "Sun, 25-Aug-2002 12:03:45 GMT" | |
| !$response:body[DATA] замещает стандартный ответ | !$response:body[DATA] замещает стандартный ответ |
| !$response:download[DATA] замещает стандартный ответ, | |
| выставляет флаг, заставляющий browser предложить download | |
| !$response:status | !$response:status |
| !^response:clear[] забыть все заданные response поля | !^response:clear[] забыть все заданные response поля |
| !$response:charset | !$response:charset |
| Line 540 Xhashfile | Line 584 Xhashfile |
| !$картинка[^image::measure[DATA]] | !$картинка[^image::measure[DATA]] |
| смотрит на .ext case insensitive, | смотрит на .ext case insensitive, |
| умеет мерить пока только .gif и .jpg .jpeg | умеет мерить пока только .gif и .jpg .jpeg |
| !$image.exif << hash после measure jpeg с exif информацией | |
| !$image.exif.DateTime & co | |
| [полный список см. http://www.ba.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html] | |
| !числа типа int/double, | |
| !даты типа date | |
| !перечисления в виде hash с ключами 0..count-1 | |
| !$картинка.src .width .height | !$картинка.src .width .height |
| !$картинка.line-width число=ширина линий | !$картинка.line-width число=ширина линий |
| !$картинка.line-style строка=стиль линий '*** * '='*** * *** * *** * ' | !$картинка.line-style строка=стиль линий '*** * '='*** * *** * *** * ' |
| Line 560 Xhashfile | Line 610 Xhashfile |
| если указана ширина_символа, то monospaced, если 0, то ширина_символа = ширине gif | если указана ширина_символа, то monospaced, если 0, то ширина_символа = ширине gif |
| !^картинка.text(x;y)[текст_надписи] AS_IS | !^картинка.text(x;y)[текст_надписи] AS_IS |
| !^картинка.length[текст_надписи] AS_IS | !^картинка.length[текст_надписи] AS_IS |
| !^картинка.gif[] -- кодирует в FILE с content-type=image/gif | !^картинка.gif[возможно, имя файла] -- кодирует в FILE с content-type=image/gif |
| имя файла будет использовано при $response:download | |
| !^картинка.arc(center x;center y;width;height;start in degrees;end in degrees;color) | !^картинка.arc(center x;center y;width;height;start in degrees;end in degrees;color) |
| !^картинка.sector(center x;center y;width;height;start in degrees;end in degrees;color) | !^картинка.sector(center x;center y;width;height;start in degrees;end in degrees;color) |
| !^картинка.circle(center x;center y;r;color) | !^картинка.circle(center x;center y;r;color) |
| Line 583 Xhashfile | Line 634 Xhashfile |
| !^file:delete[имя файла] | !^file:delete[имя файла] |
| !^file:find[имя файла][{когда не нашли}] | !^file:find[имя файла][{когда не нашли}] |
| !^file:list[путь[;шаблон]] = table с колонкой name | !^file:list[путь[;шаблон]] = table с колонкой name |
| !^file::load[text|binary;!big.zip[;!domain_press_release_2001_03_01.zip]] | !^file::load[text|binary;!big.zip[;!domain_press_release_2001_03_01.zip][;опции]] |
| !$файл_который_был_loaded.size | !$файл_который_был_loaded.size |
| !^file::stat[имя файла] | !^file::stat[имя файла] |
| !$файл_который_был_stated.size !.adate !.mdate !.cdate | !$файл_который_был_stated.size !.adate !.mdate !.cdate |
| !^file::cgi[имя файла[;env hash[;1cmd[;2line[;3ar[;4g[;5s]]]]]]] | !^file::cgi[имя файла[;env hash +options[;1cmd[;2line[;3ar[;4g[;5s]]]]]]] |
| возвращённый заголовок рассыпается на $поля | возвращённый заголовок рассыпается на $поля |
| $status | $status |
| $stderr | $stderr |
| !^file::exec[имя файла[;env hash $.stdin[текст][;1cmd[;2line[;3ar[;4g[;5s;...under win32 max 10 args]]]]]]] | !^file::exec[имя файла[;env hash[;1cmd[;2line[;3ar[;4g[;5s;...under win32 max 10 args]]]]]]] |
| options: | |
| $.stdin[текст] если текст пуст, отключается автоматическое пересовывание данных HTTP-POST | |
| !^file:move[старое имя файла;новое имя файла] | !^file:move[старое имя файла;новое имя файла] |
| можно переименовывать и двигать каталоги[win32: но не через границу дисков] | можно переименовывать и двигать каталоги[win32: но не через границу дисков] |
| каталоги для dest создаются с правами 775 | каталоги для dest создаются с правами 775 |
| Line 607 Xhashfile | Line 660 Xhashfile |
| !^file:basename[/a/some.tar.gz]=some.tar.gz | !^file:basename[/a/some.tar.gz]=some.tar.gz |
| !^file:justname[/a/some.tar.gz]=some.tar | !^file:justname[/a/some.tar.gz]=some.tar |
| !^file:justext[/a/some.tar.gz]=gz | !^file:justext[/a/some.tar.gz]=gz |
| !/some/page.html: ^file:fullpath[a.gif] => /some/a.gif | |
| math | !math |
| !$math:PI | !$math:PI |
| !^math:round floor ceiling | !^math:round floor ceiling |
| !^math:trunc frac | !^math:trunc frac |
| Line 618 math | Line 673 math |
| !^math:degrees radians | !^math:degrees radians |
| !^math:pow sqrt | !^math:pow sqrt |
| !^math:random(ширина диапазона) | !^math:random(ширина диапазона) |
| ^math:GUID {C2C0983C-E26E-4169-BD07-77ECE9405BA5} | !^math:uuid[] |
| 22C0983C-E26E-4169-BD07-77ECE9405BA5 | |
| win32: пользуется cryptapi | |
| unix: пользуется /dev/urandom, | |
| если нет, /dev/random, | |
| если нет, rand | |
| [на solaris /dev/random можно добавить] | |
| !^math:uid64[] | |
| BA39BAB6340BE370 | |
| !^math:md5[string] | |
| выдает digest строки, длиной 16 байт в виде строки, | |
| где байты digest выданы в hex виде, впритык, в нижнем регистре | |
| !^math:crypt[password;salt] | !^math:crypt[password;salt] |
| salt prefix $apr1$ вызывает встроенный MD5 алгоритм, | salt prefix $apr1$ вызывает встроенный MD5 алгоритм, |
| если нет тела salt, оно создаётся случайным | если нет тела salt, оно создаётся случайным |
| Line 630 math | Line 696 math |
| количество дней с epoch [1 января 1970 (UTC)], дробное | количество дней с epoch [1 января 1970 (UTC)], дробное |
| !всё происходит в localtime, | !всё происходит в localtime, |
| !временная зона задаётся вне parser средствами OS | !временная зона задаётся вне parser средствами OS |
| $date:UTC-offset сколько дней надо прибавить,чтобы попасть в local время | |
| $date:TZ наш часовой пояс, дробное, в часах (где-то есть с точностью до получаса) | |
| !^date::now[] | !^date::now[] |
| !^date::now(смещение в днях) выдаёт сейчас+смещение | !^date::now(смещение в днях) выдаёт сейчас+смещение |
| !^date::create(дней с epoch) // старое имя set | !^date::create(дней с epoch) // старое имя set |
| Line 638 math | Line 706 math |
| для удобного создания по значению из базы | для удобного создания по значению из базы |
| формат1: %Y[-%m[-%d[ %H[:%M[:%S]]]]] | формат1: %Y[-%m[-%d[ %H[:%M[:%S]]]]] |
| формат2: %H:%M[:%S] | формат2: %H:%M[:%S] |
| !$date.year month day hour minute second weekday todo:yearday | !^date::unix-timestamp() |
| !^date.unix-timestamp[] | |
| !$date.year month day hour minute second weekday yearday(0...) daylightsaving TZ | |
| read-only | read-only |
| TZ="" << локальная зона | |
| !^date.roll[year|month|day](+-смещение) сдвигает дату | !^date.roll[year|month|day](+-смещение) сдвигает дату |
| возможно, флажок, подправляющий день | !^date.roll[TZ;Новая зона] говорит, что дата в таком-то часовом поясе: влияет на .hour&co |
| !^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, week | столбцы: 0..6, week, weekyear |
| !^date:calendar[rus|eng;год;месяц;день] выдаёт именнованную таблицу | !^date:calendar[rus|eng;год;месяц;день] выдаёт именнованную таблицу |
| столбцы: year, month, day, weekday | столбцы: year, month, day, weekday |
| Line 681 xdoc(xnode) | Line 752 xdoc(xnode) |
| !::create[[URI]][qualifiedName] | !::create[[URI]][qualifiedName] |
| URI default = disk path to requested document | URI default = disk path to requested document |
| для каталогов конечный / обязателен | для каталогов конечный / обязателен |
| !::load[file.xml] | !::load[file.xml[;опции]] |
| !.transform[rules.xsl|xdoc][[params hash]] выдаёт dom | !.transform[rules.xsl|xdoc][[params hash]] выдаёт dom |
| шаблон кэшируется, кэш обновляется при изменении даты файла шаблона, | шаблон кэшируется, кэш обновляется при изменении даты файла шаблона, |
| или изменении даты файла "имя шаблона.stamp"[проверка даты stamp приоритетнее] | или изменении даты файла "имя шаблона.stamp"[проверка даты stamp приоритетнее] |
| Line 813 xdoc(xnode) | Line 884 xdoc(xnode) |
| does not support data | does not support data |
| NO_MODIFICATION_ALLOWED_ERR | NO_MODIFICATION_ALLOWED_ERR |
| If an attempt is made to modify an | If an attempt is made to modify an |
| object where modifications are not | object where modifications are not |
| allowed | allowed |
| NOT_FOUND_ERR | NOT_FOUND_ERR |
| If an attempt was made to reference a | If an attempt was made to reference a |
| Line 827 xdoc(xnode) | Line 898 xdoc(xnode) |
| attribute that is already inuse | attribute that is already inuse |
| elsewhere | elsewhere |
| !memory | |
| !^memory:compact[] собрать мусор, освободив место под новые данные | |
| (предупреждение: память процесса никогда не освобождается) | |
| полезно делать перед XSL transform. | |
| !status | !status |
| !чтобы класс был доступен, в apache нужно сказать | !чтобы класс был доступен, в apache нужно сказать |
| <Location /parser-status.html> | <Location /parser-status.html> |
| Line 840 xdoc(xnode) | Line 916 xdoc(xnode) |
| url time | url time |
| url time | url time |
| url time | url time |
| !$status:db hash | |
| !cache hash db_home=>tables table | |
| name time users | |
| name time users | |
| name time users | |
| !$status:stylesheet | !$status:stylesheet |
| !cache table | !cache table |
| file time | file time |
| Line 863 xdoc(xnode) | Line 934 xdoc(xnode) |
| !ixrss integral shared text memory size | !ixrss integral shared text memory size |
| !idrss integral unshared data size | !idrss integral unshared data size |
| !isrss integral unshared stack size | !isrss integral unshared stack size |
| !tv_sec | |
| !tv_usec | |
| $s[$status:rusage] | |
| ^s.tv_sec.format[%.0f].^s.tv_usec.format[%06.0f] | |
| !$status:memory hash | |
| !used | |
| Includes some pages that were allocated but never written. | |
| !free | |
| !ever_allocated_since_compact | |
| Return the number of bytes allocated since the last collection. | |
| !ever_allocated_since_start | |
| Return the total number of bytes [EVER(c)PAF] allocated in this process. | |
| Never decreases. | |
| !DATA::=string | file | !DATA::=string | file |
| Line 895 xdoc(xnode) | Line 984 xdoc(xnode) |
| там лежат в обратном порядке имена[name] и места вызовов[file line] | там лежат в обратном порядке имена[name] и места вызовов[file line] |
| операторов/методов, приведших к ошибке. | операторов/методов, приведших к ошибке. |
| !при загрузке файла (file::load, table::load, xdoc::load) можно указать такое имя файла: | |
| !http://domain/document?params | |
| !а также, возможно, указать опции: | |
| !$.method[GET|HEAD] | |
| !$.timeout(3) << в секундах, по-умолчанию =2 | |
| !$.headers[ | |
| ! $поле[значение] << значение имеет формат, как $response:ЗАГОЛОВОК | |
| !] | |
| !по-умолчанию, user-agent=parser3 | |
| !по-умолчанию, получение http status != 200 >> создает http.status ошибку, | |
| !это можно отключить, передав | |
| !$.any-status(1) | |
| !$.charset[кодировка удалённых докуметов по-умолчанию] << если сервер вернёт content-type:charset=ОНА_ПЕРЕБИВАЕТ | |
| !file::load в дополнительные поля записывает | |
| !ПОЛЕ:значение (имена полей ответа заглавными буквами) | |
| !tables << хеш их ПОЛЕ->table с единственным столбцом "value". | |
| в таких таблицах можно брать повторяющиеся заголовки. например, несколько set-cookies | |
| todo:сделать отдельный cookies | |
| !системные типы ошибок: | !системные типы ошибок: |
| !parser.compile ^test[} компиляция (непарная скобка, ...) | !parser.compile ^test[} компиляция (непарная скобка, ...) |
| !parser.runtime ^if(0). параметры (больше/меньше, чем нужно, не тех типов, ...) | !parser.runtime ^if(0). параметры (больше/меньше, чем нужно, не тех типов, ...) |
| Line 903 xdoc(xnode) | Line 1011 xdoc(xnode) |
| !file.lock shared/exclusive lock error | !file.lock shared/exclusive lock error |
| !file.missing ^file:delete[delme] not found | !file.missing ^file:delete[delme] not found |
| !file.access ^table::load[.] no rights | !file.access ^table::load[.] no rights |
| !file.seek seek failed | |
| !image.format ^image::measure[index.html] not gif/jpg | !image.format ^image::measure[index.html] not gif/jpg |
| !sql.connect ^connect[mysql://baduser:pass@host/db]{} not found/timeout | !sql.connect ^connect[mysql://baduser:pass@host/db]{} not found/timeout |
| !sql.execute ^void:sql{select bad} syntax error | !sql.execute ^void:sql{select bad} syntax error |
| Line 913 xdoc(xnode) | Line 1022 xdoc(xnode) |
| !xml ^xdoc::create{<forgot?>} any error in xml/xslt libs | !xml ^xdoc::create{<forgot?>} any error in xml/xslt libs |
| !smtp.connect not found/timeout | !smtp.connect not found/timeout |
| !smtp.execute communication error | !smtp.execute communication error |
| !email.format hren tam@null.ru wrong email format(bad chars/empty) | |
| !email.send $MAIL.sendmail[/shit] sendmail not executable | |
| !http.host ^file::load[http://notfound/there] host not found | |
| !http.connect ^file::load[http://not_accepting/there] host found, but do not accept connections | |
| !http.timeout ^file::load[http://host/doc] whole load operation failed to complete in # seconds | |
| !http.response ^file::load[http://ok/there] host found, connection accepted, bad answer | |
| !http.status ^file::load[http://ok/there] host found, connection accepted, status!=200 | |
| !нужно выключить русский apache: CharsetDisable on | !нужно выключить русский apache: CharsetDisable on |
| !если в MAIN будет определён флаг $ORIGINS(1) то вместо обычного вывода страницы будет | !если в MAIN будет определён флаг $ORIGINS(1) то вместо обычного вывода страницы будет |