--- parser3/operators.ru.txt 2003/04/03 10:48:24 1.109.2.1.2.4
+++ parser3/operators.ru.txt 2026/10/09 18:53:41 1.270
@@ -1,1007 +1,1505 @@
-!ñäåëàíî
-Xíå ñäåëàíî, âèäèìî, íå áóäåò ñäåëàíî
-áåç çíà÷êà - áóäåò ñäåëàíî
-
-
-îïåðàòîðû
- !^eval(âûðàæåíèå)[ôîðìàò] âûðàæåíèå, êðîìå îáû÷íûõ ôóíêöèé::
- !äîïóñòèìû #êîììåíòàðèè
- ðàáîòàþò äî êîíöà ñòðîêè èëè çàêðûâàþùåéñÿ êðóãëîé ñêîáêè
- âíóòðè êîììåíòàðèÿ äîïóñòèìû âëîæåííûå êðóãëûå ñêîáêè
- !èç íåî÷åâèäíûõ îïåðàòîðîâ:
- !| ïîáèòíûé xor
- !|| ëîãè÷åñêèé xor
- ~ ïîáèòíîå îòðèöàíèå
- \ öåëî÷èñëåííîå äåëåíèå 10\3=3
- !def äëÿ ïðîâåðêè defined,
- ïóñòàÿ ñòðîêà íå defined
- ïóñòàÿ òàáëèöà íå defined
- ïóñòîé hash íå defined
- ^if(method $hash.delete){yes}
- !eq ne lt gt le ge äëÿ ñðàâíåíèÿ ñòðîê,
- !in "/dir/" äëÿ ïðîâåðêè
- ["âíóòðè íå äîïóñòèìû, åñëè íàäî ñðàâíèòü ñî ñëîæíûì,
- ïóñòü ýòî áóäåò ïåðåìåííàÿ].
- !is 'type' äëÿ ïðîâåðêè òèïà ëåâîãî îïåðàíäà,
- ñêàæåì, ìîæíî ïðîâåðèòü, "íå hash ëè ïàðàìåòð ìåòîäà?"
- !-f äëÿ ïðîâåðêè ñóùåñòâîâàíèÿ ôàéëà íà äèñêå,
- !-d äëÿ ïðîâåðêè ñóùåñòâîâàíèÿ êàòàëîãà íà äèñêå,
- !ñòðîêà â êàâû÷êàõ|àïîñòðîôàõ - ñòðîêà, áåç êàâû÷åê|àïîñòðîôîâ ñòðîêà äî
- áëèæàéøåãî whitespace
- !÷èñëîâîé ëèòåðàë áûâàåò 0xABC
- !ïðèîðèòåòû:
- /* logical */
- %left "!||"
- %left "||"
- %left "&&"
- %left '<' '>' "<=" ">=" "lt" "gt" "le" "ge"
- %left "==" "!=" "eq" "ne"
- %left "is" "def" "in" "-f" "-d"
- %left '!'
- óñëîâèå ? êîãäàÄà: êîãäàÍåò
-
- /* bitwise */
- %left '!|'
- %left '|'
- %left '&'
- %left '~'
-
- /* numerical */
- %left '-' '+'
- %left '*' '/' '%' '\\'
- %left NEG /* negation: unary - */
-
-
- !^if(óñëîâèå){êîãäà äà}{êîãäà íåò}
- !^switch[çíà÷åíèå]{^case[âàðèàíò1[;âàðèàíò2...]]{äåéñòâèå}^case[DEFAULT]{äåéñòâèå ïî óìîë÷àíèþ}}
- !^while(óñëîâèå){òåëî}
- !^for[i](0;4){òåëî}[[ðàçäåëèòåëü]|{ðàçäåëèòåëü êîòîðûé âûïîëíÿåòñÿ ïåðåä íåïóñòûì î÷åðåäíûì íå ïåðâûì òåëîì}]
- !^use[ìîäóëü]
- !^try{
+операторы
+ ^eval(выражение)[формат] выражение, кроме обычных функций:
+ допу�тимы #комментарии
+ работают до конца �троки или закрывающей�� круглой �кобки
+ внутри комментари� допу�тимы вложенные круглые �кобки
+ из неочевидных операторов:
+ | побитный xor
+ || логиче�кий xor
+ ~ побитное отрицание
+ \ целочи�ленное деление 10\3=3
+ def дл� проверки defined,
+ пу�та� �трока не defined
+ пу�та� таблица не defined
+ пу�той hash не defined
+ eq ne lt gt le ge дл� �равнени� �трок,
+ in "/dir/" дл� проверки, находит�� ли текущий документ в каталоге
+ ["внутри не допу�тимы выражени�, е�ли надо �равнить �о �ложным, пу�ть �то будет переменна�]
+ is 'type' дл� проверки типа левого операнда,
+ можно проверить, "не hash ли параметр метода?"
+ -f дл� проверки �уще�твовани� файла на ди�ке,
+ -d дл� проверки �уще�твовани� каталога на ди�ке,
+ �трока в кавычках или апо�трофах - �трока, без кавычек или апо�трофов �трока до ближайшего whitespace
+ чи�ловой литерал бывает 0xABC
+ приоритеты:
+ /* logical */
+ %left "!||"
+ %left "||"
+ %left "&&"
+ %left '<' '>' "<=" ">=" "lt" "gt" "le" "ge"
+ %left "==" "!=" "eq" "ne"
+ %left "is" "def" "in" "-f" "-d"
+ %left '!'
+
+ /* bitwise */
+ %left '!|'
+ %left '|'
+ %left '&'
+ %left '~'
+
+ /* numerical */
+ %left '-' '+'
+ %left '*' '/' '%' '\\'
+ %left '~' /* negation: unary */
+
+ литералы:
+ true
+ false
+
+ ^if(у�ловие){когда да}{когда нет}
+ ^if(у�ловие1){да}[(у�ловие2){да}[(у�ловие2){да}[...]]]{нет}
+ количе�тво доп. у�ловий не ограничено (в общем elseif �то :)
+
+ ^switch[значение]{^case[вариант1[;вариант2...]]{дей�твие}^case[DEFAULT]{дей�твие по умолчанию}}
+
+ ^while(у�ловие){тело}[[разделитель]|{разделитель который выполн�ет�� перед непу�тым очередным не первым телом}]
+
+ ^for[i](0;4){тело}[[разделитель]|{разделитель который выполн�ет�� перед непу�тым очередным не первым телом}]
+
+ ^try{
...
- !^throw[sql.connect;âàñÿ;áîëâàí] // áûë ^error[òåêñò]
+ ^throw[sql.connect[;ва��[;ошиб��]]] // был ^error[тек�т]
+ ^throw[
+ $.type[sql.connect]
+ $.source[ва��]
+ $.comment[ошиб��]
+ ]
...
}{
- ^if($exception.type eq sql){
- $exception.handled(1) ^rem{ôëàã, ÷òî exception îáðàáîòàí}
+ ^if($exception.type eq "sql"){
+ $exception.handled(1|true) ^rem{флаг, что exception обработан}
....
}
-
- ^switch($exception.type){
+ ^switch[$exception.type]{
^case[sql;mail]{
$exception.handled(1)
- êîä, îáðàáàòûâàþùèé sql îøèáêó
+ код, обрабатывающий sql ошибку
$exception.type = sql.connect
- $exception.file $exception.lineno [åñëè íå çàïðåùåíû ïðè êîìïèëÿöèè]
- $exception.source = âàñÿ
- $exception.comment = áîëâàí
+ $exception.file $exception.lineno $exception.colno [е�ли не запрещены при компил�ции]
+ $exception.source = ва��
+ $exception.comment = ошиб��
}
- ^case[_default]{
- êîä, îáðàáàòûâàþùèé äðóãóþ îøèáêó
- ^throw[$exception] << re-throw
+ ^case[DEFAULT]{
+ код, обрабатывающий другую ошибку
+ ^throw[$exception] << re-throw // DON'T! It's default behaviour!
}
}
}
- ^exit[] + - ïðåêðàùÿåò îáðàáîòêó çàïðîñà.
- óäîáíî ñäåëàòü ïîñëå âûñòàâëåíèÿ 401 îøèáêè
- ^return[ðåçóëüòàò] + - îòâàëèâàåò èç âûïîëíåíèÿ ìåòîäà,
- âûäàâàÿ íåñòàíäàðòíûé ðåçóëüòàò
- ^break[] + - îáðûâàåò öèêë
- ^continue[] + - îáðûâàåò èòåðàöèþ öèêëà
- !^untaint[[as-is|file-spec|http-header|mail-header|uri|table|sql|js|xml|html|optimized-html]]{êîä}
+
+ ^break[]
+ обрывает цикл
+ ^break(true|false)
+ обрывает цикл, е�ли true
+
+ ^continue[]
+ обрывает итерацию цикла
+ ^continue(true|false)
+ обрывает итерацию цикла, е�ли true
+
+ ^return[]
+ обрывает выполнение метода
+ ^return[value]
+ при�ваивает $result значение value и обрывает выполнение метода
+
+ ^untaint[[as-is|file-spec|uri|http-header|mail-header|sql|js|json|parser-code|regex|xml|html|optimized-[as-is|xml|html]]]{код}
default as-is
- !^taint[[lang]][êîä]
+
+ ^taint[[lang]][код]
default "just tainted, language unknown"
- !^process[[$caller.CLASS|$object|$ÊËÀÑÑ:CLASS]]{ñòðîêà, êîòîðàÿ áóäåò process-ed, êàê êîä}[âî ÷òî ïåðåèìåíîâàòü @main]
- !^process..[ïóòü][âî ÷òî ïåðåèìåíîâàòü @main]
- ïî óìîë÷àíèþ, ìåòîäû êîìïèëèðóþòñÿ â $self [â ñëó÷àå îïåðàòîðà, $self=$MAIN:CLASS]
- !^connect[protocol://ñòðîêà ñîåäèíåíèÿ]]{êîä ñ ^sql[...]-ÿìè}
- !mysql://user:pass@{host[:port]|[/unix/socket]}/database?
- charset=cp1251_koi8&
- timeout=3&
- compress=1&
- named_pipe=1
- !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?
- NLS_LANG=RUSSIAN_AMERICA.CL8MSWIN1251&
- NLS_LANGUAGE language-dependent conventions
- NLS_TERRITORY territory-dependent conventions
- NLS_DATE_FORMAT=YYYY-MM-DD HH24:MI:SS
- NLS_DATE_LANGUAGE language for day and month names
- NLS_NUMERIC_CHARACTERS decimal character and group separator
- NLS_CURRENCY local currency symbol
- NLS_ISO_CURRENCY ISO currency symbol
- NLS_SORT sort sequence
- ORA_ENCRYPT_LOGIN=TRUE
+ ^apply-taint[[lang;]тек�т]
+ выполн�ет заданные в �троке преобразовани�, неопределенно гр�зное как lang, на выходе чи�та� �трока
- !odbc://DSN=dsn^;UID=user^;PWD=password
+ ^process[[$caller.CLASS|$object|$КЛ�СС:CLASS]]{�трока, котора� будет process-ed, как код}[
+ $.main[во что переименовать @main]
+ $.file[им� файла из которого, �кобы, данный тек�т]
+ $.lineno(номер �троки в файле, откуда данный тек�т, можно отрицательный)
+ ]
+ ^process..[путь][во что переименовать @main]
+ по умолчанию, методы компилируют�� в $self [в �лучае оператора, $self=$MAIN:CLASS]
- äëÿ ðàáîòû connect íóæíî, ÷òîáû çàðàíåå(ðåêîìåíäóåòñÿ â ñèñòåìíîì parser3)
- áûëà îïðåäåëåíà òàáëèöà
+ ^connect[protocol://�трока �оединени�]]{код � ^sql[...]-�ми}
+ mysql://user:pass@{host[:port][, host[:port]]|[/unix/socket]}/database?
+ ClientCharset=parser-charset << charset in which parser thinks client works
+ charset=UTF-8&
+ timeout=3&
+ compress=0&
+ named_pipe=1&
+ multi_statements=1& allow execute more then one query in one parser :sql{} request
+ config_file=.my.cnf&
+ config_group=parser3& use group name from .my.cnf
+ autocommit=1
+ autocommit е�ли вы�тавить в 0, будет делать commit/rollback
+
+ pgsql://user:pass@{host[:port]|[local]}/database?
+ client_encoding=win,[to-find-out]
+ &datestyle=ISO,SQL,Postgres,European,NonEuropean=US,German,DEFAULT=ISO
+ &ClientCharset=parser-charset << charset in which parser thinks client works
+
+ odbc://DSN=dsn^;UID=user^;PWD=password^;ClientCharset=parser-charset
+ ClientCharset << charset in which parser thinks client works
+
+ sqlite://DBfile?
+ ClientCharset=parser-charset& << charset in which parser thinks client works
+ autocommit=1
+
+ дл� работы connect нужно, чтобы заранее (рекомендует�� в �и�темном конфигурационном auto.p) была определена таблица
#sql drivers
$SQL[
- $.drivers[^table::set{protocol driver client
-mysql /www/parser3/libparser3mysql.so /usr/local/lib/mysql/libmysqlclient.so
-pgsql /www/parser3/libparser3pgsql.so /usr/local/pgsql/lib/libpq.so
-oracle /www/parser3/libparser3oracle.so /u01/app/oracle/product/8.1.5/lib/libclntsh.so?ORACLE_HOME=/u01/app/oracle/product/8.1.5&ORA_NLS33=/u01/app/oracle/product/8.1.5/ocommon/nls/admin/data
-odbc c:\drives\y\parser3project\odbc\debug\parser3odbc.dll
+ $.drivers[^table::create{protocol driver client
+mysql $prefix/libparser3mysql.so libmysqlclient.so
+pgsql $prefix/libparser3pgsql.so libpq.so
+sqlite $prefix/libparser3sqlite.so sqlite3.so
+odbc parser3odbc.dll
}]
]
- !â òàáëèöå ó oracle â ñòîëáöå êëèåíòñêîé áèáëèîòåêè
- äîïóñòèìî çàäàòü environment ïàðàìåòðû èíèöèàëèçàöèè(åñëè îíè íå çàäàíû èíà÷å çàðàíåå),
- äîïóñòèìû èìåíà, íà÷èíàþùèåñÿ íà NLS_ ORA_ è ORACLE_, èëè îêàí÷èâàþùèåñÿ íà +
- ïîä win32
- íåîáõîäèì PATH+=^;C:\Oracle\Ora81\bin
- ê ñâåäåíèþ:
- ORA_NLS33 íóæåí äëÿ ñ÷èòûâàíèÿ ôàéëèêà ñ êëèåíòñêîé êîäèðîâêîé(çàäàâàåìîé NLS_LANG)
- åñëè êîäèðîâêà íå ïî-óìîë÷àíèþ, îáÿçàòåëüíî óêàçàòü â .drivers,
- èíà÷å áóäåò ñîîáùåíèå ïðî íåïðàâèëüíûé NLS ïàðàìåòð
- (èìåþò â âèäó, ÷òî íå íàøëè êîäèðîâêó èç NLS_LANG)
- ORACLE_HOME íóæåí äëÿ ñ÷èòûâàíèÿ òåêñòîâ ñîîáùåíèé îá îøèáêàõ,
- ìîæíî óêàçûâàòü è â ñòðîêå ñîåäèíåíèÿ, íî ãëîáàëåí, è ëó÷øå âûíåñòè çà ñêîáêè,
- â îòëè÷èå îò êëèåíòñêîé êîäèðîâêè NLS_LANG, è ïðî÷åãî.
-
- ÂÍÈÌÀÍÈÅ: ïðè ðàáîòå ñ áîëüøèìè òåêñòîâûìè áëîêàìè â oracle&pgsql[à ëó÷øå âñåãäà],
- ñòàâèòü òàêîé ïðåôèêñ ïåðåä îòêðûâàþùèì àïîñòðîôîì, âïðèòûê, âåçäå áåç ïðîáëåëîâ
- /**èìÿ_ïîëÿ**/'literal'
- !^rem{}
- !^cache[ôàéë](ñåêóíä){êîä}
- !îòíîñèòåëüíîå çàäàíèå âðåìåíè
- !ñêýøèðîâàòü ñòðîêó, êîòîðàÿ ïîëó÷àåòñÿ ïðè âûïîëíåíèè êîäà íà 'ñåêóíä' ñåêóíä
- !åñëè 0ñåêóíä, çíà÷èò íå êýøèðîâàòü, à ñòàðûé òàêîé ñòåðåòü
- !^cache[ôàéë][expires date]{êîä}
- !àáñîëþòíîå çàäàíèå âðåìåíè
- X^cache[ôàéë] óäàëèòü ôàéë [íå ðóãàåò, åñëè åãî íåò] // òàêîå áûëî, áîëüøå íå áóäåò, äåëàòü ^cache(0)
- !^cache(ñåêóíä)
- !^cache[expires date]
- !ñèãíàëèçèðóåò âûøåñòîÿùåìó ^cache "óìåíüøè äî ñòîëüêèõ-òî 'ñåêóíä'/'expires'"
- !â ïðåäåëå: ^cache(0) îòìåíèòü êýøèðîâàíèå
- X^cache[read]
- ñèãíàëèçèðóåò âûøåñòîÿùåìó ^cache "âçÿòü ñêýøèðîâàííîå íàñèëüíî, èãíîðèðóÿ expires",
- âûäà¸ò bool "ïîëó÷èëîñü/íåò"
-
-
- Xåñòü ãëîáàëüíûé ôëàæîê â ñâîéñòâàõ/êîìàíäíîé ñòðîêå "íå îïòèìèçèðîâàòü"
- !è åñòü èñêëþ÷åíèå: ^untaint[html]{êîä} íå îïòèìèçèðóåòñÿ
- Xáåçîòíîñòèòåëüíî ôëàæêà
-
- !ó âñåõ ìåòîäîâ åñòü ëîêàëüíàÿ ïåðåìåííàÿ $result, åñëè â íå¸ ÷òî ïîëîæèòü,
- !òî _ýòî_ áóäåò ðåçóëüòàòîì ìàêðîñà, à íå åãî òåëî
- !ó âñåõ ìåòîäîâ åñòü ëîêàëüíàÿ ïåðåìåííàÿ $caller, â íåé ëåæèò ðîäèòåëüñêèé stack frame,
- !åñëè òóäà çàïèñàòü
-
- !use(^use èëè @USE) èùåò ôàéë...
- !1. ...åñëè ïóòü íà÷èíàåòñÿ ñ /, òî ñ÷èòàåòñÿ, ÷òî ýòî ïóòü îò êîðíÿ âåá ïðîñòðàíñòâà
- !åñòü ãëîáàëüíàÿ ñòðîêà/òàáëèöà $MAIN:CLASS_PATH ñ ïóò¸ì/ïóòÿìè ê êàòàëîãó ñ êëàññàìè.
- !êîðåíü ïóòÿ/ïóòåé ñ÷èòàåòñÿ îò êîðíÿ âåá ïðîñòðàíñòâà.
- !2. ...îòíîñèòåëüíî ñòðî÷êè èç table $MAIN:CLASS_PATH, ñíèçó ââåðõ
- çàäàâàéòå å¸ â parser3.conf âàøåãî ñàéòà
-
- !ãëîáàëüíàÿ òàáëè÷êà $CHARSETS[$.íàçâàíèå[èìÿ ôàéëà]]
- !çàäà¸ò êàêèå áóêâû ñ÷èòàþòñÿ êàêèìè(whitespace, letter, etc), à òàêæå èõ unicode
- !ôîðìàò: tab delimited ôàéë, ñ çàãîëîâêîì:
- ! char white-space digit hex-digit letter word lowercase unicode1 unicode2
- ! A x x x a 0x0041 0xFF21
- ! ãäå char è lowercase ìîãóò áûòü áóêâàìè, à ìîãóò áûòü è 0xÊÎÄÀÌÈ
- ! åñëè ñèìâîë èìååò åäèíñòâåííîå unicode ïðåäñòàâëåíèå, ðàâíîå ñàìîìó ñèìâîëó,
- ! ìîæíî íå óêàçûâàòü unicode
- !âñåãäà åñòü êîäèðîâêà UTF-8,
- !îíà ÿâëÿåòñÿ êîäèðîâêîé ïî-óìîë÷àíèþ äëÿ request è response
- !ÂÍÈÌÀÍÈÅ: èìÿ êîäèðîâêè case sensitive
-
-ñèíòàêñèñ
- !$èìÿ[íîâîå çíà÷åíèå]
- !$èìÿ(ìàòåìàòè÷åñêîå âûðàæåíèå íîâîãî çíà÷åíèÿ)
- !$èìÿ{êîä íîâîãî çíà÷åíèÿ}
- !$èìÿ whitespace èëè ${èìÿ}íåâàæíî ïîäñòàíîâêà çíà÷åíèÿ
- !^èìÿ ïàðàìåòðû âûçîâ
- !$èìÿ.CLASS êëàññ çíà÷åíèÿ
- !$èìÿ[$.key[] () {}] êîíñòðóêòîð ýëåìåíòà ïåðåìåííîé-õýøà $èìÿ.key
- !^method[$.key[] () {}] êîíñòðóêòîð ýëåìåíòà ïàðàìåòðà-õåøà $parameter.key
- $CLASS.èìÿ îáðàùåíèå ê ïåðåìåííîé êëàññà
-
- èìÿ çàêàí÷èâàåòñÿ ïåðåä: ïðîáåë tab linefeed ; ] } ) " < > + * / % & | = ! ' , ? {óòî÷íèòü}
- ò.å. ìîæíî
- $èìÿ,aaaa
- íî åñëè íóæíî ïîñëå èìåíè áóêâó, ñêàæåì -, òî
- ${èìÿ}-
- â âûðàæåíèÿõ + è - ÿâëÿþòñÿ äîïîëíèòåëüíûìè êîíöàìè èìåíè
- !ìîæíî îáðàùàòüñÿ ê ñîñòàâíûì îáúåêòàì òàê: $name.subname
- !ãäå subname áûâàåò:
- ! ñòðîêà
- ! $ïåðåìåííàÿ
- ! ñòðîêà$ïåðåìåííàÿ
- ! [êîä, âû÷èñëÿþùèé ñòðîêó]
- íàïðèìåð: $õýø[$.âîçðàñò(88)] $äîñòàòü[$.ïîëå[âîçðàñò]] ^õýø.[$äîñòàòü.ïîëå].format{%05d}
-
-ïàðàìåòðû:=îäèí èëè ìíîãî ïàðàìåòðîâ
-ïàðàìåòð:=
- !(ìàòåìàòè÷åñêîå âûðàæåíèå) âû÷èñëÿåòñÿ ìíîãî ðàç âíóòðè âûçîâà,
-| ![êîä] âû÷èñëÿåòñÿ îäèí ðàç ïåðåä âûçîâîì,
-| !{êîä} âû÷èñëÿåòñÿ 0 èëè ìíîãî ðàç âíóòðè âûçîâà,
- !âåçäå äîïóñòèìû ; âíóòðè - äåëàåò ìíîãî ïàðàìåòðîâ â îäíèõ ñêîáêàõ
-
-
-!void
- !^èìÿ.length[]
- 0
- !^èìÿ.pos[...]
- -1
- !^èìÿ.int[] (default)
- 0 èëè default
- !^èìÿ.double[] (default)
- 0 èëè default
- !^void:sql{çàïðîñ áåç ðåçóëüòàòà}
-
-!int,double
- !^èìÿ.int[] öåëî÷èñëåííîå çíà÷åíèå
- !^èìÿ.double[]+ double çíà÷åíèå
- !^èìÿ.inc(íà ñêîëüêî +)
- !^èìÿ.dec(íà ñêîëüêî -)
- !^èìÿ.mul(íà ñêîëüêî *)
- !^èìÿ.div(íà ñêîëüêî /)
- !^èìÿ.mod(íà ñêîëüêî %)
- !^èìÿ.format[ôîðìàò]
- !^int/double:sql{query}[[$.limit(2) $.offset(4) $.default{0}]]
- çàïðîñ, ðåçóëüòàò êîòîðîãî äîëæåí áûòü îäèí ñòîëáåö/îäíà ñòðîêà
-
-!string
- !â âûðàæåíèè
- !def çíà÷åíèå ðàâíî "íå ïóñòà?"
- !ëîãè÷åñêîå/÷èñëîâîå çíà÷åíèå ðàâíî ïîïûòêå ïðåîáðàçîâûâàíèÿ ê double,
- ïóñòàÿ ñòðîêà òèõî ïðåîáðàçóåòñÿ ê 0
-
- ïðèìåð:
- ^if(def $form:name) íå ïóñòà?
- ^if($user.isAlive) èñòèíà? [àâòîïðåîáðàçîâàíèå ê ÷èñëó, íå íîëü?]
- !^string::sql{query}[[$.limit(1) $.offset(4) $.default{n/a}]]
- ðåçóëüòàò çàïðîñà äîëæåí áûòü îäèí ñòîëáåö/îäíà ñòðîêà
- !^èìÿ.int[] .int(default) öåëî÷èñëåííîå çíà÷åíèå ñòðîêè.
- åñëè ëîìàåòñÿ ïðåîáðàçîâàíèå, áåð¸òñÿ default
- !^èìÿ.double[]+ .double(default) double çíà÷åíèå ñòðîêè
- åñëè ëîìàåòñÿ ïðåîáðàçîâàíèå, áåð¸òñÿ default
- !^èìÿ.format[ôîðìàò] %d %.2f %02d...
- !^ñòðîêà.match[øàáëîí][[îïöèè ïîèñêà]] $prematch $match $postmatch $1 $2...
- îïöèè ïîèñêà=
+ ^rem{}
+ комментарий, удал�ет�� при компил�ции
+
+ ^syslog[ident;message[;info|warning|error|debug]]
+ пишет message в syslog
+
+ ^cache[файл](�екунд){код}[{catch код}]
+ отно�ительное задание времени
+ �кешировать �троку, котора� получает�� при выполнении кода на '�екунд' �екунд
+ е�ли 0 �екунд, значит не кешировать, а �тарый такой �тереть
+ в catch коде $exception.handled[cache] ^rem{флаг, что exception обработан}
+ ^cache[файл][expires date]{код}[{catch код}]
+ аб�олютное задание времени
+ ^cache[файл]
+ удалить файл [не ругает, е�ли его нет]
+ ^cache(�екунд)
+ ^cache[expires date]
+ �игнализирует выше�то�щему ^cache "уменьши до �тольких-то '�екунд'/'expires'"
+ в пределе: ^cache(0) отменить кеширование
+ ^cache[]
+ выдаёт текущую expires date
+
+ у в�ех методов е�ть локальна� переменна� $result, е�ли в неё что положить,
+ то �то будет результатом метода, а не его тело
+
+ у в�ех методов е�ть локальна� переменна� $caller, в ней лежит родитель�кий stack frame,
+ можно запи�ать в его локальную переменную
+
+ use(^use или @USE) ищет и подключает файл:
+ 1. е�ли путь начинает�� � /, то �читает��, что �то путь от корн� веб про�тран�тва
+ 2. отно�ительно текущей директории
+ 3. отно�ительно �трок из table $MAIN:CLASS_PATH, �низу вверх
+ $MAIN:CLASS_PATH - глобальна� �трока или таблица � путём или пут�ми к каталогу
+ � кла��ами (от корн� веб про�тран�тва), задавайте её в конфигурационном auto.p
+
+ глобальна� табличка $CHARSETS[$.название[им� файла]]
+ задаёт какие буквы �читают�� какими (whitespace, letter, etc), а также их unicode
+ формат: tab delimited файл, � заголовком:
+ char white-space digit hex-digit letter word lowercase unicode1 unicode2
+ A x x x a 0x0041 0xFF21
+ где char и lowercase могут быть буквами, а могут быть и 0xКОД�МИ
+ е�ли �имвол имеет един�твенное unicode пред�тавление, равное �амому �имволу, можно не указывать unicode
+ в�егда е�ть кодировка UTF-8, она �вл�ет�� кодировкой по-умолчанию дл� request и response
+ В�ИМ��ИЕ: им� кодировки case insensitive
+
+
+�интак�и�
+ $им�[новое значение]
+ $им�(математиче�кое выражение нового значени�)
+ $им�{код нового значени�}
+ $им� whitespace или ${им�}неважно - вывод значени� переменой
+ ^им� параметры - вызов
+ $им�.CLASS - кла�� значени�
+ $им�.CLASS_NAME - им� кла��а
+ $им�[$.key[] () {}] - кон�труктор переменной-хеша � �лементом $им�.key
+ ^method[$.key[] () {}] - кон�труктор параметра-хеша � �лементом $parameter.key
+ $CLASS.им� обращение к переменной кла��а
+
+ им� заканчивает�� перед: пробел tab linefeed ; ] } ) " < > + * / % & | = ! ' , ?
+ т.е. можно $им�,aaaa
+ но е�ли нужно по�ле имени �имвол, �кажем -, то ${им�}-
+
+ в выражени�х + и - �вл�ют�� дополнительными концами имени
+
+ можно обращать�� к �о�тавным объектам так: $name.subname где subname бывает:
+ �трока
+ $переменна�
+ �трока$переменна�
+ [код, вычи�л�ющий �троку]
+ например: $хеш[$.возра�т(88)] $до�тать[$.поле[возра�т]] ^хеш.[$до�тать.поле].format{%05d}
+
+параметры := один или много параметров
+параметр :=
+ (математиче�кое выражение) вычи�л�ет�� много раз внутри вызова,
+| [код] вычи�л�ет�� один раз перед вызовом,
+| {код} вычи�л�ет�� 0 или много раз внутри вызова,
+ допу�тимы ';' чтобы �делать много параметров в одних �кобках
+
+void
+ до�тупны в�е методы, при�ут�твующие у объекта кла��а string, результат как у пу�той �троки
+ ^void:sql{запро� без результата}{$.bind[�м. table::sql]}
+
+int,double
+ ^им�.int[]
+ целочи�ленное значение
+ ^им�.double[]
+ double значение
+ ^им�.bool[] ^name.bool(true|false)
+ bool значение
+ ^им�.inc(на �колько +)
+ ^им�.dec(на �колько -)
+ ^им�.++[] выводит значение, затем увеличивает на 1
+ ^им�.--[] выводит значение, затем уменьшает на 1
+ ^им�.mul(на �колько *)
+ ^им�.div(на �колько /)
+ ^им�.mod(на �колько %)
+ ^им�.format[формат]
+ ^int/double:sql{query}[[$.limit(2) $.offset(4) $.default{0} $.bind[�м. table::sql]]]
+ запро�, результат которого должен быть один �толбец/одна �трока
+
+string
+ в выражении
+ def значение равно "не пу�та?"
+ логиче�кое/чи�ловое значение равно попытке преобразовывани� к double,
+ пу�та� �трока тихо преобразует�� к 0
+ пример:
+ ^if(def $form:name) не пу�та?
+ ^if($user.isAlive) и�тина? [автопреобразование к чи�лу, не ноль?]
+ ^string:sql{query}[[$.limit(1) $.offset(4) $.default{n/a} $.bind[�м. table::sql]]]
+ результат запро�а должен быть один �толбец/одна �трока
+ ^�трока.int[] ^�трока.int(default)
+ целочи�ленное значение �троки, е�ли ломает�� преобразование, берёт�� default
+ ^�трока.double[] ^�трока.double(default)
+ double значение �троки, е�ли ломает�� преобразование, берёт�� default
+ ^�трока.bool[] ^�трока.bool(default)
+ bool значение �троки, е�ли ломает�� преобразование, берёт�� default
+ ^�трока.format[формат] %d %.2f %02d...
+ ^�трока.match[шаблон-�трока|шаблон-regex][[опции пои�ка]] $prematch $match $postmatch $1 $2...
+ опции пои�ка=
i CASELESS
x whitespace in regex ignored
- s singleline = $ ñ÷èòàåòñÿ êîíöîì âñåãî òåêñòà
- m multiline = $ ñ÷èòàåòñÿ êîíöîì ñòðîêè[\n], íå êîíöîì âñåãî òåêñòà
- g íàéòè âñå âõîæäåíèÿ, à íå îäíî
- !^ñòðîêà.match[øàáëîí][îïöèè ïîèñêà]{çàìåíà}
- îïöèè ïîèñêà+=
- g çàìåíèòü âñå âõîæäåíèÿ, à íå îäíî
- !^ñòðîêà.split[ðàçäåëèòåëü][[lrhv]]
- l ñëåâà íàïðàâî [default]
- r ñïðàâà íàëåâî
- h nameless òàáëèöà
- v òàáëèöà èç ñòîëáöà piece [default]
- !^ñòðîêà.{l|r}split[ðàçäåëèòåëü] òàáëèöà èç ñòîëáöà $piece
- îñòàâëåí äëÿ ñîâìåñòèìîñòè
- !^ñòðîêà.upper|lower[]
- X^ñòðîêà.truncate(ïðåäåë òåðïåíüÿ) ñòèëü :(
- !^ñòðîêà.length[]
- !^ñòðîêà.mid(P[;N])
- áåç N - "äî êîíöà ñòðîêè"
- !^ñòðîêà.left(N)
- !^ñòðîêà.right(N)
- !^ñòðîêà.pos[ïîäñòðîêà]
- <0 = íå íàéäåíî
- !^ñòðîêà.replace[$òàáëèöà_ïîäñòàíîâîê_ñòðîêà_íà_ñòðîêó]
- !^ñòðîêà.save[[append;]ïóòü]
- !^ñòðîêà.normalize[] âûäàåò äðóãóþ ñòðîêó, â êîòîðîé ôðàãìåíòû íà îäíîì ÿçûêå îáúåäèíåíû
- ïîëåçíî äåëàòü ïåðåä ñëîæíûìè match îïåðàöèÿìè, åñëè âû çíàåòå, ÷òî âõîäíàÿ ñòðîêà
- ñîñòîèò èç áîëüøîãî ÷èñëà ôðàãìåíòîâ
-
-!table
- â âûðàæåíèè
- ëîãè÷åñêîå çíà÷åíèå ðàâíî "íå ïóñòà?"
- ÷èñëîâîå çíà÷åíèå ðàâíî count[]
- !^table::create[[nameless]]{äàííûå} ñòàðîå èìÿ "set"
- !^table::create[table][[$.limit(1) $.offset(5) $.offset[cur]]]
- êëîíèðóåò òàáëèöó
- !^table::load[[nameless;]ïóòü[;îïöèè]]
- !åñëè íå nameless, íàçâàíèÿ êîëîíîê áåðóòñÿ èç ïåðâîé ñòðîêè
- !ïóñòûå ñòðîêè, è ñòðîêè â ïåðâîé êîëîíêå ñîäåðæàùèå '#', èãíîðèðóþòñÿ
- !^table::sql{query}[[$.limit(2) $.offset(4) todo:$.default{ ^table::create[...] }]]
- !^òàáëèöà.save[[nameless|append;]ïóòü]
- !$òàáëèöà.ïîëå
- !$òàáëèöà.fields èç named òàáëèöû âûäà¸ò òåêóùóþ çàïèñü êàê Hash
- !^òàáëèöà.menu{òåëî}[ðàçäåëèòåëü]
- !^òàáëèöà.offset[[whence]](5) ñäâèãàåò; áåç ïàðàìåòðà - ïå÷àòàåò offset
- !whence=cur|set
- !áåç whence - ýòî cur
- !^òàáëèöà.count[]
- !^òàáëèöà.line[] 1-based offset
- !^òàáëèöà.sort{{êëþ÷åäåëàòåëü ñòðîêà}|(êëþ÷åäåëàòåëü ÷èñëî)}[{desc|asc}] default=asc
- !^òàáëèöà.append{äàííûå}
- X^òàáëèöà.insert{äàííûå}[(n)] äîáàâèòü çàïèñü
- íà òåêóùóþ ïîçèöèþ [äîáàâèòü çàïèñü íà ïîçèöèþ n]
- X^òàáëèöà.remove(position[;count]) - ñòèðàåò çàïèñü
- èç òåêóùåé ïîçèöèè [ñòèðàåò çàïèñü èç êîíêðåòíîé ïîçèöèè]
- [ñòèðàåò count çàïèñåé]
- !^òàáëèöà.join[òàáëèöà][$.limit(1) $.offset(5) $.offset[cur]] - äîáàâëÿåò çàïèñè èç òàáëèöû.
- òàáëèöû äîëæíû èìåòü îäèíàêîâóþ ñòðóêòóðó.
- !^òàáëèöà.flip[] âûäà¸ò òðàíñïîíèðîâàííóþ, íàäî êóäà-òî ñëîæèòü, ïîòîì ïîëüçîâàòü
- !^òàáëèöà.locate[ïîëå;çíà÷åíèå] ïåðåäâèãàåò òåêóùóþ ñòðîêó, åñëè íàéä¸ò. âûäà¸ò bool
- !^òàáëèöà.locate(ëîãè÷åñêîå âûðàæåíèå) ïåðåäâèãàåò òåêóùóþ ñòðîêó, åñëè íàéä¸ò. âûäà¸ò bool
- !^òàáëèöà.hash{[ïîëå]|{êîä}|(âûðàæåíèå)}[[ïîëå çíà÷åíèé|table ïîëÿ çíà÷åíèé]][[$.distinct(1)]]
- çíà÷åíèåì $hash.êëþ÷ áóäåò hash â êîòîðîì ïîëÿ çíà÷åíèé áóäóò êëþ÷àìè
- ïîëÿ çíà÷åíèé ìîãóò áûòü íå óêàçàíû, òîãäà èìè áóäóò âñå ñòîëáöû, âêëþ÷àÿ êëþ÷åâîé
- !^òàáëèöà.columns[]+ òàáëèöà èç îäíîãî ñòîëáöà $column
- !$îòîáðàííîå[^òàáëèöà.select(âûðàæåíèå)] = òàáëèöà èç òåõ æå ñòîëáöîâ è ñòðîê, ó êîòîðûõ óñëîâèå ñîâïàëî
+ s singleline = $ �читает�� концом в�его тек�та
+ m multiline = $ �читает�� концом �троки[\n], не концом в�его тек�та
+ g найти в�е вхождени�, а не одно
+ ' �оздавать �толбцы prematch, match, postmatch
+ n вернуть ци�ло � количе�твом найденных �овпадений, а не таблицу � результатами
+ U инвертировать �мы�л модификатора '?'
+ ^�трока.match[шаблон-�трока|шаблон-regex][опции пои�ка]{замена}
+ опции пои�ка+=
+ g заменить в�е вхождени�, а не одно
+ ^�трока.split[разделитель|regex][[lrhva]][[название �толбца дл� вертикального разбиени�]]
+ l �лева направо [default]
+ r �права налево
+ h nameless таблица � ключами 0, 1, 2, ...
+ v таблица из 1 �толбца 'piece' или как передадут [default]
+ a ма��ив
+ ^�трока.{l|r}split[разделитель] таблица из �толбца $piece
+ о�тавлен дл� �овме�тимо�ти
+ ^�трока.upper|lower[]
+ ^�трока.length[]
+ ^�трока.mid(P[;N])
+ без N - "до конца �троки"
+ ^�трока.left(N), -1 выдает в�ю �троку
+ ^�трока.right(N)
+ ^�трока.pos[под�трока]
+ ^�трока.pos[под�трока](позици�, � которой ищем)
+ <0 = не найдено
+ ^�трока.replace[$таблица_под�тановок_�трока_на_�троку]
+ ^�трока.replace[$что;$на-что]
+ ^�трока.save[[append;]путь]
+ ^�трока.save[путь[;$.charset[в какой кодировке �охран�ем] $.append(true)]]
+ �охран�ет �троку в файл
+ ^�трока.trim[start|both|end|left|right[;chars]]
+ выкидывает chars из начала/конца/и начала и конца
+ default 'chars' = whitespace chars
+ ^�трока.trim[chars]
+ выкидывает chars из начала и конца
+ ^�трока.base64[ $.pad(bool) $.wrap(bool) $.url-safe(bool) ] encode
+ ^string:base64[encoded[; $.pad(bool) $.strict(bool) $.url-safe(bool) ]] decode
+ ^�трока.idna[]
+ IDNA кодирование, поддержка кирилличе�ких доменов
+ ^string:idna[encoded]
+ IDNA декодирование, поддержка кирилличе�ких доменов
+ ^�трока.js-escape[]
+ кодирование дл� передачи в JS (%uXXXX)
+ ^string:js-unescape[escaped]
+ декодирование переданного из js
+ ^string:unescape[js|uri;escaped; $.charset[] ]
+ декодирование переданного из js или uri
+ ^�трока.contains[ключ]
+ дл� �овме�тимо�ти � hash
+
+table
+ в выражении
+ логиче�кое значение равно "не пу�та?"
+ чи�ловое значение равно count[]
+ $таблица.поле
+ $таблица.поле[новое значение]
+ $таблица.fields
+ из named таблицы выдаёт текущую запи�ь как Hash
+ ^table::create[[nameless]]{данные}[[$.separator[^#09] $.encloser[]]]
+ ^table::create[table][[$.limit(1) $.offset(5) $.offset[cur] $.reverse(1)]]
+ клонирует таблицу
+ reverse - в обратном пор�дке
+ ^table::load[[nameless;]путь[;опции]]
+ е�ли не nameless, названи� колонок берут�� из первой �троки
+ пу�тые �троки, и �троки в первой колонке �одержащие '#', игнорируют��
+ $.separator[^#09]
+ $.encloser["] по-умолчанию, нет
+ ^table::sql{query}[[$.limit(2) $.offset(4) $.bind[hash]]]
+ bind прив�зывает переменные в запро�е к их значени�м
+ пока реализован только дл� oracle
+ в запро�е надо напи�ать ":им�"
+ в параметре bind передать hash, из которого возьмёт�� (или куда запишет��) значение
+ ^таблица.save[[nameless|append;]путь[;опции, �м. load]]
+ �охран�ет таблицу в файл
+ ^таблица.menu{тело}[[разделитель]]
+ выполн�ет код тела дл� каждой �троки таблицы
+ ^таблица.foreach[позици�;значение]{тело}[[разделитель]]
+ ^таблица.line[]
+ текущий р�д таблицы, начинает�� � 1
+ ^таблица.offset[]
+ �мещение текущего р�да таблицы от начала, начинает�� � 0
+ ^таблица.offset[[whence]](5)
+ �двигает whence=cur|set, без whence - �то cur
+ ^таблица.count[], ^таблица.count[rows]
+ количе�тво �трок в таблице
+ ^таблица.count[columns]
+ количе�тво �толбцов таблицы
+ ^таблица.count[cells]
+ количе�тво �чеек в текущей �троке таблицы
+ ^таблица.sort{{ключеделатель �трока}|(ключеделатель чи�ло)}[{desc|asc}] default=asc
+ ^таблица.append{данные}
+ ^таблица.append[ $.им� �толбца[значение �толбца] ]
+ ^таблица.insert{данные} добавить запи�ь на текущую позицию
+ ^таблица.insert[ $.им� �толбца[значение �толбца] ]
+ ^таблица.delete[]
+ �тирает запи�ь � текущей позиции
+ ^таблица.join[таблица][$.limit(1) $.offset(5) $.offset[cur]]
+ добавл�ет запи�и из таблицы, таблицы должны иметь одинаковую �труктуру
+ ^таблица.flip[]
+ выдаёт тран�понированную
+ ^таблица.locate[поле;значение][[$.limit(1) $.offset(5) $.offset[cur] $.reverse(1)]]
+ передвигает текущую �троку, е�ли найдёт. выдаёт bool
+ ^таблица.locate(логиче�кое выражение)[[$.limit(1) $.offset(5) $.offset[cur] $.reverse(1)]]
+ передвигает текущую �троку, е�ли найдёт. выдаёт bool
+ ^таблица.hash{[поле]|{код}|(выражение)}[[поле значений|table пол� значений]{код значени�}][[$.distinct(1) $.distinct[tables] $.type[hash]]]
+ по умолчанию значением $hash.ключ будет hash в котором пол� значений будут ключами
+ пол� значений могут быть не указаны, тогда ими будут в�е �толбцы, включа� ключевой
+ е�ли distinct �одержит true, то не будет ошибки при повтор�ющих�� ключах
+ е�ли distinct �одержит tables, то будет �оздан hash из таблиц, �одержащих �троки � ключом
+ $.type[string/table] помен�ть значение �лемента на �троку (указать одну колонку) или таблицу
+ ^таблица.columns[[название �толбца]]
+ таблица из одного �толбца 'column' или как передадут
+ ^таблица.cells[], ^таблица.cells(лимит)
+ выдает ма��ив �чеек текущей �троки
+ ^таблица.array[]
+ возвращает ма��ив, �лементами которого �вл�ют�� хеши, отображающие данные каждой �троки
+ ^таблица.array[колонка]
+ возвращает ма��ив значений указанной колонки
+ ^таблица.array{код}
+ возвращает ма��ив результатов выполнени� переданного кода дл� каждой �троки таблицы
+ ^таблица.rename[название �толбца;новое навание �толбца] ^таблица.rename[ $.название �толбца[новое навание �толбца] ]
+ переименовывает �толбец или �толбцы
+ $отобранное[^таблица.select(выражение)]
+ таблица из тех �толбцов и �трок, у которых у�ловие �овпало
$adults[^man.select($man.age>=18)]
- ^òàáëèöà.color[öâåò1;öâåò2]
+ ^таблица.color[цвет1;цвет2]
+ чередует цвет1 и цвет2 по�ледовательно дл� каждого р�да
+hash
+ в выражении
+ логиче�кое значение равно "не пу�т?", хеш � _default уже не пу�т
+ чи�ловое значение равно count[]
+ $хеш.ключ
+ _default - �пециальный ключ, е�ли задан,
+ то при обращении по ключу, которому нет �оответ�тви�, выдаёт�� _default значение
+ $хеш.fields
+ выдает $hash, чтобы кла�� hash был чуть больше похож на кла�� table
+ ^hash::create[[|copy_from_hash|copy_from_hashfile]]
+ �оздаёт новый hash, копию �тарого
+ ^хеш.add[�лагаемое]
+ перезапи�ывает одноимённые
+ ^хеш.sub[вычитаемое]
+ ^хеш.union[b]
+ объединение, одноимённые о�тают��
+ ^хеш.intersection[b][[$.order[self|arg]]]
+ пере�ечение, новый хеш, order задает пор�док �лементов (как в и�ходном хеше или хеше-параметре)
+ ^хеш.intersects[b] = bool
+ ^hash::sql{запро�}[[$.distinct(1) $.limit(2) $.offset(4) $.type[hash|string|table]]]
+ получает�� hash(ключи=значени� перва� колонка ответа) of hash(ключи=названи� о�тальных колонкок ответа) или
+ string=значение каждого �лемента - �трока, при �том надо указать ровно два �толбца или
+ table=значение каждого �лемента - таблица
+ ^хеш.keys[[название колонки � ключами]]
+ таблица из одного �толбца key или как передадут
+ ^хеш.count[]
+ ^хеш.foreach[key;value]{тело}[[разделитель]|{разделитель который выполн�ет�� перед непу�тым очередным не первым телом}]
+ ^хеш.delete[ключ]
+ удалить ключ
+ ^хеш.contains[ключ]
+ �уще�твует ли в хеше ключ (bool)
+ ^хеш.at[first|last][[key|value|hash]]
+ ^хеш.at([-]N)[[key|value|hash]]
+ до�туп к заданным �лементам упор�доченного хеша
+ ^хеш.set[first|last;значение]
+ ^хеш.set([-+]N)[значение]
+ у�танавливает значение заданного �лемента упор�доченного хеша
+ ^хеш.rename[�тарый_ключ;новый_ключ]
+ ^хеш.rename[ $.�тарый_ключ[новый_ключ] ... ]
+ переименовывает заданные ключи хеша
+ ^хеш.array[[keys|values]]
+ �квивалентен ^array::copy[$хеш] или возвращает ма��ив ключей или значений хеша
+ ^хеш.sort[key;value]{{ключеделатель �трока}|(ключеделатель чи�ло)}[[desc|asc]] default=asc
+ $обратный_хеш[^хеш.reverse[]]
+ $отобранное[^хеш.select[key;value](выражение)[ $.limit(N) $.reverse(bool) $.default(bool) ]]
+ хеш из ключей и значений, дл� которых у�ловие и�тинно
+
+hashfile
+ ^hashfile::open[filename]
+ ^хешфайл.clear[]
+ забыть в�ё
+ $хешфайл.ключ[значение]
+ положить значение
+ $хешфайл.ключ[$.value[значение] $.expires[З��ЧЕ�ИЕ]}
+ положить значение до expires
+ значение пол� expires может быть date, или чи�ло дней(0дней=на вечно)
+ $хешфайл.ключ до�тать
+ ^хешфайл.delete[ключ] удалить ключ
+ ^хешфайл.delete[] удалить файлы, �одержащие данные
+ ^хешфайл.hash[]
+ преобразовать в обычный hash
+ попутно �тирает у�таревшие пары
+ ^хешфайл.foreach[key;value]{тело}[[разделитель]|{разделитель который выполн�ет�� перед непу�тым очередным не первым телом}]
+ ^хешфайл.release[]
+ запи�ать данные и �н�ть блокировки
+ при повторном обращении к �лементам откроет�� автоматиче�ки
+ ^хешфайл.cleanup[]
+ пробежать�� по в�ем �лементам и удалить у�таревшие.
+
+ пример:
+ $sessions[^hashfile::open[/db/sessions]]
+ $sid[^math:uuid[]]
+ $sessions.$sid[$.value[$uid] $.expires(1)]
+ $uid[$sessions.$sid]
+
+array
+ в выражении
+ логиче�кое значение равно "не пу�т?"
+ чи�ловое значение равно count[]
+ $ма��ив.индек�, $ма��ив.(выражение)
+ возврат значени� по заданному индек�у
+ $ма��ив.индек�[значение], $ма��ив.(выражение)[значение]
+ при�ваивание значени� по индек�у
+ $ма��ив[значение;значение;...]
+ �оздание ма��ива � заданными значени�ми
+ ^array::create[]
+ ^array::create[значение;значение;...]
+ �оздание ма��ива � заданными значени�ми или пу�того ма��ива
+ ^array::copy[копируемый ма��ив или хеш � цифровыми ключами]
+ копирование ма��ива или хеша � цифровыми ключами
+ ^ма��ив.add[добавл�емый ма��ив или хеш � цифровыми ключами]
+ добавление �лементов из другого ма��ива или хеша � перезапи�ью значений у �овпадающих индек�ов
+ ^ма��ив.join[добавл�емый ма��ив или произвольный хеш]
+ добавление �лементов другого ма��ива или хеша в конец ма��ива
+ ^ма��ив.append[значение;значение;...]
+ добавление �лементов в конец ма��ива
+ ^ма��ив.insert(индек�)[значение;значение;...]
+ в�тавка �лементов в указанную позицию ма��ива
+ ^ма��ив.left(n)
+ возвращает новый ма��ив из n первых �лементов ма��ива
+ ^ма��ив.right(n)
+ возвращает новый ма��ив из n по�ледних �лементов ма��ива
+ ^ма��ив.mid(m;n)
+ возвращает новый ма��ив, �одержащий n инициализированных �лементов ма��ива, начина� � позиции m
+ ^ма��ив.delete(index)
+ удаление �лемента ма��ива � о�тавлением пу�того ме�та
+ ^ма��ив.remove(index)
+ удаление �лемента �о �двигом по�ледующих �лементов на его ме�то
+ ^ма��ив.push[значение]
+ добавление �лемента в конец ма��ив
+ ^ма��ив.pop[]
+ возвращает по�ледний �лемент и удал�ет его из ма��ива
+ ^ма��ив.contains(индек�)
+ �уще�твует ли в ма��иве �лемент по переданому индек�у (bool)
+ ^array::sql{запро�}[[ $.sparse(false) $.distinct(false) $.limit(2) $.offset(4) $.type[hash|string|table]]]
+ �оздание ма��ива на о�нове выборки из базы данных
+ $.sparse(false), по умолчанию - �оздать обычный ма��ив. Значени� �трок выборки по�ледовательно добавл�ют�� в ма��ив
+ $.sparse(true) - �оздать разреженный ма��ив. Перва� колонка данных должна �одержать индек�ы,
+ по которым будут размещены значени� (аналогично ^hash::sql{})
+ получает�� array of hash (ключи=названи� о�тальных колонкок ответа) или
+ string = значение каждого �лемента - �трока, при �том надо указать ровно два �толбца или
+ table = значение каждого �лемента - таблица
+ ^ма��ив.keys[[название колонки � ключами]]
+ таблица из одного �толбца key или переданного названи� � индек�ами инициализированных �лементов ма��ива
+ ^ма��ив.count[]
+ количе�тво инициализированных �лементов ма��ива
+ ^ма��ив.count[all]
+ общее количе�тво �лементов ма��ива, включа� неинициализированные
+ ^ма��ив.foreach[index;value]{тело}[[разделитель]|{разделитель который выполн�ет�� перед непу�тым очередным не первым телом}]
+ перебирает в�е инициализированные �лементы ма��ива
+ ^ма��ив.for[index;value]{тело}[[разделитель]|{разделитель который выполн�ет�� перед непу�тым очередным не первым телом}]
+ перебирает в�е �лементы ма��ива
+ ^ма��ив.at[first|last][[key|value|hash]]
+ ^ма��ив.at([-]чи�ло)[[key|value|hash]]
+ до�туп к �лементу ма��ива по пор�дковому номеру
+ ^ма��ив.set[first|last][значение]
+ ^ма��ив.set([-]чи�ло)[значение]
+ у�тановка значени� �лемента ма��ива по пор�дковому номеру
+ ^ма��ив.compact[]
+ удаление неинициализированных �лементов ма��ива
+ ^ма��ив.compact[undef]
+ удаление неинициализированных и пу�тых �лементов ма��ива
+ ^ма��ив.sort[key;value]{{ключеделатель �трока}|(ключеделатель чи�ло)}[[desc|asc]] default=asc
+ �ортировка ма��ива
+ $обратный_ма��ив[^ма��ив.reverse[]]
+ возвращает новый ма��ив из �лементов и�ходного в обратном пор�дке
+ $отобранное[^ма��ив.select[key;value](выражение)[ $.limit(N) $.reverse(bool) ]]
+ отбор �лементов ма��ива, дл� которых у�ловие и�тинно
+
+date
+ врем� типа date можно и�пользовать в выражени�х, под�тавл�ет количе�тво дней � epoch [1 �нвар� 1970 (UTC)], дробное
+ �троковое значение в ме�тном времени, чи�ленное в UTC, диапазон от 0000-00-00 00:00:00 до 9999-12-31 23:59:59
+ по умолчанию и�пользует�� у�тановленна� �ред�твами OS временна� зона
+
+ ^date::now[]
+ ^date::now(�мещение в дн�х)
+ выдаёт �ейча�+�мещение
+ ^date::today[]
+ дата на 00:00:00 текущего дн�
+ ^date::today(целочи�ленное �мещение в дн�х)
+ дата на 00:00:00 текущего дн�+�мещение
+ ^date::create(дней � epoch)
+ ^date::create(year;month[;day[;hour[;minute[;second[;TZ]]]]])
+ ^date::create[дата в формате %Y-%m-%d %H:%M:%S]
+ дл� удобного �оздани� по значению из базы
+ формат1: %Y[-%m[-%d[ %H[:%M[:%S]]]]]
+ формат2: %H:%M[:%S]
+ ^date::create[дата в формате %Y-%m-%dT%H:%M[:%S]TZ]
+ дл� �оздани� по значению в формате ISO 8601
+ формат TZ: Z(UTC) или +-hour[:minute] (�мещение от UTC)
+ ^date::unix-timestamp()
+ ^дата.unix-timestamp[]
+ $дата.year month day hour minute second weekday yearday(0...) daylightsaving TZ weekyear
+ TZ="" << локальна� зона
+ $дата.year month day hour minute second можно задать новое значение, о�тальные read only
+ ^дата.double[] ^дата.int[]
+ количе�тво дней � epoch [1 �нвар� 1970 (UTC)], дробное или целое
+ ^дата.roll[year|month|day](+-�мещение)
+ �двигает дату
+ ^дата.roll[TZ;�ова� зона]
+ говорит, что дата в таком-то ча�овом по��е: вли�ет на .hour & Co
+ ^date:roll[TZ;�ова� зона]
+ говорит, что по умолчанию в�е даты в таком-то ча�овом по��е
+ ^дата.sql-string[[datetime|date|time]]
+ datetime или без параметра - %Y-%m-%d %H:%M:%S
+ date - %Y-%m-%d
+ time - %H:%M:%S
+ where published='^дата.sql-string[]'
+ ^date:sql-string[[datetime|date|time]]
+ sql-string дл� �ейча�
+ ^date:calendar[rus|eng](год;ме��ц)
+ выдаёт неименованную таблицу, �толбцы: 0..6, week, year
+ ^date:calendar[rus|eng](год;ме��ц;день)
+ выдаёт именнованную таблицу, �толбцы: year, month, day, weekday
+ ^date:last-day(год;ме��ц)
+ вернёт по�ледний день ме��ца
+ ^дата.last-day[]
+ вернёт по�ледний день ме��ца $дата
+ ^дата.gmt-string[]
+ Fri, 23 Mar 2001 09:32:23 GMT
+ ^date:gmt-string[]
+ gmt-string дл� �ейча�
+ ^дата.iso-string[]
+ 2001-03-23T12:32:23+03
+ ^date:iso-string[]
+ iso-string дл� �ейча�
+
+file
+ $файл_из_post.name
+ $файл_из_post.size
+ $файлt_из_post.text
+ ^файл.save[text|binary;им� файла[;$.charset[в какой кодировке �охран�ем] $.append(false)]]
+ ^file:delete[им� файла]
+ ^file:find[им� файла][{когда не нашли}]
+ ^file:list[путь[;шаблон-�трока|шаблон-regex]]
+ table � колонками name dir
+ ^file:list[путь;$.filter[шаблон-�трока|шаблон-regex] $.stat(true)]
+ table � колонками name dir size [mca]date
+ ^file::load[text|binary;big.zip[;domain_press_release_2001_03_01.zip][;опции]]
+ ^file::create[text|binary;им�;data]
+ ^file::create[text|binary;им�;data[;$.charset[кодировка букв в �оздаваемом файле] $.content-type[...]]]
+ ^file::create[string-or-file-content[;$.name[им�] $.mode[text|binary] $.content-type[...] $.charset[...]]]
+ $файл_который_был_loaded.size
+ $файл_который_был_loaded_или_created.mode = text/binary
+ ^file::stat[им� файла]
+ $файл_который_был_stated_или_loaded.size .adate .mdate .cdate
+ ^file::cgi[[text|binary;]им� файла[;env hash +options[;1cmd[;2line[;3ar[;4g[;5s]]]]]]]
+ любой аргумент может быть �трокой или ма��ивом �трок
+ возвращённый заголовок ра��ыпает�� на $пол�
+ $status
+ $stderr
+ ^file::exec[[text|binary;]им� файла[;env hash[;1cmd[;2line[;3ar[;4g[;5s;...under unix max 50 args]]]]]]]
+ любой аргумент может быть �трокой или ма��ивом �трок
+ options:
+ $.stdin[тек�т|файл] е�ли пу�то, отключает�� автоматиче�кое пере�овывание данных HTTP-POST
+ ^file:move[�тарое им� файла;новое им� файла]
+ можно переименовывать и двигать каталоги[win32: но не через границу ди�ков]
+ каталоги дл� dest �оздают�� � правами 775
+ каталог �тарого файла �тирает��, е�ли по�ле move он о�таёт�� пу�т
+ ^file:copy[им� файла;им� копии файла[; $.append(1) ]]
+ можно копировать только файлы
+ ^file:lock[им� файла]{код}
+ файл при необходимо�ти �оздаёт��
+ блокирует��
+ выполн�ет�� код
+ разблокирует��
+ ^file:dirname[/a/some.tar.gz|file]=/a (работает аналогично комманде *nix)
+ ^file:dirname[/a/b/|file]=/a (работает аналогично комманде *nix)
+ ^file:basename[/a/some.tar.gz|file]=some.tar.gz (работает аналогично комманде *nix)
+ ^file:basename[/a/b/|file]=b (работает аналогично комманде *nix)
+ ^file:justname[/a/some.tar.gz|file]=some.tar
+ ^file:justext[/a/some.tar.gz|file]=gz
+ /some/page.html: ^file:fullpath[a.gif] => /some/a.gif
+ ^файл.sql-string[]
+ внутри ^connect да�т правильно escaped �троку, которую можно в запро� отдать
+ ^file::sql{query}[[ $.name[им�_файла_дл�_download] $.content-type[пользователь�кий content-type] ]]
+ результат запро�а должен быть "одна �трока".
+ колонки:
+ перва� колонка - данные
+ е�ли е�ть втора� - �то им� файла
+ е�ли е�ть треть� - �то content-type
+ ^файл.base64[ $.pad(bool) $.wrap(bool) $.url-safe(bool) ]
+ encode
+ ^file:base64[им� файла[; $.pad(bool) $.wrap(bool) $.url-safe(bool) ]]
+ encode
+ ^file::base64[encoded string[; $.pad(bool) $.strict(bool) url-safe(bool) ]]
+ decode
+ ^file::base64[mode;им� файла;encoded string[; $.content-type[...] $.pad(bool) $.strict(bool) url-safe(bool) ]]
+ decode
+ ^file:crc32[им� файла]
+ вычи�л�ет crc32 файла � указанным именем
+ ^файл.crc32[]
+ вычи�л�ет crc32 объекта
+ ^файл.md5[], ^file:md5[им� файла]
+ выдает digest файла, длиной 16 байт в виде �троки,
+ где байты digest выданы в hex виде, впритык, в нижнем реги�тре
+
+image
+ $картинка[^image::measure[DATA[; $.exif(bool) $.xmp(bool) $.xmp-charset[] $.video(bool) ]]]
+ �мотрит на .ext case insensitive,
+ умеет мерить gif, jpg, tiff, bmp, webp и mp4 (mov)
+ $картинка.exif << hash по�ле measure jpeg � exif информацией и $.exif(true)
+ $image.exif.DateTime & co
+ [полный �пи�ок �м. https://exiftool.org/TagNames/EXIF.html]
+ чи�ла типа int/double,
+ даты типа dateб
+ перечи�лени� в виде hash � ключами 0..count-1
+ $картинка.src .width .height
+ $картинка.line-width чи�ло=ширина линий
+ $картинка.line-style �трока=�тиль линий '*** * '='*** * *** * *** * '
+ ^картинка.html[[hash]]
+
+ ^image::load[фон.gif]
+ только gif пока
+ ^image::create(размер X;размер Y[;цвет фона default белый]])
+ ^картинка.line(x0;y0;x1;y1;0xffFFff)
+ ^картинка.fill(x;y;0xffFFff)
+ ^картинка.rectangle(x0;y0;x1;y1;0xffFFff)
+ ^картинка.bar(x0;y0;x1;y1;0xffFFff)
+ ^картинка.replace(hex-цвет1;hex-цвет2)[table x:y вершины_многоугольника]
+ ^картинка.polyline(цвет)[table x:y точки]
+ ^картинка.polygon(цвет)[table x:y вершины_многоугольника]
+ ^картинка.polybar(цвет)[table x;y вершины_многоугольника]
+ ^картинка.font[набор_букв;им�_файла_шрифта.gif][(ширина_пробела[;ширина_�имвола])]
+ вы�ота �имвола = вы�ота картинки/количе�тво букв в наборе
+ е�ли указана ширина_�имвола, то monospaced, е�ли 0, то ширина_�имвола = ширине gif
+ ^картинка.font[набор_букв;им�_файла_шрифта.gif;
+ $.space(ширина_пробела) // по умолчанию = ширине gif
+ $.width(ширина_�имвола) // �м. выше, по умолчанию proportional
+ $.spacing(ра��то�ние между буквами) // по умолчанию = 1
+ ]
+ ^картинка.text(x;y)[тек�т_надпи�и] AS_IS
+ ^картинка.length[тек�т_надпи�и] AS_IS
+ ^картинка.gif[возможно, им� файла]
+ кодирует в FILE � content-type=image/gif им� файла будет и�пользовано при $response:download
+ ^картинка.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)
+ ^картинка.circle(center x;center y;r;color)
+ ^картинка.copy[source](src x;src y;src w;src h;dst x;dst y[;dest w[;dest h[;tolerance]]])
+ при заданных dest_w/dest_h делает изменение размера ку�очка
+ при уменьшении делает resample
+ годит�� только дл� уменьшени� про�той[малоцветной] дребедени вроде графиков/pie,
+ дл� thumbnais не годит��
+ при не указанном dest_h �охран�ет aspect ratio
+ tolerance - некое чи�ло[квадрат ра��то�ни� в RGB про�тран�тве до и�комого цвета],
+ определ�ющее прожорливо�ть выдел�лки цветов из палитры [default=150]
+ меньше - точнее приближает цвета, но они бы�тро кончают��
+ больше - неточно приближает цвет, но большей ча�ти хватит
+ ^картинка.pixel(x;y)[(color)]
+ узнать или задать цвет пик�ела
+
+regex
+ в выражении
+ логиче�кое значение в�егда равно true
+ чи�ловое значение равно количе�тву байт �компилированного шаблона
+ ^regex::create[шаблон-�трока|regex][[опции пои�ка]]
+ ^шаблон.size[]
+ количе�тво байт �компилированного шаблона
+ е�ли значение очень большое - �тоит почитать документацию по pcre и, возможно, перепи�ать шаблон
+ ^шаблон.study_size[]
+ размер study-�труктуры. е�ли==0 - шаблон не может быть "изучен"
+ $шаблон.pattern
+ тек�т шаблона
+ $шаблон.options
+ �трока � и�ходным тек�том опций
+
+amqp
+ ^amqp::create[[
+ $.host[localhost] $.port(5672) $.user[guest] $.password[guest] $.vhost[/] $.locale[en_US]
+ $.heartbeat(30) $.auto_reconnect(�екунд)
+ $.tls[ $.ca[файл] $.cert[файл] $.key[файл] $.verify(true) ]
+ ]]
+ подключает�� к брокеру RabbitMQ
+ auto_reconnect(N): по�ле потери �оединени� переподключить�� перед �ледующей операцией, выждав N �екунд
+ tls: �ертификат �ервера провер�ет��, только е�ли задан ca
+ ^amqp.publish[�ообщение][[
+ $.exchange[] $.routing_key[ключ]|$.queue[им�] $.mandatory(false)
+ �вой�тва �ообщени�: $.content_type[] $.content_encoding[] $.delivery_mode(1|2) $.priority(N) $.correlation_id[] $.reply_to[]
+ $.expiration[] $.message_id[] $.timestamp(N) $.type[] $.user_id[] $.app_id[] $.cluster_id[] $.headers[хеш]
+ ]]
+ ^amqp.consume[ $.queue[им�] $.ack(true) $.count(1) $.timeout(0) $.exclusive(false) $.consumer_tag[] ]
+ ма��ив �ообщений, готовых за timeout �екунд (ждёт�� только первое)
+ ^amqp.consume[ $.queue[им�] $.callback[$метод] ... ]
+ вызывает @метод[�ообщение] дл� каждого �ообщени� до ^amqp.stop_consume[], count �ообщений или timeout �екунд без �ообщений
+ count и timeout по умолчанию не ограничены
+ �ообщение: хеш � msg, delivery_tag, routing_key, exchange, redelivered, consumer_tag и заданными �вой�твами
+ ^amqp.ack(delivery_tag)
+ при $.ack(true) (по умолчанию) полученные �ообщени� нужно подтверждать
+ ^amqp.nack(delivery_tag)[ $.requeue(false) ]
+ ^amqp.reject(delivery_tag)[ $.requeue(true) ]
+ ^amqp.qos[ $.prefetch_count(N) ]
+ ^amqp.declare[ $.queue[им�] $.durable(false) $.exclusive(false) $.auto_delete(false) $.passive(false) $.arguments[хеш] ]
+ дл� пу�того имени �ервер �оздаёт очередь �о �воим именем, оно возвращает��
+ ^amqp.declare[ $.exchange[им�] $.type[direct] $.durable(false) $.auto_delete(false) $.internal(false) $.passive(false) $.arguments[хеш] ]
+ ^amqp.delete[ $.queue[им�]|$.exchange[им�] $.if_unused(false) $.if_empty(false) ]
+ ^amqp.bind[ $.exchange[им�] $.queue[им�] $.routing_key[] ]
+ ^amqp.unbind[ $.exchange[им�] $.queue[им�] $.routing_key[] ]
+ ^amqp.purge[ $.queue[им�] ]
+ чи�ло удалённых �ообщений
+ ^amqp.info[ $.queue[им�] ]
+ хеш � queue, messages, consumers
+ ^amqp.release[]
+ закрывает �оединение
+ значени� в arguments и headers: [�трока], (чи�ло), (true|false)
+
+console
+ $console:timeout
+ $console:line
+ read/write �троку
+
+cookie
+ $cookie:им� �читать �тарое или �вежезаданное
+ $cookie:им�[значение] на 90 дней
+ $cookie:им�[$.value[значение] $.expires[З��ЧЕ�ИЕ] $.secure(true) $.domain[им� домена] $.httponly(true)]
+ значение пол� expires может быть 'session', date, или чи�ло дней (0дней=session)
+ е�ли дата, она будет преобразована к формату "Sun, 25-Aug-2002 12:03:45 GMT"
+ $cookie:fields
+ hash �о в�еми cookies
+
+curl
+ ^curl:load[[
+ $.url[http://URL]
+ $.timeout(N)
+ $.ssl_verifypeer(0)
+ $.mode[text|binary] тип �оздаваемого файла
+ ]]
+ загружает файл � удалённого �ервера, можно вызывать многократно в одной �е��ии,
+ можно указать любую опцию libcurl, имена опций �трочными буквами без префик�а CURLOPT_
+ ^curl:options[[
+ $.library[libcurl.so.4]
+ $.charset[UTF-8]
+ ...
+ ]]
+ по�ледующие вызовы ^curl:load на�ледуют заданные опции, путь к libcurl задаёт�� до начала и�пользовани� curl
+ ^curl:session{код}
+ �оздаёт cURL-�е��ию, можно задать общие опции, �делать не�колько загрузок
+ ^curl:info[название], ^curl:info[]
+ информаци� о по�леднем запро�е (значение или хеш)
+ ^curl:version[]
+ вер�и� и�пользуемой библиотеки cURL
+
+env
+ $env:переменна�
+ $env:fields хеш � переменными окружени�
+ $env:PARSER_VERSION вер�и� пар�ера
+
+form
+ [берёт�� первый �лемент из одноимённых из GET, потом первый из POST]
+ $form:поле
+ string/file
+ $form:nameless
+ поле �о значением пол� без имени "?value&...", "...&value&...", "...&value"
+ $form:qtail
+ �трока �о значением тек�та по�ле второго "?xxxxx", е�ли там не было ',' [imap]
+ $form:fields
+ hash �о в�еми пол�ми формы
+ $form:elements.поле
+ array �о в�еми значени�ми пол� - как �троковыми, так и файловыми
+ $form:tables.поле
+ table � одним �толбцом "field" �о значени�ми "пол�", дл� множе�твенных значений
+ $form:files.поле
+ hash �о значени�ми полей типа файл, ключи - 0, 1, ..., значение - файл
+ $form:imap
+ хеш � ключами 'x' и 'y' �о значением ?1,2 припи�ки при и�пользовании server-site image map
+
+inet
+ ^inet:ntoa(long)
+ ^inet:aton[IP]
+ ^inet:name2ip[name][[ $.ipv[4|6|any] $.table(true) ]]
+ пр�мое преобразование имени в IP адре�
+ ^inet:ip2name[ip][ $.ipv[4|6|any] ]]
+ обратное преобразование из IP адре�а в им�
+ ^inet:hostname[]
+ им� хо�та
+
+json
+ ^json:parse[-json-�трока-[;
+ $.depth(мак�имальна� глубина, default == 19)
+ $.double(false) отключить в�троенный пар�инг чи�ел � плавающей точкой (по умолчанию включен)
+ в �том �лучае они попадут в результирующий объект как �троки
+ $.int(false) отключить в�троенный пар�инг целых чи�ел (по умолчанию включен)
+ в �том �лучае они попадут в результирующий объект как �троки
+ $.distinct[first|last|all] как будет прои�ходить разбор дублирующих�� ключей у объектов
+ first - будет о�тавлен первый в�третивший�� �лемент
+ last - будет о�тавлен по�ледний в�третивший�� �лемент
+ all - будут о�тавлены в�е �лементы. при �том �лементы, начина� �о 2
+ получат чи�ловые �уффик�ы (key_2 итд)
+ по умолчанию дублирующие�� ключи приведут к exception
+ $.object[method-junction] пользователь�кий метод[ключ;объект], которому будут передавать�� в�е разобранные
+ объекты и ключи объекта, метод возвращает новый объект
+ $.array[method-junction] пользователь�кий метод, которому будут передавать�� ма��ивы
+ $.taint[�зык преобразовани�] задаёт �зык преобразовани� дл� в�ех �трок результата
+ ]]
+ пар�ит json-�троку в хеш
+
+ ^json:string[system or user object[;
+ $.skip-unknown(false) отключить exception и выдавать 'null' при �ериализации объектов � типами
+ отличных от void, bool, string, int, double, date, table, hash и file
+ $.indent(true) форматировать результирующую �троку табул�ци�ми по глубине вложенно�ти
+ $.date[sql-string|gmt-string|iso-string|unix-timestamp]
+ формат вывода даты, по умолчанию -- sql-string
+ $.table[object|array|compact]
+ формат вывода таблицы, по умолчанию -- object
+ object: [{"c1":"v11","c2":"v12",...},{"c1":"v21","c2":"v22",...},...]
+ array: [["c1","c2",...] || null (for nameless),["v11","v12",...],...]
+ compact: ["v11" || ["v11","v12",...],...]
+ $.file[text|base64|stat] выве�ти тело файла в указанном виде (по умолчание тело файла
+ не попадает в output)
+ $.xdoc[hash] параметры преобразовани� xdoc в �троку (как в ^xdoc.string[])
+ $.тип[method-junction] любой тип можно выве�ти � помощью пользователь�кого метода, который
+ должен принимать 3 параметра: ключ, объект данного типа и опции
+ вызова ^json:string[]
+ $._default[метод] пользователь�кий метод, будет вызывать�� дл� вывода в�ех объектов пользователь�ких
+ кла��ов. Метод должен принимать 3 параметра: ключ, объект и опции вызова.
+ $._default[им� метода] им� пользователького метода, при его наличии он будет вызван дл� �ериализации
+ $.void[null|string] неопределенное значение будет выдано в виде null (по умолчанию)
+ или пу�той �троки
+ ]]
+ �ериализует �и�темный или пользователь�кий объект в json-�троку
-!hash
- !â âûðàæåíèè
- !ëîãè÷åñêîå çíà÷åíèå ðàâíî "íå ïóñòà?"
- !÷èñëîâîå çíà÷åíèå ðàâíî _count[]
- !$hash.êëþ÷
- !_default - ñïåöèàëüíûé êëþ÷, åñëè çàäàí,
- òî ïðè îáðàùåíèè ïî êëþ÷ó, êîòîðîìó íåò ñîîòâåòñòâèÿ, âûäà¸òñÿ _default çíà÷åíèå
- !$hash.fields âûäàåò $hash. ÷òîáû êëàññ hash áûë ÷óòü áîëüøå ïîõîæ íà êëàññ table
- !^hash::create[[!copy_from_hash|Xcopy_from_hashfile]]
- ñîçäà¸ò íîâûé hash, êîïèþ ñòàðîãî
- !^hash.add[ñëàãàåìîå]
- ïåðåçàïèñûâàåò îäíîèì¸ííûå
- !^hash.sub[âû÷èòàåìîå]
- !^a.union[b] = îáúåäèíåíèå
- îäíîèì¸ííûå îñòàþòñÿ
- !^a.intersection[b] = ïåðåñå÷åíèå
- çíà÷åíèÿ a
- !^a.intersects[b] = bool
- !^hash::sql{çàïðîñ}[[$.distinct(1) $.limit(2) $.offset(4) todo:$.default{$.field[]...}]]
- ïîëó÷àåòñÿ hash(êëþ÷è=çíà÷åíèÿ ïåðâàÿ êîëîíêà îòâåòà)
- of hash(êëþ÷è=íàçâàíèÿ îñòàëüíûõ êîëîíêîê îòâåòà)
- !^hash._keys[]+ òàáëèöà èç îäíîãî ñòîëáöà $key
- !^hash._count[]
- !^foreach[key;value]{òåëî}[[ðàçäåëèòåëü]|{ðàçäåëèòåëü êîòîðûé âûïîëíÿåòñÿ ïåðåä íåïóñòûì î÷åðåäíûì íå ïåðâûì òåëîì}]
- !^delete[êëþ÷] óäàëèòü êëþ÷
-
-!form
- [áåð¸òñÿ ïåðâûé ýëåìåíò èç îäíîèì¸ííûõ èç GET, ïîòîì ïåðâûé èç POST]
- !$form:ïîëå = string/file
- !$form:nameless = ïîëå ñî çíà÷åíèåì ïîëÿ áåç èìåíè "?value&...", "...&value&...", "...&value"
- !$form:qtail = ñòðîêà ñî çíà÷åíèåì òåêñòà ïîñëå âòîðîãî "?xxxxx", åñëè òàì íå áûëî ',' [imap]
- !$form:fields = hash ñî âñåìè ïîëÿìè ôîðìû
- !$form:tables.ïîëå = table ñ îäíèì ñòîëáöîì "field" ñî çíà÷åíèÿìè "ïîëÿ"
- !$form:imap = õýø ñ êëþ÷àìè 'x' è 'y'
- ñî çíà÷åíèåì ?1,2 ïðèïèñêè ïðè èñïîëüçîâàíèè server-site image map
-
-!env
- !$env:ïåðåìåííàÿ
-
-!cookie
- !$cookie:èìÿ ñ÷èòàòü ñòàðîå èëè ñâåæåçàäàííîå
- !$cookie:èìÿ[çíà÷åíèå] íà 90 äíåé
- !$cookie:èìÿ[$.value[çíà÷åíèå] $.expires ÇÍÀ×ÅÍÈÅ ]
- !çíà÷åíèå ïîëÿ expires ìîæåò áûòü 'session', date, èëè ÷èñëî äíåé(0äíåé=session)
- ! åñëè äàòà, îíà áóäåò ïðåîáðàçîâàíà ê ôîðìàòó "Sun, 25-Aug-2002 12:03:45 GMT"
-
-!request
- !$request:query
- !$request:body unprocessed POST request body
- !$request:uri
- X!$request:browser ýòî hash, ïîëÿ:
- !$type = ie/nn è !$version = íîìåð, ñêàæåì 5.5
- X$request:user
- X$request:password
- !$request:charset
- Êîäèðîâêà èñõîäíîãî äîêóìåíòà
- !èñïîëüçóåòñÿ ïðè upper/lower è match[][i]
- ÏÐÅÄÓÏÐÅÆÄÅÍÈÅ: êëàññ form ïîëó÷àåò ñâîè ïîëÿ ïîñëå îáðàáîòêè âñåõ auto êëàññà MAIN
- ïîýòîìó íåîáõîäèìî çàäàòü $request/response:charset â îäíîì èç íèõ. íå ïîñëå.
-
-!response
- !$response:ïîëå[çíà÷åíèå] è ìîæíî ñ÷èòàòü ñòàðîå -- $response:ïîëå
- !çíà÷åíèå ìîæåò áûòü string à ìîæåò áûòü hash:
- ! $value[abc] field: {abc}<<÷àñòü
- ! $attribute[zzz] field: abc; {attribute=zzz}<<÷àñòü
- !çíà÷åíèå ïîëÿ èëè àòðèáóòà ìîæåò áûòü string èëè date
- ! åñëè äàòà, îíà áóäåò ïðåîáðàçîâàíà ê ôîðìàòó "Sun, 25-Aug-2002 12:03:45 GMT"
- !$response:body[DATA] çàìåùàåò ñòàíäàðòíûé îòâåò
- !$response:download[DATA] çàìåùàåò ñòàíäàðòíûé îòâåò,
- âûñòàâëÿåò ôëàã, çàñòàâëÿþùèé browser ïðåäëîæèòü download
- !$response:status
- !^response:clear[] çàáûòü âñå çàäàííûå response ïîëÿ
- !$response:charset
- êîäèðîâêà êëèåíòà ò.å. òà,
- 1) èç êîòîðîé áóäóò ïåðåêîäèðîâàíû $form:ïîëÿ ïîñëå çàáèðàíèÿ èç browser'à
- 2) â êîòîðóþ äîêóìåíò áóäåò ïåðåêîäèðîâàí ïåðåä îòäàâàíèåì â browser
- 3) â êîòîðóþ áóäåò ïåðåêîäèðîâàí òåêñò ÿçûêà uri
- íå äîáàâëÿåò ê content-type íè÷åãî, åñëè õî÷åòñÿ, ýòî íàäî ñäåëàòü âðó÷íóþ
- ÏÐÅÄÓÏÐÅÆÄÅÍÈÅ: êëàññ form ïîëó÷àåò ñâîè ïîëÿ ïîñëå îáðàáîòêè âñåõ auto êëàññà MAIN
- ïîýòîìó íåîáõîäèìî çàäàòü $request/response:charset â îäíîì èç íèõ. íå ïîñëå.
-
-Xhashfile
- !^hashfile::open[$DB_HOME;filename]
- !^hashfile.clear[]
- çàáûòü âñ¸
- !.êëþ÷[çíà÷åíèå] ïîëîæèòü çíà÷åíèå íàâå÷íî
- !.êëþ÷[$.value[çíà÷åíèå] $.expires(ñåêóíä)} ïîëîæèòü çíà÷åíèå íà expires ñåêóíä
- !.êëþ÷ äîñòàòü
- !^cache[êëþ÷](ñåêóíä){êîä}
- !ñóòü òî æå, ÷òî è "ïîëîæèòü+äîñòàòü", íî çà îäèí ðàç è êîìïàêòíåå
- !åñëè 0ñåêóíä, çíà÷èò íå êýøèðîâàòü, à ñòàðûé òàêîé ñòåðåòü
- !âíóòðè {êîäà} ìîæåò áûòü âûçâàí ^delete[]
- !^delete[[êëþ÷]] óäàëèòü êëþ÷
- !áóäå âûçâàí áåç ïàðàìåòðà èçíóòðè cache, îòìåíÿåò êýøèðîâàíèå áëîêà:
- !áëîê íå áóäåò ñêýøèðîâàí, åãî ñòàðîå çíà÷åíèå áóäåò ñò¸ðòî
- !^hash[]
- ïðåîáðàçîâàòü â îáû÷íûé hash
- !^foreach[key|value]{òåëî}[[ðàçäåëèòåëü]|{ðàçäåëèòåëü êîòîðûé âûïîëíÿåòñÿ ïåðåä íåïóñòûì î÷åðåäíûì íå ïåðâûì òåëîì}]
-
-
- ïðèìåðû:
- $uids[^hashfile::assign[/db/uids]]
- $code:clear[/db/cache]]
- $code[^hashfile::assign[/db/cache]]
-
- $random[23847387taduigh345XGHWElxjgdjg]
- $uids.$random[$.value[$uid] $.expires(60*30)]
- $uid[$persistent.logins.$random]
-
- ^code.cache[çàãîëîâêè íîâîñòåé](35){....}
-
-!mail
- !$mail.received=MESSAGE:
+mail
+ $mail.received=MESSAGE:
.from
.reply-to
.subject
- .date êëàññà date
+ .date кла��а date
.message-id
.raw[
- .ÑÛÐÎÅ_ÏÎËÜÇÎÂÀÒÅËÜÑÊÎÅ-ÏÎËÅ-ÇÀÃÎËÎÂÊÀ
+ .СЫРОЕ_ПОЛЬЗОВ�ТЕЛЬСКОЕ-ПОЛЕ-З�ГОЛОВК�
]
- $.{text|html|file#}[ << íóìåðóåòñÿ êàê è â mail:send (text, text2, ...) (file, file2, ...)
+ $.{text|html|file#}[ << нумерует�� как и в mail:send (text, text2, ...) (file, file2, ...)
$.content-type[
$.value[{text|...|x-unknown}/{plain|html|...|x-unknown}]
- [$.charset[windows-1251]] << â êàêîì ïðèøëî, ñåé÷àñ óæå ïåðåêîäèðîâàíî
- $.ÏÎËÜÇÎÂÀÒÅËÜÑÊÈÉ-ÏÀÐÀÌÅÒÐ-ÇÀÃÎËÎÂÊÀ
+ [$.charset[windows-1251]] << в каком пришло, �ейча� уже перекодировано
+ $.ПОЛЬЗОВ�ТЕЛЬСКИЙ-П�Р�МЕТР-З�ГОЛОВК�
]
$.description
$.content-id
$.content-md5
$.content-location
.raw[
- .ÑÛÐÎÅ_ÏÎËÜÇÎÂÀÒÅËÜÑÊÎÅ-ÏÎËÅ-ÇÀÃÎËÎÂÊÀ
+ .СЫРОЕ_ПОЛЬЗОВ�ТЕЛЬСКОЕ-ПОЛЕ-З�ГОЛОВК�
]
- $.value[ñòðîêà|FILE]
+ $.value[�трока|FILE]
]
$.message#[MESSAGE] (message, message2, ...)
- !^mail:send[
- $.charset[êîäèðîâêà çàãîëîâêà è òåêñòîâûõ áëîêîâ]
- $.any-header-field
+ ^mail:send[
+ $.options[-odd]
+ unix: �трока, котора� будет добавлена к команде запу�ка sendmail
+ -odd означает "бы�тро по�тавь в очередь без проверки email"
+ win32: игнорирует��
+ $.charset[кодировка заголовка и тек�товых блоков]
+ $.any-header-field
$.text[string]
$.text[
- $.any-header-field
+ $.any-header-field
$.value[string]
]
$.html{string}
$.html[
- $.any-header-field
+ $.any-header-field
$.value{string}
]
$.file#[FILE]
$.file#[
- $.any-header-field
+ $.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["âàñÿ" ]
- $.to["ïåòÿ" ]
- $.subject[ïîéä¸ì ïèâêà]
- $.body[
- ñëîâà
- ]
+ е�ли charset указан, пи�ьмо перекодирует�� в �тот charset
+ content-type.charset не вли�ет на перекодирование
+ по�ле имени ча�ти может идти # чи�ло
+
+ ^mail:send[
+# по-умолчанию, �овпадает � source encoding.
+# задаёт кодировку body
+ $.charset[windows-1251]
+# нет умолчани�
+ $.content-type[$.value[text/plain] $.charset[windows-1251]]
+ $.from["ва��" ]
+ $.to["пет�" ]
+ $.subject[тема]
+ $.body[
+ �лова
]
- !:send[$.header-field[] $.charset[êîäèðîâêà ïèñüìà] $.body[êîãäà body íå ñòðîêà,
- à hash, îòñûëàåòñÿ multipart ïèñüìî]]
- !åñëè charset óêàçàí, ïèñüìî ïåðåêîäèðóåòñÿ â ýòîò charset
- !content-type.charset íå âëèÿåò íà ïåðåêîäèðîâàíèå
- !ïîñëå èìåíè ÷àñòè ìîæåò èäòè öåëîå ÷èñëî, ÷àñòè ïîéäóò â ïîðÿäêå ÷èñåë.
- !åñëè body óêàçàí ñòðîêîé, òî ýòî òåêñò ïèñüìà, íèêàêèõ âëîæåíèé.
- !åñëè body óêàçàí hash, òî ýòî ÷àñòè, áóäóò ñîáðàíû òåêñòîâûå áëîêè, çàòåì âëîæåíèÿ
- !ýòî ñòàðûé ôîðìàò, ïîääåðæèâàåòñÿ äëÿ îáðàòíîé ñîâìåñòèìîñòè
- !åñëè èìÿ ÷àñòè íà÷èíàåòñÿ ñî ñëîâà text, òî ýòî òåêñòîâûé áëîê.
- !åñëè èìÿ ÷àñòè íà÷èíàåòñÿ ñî ñëîâà attach, òî ýòî âëîæåíèå, ôîðìàò çàäàíèÿ::
- !$attach[$.format[!uue|Xbase64] $.value[DATA] $.file-name[user-file-name]]
- !âàæíî: ïðè multipart íå óêàçûâàòü content-type
+ ]
+
+ ^mail:send[$.header-field[] $.charset[кодировка пи�ьма] $.body[когда body не �трока, а hash, от�ылает�� multipart пи�ьмо]]
+ е�ли charset указан, пи�ьмо перекодирует�� в �тот charset
+ content-type.charset не вли�ет на перекодирование
+ по�ле имени ча�ти может идти целое чи�ло, ча�ти пойдут в пор�дке чи�ел.
+ е�ли body указан �трокой, то �то тек�т пи�ьма, никаких вложений.
+ е�ли body указан hash, то �то ча�ти, будут �обраны тек�товые блоки, затем вложени�
+ �то �тарый формат, поддерживает�� дл� обратной �овме�тимо�ти
+ е�ли им� ча�ти начинает�� �о �лова text, то �то тек�товый блок.
+ е�ли им� ча�ти начинает�� �о �лова file, то �то вложение, формат задани�:
+ $file[$.format[uue|base64] $.value[DATA] $.name[user-file-name]]
+ важно: при multipart не указывать content-type
+
^mail:send[
-# ïî-óìîë÷àíèþ, ñîâïàäàåò ñ source encoding.
-# çàäà¸ò êîäèðîâêó body
- $.charset[windows-1251]
-# íåò óìîë÷àíèÿ
+# по-умолчанию, �овпадает � source encoding
+# задаёт кодировку body
+ $.charset[windows-1251]
+# нет умолчани�
$.content-type[$.value[text/plain] $.charset[windows-1251]]
- $.from["âàñÿ" ]
- $.to["ïåòÿ" ]
- $.subject[ïîéä¸ì ïèâêà]
+ $.from["ва��" ]
+ $.to["пет�" ]
+ $.subject[тема]
$.body[
- ñëîâà
+ �лова
]
]
+
^mail:send[
- $.from["âàñÿ" ]
- $.to["ïåòÿ" ]
- $.subject[ïîéä¸ì ïèâêà]
+ $.from["ва��" ]
+ $.to["пет�" ]
+ $.subject[тема]
$.body[
$.text[
-# çàäà¸ò êîäèðîâêó body
+# задаёт кодировку body
$.charset[windows-1251]
-# íåò óìîë÷àíèÿ
+# нет умолчани�
$.content-type[$.value[text/plain] $.charset[windows-1251]]
- $.body[ñëîâà]
+ $.body[�лова]
+ ]
+# дл� удоб�тва можно указать только одну ча�ть, при �том не будет multipart
+ $.file[
+ $.value[^file::load[my beloved.doc]]
+ $.name[my beloved.doc]
+ $.format[base64]
]
-#äëÿ óäîáñòâà ñêðèïòîâàíèÿ ìîæíî óêàçàòü òîëüêî îäíó ÷àñòü, ïðè ýòîì íå áóäåò multipart
- $.attach[
- $.value[^file::load[my beloved.doc]]
- $.file-name[ìîé ëþáèìûé.doc]
+ $.file2[
+ $.value[^file::load[my beloved.doc]]
+ $.name[my beloved.doc]
]
- $.attach2[
- $.value[^file::load[my beloved.doc]]
- $.file-name[ìîé ëþáèìûé.doc]
- ]
]
]
- !äëÿ îòïðàâêè
- ïîä unix èñïîëüçóåòñÿ ïðîãðàììà ñ ïàðàìåòðàìè, çàäàâàåìàÿ
- $MAIL.sendmail[êîìàíäà]
- åñëè íå áóäåò çàäàíà, ïðîâåðÿåòñÿ, äîñòóïíà ëè
- /usr/sbin/sendmail èëè
- /usr/lib/sendmail
- è, åñëè äîñòóïíà, òî çàïóñêàåòñÿ ñ ïàðàìåòðîì "-t".
- ïîä win32 èñïîëüçóåòñÿ SMTP ïðîòîêîë, ñåðâåð çàäà¸òñÿ
- $MAIL.SMTP[smtp.domain.ru]
-
-!image
- !$êàðòèíêà[^image::measure[DATA]]
- ñìîòðèò íà .ext case insensitive,
- óìååò ìåðèòü ïîêà òîëüêî .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
- !$êàðòèíêà.line-width ÷èñëî=øèðèíà ëèíèé
- !$êàðòèíêà.line-style ñòðîêà=ñòèëü ëèíèé '*** * '='*** * *** * *** * '
- !^êàðòèíêà.html[[hash]] =
- !^image::load[ôîí.gif]
- òîëüêî gif ïîêà
- !^image::create(ðàçìåð X;ðàçìåð Y[;öâåò ôîíà default áåëûé]])
- !^êàðòèíêà.line(x0;y0;x1;y1;0xffFFff)
- !^êàðòèíêà.fill(x;y;0xffFFff)
- !^êàðòèíêà.rectangle(x0;y0;x1;y1;0xffFFff)
- !^êàðòèíêà.bar(x0;y0;x1;y1;0xffFFff)
- !^êàðòèíêà.replace(hex-öâåò1;hex-öâåò2)[table x:y âåðøèíû_ìíîãîóãîëüíèêà]
- !^êàðòèíêà.polyline+(öâåò)[table x:y òî÷êè]
- !^êàðòèíêà.polygon(öâåò)[table x:y âåðøèíû_ìíîãîóãîëüíèêà]
- !^êàðòèíêà.polybar(öâåò)[table x;y âåðøèíû_ìíîãîóãîëüíèêà]
- !^êàðòèíêà.font[íàáîð_áóêâ;èìÿ_ôàéëà_øðèôòà.gif](øèðèíà_ïðîáåëà[;øèðèíà_ñèìâîëà])
- âûñîòà ñèìâîëà = âûñîòà êàðòèíêè/êîëè÷åñòâî áóêâ â íàáîðå
- åñëè óêàçàíà øèðèíà_ñèìâîëà, òî monospaced, åñëè 0, òî øèðèíà_ñèìâîëà = øèðèíå gif
- !^êàðòèíêà.text(x;y)[òåêñò_íàäïèñè] AS_IS
- !^êàðòèíêà.length[òåêñò_íàäïèñè] AS_IS
- !^êàðòèíêà.gif[] -- êîäèðóåò â FILE ñ content-type=image/gif
- !^êàðòèíêà.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)
- !^êàðòèíêà.circle(center x;center y;r;color)
- !^êàðòèíêà.copy[source](src x;src y;src w;src h;dst x;dst y[;dest w[;dest h[;tolerance]]])
- ïðè çàäàííûõ dest_w/dest_h äåëàåò èçìåíåíèå ðàçìåðà êóñî÷êà
- ïðè óìåíüøåíèè äåëàåò resample
- ãîäèòñÿ òîëüêî äëÿ óìåíüøåíèÿ ïðîñòîé[ìàëîöâåòíîé] äðåáåäåíè âðîäå ãðàôèêîâ/pie,
- äëÿ thumbnais íå ãîäèòñÿ.
- ïðè íå óêàçàííîì dest_h ñîõðàíÿåò aspect ratio
- tolerance - íåêîå ÷èñëî[êâàäðàò ðàññòîÿíèÿ â RGB ïðîñòðàíñòâå äî èñêîìîãî öâåòà],
- îïðåäåëÿþùåå ïðîæîðëèâîñòü âûäåëÿëêè öâåòîâ èç ïàëèòðû [default=150]
- ìåíüøå - òî÷íåå ïðèáëèæàåò öâåòà, íî îíè áûñòðî êîí÷àþòñÿ
- áîëüøå - íåòî÷íî ïðèáëèæàåò öâåò, íî áÎëüøåé ÷àñòè õâàòèò
-
-!file
- !$ôàéë_èç_post.name
- !$ôàéë_èç_post.size
- !$ôàéëtèç_post.text
- !^ôàéë.save[text|binary;èìÿ ôàéëà]
- !^file:delete[èìÿ ôàéëà]
- !^file:find[èìÿ ôàéëà][{êîãäà íå íàøëè}]
- !^file:list[ïóòü[;øàáëîí]] = table ñ êîëîíêîé name
- !^file::load[text|binary;!big.zip[;!domain_press_release_2001_03_01.zip][;îïöèè]]
- !$ôàéë_êîòîðûé_áûë_loaded.size
- !^file::stat[èìÿ ôàéëà]
- !$ôàéë_êîòîðûé_áûë_stated.size !.adate !.mdate !.cdate
- !^file::cgi[èìÿ ôàéëà[;env hash +options[;1cmd[;2line[;3ar[;4g[;5s]]]]]]]
- âîçâðàù¸ííûé çàãîëîâîê ðàññûïàåòñÿ íà $ïîëÿ
- $status
- $stderr
- !^file::exec[èìÿ ôàéëà[;env hash[;1cmd[;2line[;3ar[;4g[;5s;...under win32 max 10 args]]]]]]]
- options:
- $.stdin[òåêñò] åñëè òåêñò ïóñò, îòêëþ÷àåòñÿ àâòîìàòè÷åñêîå ïåðåñîâûâàíèå äàííûõ HTTP-POST
- !^file:move[ñòàðîå èìÿ ôàéëà;íîâîå èìÿ ôàéëà]
- ìîæíî ïåðåèìåíîâûâàòü è äâèãàòü êàòàëîãè[win32: íî íå ÷åðåç ãðàíèöó äèñêîâ]
- êàòàëîãè äëÿ dest ñîçäàþòñÿ ñ ïðàâàìè 775
- êàòàëîã ñòàðîãî ôàéëà ñòèðàåòñÿ, åñëè ïîñëå move îí îñòà¸òñÿ ïóñò
- !^file:lock[èìÿ ôàéëà]{êîä}
- ôàéë ïðè íåîáõîäèìîñòè ñîçäà¸òñÿ
- áëîêèðóåòñÿ
- âûïîëíÿåòñÿ êîä
- ðàçáëîêèðóåòñÿ
- 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
- !/some/page.html: ^file:fullpath[a.gif] => /some/a.gif
+ дл� отправки под unix и�пользует�� программа � параметрами, задаваема�
+ $MAIL.sendmail[команда]
+ е�ли не будет задана, провер�ет��, до�тупна ли /usr/sbin/sendmail или
+ /usr/lib/sendmail и, е�ли до�тупна, то запу�кает�� � параметром "-t".
+ под Windows и�пользует�� SMTP протокол, �ервер задаёт��
+ $MAIL.SMTP[smtp.domain.ru]
math
- !$math:PI
- !^math:round floor ceiling
- !^math:trunc frac
- !^math:abs sign
- !^math:exp log
- !^math:sin asin cos acos tan atan
- !^math:degrees radians
- !^math:pow sqrt
- !^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
- !âðåìÿ òèïà time ìîæíî èñïîëüçîâàòü â âûðàæåíèÿõ, ïîäñòàâëÿåò
- êîëè÷åñòâî äíåé ñ epoch [1 ÿíâàðÿ 1970 (UTC)], äðîáíîå
- !âñ¸ ïðîèñõîäèò â localtime,
- !âðåìåííàÿ çîíà çàäà¸òñÿ âíå parser ñðåäñòâàìè OS
- $date:UTC-offset ñêîëüêî äíåé íàäî ïðèáàâèòü,÷òîáû ïîïàñòü â local âðåìÿ
- $date:TZ íàø ÷àñîâîé ïîÿñ, äðîáíîå, â ÷àñàõ (ãäå-òî åñòü ñ òî÷íîñòüþ äî ïîëó÷àñà)
- !^date::now[]
- !^date::now(ñìåùåíèå â äíÿõ) âûäà¸ò ñåé÷àñ+ñìåùåíèå
- !^date::create(äíåé ñ epoch) // ñòàðîå èìÿ set
- !^date::create(year;month[;day[;hour[;minute[;second]]]]) // ñòàðîå èìÿ set
- !^date::create[äàòà â ôîðìàòå %Y-%m-%d %H:%M:%S]
- äëÿ óäîáíîãî ñîçäàíèÿ ïî çíà÷åíèþ èç áàçû
- ôîðìàò1: %Y[-%m[-%d[ %H[:%M[:%S]]]]]
- ôîðìàò2: %H:%M[:%S]
- !$date.year month day hour minute second weekday yearday(0...) daylightsaving
- read-only
- !^date.roll[year|month|day](+-ñìåùåíèå) ñäâèãàåò äàòó
- !^date.sql-string[] %Y-%m-%d %H:%M:%S
- where published='$äàòà.sql-string[]'
- !^date:calendar[rus|eng;ãîä;ìåñÿö] âûäà¸ò íåèìåíîâàííóþ òàáëèöó
- ñòîëáöû: 0..6, week, weekyear
- !^date:calendar[rus|eng;ãîä;ìåñÿö;äåíü] âûäà¸ò èìåííîâàííóþ òàáëèöó
- ñòîëáöû: year, month, day, weekday
-
+ $math:PI
+ ^math:round floor ceiling
+ ^math:trunc frac
+ ^math:abs sign
+ ^math:exp log log10
+ ^math:sin asin cos acos tan atan atan2
+ ^math:degrees radians
+ ^math:pow sqrt
+ ^math:random(ширина диапазона)
+ ^math:convert[number|файл](base-from;base-to)[[ $.format[string|file] ]]
+ ^math:convert[number|файл][алфавит](base-to)[[ $.format[string|file] ]]
+ ^math:convert[number|файл](base-from)[алфавит][[ $.format[string|file] ]]
+ преобразует �троку или файл � чи�лом из одной �и�темы и�чи�лени� в другую
+ �и�тема �чи�лени� может быть задана алфавитом, чи�лом от 2 до 16 (�квивалентно алфавиту 0123456789ABCDEF), чи�лом 256 (в�е ASCII �имволы)
+ ^math:eq(a;b[;max ULP])
+ и�тина, е�ли разница между чи�лами меньше или равна max ULP (по умолчанию 3)
+ ^math:uuid[ $.lower(bool) $.solid(bool) ]
+ 22C0983C-E26E-4169-BD07-77ECE9405BA5
+ win32: пользует�� cryptapi
+ unix: пользует�� /dev/urandom,
+ е�ли нет, /dev/random,
+ е�ли нет, rand
+ ^math:uuid7[ $.lower(bool) $.solid(bool) ]
+ 0193CBF0-7898-7000-A391-AC513CC15658
+ https://www.rfc-editor.org/rfc/rfc9562.html#name-uuid-version-7
+ ^math:uid64[ $.lower(bool) ]
+ BA39BAB6340BE370
+ ^math:md5[string]
+ выдает digest �троки, длиной 16 байт в виде �троки,
+ где байты digest выданы в hex виде, впритык, в нижнем реги�тре
+ ^math:crypt[password;salt]
+ salt prefix $apr1$ вызывает в�троенный MD5 алгоритм,
+ е�ли нет тела salt, оно �оздаёт�� �лучайным
+ $1$ вызывает MD5 алгоритм функции OS 'crypt', е�ли поддерживает��.
+ другие salt читайте документацию по функции OS 'crypt'.
+ ^math:crc32[string]
+ вычи�л�ет crc32 �троки
+ ^math:sha1[string]
+ ^math:digest[[md5|sha1|sha256|sha512];�трока или файл][[ $.format[hex|base64|file] $.hmac[ключ �трока|ключ файл] ]]
+ объедин�ет в �ебе возможно�ть работы � разными алгоритмами криптографиче�кого хешировани�.
+ $.hmac[ключ] дл� проверки цело�тно�ти переданных данных
+
+memory
+ ^memory:compact[]
+ �обрать му�ор, о�вободив ме�то под новые данные (предупреждение: пам�ть проце��а никогда не о�вобождает��)
+ полезно делать перед XSL transform
+ ^memory:auto-compact(ча�тота �борки)
+ задает режим автоматиче�кой �борки му�ора, от 0 (выключена) до 5 (мак�имальна�)
+
+reflection
+ ^reflection:create[кла��;кон�труктор[;пара[;мет[;ры]]]]
+ вызывает указанный кон�труктор кла��а (не более 100 параметров)
+ ^reflection:create[ $.class[name] $.constructor[name] $.arguments[ $.1[па] $.2[рам] $.3[етры] ] ]
+ вызывает указанный кон�труктор кла��а
+ ^reflection:classes[]
+ хеш �о в�еми кла��ами. ключ = им� кла��а, значение бывает methoded (кла�� � методами) или void
+ ^reflection:class[объект]
+ кла�� переданного объекта
+ ^reflection:class_name[объект]
+ им� кла��а переданного объекта
+ ^reflection:base[объект]
+ родитель�кий кла�� переданного объекта
+ ^reflection:base_name[объект]
+ им� родитель�кого кла��а переданного объекта
+ ^reflection:class_by_name[им� кла��а]
+ получение кла��а по имени
+ ^reflection:class_alias[им� кла��а;новое им� кла��а]
+ задает п�евдоним дл� указанного кла��а
+ ^reflection:def[class;им� кла��а]
+ проверка кла��а на �уще�твование
+ ^reflection:methods[кла��]
+ хеш �о �пи�ком методов указанного кла��а, значени� - �троки 'native' или 'parser'
+ ^reflection:method[кла�� или объект;им� метода]
+ возвращает junction-method кла��а или объекта
+ ^reflection:filename[объект или кла�� или метод]
+ возвращает им� файла, где определен объект, кла�� или метод
+ ^reflection:fields[кла�� или объект]
+ хеш �о �пи�ком �татиче�ких полей указанного кла��а или динамиче�ких полей указанного объекта
+ ^reflection:fields_reference[объект]
+ редактируемый хеш динамиче�ких полей указанного объекта
+ ^reflection:field[кла�� или объект;им� пол�]
+ возвращает значение указанного пол� кла��а или объекта. getter-ы игнорируют��.
+ ^reflection:copy[и�точник;назначение]
+ копирует пол� из одного объекта или кла��а в другой
+ ^reflection:uid[кла�� или объект]
+ возвращает идентификатор объекта или кла��а
+ ^reflection:method_info[кла��;метод]
+ хеш � параметрами указанного метода кла��а
+ $.inherited[кла��] им� кла��а, где метод был определён (возвращает�� только е�ли метод был определён в предке)
+ $.overridden[кла��] им� кла��а, где метод был определён (возвращает�� только е�ли метод был определён в предке)
+ дл� native кла��ов возвращает�� хеш:
+ .min_params(минимально необходимое чи�ло параметров)
+ .max_params(мак�имально возможное чи�ло параметров)
+ .call_type[dynamic|static|any]
+ дл� parser кла��ов возвращает�� хеш:
+ ключ - номер параметра (0, 1, ...), значение - им� параметра
+ ^reflection:dynamical[[object or class, caller if absent]]
+ возвращает true, е�ли метод был вызван из динамиче�кого контек�та при передаче
+ параметра возвращает true, е�ли передан динамиче�кий объект, false е�ли кла��
+ ^reflection:delete[кла�� или объект;им� переменной]
+ удал�ет переменную � указанным именем в указанном кла��е или объекте
+ ^reflection:is[им� �лемента;им� кла��а][[контек�т]]
+ аналог оператора 'is', позвол�ющий определить, �вл�ет�� ли �лемент кодом.
+ ^reflection:tainting[[�зык|tainted|optimized];�трока]
+ �трока, в которой каждому �имволу и�ходной �троки �оотве�твует �имвол � кодом преобразовани�
+ ^reflection:stack[ $.args(false/true) $.locals(false/true) $.limit(n) $.offset(o)]
+ текущее �о�то�ние �тека вызовов методов на пар�ере
+ ^reflection:mixin[и�точник; $.to[получатель] $.name[им�] $.methods(true/false) $.fields(true/false) $.overwrite(false/true) ]
+ копирует в кла�� методы и пол� другого кла��а
+ ^reflection:override[метод[; $.to[получатель] $.name[новое им�]]]
+ переопредел�ет или определ�ет метод
+
+redis
+ ^redis::open[[
+ $.host[localhost] $.port(6379)|$.unix_socket[путь]
+ $.user[] $.password[] $.db(0) $.timeout(2) $.protocol(3) $.auto_reconnect(�екунд)
+ $.tls[ $.ca[файл] $.cert[файл] $.key[файл] $.verify(true) ]
+ ]]
+ подключает�� к �ерверу redis
+ timeout в �екундах на подключение и на каждую команду, 0 - без ограничени�
+ protocol(2) дл� �ерверов до redis 6
+ auto_reconnect(N): по�ле потери �оединени� переподключить�� перед �ледующей командой, выждав N �екунд
+ tls: �ертификат �ервера провер�ет��, только е�ли задан ca
+ ^redis.им�_команды[аргументы;...]
+ люба� команда redis, например ^redis.set[ключ;значение] ^redis.get[ключ] ^redis.hgetall[ключ]
+ ^redis.call[команда;аргументы;...]
+ ^redis.f-им�_команды[аргументы;...], ^redis.f-call[команда;аргументы;...]
+ �троки ответа выдают�� файлами (двоичные данные)
+ аргументы: �трока, чи�ло, bool как 1/0, файл �воим �одержимым; ма��ив - его �лементы, хеш - пары ключ значение
+ ответ: string, int, double, bool, void (nil), array, hash (map); ответ-ошибка - и�ключение
+ ^redis.release[]
+ закрывает �оединение
+
+request
+ https://site.name/a%20b/?name=some%20value
+ $request:query
+ name=some%20value
+ $request:uri
+ /a%20b/?name=value
+ $request:path
+ /a b/
+ $request:document-root
+ каталог, отно�ительно которого �читают�� пути в parser, по-умолчанию = $env:DOCUMENT_ROOT
+ $request:argv
+ hash � параметрами коммандной �троки. ключи 0, 1, ... [0 -- им� обрабатываемого файла]
+ $request:charset
+ кодировка и�ходного документа
+ и�пользует�� при upper/lower и match[][i]
+ ПРЕДУПРЕЖДЕ�ИЕ: необходимо задать $request/response:charset до и�пользовани� полей кла��а form
+ $request:method
+ метод запро�а (GET|POST|PUT)
+ $request:body
+ тело POST-запро�а в виде тек�та
+ $request:body-file
+ тело POST-запро�а в виде файла
+ $request:body-charset
+ кодировка POST-запро�а
+ $request:headers
+ хеш � заголовками запро�а (без префик�а HTTP_)
+
+response
+ $response:поле[значение] и можно �читать �тарое - $response:поле
+ значение может быть string а может быть hash:
+ $value[abc] field: {abc}<<ча�ть
+ $attribute[zzz] field: abc; {attribute=zzz}<<ча�ть
+ значение пол� или атрибута может быть string или date
+ е�ли дата, она будет преобразована к формату "Sun, 25-Aug-2002 12:03:45 GMT"
+ $response:headers
+ накопленные пол�
+ $response:body[DATA]
+ замещает �тандартный ответ
+ $response:download[DATA]
+ замещает �тандартный ответ, вы�тавл�ет флаг, за�тавл�ющий browser предложить download
+ $response:status
+ ^response:clear[] забыть в�е заданные response пол�
+ $response:charset
+ кодировка клиента т.е. та,
+ 1) из которой будут перекодированы $form:пол� по�ле забирани� из browser'а
+ 2) в которую документ будет перекодирован перед отдаванием в browser
+ 3) в которую будет перекодирован тек�т �зыка uri
+ не добавл�ет к content-type ничего, е�ли хочет��, �то надо �делать вручную
+ ПРЕДУПРЕЖДЕ�ИЕ: необходимо задать $request/response:charset до и�пользовани� полей кла��а form
+
+status
+ $status:sql
+ cache table
+ url time
+ url time
+ url time
+ $status:stylesheet
+ cache table
+ file time
+ file time
+ file time
+ $status:rusage hash
+ utime user time used
+ stime system time used
+ maxrss max resident set size
+ ixrss integral shared text memory size
+ idrss integral unshared data 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
+ $status:pid
+ process id
+ $status:tid
+ thread id
+ $status:mode
+ режим работы, cgi|console|mail|httpd|apache|isapi
+ $status:log-filename
+ путь к журналу ошибок parser3.log
+
xdoc(xnode)
+ $xdoc.search-namespaces hash, where keys=prefixes, values=urls
+
DOM1 attributes:
- !readonly attribute DocumentType doctype
- Xreadonly attribute DOMImplementation implementation
- !readonly attribute Element documentElement
+ readonly attribute DocumentType doctype
+ readonly attribute Element documentElement
DOM1 methods:
- !Element createElement(in DOMString tagName)
- !DocumentFragment createDocumentFragment()
- !Text createTextNode(in DOMString data)
- !Comment createComment(in DOMString data)
- !CDATASection createCDATASection(in DOMString data)
- !ProcessingInstruction createProcessingInstruction(in DOMString target,in DOMString data)
- !Attr createAttribute(in DOMString name)
- !EntityReference createEntityReference(in DOMString name)
- !NodeList getElementsByTagName(in DOMString tagname)
+ Element createElement(in DOMString tagName)
+ DocumentFragment createDocumentFragment()
+ Text createTextNode(in DOMString data)
+ Comment createComment(in DOMString data)
+ CDATASection createCDATASection(in DOMString data)
+ ProcessingInstruction createProcessingInstruction(in DOMString target,in DOMString data)
+ Attr createAttribute(in DOMString name)
+ EntityReference createEntityReference(in DOMString name)
+ NodeList getElementsByTagName(in DOMString tagname)
DOM2 some methods:
- !^.getElementById[elementId] = xnode
- The DOM implementation must have information that says which attributes are of type ID.
- Attributes with the name "ID" are not of type ID unless so defined.
- Implementations that do not know whether attributes are of type ID or not
+ ^.getElementById[elementId] = xnode
+ The DOM implementation must have information that says which attributes are of type ID.
+ Attributes with the name "ID" are not of type ID unless so defined.
+ Implementations that do not know whether attributes are of type ID or not
are expected to return null.
- !êîäèðîâêà ñòðîê è óìîë÷àíèå äëÿ $.encoding
- !ðàâíî òåêóùåé êîäèðîâêå âûõîäíîé ñòðàíèöû,
- $response:charset
+ кодировка �трок и умолчание дл� $.encoding равно текущей кодировке выходной �траницы, $response:charset
+
::sql{...}
- !::create[[URI]]{} ñòàðîå èìÿ 'set'
- !::create[[URI]][qualifiedName]
+ ::create[[URI]]{} �тарое им� 'set'
+ ::create[[URI]][qualifiedName]
URI default = disk path to requested document
- äëÿ êàòàëîãîâ êîíå÷íûé / îáÿçàòåëåí
- !::load[file.xml[;îïöèè]]
- !.transform[rules.xsl|xdoc][[params hash]] âûäà¸ò dom
- øàáëîí êýøèðóåòñÿ, êýø îáíîâëÿåòñÿ ïðè èçìåíåíèè äàòû ôàéëà øàáëîíà,
- èëè èçìåíåíèè äàòû ôàéëà "èìÿ øàáëîíà.stamp"[ïðîâåðêà äàòû stamp ïðèîðèòåòíåå]
+ дл� каталогов конечный / об�зателен
+ ::create[file] can be usable:
+ $f[^file::load[binary;http://;some HTTP options here...]]
+ $x[^xdoc::create[$f]]
+ ::load[file.xml[;опции]]
+ .transform[rules.xsl|xdoc][[params hash]] выдаёт dom
+ шаблон кеширует��, кеш обновл�ет�� при изменении даты файла шаблона,
+ или изменении даты файла "им� шаблона.stamp"[проверка даты stamp приоритетнее]
- !ïàðàìåòðû ïåðåäàþòñÿ êàê åñòü, íå xpath âûðàæåíèÿ
-
- !.string[[output options]]
- !.save[file.xml[;output options]] ñ øàïêîé
- !.file[[output options]] = file
- output options èäåíòè÷íû àòðèáóòàì xsl:output
- [èñêëþ÷åíèå: èãíîðèðóåòñÿ cdata-section-elements, íóæíî áóäåò, ñäåëàþ]
- âûäà¸ò media-type ïðè ïîäñòàíîâêå $response:body[ñþäà]
+ method = "xml" | "html" | "text"
+ version = nmtoken
+ encoding = string
+ omit-xml-declaration = "yes" | "no"
+ standalone = "yes" | "no"
+ cdata-section-elements = qnames
+ indent = "yes" | "no"
+ media-type = string />
+ параметры передают�� как е�ть, не xpath выражени�
+
+ .string[[output options]]
+ .save[file.xml[;output options]] � шапкой
+ .file[[output options]] = file
+ output options идентичны атрибутам xsl:output
+ [и�ключение: игнорирует�� cdata-section-elements, нужно будет, �делаю]
+ выдаёт media-type при под�тановке $response:body[�юда]
+
+ е�ли на документ ��ылают�� так:
+ parser://method/param/to/that/method
+ то в каче�тве документа и�пользует�� ^MAIN:method[/param/to/that/method]
+ [примечание: в параметр в�егда приходит лидирующа� /, даже, е�ли параметров вообще не было]
-
-!xnode
+xnode
DOM1 attributes:
- !$node.nodeName
- !$node.nodeValue
- !$node.nodeType = int
- ELEMENT_NODE = 1
- ATTRIBUTE_NODE = 2
- TEXT_NODE = 3
- CDATA_SECTION_NODE = 4
- ENTITY_REFERENCE_NODE = 5
- ENTITY_NODE = 6
- PROCESSING_INSTRUCTION_NODE = 7
- COMMENT_NODE = 8
- DOCUMENT_NODE = 9
- DOCUMENT_TYPE_NODE = 10
- DOCUMENT_FRAGMENT_NODE = 11
- NOTATION_NODE = 12
+ $node.nodeName
+ $node.nodeValue
+ read
+ write
+ $node.nodeType = int
+ ELEMENT_NODE = 1
+ ATTRIBUTE_NODE = 2
+ TEXT_NODE = 3
+ CDATA_SECTION_NODE = 4
+ ENTITY_REFERENCE_NODE = 5
+ ENTITY_NODE = 6
+ PROCESSING_INSTRUCTION_NODE = 7
+ COMMENT_NODE = 8
+ DOCUMENT_NODE = 9
+ DOCUMENT_TYPE_NODE = 10
+ DOCUMENT_FRAGMENT_NODE = 11
+ NOTATION_NODE = 12
$vasyaNode.type==$xnode:ELEMENT_NODE
- !$node.parentNode
- !$node.childNodes = array of nodes
- !$node.firstChild
- !$node.lastChild
- !$node.previousSibling
- !$node.nextSibling
- !$node.ownerDocument = xdoc
- !$element_node.attributes = hash of xnodes
- !$element_node.tagName
- !$attribute_node.specified = boolean
- true if the attribute received its value explicitly in the XML document,
- 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.
- !$attribute_node.name
- !$attribute_node.value
+ $node.parentNode
+ $node.childNodes = array of nodes
+ $node.firstChild
+ $node.lastChild
+ $node.previousSibling
+ $node.nextSibling
+ $node.ownerDocument = xdoc
+ $node.prefix
+ $node.namespaceURI
+ $element_node.attributes = hash of xnodes
+ $element_node.tagName
+ $attribute_node.specified = boolean
+ true if the attribute received its value explicitly in the XML document,
+ or if a value was assigned programmatically with the setValue function.
+ 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
- !$pi_node.target = target of this processing instruction
- XML defines this as being the first token following the markup
+ $pi_node.target = target of this processing instruction
+ XML defines this as the first token following the markup
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 ?>.
+ $pi_node.data = The content of this processing instruction
+ From the first non-whitespace character after the target
+ to the character immediately preceding the ?>.
document_node.
readonly attribute DocumentType doctype
- readonly attribute DOMImplementation implementation
+ readonly attribute DOMImplementation implementation
readonly attribute Element documentElement
document_type_node.
- !readonly attribute DOMString name
+ readonly attribute DOMString name
readonly attribute NamedNodeMap entities
readonly attribute NamedNodeMap notations
- !notation_node.
- !readonly attribute DOMString publicId
- !readonly attribute DOMString systemId
-
- !DOM1 node methods:
- !Node insertBefore(in Node newChild,in Node refChild)
- !Node replaceChild(in Node newChild,in Node oldChild)
- !Node removeChild(in Node oldChild)
- !Node appendChild(in Node newChild)
- !boolean hasChildNodes()
- !Node cloneNode(in boolean deep)
-
- !DOM1 element methods:
- !DOMString getAttribute(in DOMString name)
- !void setAttribute(in DOMString name, in DOMString value) raises(DOMException)
- !void removeAttribute(in DOMString name) raises(DOMException)
- !Attr getAttributeNode(in DOMString name)
- !Attr setAttributeNode(in Attr newAttr) raises(DOMException)
- !Attr removeAttributeNode(in Attr oldAttr) raises(DOMException)
- !NodeList getElementsByTagName(in DOMString name)
- !void normalize()
-
-
- !Introduced in DOM Level 2:
- !Node importNode(in Node importedNode, in boolean deep) raises(DOMException)
- !NodeList getElementsByTagNameNS(in DOMString namespaceURI, in DOMString localName);
+ notation_node.
+ readonly attribute DOMString publicId
+ readonly attribute DOMString systemId
+
+ DOM1 node methods:
+ Node insertBefore(in Node newChild,in Node refChild)
+ Node replaceChild(in Node newChild,in Node oldChild)
+ Node removeChild(in Node oldChild)
+ Node appendChild(in Node newChild)
+ boolean hasChildNodes()
+ Node cloneNode(in boolean deep)
+
+ DOM1 element methods:
+ DOMString getAttribute(in DOMString name)
+ void setAttribute(in DOMString name, in DOMString value) raises(DOMException)
+ void removeAttribute(in DOMString name) raises(DOMException)
+ Attr getAttributeNode(in DOMString name)
+ Attr setAttributeNode(in Attr newAttr) raises(DOMException)
+ Attr removeAttributeNode(in Attr oldAttr) raises(DOMException)
+ NodeList getElementsByTagName(in DOMString name)
+ void normalize()
+
+ Introduced in DOM Level 2:
+ Node importNode(in Node importedNode, in boolean deep) raises(DOMException)
+ NodeList getElementsByTagNameNS(in DOMString namespaceURI, in DOMString localName)
+ boolean hasAttributes()
- !XPath:
- !^node.select[xpath/query/expression] = array of nodes,
+ XPath:
+ ^node.select[xpath/query/expression] = array of nodes,
empty array if nothing found
- !^node.selectSingle[xpath/query/expression] = first node if any
- !^node.selectBool[xpath/query/expression] = bool if any or die
- !^node.selectNumber[xpath/query/expression] = double if any or die
- !^node.selectString[xpath/query/expression] = string if any or die
-
- !error codes(ïîêà ïðèäóò êàê òåêñò â ñëó÷àå ñîîòâåòñòâóþùèõ îøèáîê):
- INDEX_SIZE_ERR
- If index or size is negative, or greater
- than the allowed value
- DOMSTRING_SIZE_ERR
- If the specified range of text does not
- fit into a DOMString
- HIERARCHY_REQUEST_ERR
- If any node is inserted somewhere it
- doesn't belong
- WRONG_DOCUMENT_ERR
- If a node is used in a different
- document than the one that created it
- (that doesn't support it)
- INVALID_CHARACTER_ERR
- If an invalid character is specified,
- such as in a name.
- NO_DATA_ALLOWED_ERR
- If data is specified for a node which
- does not support data
- NO_MODIFICATION_ALLOWED_ERR
- If an attempt is made to modify an
- object where modifications are not
- allowed
- NOT_FOUND_ERR
- If an attempt was made to reference a
- node in a context where it does not
- exist
- NOT_SUPPORTED_ERR
- If the implementation does not support
- the type of object requested
- INUSE_ATTRIBUTE_ERR
- If an attempt is made to add an
- attribute that is already inuse
- elsewhere
-
-!memory
- !^memory:compact[] ñîáðàòü ìóñîð, îñâîáîäèâ ìåñòî ïîä íîâûå äàííûå
- (ïðåäóïðåæäåíèå: ïàìÿòü ïðîöåññà íèêîãäà íå îñâîáîæäàåòñÿ)
- ïîëåçíî äåëàòü ïåðåä XSL transform.
-
-!status
- !÷òîáû êëàññ áûë äîñòóïåí, â apache íóæíî ñêàçàòü
-
- ParserStatusAllowed
-
- !â cgi äîñòóïåí âåçäå
- !â isapi íå äîñòóïåí íèãäå
-
- !$status:sql hash
- !cache table
- url time
- url time
- url time
- !$status:stylesheet
- !cache table
- file time
- file time
- file time
- !$status:charset hash
- !cache table
- file
- file
- file
-
- !$status:rusage hash
- !utime user time used
- !stime system time used
- !maxrss max resident set size
- !ixrss integral shared text memory size
- !idrss integral unshared data size
- !isrss integral unshared stack size
- !tv_sec
- !tv_usec
- $s[$status:rusage]
- ^s.tv_sec.format[%.0f].^s.tv_usec.format[%06.0f]
+ ^node.selectSingle[xpath/query/expression] = first node if any
+ ^node.selectBool[xpath/query/expression] = bool if any or die
+ ^node.selectNumber[xpath/query/expression] = double if any or die
+ ^node.selectString[xpath/query/expression] = string if any or die
+
+DATA::=string | file | hash
+ hash вида
+ [
+ $.file[им� файла на ди�ке]
+ $.name[им� файла дл� пользовател�]
+ $.mdate[date]
+ ]
- !$status:memory hash
- !used
- Return the number of bytes in the heap. Excludes collector private
- data structures. Includes empty blocks and fragmentation loss.
- Includes some pages that were allocated but never written.
-
- !free
- Return a lower bound on the number of free bytes in the heap.
-
- !since_compact
- Return the number of bytes allocated since the last collection.
-
- !process
- Return the total number of bytes allocated in this process.
- Never decreases.
-
-
-!DATA::=string | file
-
-!MAIN
- ýòî êëàññ, çàãðóæàåìûé íà àâòîìàòå èç parser3.conf,
- êó÷è auto.p è çàïðàøèâàåìîãî äîêóìåíòà:
- !parser3.conf
- cgi:
- 1. èëè ïîëíûé ïóòü èç ïåðåìåííîé îêðóæåíèÿ CGI_PARSER_SITE_CONFIG
- èëè ðÿäîì ñ áèíàðíèêîì parser'à
+MAIN
+ �то кла��, загружаемый на автомате из конфигурационного auto.p, кучи auto.p и запрашиваемого документа:
+ конфигурационный auto.p
+ cgi:
+ 1. или полный путь из переменной окружени� CGI_PARSER_SITE_CONFIG или р�дом � бинарником parser'а
isapi: windows directory
- apache module:
+ apache module:
1) ParserConfig [can be in .htaccess]
- !auto.p âíèç îò DOCUMENT_ROOT/ ïî äåðåâó äî êàòàëîãà ñ îáðàáàòûâàåìûì ôàéëîì âêëþ÷èòåëüíî
- êëàññ ñîáèðàåòñÿ èç âñåõ ýòèõ ôàéëîâ, ïîñëåäóþùèå ñòàíîâÿòñÿ ðîäèòåëÿìè ïðåäûäóùèõ
- èìÿ ïîñëåäíåãî çàãðóæåííîãî MAIN, èì¸í ó ïðåäûäóùèõ íåò
-
- !ïîñëå çàãðóçêè MAIN êëàññà âûçûâàåòñÿ åãî @main[]
- !ðåçóëüòàò êîòîðîãî ïåðåäà¸òñÿ â åãî @post-process[data] if($data is string) ...
- !ðåçóëüòàò êîòîðîãî îòäà¸òñÿ ïîëüçîâàòåëþ
-
-!åñëè âñòðå÷àåòñÿ îøèáêà è try íå çàäàí, å¸ ìîæíî êðàñèâî ñîîáùèòü ïîëüçîâàòåëþ,
- !îïðåäåëèâ
- !@unhandled_exception[exception;stack]
- !$exception.type ñòðîêà "òèï ïðîáëåìû"
- !$exception.file $exception.lineno ôàéë è ñòðîêà ãäå ñëó÷èëàñü ïðîáëåìà [åñëè íå çàïðåùåíû ïðè êîìïèëÿöèè]
- !$exception.source ñòðîêà, èç-çà êîòîðîé ñëó÷èëàñü ïðîáëåìà
- !$exception.comment êîììåíòàðèé english
- !stack òàáëè÷êà èç êîëîíîê file line name,
- òàì ëåæàò â îáðàòíîì ïîðÿäêå èìåíà[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)
- !file::load â äîïîëíèòåëüíûå ïîëÿ çàïèñûâàåò ÏÎËÅ:çíà÷åíèå (èìåíà ïîëåé îòâåòà çàãëàâíûìè áóêâàìè)
-
-!ñèñòåìíûå òèïû îøèáîê:
- !parser.compile ^test[} êîìïèëÿöèÿ (íåïàðíàÿ ñêîáêà, ...)
- !parser.runtime ^if(0). ïàðàìåòðû (áîëüøå/ìåíüøå, ÷åì íóæíî, íå òåõ òèïîâ, ...)
- !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
- !file.seek seek failed
- !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
+ auto.p вниз от DOCUMENT_ROOT/ по дереву до каталога � обрабатываемым файлом включительно
+ кла�� �обирает�� из в�ех �тих файлов, по�ледующие �танов�т�� родител�ми предыдущих
+ им� по�леднего загруженного MAIN, имён у предыдущих нет
+
+ по�ле загрузки MAIN кла��а вызывает�� его @main[]
+ результат которого передаёт�� в его @postprocess[data] if($data is string) ...
+ результат которого отдаёт�� пользователю
+
+е�ли в�тречает�� ошибка и try не задан, её можно кра�иво �ообщить пользователю, определив
+ @unhandled_exception[exception;stack]
+ $exception.type �трока "тип проблемы"
+ $exception.file $exception.lineno $exception.colno файл, �трока и позици�, где �лучила�ь проблема [е�ли не запрещены при компил�ции]
+ $exception.source �трока, из-за которой �лучила�ь проблема
+ $exception.comment комментарий english
+ stack табличка из колонок file line name,
+ там лежат в обратном пор�дке имена[name] и ме�та вызовов[file line] операторов/методов, приведших к ошибке.
+
+при загрузке файла (file::load, table::load, xdoc::load) можно указать такое им� файла:
+ http://domain/document[?params<> �оздает http.status ошибку, �то можно отключить, передав $.any-status(1)
+ $.charset[кодировка удалённых документов по-умолчанию], е�ли �ервер вернёт content-type:charset - О�� ПЕРЕБИВ�ЕТ
+ $.response-charset[кодировка удалённых документов], не перебивае�� content-type:charset
+ $.user[пользователь]
+ $.password[пароль]
+ file::load в дополнительные пол� запи�ывает
+ ПОЛЕ:значение (имена полей ответа заглавными буквами)
+ tables << хеш их ПОЛЕ->table � един�твенным �толбцом "value"
+ в таких таблицах можно брать повтор�ющие�� заголовки. например, не�колько set-cookies
+ todo:�делать отдельный cookies
+
+�и�темные типы ошибок:
+ parser.compile ^test[} компил�ци� (непарна� �кобка, ...)
+ parser.runtime ^if(0). параметры (больше/меньше, чем нужно, не тех типов, ...)
+ 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
+ file.read ^file::load[...] error while reading file
+ file.seek seek failed
+ file.execute ^file::cgi[...] incorrect cgi header/can't execute
+ 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{} 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)
- !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
+ xml ^xdoc::create{} 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)
+ 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 does not accept connections
+ http.timeout ^file::load[http://host/doc] 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
+ date.range ^date::create(10000;1;1) date out of valid range
+ amqp ^amqp::create[$.port(1)] connection failed/error from the broker
+ redis ^redis::open[$.port(1)] connection failed/error reply
+
+е�ли в MAIN определён $SIGPIPE(1) то в �лучае, е�ли обработка была прервана пользователем, �ообщение
+ об �том будет запи�ано в parser3.log
+
+е�ли опи�ание метода �одержит локальную переменную result в �вном виде (е�ть и не�вна� переменна�)
+ то код вывода пробельных литералов не попадает в конечный байт-код
-!åñëè â MAIN áóäåò îïðåäåë¸í ôëàã $ORIGINS(1) òî âìåñòî îáû÷íîãî âûâîäà ñòðàíèöû áóäåò
- âûäàí ñïèñîê ôðàãìåíòîâ ðåçóëüòàòà ñ óêàçàíèåì èõ ïðîèñõîæäåíèÿ
+$Id: operators.ru.txt,v 1.270 2026/10/09 18:53:41 moko Exp $