--- parser3/operators.ru.txt 2002/11/26 09:02:14 1.101 +++ parser3/operators.ru.txt 2026/10/09 18:53:41 1.270 @@ -1,979 +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, êàê êîä} - ïî óìîë÷àíèþ, ìåòîäû êîìïèëèðóþòñÿ â $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, на выходе чиÑ�таÑ� Ñ�трока + + ^process[[$caller.CLASS|$object|$КЛÐ�СС:CLASS]]{Ñ�трока, котораÑ� будет process-ed, как код}[ + $.main[во что переименовать @main] + $.file[имÑ� файла из которого, Ñ�кобы, данный текÑ�Ñ‚] + $.lineno(номер Ñ�троки в файле, откуда данный текÑ�Ñ‚, можно отрицательный) + ] + ^process..[путь][во что переименовать @main] + по умолчанию, методы компилируютÑ�Ñ� в $self [в Ñ�лучае оператора, $self=$MAIN:CLASS] - !odbc://DSN=dsn^;UID=user^;PWD=password + ^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 íóæíî, ÷òîáû çàðàíåå(ðåêîìåíäóåòñÿ â ñèñòåìíîì parser3) - áûëà îïðåäåëåíà òàáëèöà + длÑ� работы 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 - !â âûðàæåíèè - !ëîãè÷åñêîå çíà÷åíèå ðàâíî "íå ïóñòà?" - !÷èñëîâîå çíà÷åíèå ðàâíî _count[] - !$hash.êëþ÷ - !_default - ñïåöèàëüíûé êëþ÷, åñëè çàäàí, - òî ïðè îáðàùåíèè ïî êëþ÷ó, êîòîðîìó íåò ñîîòâåòñòâèÿ, âûäà¸òñÿ _default çíà÷åíèå - !^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(äíåé, 0äíåé=session)] - -!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: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){....} +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-Ñ�троку -!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 - $.attach[ - $.value[^file::load[my beloved.doc]] - $.file-name[ìîé ëþáèìûé.doc] +# длÑ� удобÑ�тва можно указать только одну чаÑ�ть, при Ñ�том не будет multipart + $.file[ + $.value[^file::load[my beloved.doc]] + $.name[my beloved.doc] + $.format[base64] + ] + $.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, - !ïåðå÷èñëåíèÿ â âèäå 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 - -!status - !÷òîáû êëàññ áûë äîñòóïåí, â apache íóæíî ñêàçàòü - - ParserStatusAllowed - - !â cgi äîñòóïåí âåçäå - !â isapi íå äîñòóïåí íèãäå - - !$status:sql hash - !cache table - url time - url time - url time - !$status:db hash - !cache hash db_home=>tables table - name time users - name time users - name time users - !$status:stylesheet - !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] - - -!DATA::=string | file + ^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] + ] -!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[ - ! $ïîëå[çíà÷åíèå] << ïî-óìîë÷àíèþ, user-agent=parser3 - !] - !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.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 $