--- parser3/operators.ru.txt 2004/03/05 10:16:49 1.163 +++ parser3/operators.ru.txt 2017/02/16 23:16:53 1.252 @@ -1,120 +1,134 @@ -!ñäåëàíî -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 '!' - óñëîâèå ? êîãäàÄà: êîãäàÍåò +операторы + ^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 '~' + %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{ + %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[ðåçóëüòàò] + - îòâàëèâàåò èç âûïîëíåíèÿ ìåòîäà, - âûäàâàÿ íåñòàíäàðòíûé ðåçóëüòàò - X^break[] + - îáðûâàåò öèêë - X^continue[] + - îáðûâàåò èòåðàöèþ öèêëà - !^untaint[[as-is|file-spec|http-header|mail-header|uri|table|sql|js|xml|html|optimized-html]]{êîä} + + ^break[] - обрывает цикл + ^break(true|false) - обрывает цикл, еÑ�ли true + + ^continue[] - обрывает итерацию цикла + ^continue(true|false) - обрывает итерацию цикла, еÑ�ли true + + ^return[] - обрывает выполнение метода + ^return[value] - приÑ�ваивает $result значение value и обрывает выполнение метода + + ^untaint[[as-is|file-spec|uri|http-header|mail-header|sql|js|json|parser-code|regex|xml|html|optimized-[as-is|xml|html]]]{код} default as-is - !^taint[[lang]][êîä] + + ^taint[[lang]][код] default "just tainted, language unknown" - !^process[[$caller.CLASS|$object|$ÊËÀÑÑ:CLASS]]{ñòðîêà, êîòîðàÿ áóäåò process-ed, êàê êîä}[ - $.main[âî ÷òî ïåðåèìåíîâàòü @main] - $.file[èìÿ ôàéëà èç êîòîðîãî, ÿêîáû, äàííûé òåêñò] - $.lineno(íîìåð ñòðîêè â ôàéëå, îòêóäà äàííûé òåêñò. ìîæíî îòðèöàòåëüíûé) + + ^apply-taint[[lang;]текÑ�Ñ‚] + выполнÑ�ет заданные в Ñ�троке преобразованиÑ�, неопределенно грÑ�зное как lang, на выходе чиÑ�таÑ� Ñ�трока + + ^process[[$caller.CLASS|$object|$КЛÐ�СС:CLASS]]{Ñ�трока, котораÑ� будет process-ed, как код}[ + $.main[во что переименовать @main] + $.file[имÑ� файла из которого, Ñ�кобы, данный текÑ�Ñ‚] + $.lineno(номер Ñ�троки в файле, откуда данный текÑ�Ñ‚. можно отрицательный) ] - !^process..[ïóòü][âî ÷òî ïåðåèìåíîâàòü @main] - ïî óìîë÷àíèþ, ìåòîäû êîìïèëèðóþòñÿ â $self [â ñëó÷àå îïåðàòîðà, $self=$MAIN:CLASS] - !^connect[protocol://ñòðîêà ñîåäèíåíèÿ]]{êîä ñ ^sql[...]-ÿìè} - !mysql://user:pass@{host[:port]|[/unix/socket]}/database? + ^process..[путь][во что переименовать @main] + по умолчанию, методы компилируютÑ�Ñ� в $self [в Ñ�лучае оператора, $self=$MAIN:CLASS] + + ^connect[protocol://Ñ�трока Ñ�оединениÑ�]]{код Ñ� ^sql[...]-Ñ�ми} + mysql://user:pass@{host[:port]|[/unix/socket]}/database? ClientCharset=parser-charset << charset in which parser thinks client works - charset=cp1251_koi8& + charset=UTF-8& timeout=3& - compress=1& + compress=0& named_pipe=1& + multi_statements=1& allow execute more then one query in one parser :sql{} request autocommit=1 - autocommit åñëè âûñòàâèòü â 0, áóäåò äåëàòü commit/rollback + autocommit еÑ�ли выÑ�тавить в 0, будет делать commit/rollback - !pgsql://user:pass@{host[:port]|[local]}/database? + pgsql://user:pass@{host[:port]|[local]}/database? client_encoding=win,[to-find-out] &datestyle=ISO,SQL,Postgres,European,NonEuropean=US,German,DEFAULT=ISO &ClientCharset=parser-charset << charset in which parser thinks client works - - !oracle://user:pass@service? + + oracle://user:pass@service? NLS_LANG=RUSSIAN_AMERICA.CL8MSWIN1251& NLS_LANGUAGE language-dependent conventions NLS_TERRITORY territory-dependent conventions @@ -127,565 +141,693 @@ Xíå ñäåëàíî, âèäèìî, íå áóäåò ñäåëàíî ORA_ENCRYPT_LOGIN=TRUE ClientCharset=parser-charset << charset in which parser thinks client works - !odbc://DSN=dsn^;UID=user^;PWD=password^;ClientCharset=parser-charset + odbc://DSN=dsn^;UID=user^;PWD=password^;ClientCharset=parser-charset ClientCharset << charset in which parser thinks client works - äëÿ ðàáîòû connect íóæíî, ÷òîáû çàðàíåå(ðåêîìåíäóåòñÿ â ñèñòåìíîì parser3) - áûëà îïðåäåëåíà òàáëèöà + sqlite://DBfile? + ClientCharset=parser-charset& << charset in which parser thinks client works + autocommit=1 + + длÑ� работы connect нужно, чтобы заранее(рекомендуетÑ�Ñ� в Ñ�иÑ�темном конфигурационном auto.p) + была определена таблица #sql drivers $SQL[ - $.drivers[^table::set{protocol driver client -mysql /www/parser3/libparser3mysql.so /usr/local/lib/mysql/libmysqlclient.so -pgsql /www/parser3/libparser3pgsql.so /usr/local/pgsql/lib/libpq.so -oracle /www/parser3/libparser3oracle.so /u01/app/oracle/product/8.1.5/lib/libclntsh.so?ORACLE_HOME=/u01/app/oracle/product/8.1.5&ORA_NLS33=/u01/app/oracle/product/8.1.5/ocommon/nls/admin/data -odbc c:\drives\y\parser3project\odbc\debug\parser3odbc.dll + $.drivers[^table::create{protocol driver client +mysql /www/parser3/libparser3mysql.so libmysqlclient.so +pgsql /www/parser3/libparser3pgsql.so 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 +sqlite /www/parser3/libparser3sqlite.so sqlite3.so +odbc c:\drives\y\parser3project\odbc\debug\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[ôàéë](ñåêóíä){êîä}[{catch êîä}] - !îòíîñèòåëüíîå çàäàíèå âðåìåíè - !ñêýøèðîâàòü ñòðîêó, êîòîðàÿ ïîëó÷àåòñÿ ïðè âûïîëíåíèè êîäà íà 'ñåêóíä' ñåêóíä - !åñëè 0ñåêóíä, çíà÷èò íå êýøèðîâàòü, à ñòàðûé òàêîé ñòåðåòü - !â catch êîäå $exception.handled[cache] ^rem{ôëàã, ÷òî exception îáðàáîòàí} - !^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 - !^void.left(n) - íè÷åãî íå âûäà¸ò - !^void.right(n) - íè÷åãî íå âûäà¸ò - !^void.mid(p[;n]) - íè÷åãî íå âûäà¸ò - !^èìÿ.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... - îïöèè ïîèñêà= + в таблице у 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[файл](Ñ�екунд){код}[{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[] .bool(true|false) bool значение + ^имÑ�.inc(на Ñ�колько +) + ^имÑ�.dec(на Ñ�колько -) + ^имÑ�.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 íàéòè âñå âõîæäåíèÿ, à íå îäíî - ' ñîçäàâàòü ñòîëáöû prematch, match, postmatch - !^ñòðîêà.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 îïåðàöèÿìè, åñëè âû çíàåòå, ÷òî âõîäíàÿ ñòðîêà - ñîñòîèò èç áîëüøîãî ÷èñëà ôðàãìåíòîâ - !^string.trim[start|both|end[;chars]] âûêèäûâàåò charset èç íà÷àëà/êîíöà/è íà÷àëà è êîíöà + s singleline = $ Ñ�читаетÑ�Ñ� концом вÑ�его текÑ�та + m multiline = $ Ñ�читаетÑ�Ñ� концом Ñ�троки[\n], не концом вÑ�его текÑ�та + g найти вÑ�е вхождениÑ�, а не одно + ' Ñ�оздавать Ñ�толбцы prematch, match, postmatch + n вернуть циÑ�ло Ñ� количеÑ�твом найденных Ñ�овпадений, а не таблицу Ñ� результатами + U инвертировать Ñ�мыÑ�л модификатора '?' + + ^Ñ�трока.match[шаблон-Ñ�трока|шаблон-regex][опции поиÑ�ка]{замена} + опции поиÑ�ка+= + g заменить вÑ�е вхождениÑ�, а не одно + + ^Ñ�трока.split[разделитель][[lrhv]][[название Ñ�толбца длÑ� вертикального разбиениÑ�]] + l Ñ�лева направо [default] + r Ñ�права налево + h nameless таблица Ñ� ключами 0, 1, 2, ... + v таблица из 1 Ñ�толбца 'piece' или как передадут [default] + + ^Ñ�трока.{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 -!table - â âûðàæåíèè - ëîãè÷åñêîå çíà÷åíèå ðàâíî "íå ïóñòà?" - ÷èñëîâîå çíà÷åíèå ðàâíî count[] - !^table::create[[nameless]]{äàííûå} ñòàðîå èìÿ "set" - !^table::create[table][[$.limit(1) $.offset(5) $.offset[cur] $.reverse(1)]] - êëîíèðóåò òàáëèöó - reverse << ñçàäó íà ïåð¸ä (ðàáîòàåò ïîêà òîëüêî â locate, â table::create ÍÅ ðàáîòàåò) - !^table::load[[nameless;]ïóòü[;îïöèè]] - !åñëè íå nameless, íàçâàíèÿ êîëîíîê áåðóòñÿ èç ïåðâîé ñòðîêè - !ïóñòûå ñòðîêè, è ñòðîêè â ïåðâîé êîëîíêå ñîäåðæàùèå '#', èãíîðèðóþòñÿ - !$.separator[^#09] - !$.encloser["] ïî-óìîë÷àíèþ, íåò. - !^table::sql{query}[[$.limit(2) $.offset(4) todo:$.default{ ^table::create[...] }]] - !^òàáëèöà.save[[nameless|append;]ïóòü[;îïöèè, ñì. load]] - !$òàáëèöà.ïîëå - !$òàáëèöà.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[ïîëå;çíà÷åíèå][[$.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]]] - çíà÷åíèåì $hash.êëþ÷ áóäåò hash â êîòîðîì ïîëÿ çíà÷åíèé áóäóò êëþ÷àìè - ïîëÿ çíà÷åíèé ìîãóò áûòü íå óêàçàíû, òîãäà èìè áóäóò âñå ñòîëáöû, âêëþ÷àÿ êëþ÷åâîé - åñëè distinct ñîäåðæèò true, òî íå áóäåò îøèáêè ïðè ïîâòîðÿþùèõñÿ êëþ÷àõ - åñëè distinct ñîäåðæèò tables, òî áóäåò ñîçäàí hash èç òàáëèö, ñîäåðæàùèõ ñòðîêè ñ êëþ÷îì - !^òàáëèöà.columns[]+ òàáëèöà èç îäíîãî ñòîëáöà $column - !$îòîáðàííîå[^òàáëèöà.select(âûðàæåíèå)] = òàáëèöà èç òåõ æå ñòîëáöîâ è ñòðîê, ó êîòîðûõ óñëîâèå ñîâïàëî + ^Ñ�трока.trim[chars] выкидывает chars из начала и конца + + ^Ñ�трока.base64[] encode + ^string:base64[encoded[;$.strict(true)]] decode + + ^Ñ�трока.idna[] + IDNA кодирование, поддержка кирилличеÑ�ких доменов + + ^string:idna[encoded] + IDNA декодирование, поддержка кирилличеÑ�ких доменов + + ^Ñ�трока.js-escape[] кодирование длÑ� передачи в JS (%uXXXX) + + ^string:js-unescape[escaped] декодирование переданного из js + + ^string:unescape[js|uri;escaped; $.charset[] ] декодирование переданного из js или uri + +table + в выражении + логичеÑ�кое значение равно "не пуÑ�та?" + чиÑ�ловое значение равно count[] + ^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]] + $таблица.поле + $таблица.поле[новое значение] + $таблица.fields из named таблицы выдаёт текущую запиÑ�ÑŒ как Hash + ^таблица.menu{тело}[[разделитель]] + ^таблица.foreach[позициÑ�;значение]{тело}[[разделитель]] + ^таблица.line[] 1-based offset + ^таблица.offset[] печатает offset + ^таблица.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' или как передадут + $отобранное[^таблица.select(выражение)] = таблица из тех же Ñ�толбцов и Ñ�трок, у которых уÑ�ловие Ñ�овпало $adults[^man.select($man.age>=18)] - ^òàáëèöà.color[öâåò1;öâåò2] + ^таблица.color[цвет1;цвет2] -!hash - !â âûðàæåíèè - !ëîãè÷åñêîå çíà÷åíèå ðàâíî "íå ïóñòà?" - !÷èñëîâîå çíà÷åíèå ðàâíî _count[] - !$hash.êëþ÷ - !_default - ñïåöèàëüíûé êëþ÷, åñëè çàäàí, - òî ïðè îáðàùåíèè ïî êëþ÷ó, êîòîðîìó íåò ñîîòâåòñòâèÿ, âûäà¸òñÿ _default çíà÷åíèå - !$hash.fields âûäàåò $hash. ÷òîáû êëàññ hash áûë ÷óòü áîëüøå ïîõîæ íà êëàññ table - !^hash::create[[!copy_from_hash|copy_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[êëþ÷] óäàëèòü êëþ÷ - -!hashfile - !^hashfile::open[filename] - !^hashfile.clear[] çàáûòü âñ¸ - !.êëþ÷[çíà÷åíèå] ïîëîæèòü çíà÷åíèå - !.êëþ÷[$.value[çíà÷åíèå] $.expires ÇÍÀ×ÅÍÈÅ} - ïîëîæèòü çíà÷åíèå äî expires - çíà÷åíèå ïîëÿ expires ìîæåò áûòü date, èëè ÷èñëî äíåé(0äíåé=íà âå÷íî) - !.êëþ÷ äîñòàòü - !^delete[êëþ÷] óäàëèòü êëþ÷ - !^delete[] óäàëèòü ôàéëû, ñîäåðæàùèå äàííûå - !^hash[] - ïðåîáðàçîâàòü â îáû÷íûé hash - ïîïóòíî ñòèðàåò óñòàðåâøèå ïàðû - !^foreach[key|value]{òåëî}[[ðàçäåëèòåëü]|{ðàçäåëèòåëü êîòîðûé âûïîëíÿåòñÿ ïåðåä íåïóñòûì î÷åðåäíûì íå ïåðâûì òåëîì}] +hash + в выражении + логичеÑ�кое значение равно "не пуÑ�Ñ‚?", хеш Ñ� _default уже не пуÑ�Ñ‚ + чиÑ�ловое значение равно count[] + $хеш.ключ + !_default - Ñ�пециальный ключ, еÑ�ли задан, + то при обращении по ключу, которому нет Ñ�оответÑ�твиÑ�, выдаётÑ�Ñ� _default значение + $хеш.fields выдает $hash. чтобы клаÑ�Ñ� hash был чуть больше похож на клаÑ�Ñ� table + ^hash::create[[|copy_from_hash|copy_from_hashfile]] + Ñ�оздаёт новый hash, копию Ñ�тарого + ^хеш.add[Ñ�лагаемое] + перезапиÑ�ывает одноимённые + ^хеш.sub[вычитаемое] + ^хеш.union[b] = объединение + одноимённые оÑ�таютÑ�Ñ� + ^хеш.intersection[b] = переÑ�ечение + значениÑ� хеш + ^хеш.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[ключ] удалить ключ + ^хеш.contain[ключ] - Ñ�ущеÑ�твует ли в хеше ключ (bool) + ^Ñ…Ñ�ш.at[first|last][[key|value|hash]] + ^Ñ…Ñ�ш.at([-]N)[[key|value|hash]] + доÑ�туп к заданным Ñ�лементам упорÑ�доченного хеша + ^Ñ…Ñ�ш.sort[key;value]{{ключеделатель Ñ�трока}|(ключеделатель чиÑ�ло)}[[desc|asc]] default=asc + +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] + + +form + [берётÑ�Ñ� первый Ñ�лемент из одноимённых из GET, потом первый из POST] + $form:поле = string/file + $form:nameless = поле Ñ�о значением полÑ� без имени "?value&...", "...&value&...", "...&value" + $form:qtail = Ñ�трока Ñ�о значением текÑ�та поÑ�ле второго "?xxxxx", еÑ�ли там не было ',' [imap] + $form:fields = hash Ñ�о вÑ�еми полÑ�ми формы + $form:tables.поле = table Ñ� одним Ñ�толбцом "field" Ñ�о значениÑ�ми "полÑ�", длÑ� множеÑ�твенных значений + $form:files.поле = hash Ñ�о значениÑ�ми полей типа файл, ключи - 0, 1, ..., значение - файл + $form:imap = Ñ…Ñ�ш Ñ� ключами 'x' и 'y' + Ñ�о значением ?1,2 припиÑ�ки при иÑ�пользовании server-site image map + + +env + $env:переменнаÑ� + $env:fields Ñ…Ñ�ш Ñ� переменными окружениÑ� + $env:PARSER_VERSION верÑ�иÑ� парÑ�ера + + +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 + + +request + $request:query + $request:uri + $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 + + +regex + в выражении + логичеÑ�кое значение вÑ�егда равно true + чиÑ�ловое значение равно количеÑ�тву байт Ñ�компилированного шаблона. + ^regex::create[шаблон-Ñ�трока][[опции поиÑ�ка]] + ^шаблон.size[] количеÑ�тво байт Ñ�компилированного шаблона + еÑ�ли значение очень большое - Ñ�тоит почитать документацию по pcre и, возможно, перепиÑ�ать шаблон. + ^шаблон.study_size[] размер study-Ñ�труктуры. еÑ�ли==0 - шаблон не может быть "изучен" + $шаблон.pattern текÑ�Ñ‚ шаблона + $шаблон.options Ñ�трока Ñ� иÑ�ходным текÑ�том опций + + +TODO: reflection + ^reflection:create[клаÑ�Ñ�;конÑ�труктор[;пара;[мет[;ры]]]] вызывает указанный конÑ�труктор клаÑ�Ñ�а (не более 100 параметров) + ^reflection:classes[] хеш Ñ�о вÑ�еми клаÑ�Ñ�ами. ключ -- имÑ� клаÑ�Ñ�а, значение бывает methoded (клаÑ�Ñ� Ñ� методами) или void + ^reflection:class[объект] клаÑ�Ñ� переданного объекта + ^reflection:class_name[объект] имÑ� клаÑ�Ñ�а переданного объекта + ^reflection:base[объект] родительÑ�кий клаÑ�Ñ� переданного объекта + ^reflection:base_name[объект] имÑ� родительÑ�кого клаÑ�Ñ�а переданного объекта + ^reflection:class_by_name[имÑ� клаÑ�Ñ�а] получение клаÑ�Ñ�а по имени + ^reflection:def[class;имÑ� клаÑ�Ñ�а] проверка клаÑ�Ñ�а на Ñ�ущеÑ�твование + ^reflection:methods[клаÑ�Ñ�] хеш Ñ�о Ñ�пиÑ�ком методов указанного клаÑ�Ñ�а, значениÑ� -- Ñ�троки 'native' или 'parser' + ^reflection:method[клаÑ�Ñ� или объект;имÑ� метода] возвращает junction-method клаÑ�Ñ�а или объекта + ^reflection:fields[клаÑ�Ñ� или объект] хеш Ñ�о Ñ�пиÑ�ком Ñ�татичеÑ�ких полей указанного клаÑ�Ñ�а или динамичеÑ�ких полей указанного объекта + ^reflection:field[клаÑ�Ñ� или объект;имÑ� полÑ�] возвращает значение указанного полÑ� клаÑ�Ñ�а или объекта. getter-Ñ‹ игнорируютÑ�Ñ�. + ^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, позволÑ�ющий определить, Ñ�влÑ�етÑ�Ñ� ли Ñ�лемент кодом. - ïðèìåð: - $uids[^hashfile::open[/db/uids]] - - $random[23847387taduigh345XGHWElxjgdjg] - $uids.$random[$.value[$uid] $.expires(1)] - $uid[$persistent.logins.$random] - -!form - [áåð¸òñÿ ïåðâûé ýëåìåíò èç îäíîèì¸ííûõ èç GET, ïîòîì ïåðâûé èç POST] - !$form:ïîëå = string/file - !$form:nameless = ïîëå ñî çíà÷åíèåì ïîëÿ áåç èìåíè "?value&...", "...&value&...", "...&value" - !$form:qtail = ñòðîêà ñî çíà÷åíèåì òåêñòà ïîñëå âòîðîãî "?xxxxx", åñëè òàì íå áûëî ',' [imap] - !$form:fields = hash ñî âñåìè ïîëÿìè ôîðìû - !$form:tables.ïîëå = table ñ îäíèì ñòîëáöîì "field" ñî çíà÷åíèÿìè "ïîëÿ" - !$form:imap = õýø ñ êëþ÷àìè 'x' è 'y' - ñî çíà÷åíèåì ?1,2 ïðèïèñêè ïðè èñïîëüçîâàíèè server-site image map - -!env - !$env:ïåðåìåííàÿ - -!cookie - !$cookie:èìÿ ñ÷èòàòü ñòàðîå èëè ñâåæåçàäàííîå - !$cookie:èìÿ[çíà÷åíèå] íà 90 äíåé - !$cookie:èìÿ[$.value[çíà÷åíèå] $.expires ÇÍÀ×ÅÍÈÅ ] - !çíà÷åíèå ïîëÿ expires ìîæåò áûòü 'session', date, èëè ÷èñëî äíåé(0äíåé=session) - ! åñëè äàòà, îíà áóäåò ïðåîáðàçîâàíà ê ôîðìàòó "Sun, 25-Aug-2002 12:03:45 GMT" - -!request - !$request:query - !$request:body unprocessed POST request body - !$request:uri - !$request:document-root - êàòàëîã, îòíîñèòåëüíî êîòîðîãî ñ÷èòàþòñÿ ïóòè â parser, ïî-óìîë÷àíèþ = $env:DOCUMENT_ROOT - ìîæíî èçìåíèòü, åñëè íà hosting ÷òî-òî íåóäîáíî íàñòðîåíî - X!$request:browser ýòî hash, ïîëÿ: - !$type = ie/nn è !$version = íîìåð, ñêàæåì 5.5 - X$request:user - X$request:password - !$request:charset - Êîäèðîâêà èñõîäíîãî äîêóìåíòà - !èñïîëüçóåòñÿ ïðè upper/lower è match[][i] - ÏÐÅÄÓÏÐÅÆÄÅÍÈÅ: êëàññ form ïîëó÷àåò ñâîè ïîëÿ ïîñëå îáðàáîòêè âñåõ auto êëàññà MAIN - ïîýòîìó íåîáõîäèìî çàäàòü $request/response:charset â îäíîì èç íèõ. íå ïîñëå. - -!response - !$response:ïîëå[çíà÷åíèå] è ìîæíî ñ÷èòàòü ñòàðîå -- $response:ïîëå - !çíà÷åíèå ìîæåò áûòü string à ìîæåò áûòü hash: - ! $value[abc] field: {abc}<<÷àñòü - ! $attribute[zzz] field: abc; {attribute=zzz}<<÷àñòü - !çíà÷åíèå ïîëÿ èëè àòðèáóòà ìîæåò áûòü string èëè date - ! åñëè äàòà, îíà áóäåò ïðåîáðàçîâàíà ê ôîðìàòó "Sun, 25-Aug-2002 12:03:45 GMT" - !$response:body[DATA] çàìåùàåò ñòàíäàðòíûé îòâåò - !$response:download[DATA] çàìåùàåò ñòàíäàðòíûé îòâåò, - âûñòàâëÿåò ôëàã, çàñòàâëÿþùèé browser ïðåäëîæèòü download - !$response:status - !^response:clear[] çàáûòü âñå çàäàííûå response ïîëÿ - !$response:charset - êîäèðîâêà êëèåíòà ò.å. òà, - 1) èç êîòîðîé áóäóò ïåðåêîäèðîâàíû $form:ïîëÿ ïîñëå çàáèðàíèÿ èç browser'à - 2) â êîòîðóþ äîêóìåíò áóäåò ïåðåêîäèðîâàí ïåðåä îòäàâàíèåì â browser - 3) â êîòîðóþ áóäåò ïåðåêîäèðîâàí òåêñò ÿçûêà uri - íå äîáàâëÿåò ê content-type íè÷åãî, åñëè õî÷åòñÿ, ýòî íàäî ñäåëàòü âðó÷íóþ - ÏÐÅÄÓÏÐÅÆÄÅÍÈÅ: êëàññ form ïîëó÷àåò ñâîè ïîëÿ ïîñëå îáðàáîòêè âñåõ auto êëàññà MAIN - ïîýòîìó íåîáõîäèìî çàäàòü $request/response:charset â îäíîì èç íèõ. íå ïîñëå. -!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[ - $.options[-odd] - unix: ñòðîêà, êîòîðàÿ áóäåò äîáàâëåíà ê êîìàíäå çàïóñêà sendmail - -odd îçíà÷àåò "áûñòðî ïîñòàâü â î÷åðåäü áåç ïðîâåðêè email" - win32: èãíîðèðóåòñÿ - $.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[ +# длÑ� удобÑ�тва можно указать только одну чаÑ�ть, при Ñ�том не будет multipart + $.file[ $.value[^file::load[my beloved.doc]] - $.file-name[ìîé ëþáèìûé.doc] + $.name[мой любимый.doc] + $.format[base64] ] - $.attach2[ + $.file2[ $.value[^file::load[my beloved.doc]] - $.file-name[ìîé ëþáèìûé.doc] + $.name[мой любимый.doc] ] ] ] - !äëÿ îòïðàâêè - ïîä unix èñïîëüçóåòñÿ ïðîãðàììà ñ ïàðàìåòðàìè, çàäàâàåìàÿ - $MAIL.sendmail[êîìàíäà] - åñëè íå áóäåò çàäàíà, ïðîâåðÿåòñÿ, äîñòóïíà ëè - /usr/sbin/sendmail èëè - /usr/lib/sendmail - è, åñëè äîñòóïíà, òî çàïóñêàåòñÿ ñ ïàðàìåòðîì "-t". - ïîä win32 èñïîëüçóåòñÿ SMTP ïðîòîêîë, ñåðâåð çàäà¸òñÿ + длÑ� отправки под unix иÑ�пользуетÑ�Ñ� программа Ñ� параметрами, задаваемаÑ� + $MAIL.sendmail[команда] + еÑ�ли не будет задана, проверÑ�етÑ�Ñ�, доÑ�тупна ли /usr/sbin/sendmail или + /usr/lib/sendmail и, еÑ�ли доÑ�тупна, то запуÑ�каетÑ�Ñ� Ñ� параметром "-t". + + под win32 иÑ�пользуетÑ�Ñ� SMTP протокол, Ñ�ервер задаётÑ�Ñ� $MAIL.SMTP[smtp.domain.ru] -!image - !$êàðòèíêà[^image::measure[DATA]] - ñìîòðèò íà .ext case insensitive, - óìååò ìåðèòü ïîêà òîëüêî .gif è .jpg .jpeg - !$image.exif << hash ïîñëå measure jpeg ñ exif èíôîðìàöèåé - !$image.exif.DateTime & co - [ïîëíûé ñïèñîê ñì. http://www.ba.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html] - !÷èñëà òèïà int/double, - !äàòû òèïà date - !ïåðå÷èñëåíèÿ â âèäå hash ñ êëþ÷àìè 0..count-1 - !$êàðòèíêà.src .width .height - !$êàðòèíêà.line-width ÷èñëî=øèðèíà ëèíèé - !$êàðòèíêà.line-style ñòðîêà=ñòèëü ëèíèé '*** * '='*** * *** * *** * ' - !^êàðòèíêà.html[[hash]] = - !^image::load[ôîí.gif] - òîëüêî gif ïîêà - !^image::create(ðàçìåð X;ðàçìåð Y[;öâåò ôîíà default áåëûé]]) - !^êàðòèíêà.line(x0;y0;x1;y1;0xffFFff) - !^êàðòèíêà.fill(x;y;0xffFFff) - !^êàðòèíêà.rectangle(x0;y0;x1;y1;0xffFFff) - !^êàðòèíêà.bar(x0;y0;x1;y1;0xffFFff) - !^êàðòèíêà.replace(hex-öâåò1;hex-öâåò2)[table x:y âåðøèíû_ìíîãîóãîëüíèêà] - !^êàðòèíêà.polyline+(öâåò)[table x:y òî÷êè] - !^êàðòèíêà.polygon(öâåò)[table x:y âåðøèíû_ìíîãîóãîëüíèêà] - !^êàðòèíêà.polybar(öâåò)[table x;y âåðøèíû_ìíîãîóãîëüíèêà] - !^êàðòèíêà.font[íàáîð_áóêâ;èìÿ_ôàéëà_øðèôòà.gif](øèðèíà_ïðîáåëà[;øèðèíà_ñèìâîëà]) - âûñîòà ñèìâîëà = âûñîòà êàðòèíêè/êîëè÷åñòâî áóêâ â íàáîðå - åñëè óêàçàíà øèðèíà_ñèìâîëà, òî monospaced, åñëè 0, òî øèðèíà_ñèìâîëà = øèðèíå gif - !^êàðòèíêà.text(x;y)[òåêñò_íàäïèñè] AS_IS - !^êàðòèíêà.length[òåêñò_íàäïèñè] AS_IS - !^êàðòèíêà.gif[âîçìîæíî, èìÿ ôàéëà] -- êîäèðóåò â FILE ñ content-type=image/gif - èìÿ ôàéëà áóäåò èñïîëüçîâàíî ïðè $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)] - óçíàòü èëè çàäàòü öâåò ïèêñåëà +image + $картинка[^image::measure[DATA]] + Ñ�мотрит на .ext case insensitive, + умеет мерить пока только .gif и .jpg .jpeg + $картинка.exif << hash поÑ�ле measure jpeg Ñ� exif информацией + $image.exif.DateTime & co + [полный Ñ�пиÑ�ок Ñ�м. http://www.ba.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html] + чиÑ�ла типа int/double, + даты типа date + перечиÑ�лениÑ� в виде hash Ñ� ключами 0..count-1 + $картинка.src .width .height + $картинка.line-width чиÑ�ло=ширина линий + $картинка.line-style Ñ�трока=Ñ�тиль линий '*** * '='*** * *** * *** * ' + ^картинка.html[[hash]] = + ^image::load[фон.gif] + только gif пока + ^image::create(размер X;размер Y[;цвет фона default белый]]) + ^картинка.line(x0;y0;x1;y1;0xffFFff) + ^картинка.fill(x;y;0xffFFff) + ^картинка.rectangle(x0;y0;x1;y1;0xffFFff) + ^картинка.bar(x0;y0;x1;y1;0xffFFff) + ^картинка.replace(hex-цвет1;hex-цвет2)[table x:y вершины_многоугольника] + ^картинка.polyline(цвет)[table x:y точки] + ^картинка.polygon(цвет)[table x:y вершины_многоугольника] + ^картинка.polybar(цвет)[table x;y вершины_многоугольника] + ^картинка.font[набор_букв;имÑ�_файла_шрифта.gif][(ширина_пробела[;ширина_Ñ�имвола])] + выÑ�ота Ñ�имвола = выÑ�ота картинки/количеÑ�тво букв в наборе + еÑ�ли указана ширина_Ñ�имвола, то monospaced, еÑ�ли 0, то ширина_Ñ�имвола = ширине gif + ^картинка.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)] + узнать или задать цвет пикÑ�ела + !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]]]]]]] - âîçâðàù¸ííûé çàãîëîâîê ðàññûïàåòñÿ íà $ïîëÿ + !$файл_из_post.name + !$файл_из_post.size + !$файлtиз_post.text + !^файл.save[text|binary;имÑ� файла[;$.charset[в какой кодировке Ñ�охранÑ�ем]]] + !^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[èìÿ ôàéëà[;env hash[;1cmd[;2line[;3ar[;4g[;5s;...under win32 max 10 args]]]]]]] + !^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: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 + $.stdin[текÑ�Ñ‚] еÑ�ли текÑ�Ñ‚ пуÑ�Ñ‚, отключаетÑ�Ñ� автоматичеÑ�кое переÑ�овывание данных HTTP-POST + !^file:move[Ñ�тарое имÑ� файла;новое имÑ� файла] + можно переименовывать и двигать каталоги[win32: но не через границу диÑ�ков] + каталоги длÑ� dest Ñ�оздаютÑ�Ñ� Ñ� правами 775 + каталог Ñ�тарого файла Ñ�тираетÑ�Ñ�, еÑ�ли поÑ�ле move он оÑ�таётÑ�Ñ� пуÑ�Ñ‚ + !^file:copy[имÑ� файла;имÑ� копии файла] + можно копировать только файлы + !^file:lock[имÑ� файла]{код} + файл при необходимоÑ�ти Ñ�оздаётÑ�Ñ� + блокируетÑ�Ñ� + выполнÑ�етÑ�Ñ� код + разблокируетÑ�Ñ� + Xchmod[...] Ð�ЕТ И Ð�Е БУДЕТ, ЧТОБЫ Ð�Е МОГЛИ СДЕЛÐ�ТЬ executable и запуÑ�тить, даже еÑ�ли ftp запрещает chmod. + !^file:dirname[/a/some.tar.gz]=/a (работает аналогично комманде *nix) + !^file:dirname[/a/b/]=/a (работает аналогично комманде *nix) + !^file:basename[/a/some.tar.gz]=some.tar.gz (работает аналогично комманде *nix) + !^file:basename[/a/b/]=b (работает аналогично комманде *nix) !^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 - !^file.sql-string[] âíóòðè ^connect äàñò ïðàâèëüíî escaped ñòðîêó, êîòîðóþ ìîæíî â çàïðîñ îòäàòü - !^file::sql[[èìÿ_ôàéëà_äëÿ_download]]{} - ðåçóëüòàò çàïðîñà äîëæåí áûòü "îäíà ñòðîêà". - êîëîíêè: - ïåðâàÿ êîëîíêà - äàííûå - åñëè åñòü âòîðàÿ - ýòî èìÿ ôàéëà - åñëè åñòü òðåòüÿ - ýòî content-type + !^файл.sql-string[] внутри ^connect даÑ�Ñ‚ правильно escaped Ñ�троку, которую можно в запроÑ� отдать + !^file::sql{query}[[ + $.name[имÑ�_файла_длÑ�_download] + $.content-type[пользовательÑ�кий content-type] + ]] + результат запроÑ�а должен быть "одна Ñ�трока". + колонки: + перваÑ� колонка - данные + еÑ�ли еÑ�ть втораÑ� - Ñ�то имÑ� файла + еÑ�ли еÑ�ть третьÑ� - Ñ�то content-type + !^файл.base64[] encode + !^file:base64[имÑ� файла] + encode + !^file::base64[encoded string] + !^file::base64[mode;имÑ� файла;encoded string[;$.content-type[...]]] + decode + !^file:crc32[имÑ� файла] + вычиÑ�лÑ�ет crc32 файла Ñ� указанным именем + !^файл.crc32[] + вычиÑ�лÑ�ет crc32 объекта + !^файл.md5[] + !^file:md5[имÑ� файла] + выдает digest файла, длиной 16 байт в виде Ñ�троки, + где байты digest выданы в hex виде, впритык, в нижнем региÑ�тре !math @@ -697,55 +839,125 @@ odbc c:\drives\y\parser3project\odbc\ !^math:sin asin cos acos tan atan !^math:degrees radians !^math:pow sqrt - !^math:random(øèðèíà äèàïàçîíà) + !^math:random(ширина диапазона) !^math:uuid[] 22C0983C-E26E-4169-BD07-77ECE9405BA5 - win32: ïîëüçóåòñÿ cryptapi - unix: ïîëüçóåòñÿ /dev/urandom, - åñëè íåò, /dev/random, - åñëè íåò, rand - [íà solaris /dev/random ìîæíî äîáàâèòü] + win32: пользуетÑ�Ñ� cryptapi + unix: пользуетÑ�Ñ� /dev/urandom, + еÑ�ли нет, /dev/random, + еÑ�ли нет, rand + [на solaris /dev/random можно добавить] !^math:uid64[] BA39BAB6340BE370 !^math:md5[string] - âûäàåò digest ñòðîêè, äëèíîé 16 áàéò â âèäå ñòðîêè, - ãäå áàéòû digest âûäàíû â hex âèäå, âïðèòûê, â íèæíåì ðåãèñòðå + выдает digest Ñ�троки, длиной 16 байт в виде Ñ�троки, + где байты digest выданы в hex виде, впритык, в нижнем региÑ�тре !^math:crypt[password;salt] - salt prefix $apr1$ âûçûâàåò âñòðîåííûé MD5 àëãîðèòì, - åñëè íåò òåëà salt, îíî ñîçäà¸òñÿ ñëó÷àéíûì - $1$ âûçûâàåò MD5 àëãîðèòì ôóíêöèè OS 'crypt', åñëè ïîääåðæèâàåòñÿ [çàâåäîìî íåò íà solaris]. - äðóãèå salt ÷èòàéòå äîêóìåíòàöèþ ïî ôóíêöèè OS 'crypt'. + salt prefix $apr1$ вызывает вÑ�троенный MD5 алгоритм, + еÑ�ли нет тела salt, оно Ñ�оздаётÑ�Ñ� Ñ�лучайным + $1$ вызывает MD5 алгоритм функции OS 'crypt', еÑ�ли поддерживаетÑ�Ñ� [заведомо нет на solaris]. + другие salt читайте документацию по функции OS 'crypt'. + !^math:crc32[string] + вычиÑ�лÑ�ет crc32 Ñ�троки + !^math:sha1[string] + !^math:convert[number](base-from;base-to) преобразует Ñ�троку Ñ� чиÑ�лом из одной Ñ�иÑ�темы иÑ�чиÑ�лениÑ� в другую + !^math:digest[[md5|sha1|sha256|sha512];Ñ�трока или файл][[ $.format[hex|base64] $.hmac[ключ] ]] + объединÑ�ет в Ñ�ебе возможноÑ�ть работы Ñ� разными алгоритмами криптографичеÑ�кого хешированиÑ�. + $.hmac[ключ] длÑ� проверки целоÑ�тноÑ�ти переданных данных + + +!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 адреÑ�а в имÑ� + + +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] пользовательÑ�кий метод, которому будут передаватьÑ�Ñ� маÑ�Ñ�ивы + ]] + парÑ�ит 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[имÑ� метода] имÑ� пользователького метода, при его наличии он будет вызван длÑ� + Ñ�ериализации + $.void[null|string] неопределенное значение будет выдано в виде null (по умолчанию) + или пуÑ�той Ñ�троки + ]] + Ñ�ериализует Ñ�иÑ�темный или пользовательÑ�кий объект в json-Ñ�троку + !date - !âðåìÿ òèïà time ìîæíî èñïîëüçîâàòü â âûðàæåíèÿõ, ïîäñòàâëÿåò - êîëè÷åñòâî äíåé ñ epoch [1 ÿíâàðÿ 1970 (UTC)], äðîáíîå - !âñ¸ ïðîèñõîäèò â localtime, - !âðåìåííàÿ çîíà çàäà¸òñÿ âíå parser ñðåäñòâàìè OS - $date:UTC-offset ñêîëüêî äíåé íàäî ïðèáàâèòü,÷òîáû ïîïàñòü â local âðåìÿ - $date:TZ íàø ÷àñîâîé ïîÿñ, äðîáíîå, â ÷àñàõ (ãäå-òî åñòü ñ òî÷íîñòüþ äî ïîëó÷àñà) + !времÑ� типа time можно иÑ�пользовать в выражениÑ�Ñ…, подÑ�тавлÑ�ет + количеÑ�тво дней Ñ� epoch [1 Ñ�нварÑ� 1970 (UTC)], дробное + !Ñ�троковое значение в меÑ�тном времени, чиÑ�ленное в UTC + !по умолчанию иÑ�пользуетÑ�Ñ� уÑ�тановленнаÑ� Ñ�редÑ�твами OS временнаÑ� зона !^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::now(Ñ�мещение в днÑ�Ñ…) выдаёт Ñ�ейчаÑ�+Ñ�мещение + !^date::today[] дата на 00:00:00 текущего днÑ� + !^date::create(дней Ñ� epoch) + !^date::create(year;month[;day[;hour[;minute[;second]]]]) + !^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() - !^date.unix-timestamp[] - !$date.year month day hour minute second weekday yearday(0...) daylightsaving TZ + !^дата.unix-timestamp[] + !$дата.year month day hour minute second weekday yearday(0...) daylightsaving TZ weekyear read-only - TZ="" << ëîêàëüíàÿ çîíà - !^date.roll[year|month|day](+-ñìåùåíèå) ñäâèãàåò äàòó - !^date.roll[TZ;Íîâàÿ çîíà] ãîâîðèò, ÷òî äàòà â òàêîì-òî ÷àñîâîì ïîÿñå: âëèÿåò íà .hour&co - !^date.sql-string[] %Y-%m-%d %H:%M:%S - where published='$äàòà.sql-string[]' - !^date:calendar[rus|eng;ãîä;ìåñÿö] âûäà¸ò íåèìåíîâàííóþ òàáëèöó - ñòîëáöû: 0..6, week, year - !^date:calendar[rus|eng;ãîä;ìåñÿö;äåíü] âûäà¸ò èìåííîâàííóþ òàáëèöó - ñòîëáöû: year, month, day, weekday - + TZ="" << локальнаÑ� зона + !^дата.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: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 + !^дата.iso-string[] 2001-03-23T12:32:23+3 + + xdoc(xnode) + !$xdoc.search-namespaces hash, where keys=prefixes, values=urls + DOM1 attributes: !readonly attribute DocumentType doctype Xreadonly attribute DOMImplementation implementation @@ -769,18 +981,21 @@ xdoc(xnode) Implementations that do not know whether attributes are of type ID or not are expected to return null. - !êîäèðîâêà ñòðîê è óìîë÷àíèå äëÿ $.encoding - !ðàâíî òåêóùåé êîäèðîâêå âûõîäíîé ñòðàíèöû, + !кодировка Ñ�трок и умолчание длÑ� $.encoding + !равно текущей кодировке выходной Ñ�траницы, $response:charset ::sql{...} - !::create[[URI]]{} ñòàðîå èìÿ 'set' + !::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 âûðàæåíèÿ + !параметры передаютÑ�Ñ� как еÑ�ть, не xpath выражениÑ� !.string[[output options]] - !.save[file.xml[;output options]] ñ øàïêîé + !.save[file.xml[;output options]] Ñ� шапкой !.file[[output options]] = file - output options èäåíòè÷íû àòðèáóòàì xsl:output - [èñêëþ÷åíèå: èãíîðèðóåòñÿ cdata-section-elements, íóæíî áóäåò, ñäåëàþ] - âûäà¸ò media-type ïðè ïîäñòàíîâêå $response:body[ñþäà] + output options идентичны атрибутам xsl:output + [иÑ�ключение: игнорируетÑ�Ñ� cdata-section-elements, нужно будет, Ñ�делаю] + выдаёт media-type при подÑ�тановке $response:body[Ñ�юда] - !åñëè íà äîêóìåíò ññûëàþòñÿ òàê: + !еÑ�ли на документ Ñ�Ñ�ылаютÑ�Ñ� так: parser://method/param/to/that/method - òî â êà÷åñòâå äîêóìåíòà èñïîëüçóåòñÿ ^MAIN:method[/param/to/that/method] - [ïðèìå÷àíèå: â ïàðàìåòð âñåãäà ïðèõîäèò ëèäèðóþùàÿ /, äàæå, åñëè ïàðàìåòðîâ âîîáùå íå áûëî] + то в качеÑ�тве документа иÑ�пользуетÑ�Ñ� ^MAIN:method[/param/to/that/method] + [примечание: в параметр вÑ�егда приходит лидирующаÑ� /, даже, еÑ�ли параметров вообще не было] !xnode DOM1 attributes: @@ -836,6 +1051,8 @@ xdoc(xnode) !$node.previousSibling !$node.nextSibling !$node.ownerDocument = xdoc + !$node.prefix + !$node.namespaceURI !$element_node.attributes = hash of xnodes !$element_node.tagName !$attribute_node.specified = boolean @@ -884,7 +1101,8 @@ xdoc(xnode) !Introduced in DOM Level 2: !Node importNode(in Node importedNode, in boolean deep) raises(DOMException) - !NodeList getElementsByTagNameNS(in DOMString namespaceURI, in DOMString localName); + !NodeList getElementsByTagNameNS(in DOMString namespaceURI, in DOMString localName) + !boolean hasAttributes() !XPath: !^node.select[xpath/query/expression] = array of nodes, @@ -894,54 +1112,18 @@ xdoc(xnode) !^node.selectNumber[xpath/query/expression] = double if any or die !^node.selectString[xpath/query/expression] = string if any or die - !error codes(ïîêà ïðèäóò êàê òåêñò â ñëó÷àå ñîîòâåòñòâóþùèõ îøèáîê): - INDEX_SIZE_ERR - If index or size is negative, or greater - than the allowed value - DOMSTRING_SIZE_ERR - If the specified range of text does not - fit into a DOMString - HIERARCHY_REQUEST_ERR - If any node is inserted somewhere it - doesn't belong - WRONG_DOCUMENT_ERR - If a node is used in a different - document than the one that created it - (that doesn't support it) - INVALID_CHARACTER_ERR - If an invalid character is specified, - such as in a name. - NO_DATA_ALLOWED_ERR - If data is specified for a node which - does not support data - NO_MODIFICATION_ALLOWED_ERR - If an attempt is made to modify an - object where modifications are not - allowed - NOT_FOUND_ERR - If an attempt was made to reference a - node in a context where it does not - exist - NOT_SUPPORTED_ERR - If the implementation does not support - the type of object requested - INUSE_ATTRIBUTE_ERR - If an attempt is made to add an - attribute that is already inuse - elsewhere - !memory - !^memory:compact[] ñîáðàòü ìóñîð, îñâîáîäèâ ìåñòî ïîä íîâûå äàííûå - (ïðåäóïðåæäåíèå: ïàìÿòü ïðîöåññà íèêîãäà íå îñâîáîæäàåòñÿ) - ïîëåçíî äåëàòü ïåðåä XSL transform. + !^memory:compact[] Ñ�обрать муÑ�ор, оÑ�вободив меÑ�то под новые данные + (предупреждение: памÑ�ть процеÑ�Ñ�а никогда не оÑ�вобождаетÑ�Ñ�) + полезно делать перед XSL transform. !status - !÷òîáû êëàññ áûë äîñòóïåí, â apache íóæíî ñêàçàòü + !чтобы клаÑ�Ñ� был доÑ�тупен, в apache нужно Ñ�казать ParserStatusAllowed - !â cgi äîñòóïåí âåçäå - !â isapi íå äîñòóïåí íèãäå + !в cgi доÑ�тупен везде + !в isapi не доÑ�тупен нигде !$status:sql hash !cache table @@ -968,7 +1150,7 @@ xdoc(xnode) !$status:memory hash !used - Includes some pages that were allocated but never written. + Includes some pages that were allocated but never written. !free @@ -976,8 +1158,8 @@ xdoc(xnode) 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. + Return the total number of bytes [EVER(c)PAF] allocated in this process. + Never decreases. !$status:pid process id !$status:tid thread id @@ -985,67 +1167,90 @@ xdoc(xnode) console $console:timeout !$console:line - read/write ñòðîêó + read/write Ñ�троку -!DATA::=string | file +DATA::=string | file | hash + +!hash вида +[ + $.file[имÑ� файла на диÑ�ке] + $.name[имÑ� файла длÑ� пользователÑ�] + $.mdate[date] +] !MAIN - ýòî êëàññ, çàãðóæàåìûé íà àâòîìàòå èç parser3.conf, - êó÷è auto.p è çàïðàøèâàåìîãî äîêóìåíòà: - !parser3.conf + Ñ�то клаÑ�Ñ�, загружаемый на автомате из конфигурационного auto.p, + кучи auto.p и запрашиваемого документа: + !конфигурационный auto.p cgi: - 1. èëè ïîëíûé ïóòü èç ïåðåìåííîé îêðóæåíèÿ CGI_PARSER_SITE_CONFIG - èëè ðÿäîì ñ áèíàðíèêîì parser'à + 1. или полный путь из переменной окружениÑ� CGI_PARSER_SITE_CONFIG + или Ñ€Ñ�дом Ñ� бинарником parser'а isapi: windows directory apache module: 1) ParserConfig [can be in .htaccess] - !auto.p âíèç îò DOCUMENT_ROOT/ ïî äåðåâó äî êàòàëîãà ñ îáðàáàòûâàåìûì ôàéëîì âêëþ÷èòåëüíî - êëàññ ñîáèðàåòñÿ èç âñåõ ýòèõ ôàéëîâ, ïîñëåäóþùèå ñòàíîâÿòñÿ ðîäèòåëÿìè ïðåäûäóùèõ - èìÿ ïîñëåäíåãî çàãðóæåííîãî MAIN, èì¸í ó ïðåäûäóùèõ íåò + !auto.p вниз от DOCUMENT_ROOT/ по дереву до каталога Ñ� обрабатываемым файлом включительно + клаÑ�Ñ� Ñ�обираетÑ�Ñ� из вÑ�ех Ñ�тих файлов, поÑ�ледующие Ñ�тановÑ�Ñ‚Ñ�Ñ� родителÑ�ми предыдущих + имÑ� поÑ�леднего загруженного MAIN, имён у предыдущих нет - !ïîñëå çàãðóçêè MAIN êëàññà âûçûâàåòñÿ åãî @main[] - !ðåçóëüòàò êîòîðîãî ïåðåäà¸òñÿ â åãî @post-process[data] if($data is string) ... - !ðåçóëüòàò êîòîðîãî îòäà¸òñÿ ïîëüçîâàòåëþ + !поÑ�ле загрузки MAIN клаÑ�Ñ�а вызываетÑ�Ñ� его @main[] + !результат которого передаётÑ�Ñ� в его @postprocess[data] if($data is string) ... + !результат которого отдаётÑ�Ñ� пользователю -!åñëè âñòðå÷àåòñÿ îøèáêà è try íå çàäàí, å¸ ìîæíî êðàñèâî ñîîáùèòü ïîëüçîâàòåëþ, - !îïðåäåëèâ +!еÑ�ли вÑ�тречаетÑ�Ñ� ошибка и 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 + !$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 îøèáêó, - !ýòî ìîæíî îòêëþ÷èòü, ïåðåäàâ + $.enctype[multipart/form-data] + $.form[ + !$.field1[string] + !$.field2[^table::create{one_column_only^#0Avalue1^#0Avalue2}] + $.field3[file] + ] + !$.body[string] + |file + !по-умолчанию, user-agent=parser3 + !по-умолчанию, получение http status != 200 >> Ñ�оздает http.status ошибку, + !Ñ�то можно отключить, передав !$.any-status(1) - !$.charset[êîäèðîâêà óäàë¸ííûõ äîêóìåòîâ ïî-óìîë÷àíèþ] << åñëè ñåðâåð âåðí¸ò content-type:charset=ÎÍÀ_ÏÅÐÅÁÈÂÀÅÒ - !file::load â äîïîëíèòåëüíûå ïîëÿ çàïèñûâàåò - !ÏÎËÅ:çíà÷åíèå (èìåíà ïîëåé îòâåòà çàãëàâíûìè áóêâàìè) - !tables << õåø èõ ÏÎËÅ->table ñ åäèíñòâåííûì ñòîëáöîì "value". - â òàêèõ òàáëèöàõ ìîæíî áðàòü ïîâòîðÿþùèåñÿ çàãîëîâêè. íàïðèìåð, íåñêîëüêî set-cookies - todo:ñäåëàòü îòäåëüíûé cookies - -!ñèñòåìíûå òèïû îøèáîê: - !parser.compile ^test[} êîìïèëÿöèÿ (íåïàðíàÿ ñêîáêà, ...) - !parser.runtime ^if(0). ïàðàìåòðû (áîëüøå/ìåíüøå, ÷åì íóæíî, íå òåõ òèïîâ, ...) + !$.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 @@ -1063,8 +1268,12 @@ console !http.timeout ^file::load[http://host/doc] whole load operation failed to complete in # seconds !http.response ^file::load[http://ok/there] host found, connection accepted, bad answer !http.status ^file::load[http://ok/there] host found, connection accepted, status!=200 - -!íóæíî âûêëþ÷èòü ðóññêèé apache: CharsetDisable on + !date.range ^date::create(1950;1;1) date out of valid range + +еÑ�ли в MAIN определён $SIGPIPE(1) то в Ñ�лучае, еÑ�ли обработка была прервана пользователем, Ñ�ообщение + об Ñ�том будет запиÑ�ано в parser3.log (раньше оно вÑ�егда пиÑ�алоÑ�ÑŒ) + +еÑ�ли опиÑ�ание метода Ñ�одержит локальную переменную result в Ñ�вном виде + (еÑ�ть и неÑ�внаÑ� переменнаÑ�) + то код вывода пробельных литералов не попадает в конечный байт-код. -!åñëè â MAIN áóäåò îïðåäåë¸í ôëàã $ORIGINS(1) òî âìåñòî îáû÷íîãî âûâîäà ñòðàíèöû áóäåò - âûäàí ñïèñîê ôðàãìåíòîâ ðåçóëüòàòà ñ óêàçàíèåì èõ ïðîèñõîæäåíèÿ