--- parser3/operators.ru.txt 2015/10/29 18:33:00 1.248 +++ parser3/operators.ru.txt 2017/02/08 19:14:51 1.249 @@ -1,35 +1,35 @@ -!ñäåëàíî -Xíå ñäåëàíî, âèäèìî, íå áóäåò ñäåëàíî -áåç çíà÷êà - áóäåò ñäåëàíî - - -îïåðàòîðû - !^eval(âûðàæåíèå)[ôîðìàò] âûðàæåíèå, êðîìå îáû÷íûõ ôóíêöèé:: - !äîïóñòèìû #êîììåíòàðèè - ðàáîòàþò äî êîíöà ñòðîêè èëè çàêðûâàþùåéñÿ êðóãëîé ñêîáêè - âíóòðè êîììåíòàðèÿ äîïóñòèìû âëîæåííûå êðóãëûå ñêîáêè - !èç íåî÷åâèäíûõ îïåðàòîðîâ: - !| ïîáèòíûé xor - !|| ëîãè÷åñêèé xor - ~ ïîáèòíîå îòðèöàíèå - \ öåëî÷èñëåííîå äåëåíèå 10\3=3 - !def äëÿ ïðîâåðêè defined, - ïóñòàÿ ñòðîêà íå defined - ïóñòàÿ òàáëèöà íå defined - ïóñòîé hash íå defined +!Ñ�делано +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 - !ïðèîðèòåòû: + !eq ne lt gt le ge длÑ� Ñ�равнениÑ� Ñ�трок, + !in "/dir/" длÑ� проверки + ["внутри не допуÑ�тимы, еÑ�ли надо Ñ�равнить Ñ�о Ñ�ложным, + пуÑ�ть Ñ�то будет переменнаÑ�]. + !is 'type' длÑ� проверки типа левого операнда, + Ñ�кажем, можно проверить, "не hash ли параметр метода?" + !-f длÑ� проверки Ñ�ущеÑ�твованиÑ� файла на диÑ�ке, + !-d длÑ� проверки Ñ�ущеÑ�твованиÑ� каталога на диÑ�ке, + !Ñ�трока в кавычках|апоÑ�трофах - Ñ�трока, без кавычек|апоÑ�трофов Ñ�трока до + ближайшего whitespace + !чиÑ�ловой литерал бывает 0xABC + !приоритеты: /* logical */ %left "!||" %left "||" @@ -38,7 +38,7 @@ Xíå ñäåëàíî, âèäèìî, íå áóäåò ñäåëàíî %left "==" "!=" "eq" "ne" %left "is" "def" "in" "-f" "-d" %left '!' - óñëîâèå ? êîãäàÄà: êîãäàÍåò + уÑ�ловие ? когдаДа: когдаÐ�ет /* bitwise */ %left '!|' @@ -50,61 +50,61 @@ Xíå ñäåëàíî, âèäèìî, íå áóäåò ñäåëàíî %left '-' '+' %left '*' '/' '%' '\\' %left NEG /* negation: unary - */ - !ëèòåðàëû + !литералы true false - !^if(óñëîâèå){êîãäà äà}{êîãäà íåò} - !^if(óñëîâèå1){äà}[(óñëîâèå2){äà}[(óñëîâèå2){äà}[...]]]{íåò} -- êîëè÷åñòâî äîï. óñëîâèé íå îãðàíè÷åíî (â îáùåì elseif ýòî :) - !^switch[çíà÷åíèå]{^case[âàðèàíò1[;âàðèàíò2...]]{äåéñòâèå}^case[DEFAULT]{äåéñòâèå ïî óìîë÷àíèþ}} - !^while(óñëîâèå){òåëî}[[ðàçäåëèòåëü]|{ðàçäåëèòåëü êîòîðûé âûïîëíÿåòñÿ ïåðåä íåïóñòûì î÷åðåäíûì íå ïåðâûì òåëîì}] - !^for[i](0;4){òåëî}[[ðàçäåëèòåëü]|{ðàçäåëèòåëü êîòîðûé âûïîëíÿåòñÿ ïåðåä íåïóñòûì î÷åðåäíûì íå ïåðâûì òåëîì}] - !^use[ìîäóëü] + !^if(уÑ�ловие){когда да}{когда нет} + !^if(уÑ�ловие1){да}[(уÑ�ловие2){да}[(уÑ�ловие2){да}[...]]]{нет} -- количеÑ�тво доп. уÑ�ловий не ограничено (в общем elseif Ñ�то :) + !^switch[значение]{^case[вариант1[;вариант2...]]{дейÑ�твие}^case[DEFAULT]{дейÑ�твие по умолчанию}} + !^while(уÑ�ловие){тело}[[разделитель]|{разделитель который выполнÑ�етÑ�Ñ� перед непуÑ�тым очередным не первым телом}] + !^for[i](0;4){тело}[[разделитель]|{разделитель который выполнÑ�етÑ�Ñ� перед непуÑ�тым очередным не первым телом}] + !^use[модуль] !^try{ ... - !^throw[sql.connect[;âàñÿ[;áîëâàí]]] // áûë ^error[òåêñò] + !^throw[sql.connect[;ваÑ�Ñ�[;болван]]] // был ^error[текÑ�Ñ‚] !^throw[ $.type[sql.connect] - $.source[âàñÿ] - $.comment[áîëâàí] + $.source[ваÑ�Ñ�] + $.comment[болван] ] ... }{ ^if($exception.type eq "sql"){ - $exception.handled(1|true) ^rem{ôëàã, ÷òî exception îáðàáîòàí} + $exception.handled(1|true) ^rem{флаг, что exception обработан} .... } ^switch[$exception.type]{ ^case[sql;mail]{ $exception.handled(1) - êîä, îáðàáàòûâàþùèé sql îøèáêó + код, обрабатывающий sql ошибку $exception.type = sql.connect - $exception.file $exception.lineno $exception.colno [åñëè íå çàïðåùåíû ïðè êîìïèëÿöèè] - $exception.source = âàñÿ - $exception.comment = áîëâàí + $exception.file $exception.lineno $exception.colno [еÑ�ли не запрещены при компилÑ�ции] + $exception.source = ваÑ�Ñ� + $exception.comment = болван } ^case[DEFAULT]{ - êîä, îáðàáàòûâàþùèé äðóãóþ îøèáêó + код, обрабатывающий другую ошибку ^throw[$exception] << re-throw // DON'T! It's default behaviour! } } } - !^break[] + - îáðûâàåò öèêë - !^continue[] + - îáðûâàåò èòåðàöèþ öèêëà - !^untaint[[as-is|file-spec|uri|http-header|mail-header|sql|js|json|parser-code|regex|xml|html|optimized-[as-is|xml|html]]]{êîä} + !^break[] + - обрывает цикл + !^continue[] + - обрывает итерацию цикла + !^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(íîìåð ñòðîêè â ôàéëå, îòêóäà äàííûé òåêñò. ìîæíî îòðèöàòåëüíûé) + !^process[[$caller.CLASS|$object|$КЛÐ�СС:CLASS]]{Ñ�трока, котораÑ� будет process-ed, как код}[ + $.main[во что переименовать @main] + $.file[имÑ� файла из которого, Ñ�кобы, данный текÑ�Ñ‚] + $.lineno(номер Ñ�троки в файле, откуда данный текÑ�Ñ‚. можно отрицательный) ] - !^process..[ïóòü][âî ÷òî ïåðåèìåíîâàòü @main] - ïî óìîë÷àíèþ, ìåòîäû êîìïèëèðóþòñÿ â $self [â ñëó÷àå îïåðàòîðà, $self=$MAIN:CLASS] - !^connect[protocol://ñòðîêà ñîåäèíåíèÿ]]{êîä ñ ^sql[...]-ÿìè} + !^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=UTF-8& @@ -113,7 +113,7 @@ Xíå ñäåëàíî, âèäèìî, íå áóäåò ñäåëàíî 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? client_encoding=win,[to-find-out] @@ -140,8 +140,8 @@ Xíå ñäåëàíî, âèäèìî, íå áóäåò ñäåëàíî ClientCharset=parser-charset& << charset in which parser thinks client works autocommit=1 - äëÿ ðàáîòû connect íóæíî, ÷òîáû çàðàíåå(ðåêîìåíäóåòñÿ â ñèñòåìíîì êîíôèãóðàöèîííîì auto.p) - áûëà îïðåäåëåíà òàáëèöà + длÑ� работы connect нужно, чтобы заранее(рекомендуетÑ�Ñ� в Ñ�иÑ�темном конфигурационном auto.p) + была определена таблица #sql drivers $SQL[ $.drivers[^table::create{protocol driver client @@ -152,284 +152,284 @@ sqlite /www/parser3/libparser3sqlite.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' + !в таблице у 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[файл](Ñ�екунд){код}[{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. ...åñëè ïóòü íà÷èíàåòñÿ ñ /, òî ñ÷èòàåòñÿ, ÷òî ýòî ïóòü îò êîðíÿ âåá ïðîñòðàíñòâà - !åñòü ãëîáàëüíàÿ ñòðîêà/òàáëèöà $MAIN:CLASS_PATH ñ ïóò¸ì/ïóòÿìè ê êàòàëîãó ñ êëàññàìè. - !êîðåíü ïóòÿ/ïóòåé ñ÷èòàåòñÿ îò êîðíÿ âåá ïðîñòðàíñòâà. - !2. ...îòíîñèòåëüíî ñòðî÷êè èç table $MAIN:CLASS_PATH, ñíèçó ââåðõ - çàäàâàéòå å¸ â êîíôèãóðàöèîííîì auto.p âàøåãî ñàéòà - - !ãëîáàëüíàÿ òàáëè÷êà $CHARSETS[$.íàçâàíèå[èìÿ ôàéëà]] - !çàäà¸ò êàêèå áóêâû ñ÷èòàþòñÿ êàêèìè(whitespace, letter, etc), à òàêæå èõ unicode - !ôîðìàò: tab delimited ôàéë, ñ çàãîëîâêîì: + !Ñ�игнализирует вышеÑ�тоÑ�щему ^cache "уменьши до Ñ�тольких-то 'Ñ�екунд'/'expires'" + !в пределе: ^cache(0) отменить кÑ�ширование + !^cache[] выдаёт текущую expires date + + !у вÑ�ех методов еÑ�ть локальнаÑ� переменнаÑ� $result, еÑ�ли в неё что положить, + !то _Ñ�то_ будет результатом макроÑ�а, а не его тело + !у вÑ�ех методов еÑ�ть локальнаÑ� переменнаÑ� $caller, в ней лежит родительÑ�кий stack frame, + !еÑ�ли туда запиÑ�ать + + !use(^use или @USE) ищет файл... + !1. ...еÑ�ли путь начинаетÑ�Ñ� Ñ� /, то Ñ�читаетÑ�Ñ�, что Ñ�то путь от корнÑ� веб проÑ�транÑ�тва + !еÑ�ть глобальнаÑ� Ñ�трока/таблица $MAIN:CLASS_PATH Ñ� путём/путÑ�ми к каталогу Ñ� клаÑ�Ñ�ами. + !корень путÑ�/путей Ñ�читаетÑ�Ñ� от корнÑ� веб проÑ�транÑ�тва. + !2. ...отноÑ�ительно Ñ�трочки из table $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 sensitive - -ñèíòàêñèñ - !$èìÿ[íîâîå çíà÷åíèå] - !$èìÿ(ìàòåìàòè÷åñêîå âûðàæåíèå íîâîãî çíà÷åíèÿ) - !$èìÿ{êîä íîâîãî çíà÷åíèÿ} - !$èìÿ whitespace èëè ${èìÿ}íåâàæíî ïîäñòàíîâêà çíà÷åíèÿ - !^èìÿ ïàðàìåòðû âûçîâ - !$èìÿ.CLASS êëàññ çíà÷åíèÿ - !$èìÿ.CLASS_NAME èìÿ êëàññà - !$èìÿ[$.key[] () {}] êîíñòðóêòîð ýëåìåíòà ïåðåìåííîé-õýøà $èìÿ.key - !^method[$.key[] () {}] êîíñòðóêòîð ýëåìåíòà ïàðàìåòðà-õåøà $parameter.key - $CLASS.èìÿ îáðàùåíèå ê ïåðåìåííîé êëàññà - - èìÿ çàêàí÷èâàåòñÿ ïåðåä: ïðîáåë tab linefeed ; ] } ) " < > + * / % & | = ! ' , ? {óòî÷íèòü} - ò.å. ìîæíî - $èìÿ,aaaa - íî åñëè íóæíî ïîñëå èìåíè áóêâó, ñêàæåì -, òî - ${èìÿ}- - â âûðàæåíèÿõ + è - ÿâëÿþòñÿ äîïîëíèòåëüíûìè êîíöàìè èìåíè - !ìîæíî îáðàùàòüñÿ ê ñîñòàâíûì îáúåêòàì òàê: $name.subname - !ãäå subname áûâàåò: - ! ñòðîêà - ! $ïåðåìåííàÿ - ! ñòðîêà$ïåðåìåííàÿ - ! [êîä, âû÷èñëÿþùèé ñòðîêó] - íàïðèìåð: $õýø[$.âîçðàñò(88)] $äîñòàòü[$.ïîëå[âîçðàñò]] ^õýø.[$äîñòàòü.ïîëå].format{%05d} - -ïàðàìåòðû:=îäèí èëè ìíîãî ïàðàìåòðîâ -ïàðàìåòð:= - !(ìàòåìàòè÷åñêîå âûðàæåíèå) âû÷èñëÿåòñÿ ìíîãî ðàç âíóòðè âûçîâà, -| ![êîä] âû÷èñëÿåòñÿ îäèí ðàç ïåðåä âûçîâîì, -| !{êîä} âû÷èñëÿåòñÿ 0 èëè ìíîãî ðàç âíóòðè âûçîâà, - !âåçäå äîïóñòèìû ; âíóòðè - äåëàåò ìíîãî ïàðàìåòðîâ â îäíèõ ñêîáêàõ + ! где char и lowercase могут быть буквами, а могут быть и 0xКОДÐ�МИ + ! еÑ�ли Ñ�имвол имеет единÑ�твенное unicode предÑ�тавление, равное Ñ�амому Ñ�имволу, + ! можно не указывать unicode + !вÑ�егда еÑ�ть кодировка UTF-8, + !она Ñ�влÑ�етÑ�Ñ� кодировкой по-умолчанию длÑ� request и response + !Ð’Ð�ИМÐ�Ð�ИЕ: имÑ� кодировки case sensitive + +Ñ�интакÑ�иÑ� + !$имÑ�[новое значение] + !$имÑ�(математичеÑ�кое выражение нового значениÑ�) + !$имÑ�{код нового значениÑ�} + !$имÑ� 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]} + !доÑ�тупны вÑ�е методы, приÑ�утÑ�твующие у объекта клаÑ�Ñ�а 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]]] - çàïðîñ, ðåçóëüòàò êîòîðîãî äîëæåí áûòü îäèí ñòîëáåö/îäíà ñòðîêà + !^имÑ�.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 çíà÷åíèå ñòðîêè - !^ñòðîêà.bool[] + .bool(default) bool çíà÷åíèå ñòðîêè - åñëè ëîìàåòñÿ ïðåîáðàçîâàíèå, áåð¸òñÿ default - !^ñòðîêà.format[ôîðìàò] %d %.2f %02d... - !^ñòðîêà.match[øàáëîí-ñòðîêà|øàáëîí-regex][[îïöèè ïîèñêà]] $prematch $match $postmatch $1 $2... - îïöèè ïîèñêà= + !в выражении + !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 значение Ñ�троки + !^Ñ�трока.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 - 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)]] - !^ñòðîêà.normalize[] âûäàåò äðóãóþ ñòðîêó, â êîòîðîé ôðàãìåíòû íà îäíîì ÿçûêå îáúåäèíåíû - ïîëåçíî äåëàòü ïåðåä ñëîæíûìè match îïåðàöèÿìè, åñëè âû çíàåòå, ÷òî âõîäíàÿ ñòðîêà - ñîñòîèò èç áîëüøîãî ÷èñëà ôðàãìåíòîâ - !^ñòðîêà.trim[start|both|end|left|right[;chars]] âûêèäûâàåò chars èç íà÷àëà/êîíöà/è íà÷àëà è êîíöà + 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)]] + !^Ñ�трока.normalize[] выдает другую Ñ�троку, в которой фрагменты на одном Ñ�зыке объединены + полезно делать перед Ñ�ложными match операциÑ�ми, еÑ�ли вы знаете, что входнаÑ� Ñ�трока + Ñ�оÑ�тоит из большого чиÑ�ла фрагментов + !^Ñ�трока.trim[start|both|end|left|right[;chars]] выкидывает chars из начала/конца/и начала и конца default 'chars' -- whitespace chars - !^ñòðîêà.trim[chars] âûêèäûâàåò chars èç íà÷àëà è êîíöà - !^ñòðîêà.base64[] encode + !^Ñ�трока.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 + !^Ñ�трока.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]]] ñòàðîå èìÿ "set" + в выражении + логичеÑ�кое значение равно "не пуÑ�та?" + чиÑ�ловое значение равно count[] + !^table::create[[nameless]]{данные}[[$.separator[^#09]]] Ñ�тарое имÑ� "set" !^table::create[table][[$.limit(1) $.offset(5) $.offset[cur] $.reverse(1)]] - êëîíèðóåò òàáëèöó - reverse << ñçàäó íà ïåð¸ä (ðàáîòàåò ïîêà òîëüêî â locate, â table::create ÍÅ ðàáîòàåò) - !^table::load[[nameless;]ïóòü[;îïöèè]] - !åñëè íå nameless, íàçâàíèÿ êîëîíîê áåðóòñÿ èç ïåðâîé ñòðîêè - !ïóñòûå ñòðîêè, è ñòðîêè â ïåðâîé êîëîíêå ñîäåðæàùèå '#', èãíîðèðóþòñÿ + клонирует таблицу + reverse << Ñ�заду на перёд (работает пока только в locate, в table::create Ð�Е работает) + !^table::load[[nameless;]путь[;опции]] + !еÑ�ли не nameless, названиÑ� колонок берутÑ�Ñ� из первой Ñ�троки + !пуÑ�тые Ñ�троки, и Ñ�троки в первой колонке Ñ�одержащие '#', игнорируютÑ�Ñ� !$.separator[^#09] - !$.encloser["] ïî-óìîë÷àíèþ, íåò. + !$.encloser["] по-умолчанию, нет. !^table::sql{query}[[$.limit(2) $.offset(4) $.bind[hash] todo:$.default{ ^table::create[...] }]] - bind ïðèâÿçûâàåò ïåðåìåííûå â çàïðîñå ê èõ çíà÷åíèÿì - ïîêà ðåàëèçîâàí òîëüêî äëÿ oracle - â çàïðîñå íàäî íàïèñàòü ":èìÿ" - â ïàðàìåòðå bind ïåðåäàòü hash, èç êîòîðîãî âîçüì¸òñÿ(èëè êóäà çàïèøåòñÿ) çíà÷åíèå - !^òàáëèöà.save[[nameless|append;]ïóòü[;îïöèè, ñì. load]] - !$òàáëèöà.ïîëå - !$òàáëèöà.ïîëå[íîâîå çíà÷åíèå] - !$òàáëèöà.fields èç named òàáëèöû âûäà¸ò òåêóùóþ çàïèñü êàê Hash - !^òàáëèöà.menu{òåëî}[[ðàçäåëèòåëü]] - !^òàáëèöà.offset[] ïå÷àòàåò offset - !^òàáëèöà.offset[[whence]](5) ñäâèãàåò + bind привÑ�зывает переменные в запроÑ�е к их значениÑ�м + пока реализован только длÑ� oracle + в запроÑ�е надо напиÑ�ать ":имÑ�" + в параметре bind передать hash, из которого возьмётÑ�Ñ�(или куда запишетÑ�Ñ�) значение + !^таблица.save[[nameless|append;]путь[;опции, Ñ�м. load]] + !$таблица.поле + !$таблица.поле[новое значение] + !$таблица.fields из named таблицы выдаёт текущую запиÑ�ÑŒ как Hash + !^таблица.menu{тело}[[разделитель]] + !^таблица.offset[] печатает offset + !^таблица.offset[[whence]](5) Ñ�двигает !whence=cur|set - !áåç whence - ýòî cur - !^òàáëèöà.count[], ^òàáëèöà.count[rows] - êîëè÷åñòâî ñòðîê â òàáëèöå - !^òàáëèöà.count[columns] - êîëè÷åñòâî ñòîëáöîâ òàáëèöû - !^òàáëèöà.count[cells] - êîëè÷åñòâî ÿ÷ååê â òåêóùåé ñòðîêå òàáëèöû - !^òàáëèöà.line[] 1-based offset - !^òàáëèöà.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]]] - çíà÷åíèåì $hash.êëþ÷ áóäåò hash â êîòîðîì ïîëÿ çíà÷åíèé áóäóò êëþ÷àìè - ïîëÿ çíà÷åíèé ìîãóò áûòü íå óêàçàíû, òîãäà èìè áóäóò âñå ñòîëáöû, âêëþ÷àÿ êëþ÷åâîé - åñëè distinct ñîäåðæèò true, òî íå áóäåò îøèáêè ïðè ïîâòîðÿþùèõñÿ êëþ÷àõ - åñëè distinct ñîäåðæèò tables, òî áóäåò ñîçäàí hash èç òàáëèö, ñîäåðæàùèõ ñòðîêè ñ êëþ÷îì - !^òàáëèöà.columns[[íàçâàíèå ñòîëáöà]]+ òàáëèöà èç îäíîãî ñòîëáöà 'column' èëè êàê ïåðåäàäóò - !$îòîáðàííîå[^òàáëèöà.select(âûðàæåíèå)] = òàáëèöà èç òåõ æå ñòîëáöîâ è ñòðîê, ó êîòîðûõ óñëîâèå ñîâïàëî + !без whence - Ñ�то cur + !^таблица.count[], ^таблица.count[rows] - количеÑ�тво Ñ�трок в таблице + !^таблица.count[columns] - количеÑ�тво Ñ�толбцов таблицы + !^таблица.count[cells] - количеÑ�тво Ñ�чеек в текущей Ñ�троке таблицы + !^таблица.line[] 1-based offset + !^таблица.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]]] + значением $hash.ключ будет hash в котором полÑ� значений будут ключами + полÑ� значений могут быть не указаны, тогда ими будут вÑ�е Ñ�толбцы, включаÑ� ключевой + еÑ�ли distinct Ñ�одержит true, то не будет ошибки при повторÑ�ющихÑ�Ñ� ключах + еÑ�ли distinct Ñ�одержит tables, то будет Ñ�оздан hash из таблиц, Ñ�одержащих Ñ�троки Ñ� ключом + !^таблица.columns[[название Ñ�толбца]]+ таблица из одного Ñ�толбца 'column' или как передадут + !$отобранное[^таблица.select(выражение)] = таблица из тех же Ñ�толбцов и Ñ�трок, у которых уÑ�ловие Ñ�овпало $adults[^man.select($man.age>=18)] - ^òàáëèöà.color[öâåò1;öâåò2] + ^таблица.color[цвет1;цвет2] !hash - !â âûðàæåíèè - !ëîãè÷åñêîå çíà÷åíèå ðàâíî "íå ïóñòà?" - !÷èñëîâîå çíà÷åíèå ðàâíî _count[] - !$õåø.êëþ÷ - !_default - ñïåöèàëüíûé êëþ÷, åñëè çàäàí, - òî ïðè îáðàùåíèè ïî êëþ÷ó, êîòîðîìó íåò ñîîòâåòñòâèÿ, âûäà¸òñÿ _default çíà÷åíèå - !$õåø.fields âûäàåò $hash. ÷òîáû êëàññ hash áûë ÷óòü áîëüøå ïîõîæ íà êëàññ table + !в выражении + !логичеÑ�кое значение равно "не пуÑ�та?" + !чиÑ�ловое значение равно _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) todo:$.default{$.field[]...}]] - ïîëó÷àåòñÿ hash(êëþ÷è=çíà÷åíèÿ ïåðâàÿ êîëîíêà îòâåòà) - of hash(êëþ÷è=íàçâàíèÿ îñòàëüíûõ êîëîíêîê îòâåòà) - !^õåø.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 + Ñ�оздаёт новый hash, копию Ñ�тарого + !^хеш.add[Ñ�лагаемое] + перезапиÑ�ывает одноимённые + !^хеш.sub[вычитаемое] + !^хеш.union[b] = объединение + одноимённые оÑ�таютÑ�Ñ� + !^хеш.intersection[b] = переÑ�ечение + значениÑ� хеш + !^хеш.intersects[b] = bool + !^hash::sql{запроÑ�}[[$.distinct(1) $.limit(2) $.offset(4) todo:$.default{$.field[]...}]] + получаетÑ�Ñ� hash(ключи=значениÑ� перваÑ� колонка ответа) + of hash(ключи=названиÑ� оÑ�тальных колонкок ответа) + !^хеш.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[] ïðîáåæàòüñÿ ïî âñåì ýëåìåíòàì è óäàëèòü óñòàðåâøèå. + !^хешфайл.clear[] забыть вÑ�Ñ‘ + !$хешфайл.ключ[значение] положить значение + !$хешфайл.ключ[$.value[значение] $.expires[ЗÐ�Ð�ЧЕÐ�ИЕ]} + положить значение до expires + значение полÑ� expires может быть date, или чиÑ�ло дней(0дней=на вечно) + !$хешфайл.ключ доÑ�тать + !^хешфайл.delete[ключ] удалить ключ + !^хешфайл.delete[] удалить файлы, Ñ�одержащие данные + !^хешфайл.hash[] + преобразовать в обычный hash + попутно Ñ�тирает уÑ�таревшие пары + !^хешфайл.foreach[key;value]{тело}[[разделитель]|{разделитель который выполнÑ�етÑ�Ñ� перед непуÑ�тым очередным не первым телом}] + !^хешфайл.release[] + запиÑ�ать данные и Ñ�нÑ�ть блокировки. + при повторном обращении к Ñ�лементам откроетÑ�Ñ� автоматичеÑ�ки. + !^хешфайл.cleanup[] пробежатьÑ�Ñ� по вÑ�ем Ñ�лементам и удалить уÑ�таревшие. - ïðèìåð: + пример: $sessions[^hashfile::open[/db/sessions]] $sid[^math:uuid[]] @@ -438,113 +438,113 @@ odbc c:\drives\y\parser3project\odbc\deb !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 + [берётÑ�Ñ� первый Ñ�лемент из одноимённых из 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 âåðñèÿ ïàðñåðà + !$env:переменнаÑ� + !$env:fields Ñ…Ñ�ш Ñ� переменными окружениÑ� + !$env:PARSER_VERSION верÑ�иÑ� парÑ�ера !cookie - !$cookie:èìÿ ñ÷èòàòü ñòàðîå èëè ñâåæåçàäàííîå - !$cookie:èìÿ[çíà÷åíèå] íà 90 äíåé - !$cookie:èìÿ[$.value[çíà÷åíèå] $.expires[ÇÍÀ×ÅÍÈÅ] $.secure(true)] - !çíà÷åíèå ïîëÿ expires ìîæåò áûòü 'session', date, èëè ÷èñëî äíåé(0äíåé=session) - ! åñëè äàòà, îíà áóäåò ïðåîáðàçîâàíà ê ôîðìàòó "Sun, 25-Aug-2002 12:03:45 GMT" - ! ìîæíî óñòàíàâëèâàòü bool ñâîéñòâà, íàïðèìåð $.secure(true), $.httponly(true) - !$cookie:fields = hash ñî âñåìè cookies + !$cookie:имÑ� Ñ�читать Ñ�тарое или Ñ�вежезаданное + !$cookie:имÑ�[значение] на 90 дней + !$cookie:имÑ�[$.value[значение] $.expires[ЗÐ�Ð�ЧЕÐ�ИЕ] $.secure(true)] + !значение полÑ� expires может быть 'session', date, или чиÑ�ло дней(0дней=session) + ! еÑ�ли дата, она будет преобразована к формату "Sun, 25-Aug-2002 12:03:45 GMT" + ! можно уÑ�танавливать bool Ñ�войÑ�тва, например $.secure(true), $.httponly(true) + !$cookie:fields = hash Ñ�о вÑ�еми cookies !request !$request:query !$request:uri !$request:document-root - êàòàëîã, îòíîñèòåëüíî êîòîðîãî ñ÷èòàþòñÿ ïóòè â parser, ïî-óìîë÷àíèþ = $env:DOCUMENT_ROOT - ìîæíî èçìåíèòü, åñëè íà hosting ÷òî-òî íåóäîáíî íàñòðîåíî - !$request:argv = hash ñ ïàðàìåòðàìè êîììàíäíîé ñòðîêè. êëþ÷è 0, 1, ... [0 -- èìÿ îáðàáàòûâàåìîãî ôàéëà]. + каталог, отноÑ�ительно которого Ñ�читаютÑ�Ñ� пути в parser, по-умолчанию = $env:DOCUMENT_ROOT + можно изменить, еÑ�ли на hosting что-то неудобно наÑ�троено + !$request:argv = hash Ñ� параметрами коммандной Ñ�троки. ключи 0, 1, ... [0 -- имÑ� обрабатываемого файла]. !$request:charset - Êîäèðîâêà èñõîäíîãî äîêóìåíòà - !èñïîëüçóåòñÿ ïðè upper/lower è match[][i] - ÏÐÅÄÓÏÐÅÆÄÅÍÈÅ: êëàññ form ïîëó÷àåò ñâîè ïîëÿ ïîñëå îáðàáîòêè âñåõ auto êëàññà MAIN - ïîýòîìó íåîáõîäèìî çàäàòü $request/response:charset â îäíîì èç íèõ. íå ïîñëå. - !$request:method ìåòîä çàïðîñà (GET|POST|PUT) - !$request:body òåëî POST-çàïðîñà â âèäå òåêñòà - !$request:body-file òåëî POST-çàïðîñà â âèäå ôàéëà - !$request:body-charset êîäèðîâêà POST-çàïðîñà - !$request:headers õýø ñ çàãîëîâêàìè çàïðîñà (áåç ïðåôèêñà HTTP_) + Кодировка иÑ�ходного документа + !иÑ�пользуетÑ�Ñ� при upper/lower и match[][i] + ПРЕДУПРЕЖДЕÐ�ИЕ: клаÑ�Ñ� form получает Ñ�вои полÑ� поÑ�ле обработки вÑ�ех auto клаÑ�Ñ�а MAIN + поÑ�тому необходимо задать $request/response:charset в одном из них. не поÑ�ле. + !$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:поле[значение] и можно Ñ�читать Ñ�тарое -- $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:clear[] забыть вÑ�е заданные response полÑ� !$response:charset - êîäèðîâêà êëèåíòà ò.å. òà, - 1) èç êîòîðîé áóäóò ïåðåêîäèðîâàíû $form:ïîëÿ ïîñëå çàáèðàíèÿ èç browser'à - 2) â êîòîðóþ äîêóìåíò áóäåò ïåðåêîäèðîâàí ïåðåä îòäàâàíèåì â browser - 3) â êîòîðóþ áóäåò ïåðåêîäèðîâàí òåêñò ÿçûêà uri - íå äîáàâëÿåò ê content-type íè÷åãî, åñëè õî÷åòñÿ, ýòî íàäî ñäåëàòü âðó÷íóþ - ÏÐÅÄÓÏÐÅÆÄÅÍÈÅ: êëàññ form ïîëó÷àåò ñâîè ïîëÿ ïîñëå îáðàáîòêè âñåõ auto êëàññà MAIN - ïîýòîìó íåîáõîäèìî çàäàòü $request/response:charset â îäíîì èç íèõ. íå ïîñëå. + кодировка клиента Ñ‚.е. та, + 1) из которой будут перекодированы $form:полÑ� поÑ�ле забираниÑ� из browser'а + 2) в которую документ будет перекодирован перед отдаванием в browser + 3) в которую будет перекодирован текÑ�Ñ‚ Ñ�зыка uri + не добавлÑ�ет к content-type ничего, еÑ�ли хочетÑ�Ñ�, Ñ�то надо Ñ�делать вручную + ПРЕДУПРЕЖДЕÐ�ИЕ: клаÑ�Ñ� form получает Ñ�вои полÑ� поÑ�ле обработки вÑ�ех auto клаÑ�Ñ�а MAIN + поÑ�тому необходимо задать $request/response:charset в одном из них. не поÑ�ле. !regex - !â âûðàæåíèè - !ëîãè÷åñêîå çíà÷åíèå âñåãäà ðàâíî true - !÷èñëîâîå çíà÷åíèå ðàâíî êîëè÷åñòâó áàéò ñêîìïèëèðîâàííîãî øàáëîíà. - !^regex::create[øàáëîí-ñòðîêà][[îïöèè ïîèñêà]] - !^øàáëîí.size[] êîëè÷åñòâî áàéò ñêîìïèëèðîâàííîãî øàáëîíà - åñëè çíà÷åíèå î÷åíü áîëüøîå -- ñòîèò ïî÷èòàòü äîêóìåíòàöèþ ïî pcre è, âîçìîæíî, ïåðåïèñàòü øàáëîí. - !^øàáëîí.study_size[] ðàçìåð study-ñòðóêòóðû. åñëè==0 -- øàáëîí íå ìîæåò áûòü "èçó÷åí" + !в выражении + !логичеÑ�кое значение вÑ�егда равно true + !чиÑ�ловое значение равно количеÑ�тву байт Ñ�компилированного шаблона. + !^regex::create[шаблон-Ñ�трока][[опции поиÑ�ка]] + !^шаблон.size[] количеÑ�тво байт Ñ�компилированного шаблона + еÑ�ли значение очень большое -- Ñ�тоит почитать документацию по pcre и, возможно, перепиÑ�ать шаблон. + !^шаблон.study_size[] размер study-Ñ�труктуры. еÑ�ли==0 -- шаблон не может быть "изучен" !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(ìàêñèìàëüíî âîçìîæíîå ÷èñëî ïàðàìåòðîâ) + !^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, ïîçâîëÿþùèé îïðåäåëèòü, ÿâëÿåòñÿ ëè ýëåìåíò êîäîì. + длÑ� parser клаÑ�Ñ�ов возвращаетÑ�Ñ� хеш: + ключ -- номер параметра (0, 1, ...), значение - имÑ� параметра + !^reflection:dynamical[[object or class, caller if absent]] возвращает true, еÑ�ли метод был вызван из динамичеÑ�кого контекÑ�та + при передаче параметра возвращает true, еÑ�ли передан динамичеÑ�кий объект, + false еÑ�ли клаÑ�Ñ� + !^reflection:delete[клаÑ�Ñ� или объект;имÑ� переменной] удалÑ�ет переменную Ñ� указанным именем в указанном клаÑ�Ñ�е или объекте + !^reflection:is[имÑ� Ñ�лемента;имÑ� клаÑ�Ñ�а][[контекÑ�Ñ‚]] аналог оператора is, позволÑ�ющий определить, Ñ�влÑ�етÑ�Ñ� ли Ñ�лемент кодом. !mail @@ -552,34 +552,34 @@ odbc c:\drives\y\parser3project\odbc\deb .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[êîäèðîâêà çàãîëîâêà è òåêñòîâûõ áëîêîâ] + unix: Ñ�трока, котораÑ� будет добавлена к команде запуÑ�ка sendmail + -odd означает "быÑ�тро поÑ�тавь в очередь без проверки email" + win32: игнорируетÑ�Ñ� + $.charset[кодировка заголовка и текÑ�товых блоков] $.any-header-field $.text[string] $.text[ @@ -597,202 +597,202 @@ odbc c:\drives\y\parser3project\odbc\deb $value[FILE] ] ] - !åñëè charset óêàçàí, ïèñüìî ïåðåêîäèðóåòñÿ â ýòîò charset - !content-type.charset íå âëèÿåò íà ïåðåêîäèðîâàíèå - !ïîñëå èìåíè ÷àñòè ìîæåò èäòè # ÷èñëî + !еÑ�ли charset указан, пиÑ�ьмо перекодируетÑ�Ñ� в Ñ�тот charset + !content-type.charset не влиÑ�ет на перекодирование + !поÑ�ле имени чаÑ�ти может идти # чиÑ�ло ^mail:send[ -# ïî-óìîë÷àíèþ, ñîâïàäàåò ñ source encoding. -# çàäà¸ò êîäèðîâêó body +# по-умолчанию, Ñ�овпадает Ñ� source encoding. +# задаёт кодировку body $.charset[windows-1251] -# íåò óìîë÷àíèÿ +# нет умолчаниÑ� $.content-type[$.value[text/plain] $.charset[windows-1251]] - $.from["âàñÿ" ] - $.to["ïåòÿ" ] - $.subject[ïîéä¸ì ïèâêà] + $.from["ваÑ�Ñ�" ] + $.to["петÑ�" ] + $.subject[пойдём пивка] $.body[ - ñëîâà + Ñ�лова ] ] - !:send[$.header-field[] $.charset[êîäèðîâêà ïèñüìà] $.body[êîãäà body íå ñòðîêà, - à hash, îòñûëàåòñÿ multipart ïèñüìî]] - !åñëè charset óêàçàí, ïèñüìî ïåðåêîäèðóåòñÿ â ýòîò charset - !content-type.charset íå âëèÿåò íà ïåðåêîäèðîâàíèå - !ïîñëå èìåíè ÷àñòè ìîæåò èäòè öåëîå ÷èñëî, ÷àñòè ïîéäóò â ïîðÿäêå ÷èñåë. - !åñëè body óêàçàí ñòðîêîé, òî ýòî òåêñò ïèñüìà, íèêàêèõ âëîæåíèé. - !åñëè body óêàçàí hash, òî ýòî ÷àñòè, áóäóò ñîáðàíû òåêñòîâûå áëîêè, çàòåì âëîæåíèÿ - !ýòî ñòàðûé ôîðìàò, ïîääåðæèâàåòñÿ äëÿ îáðàòíîé ñîâìåñòèìîñòè - !åñëè èìÿ ÷àñòè íà÷èíàåòñÿ ñî ñëîâà text, òî ýòî òåêñòîâûé áëîê. - !åñëè èìÿ ÷àñòè íà÷èíàåòñÿ ñî ñëîâà file, òî ýòî âëîæåíèå, ôîðìàò çàäàíèÿ:: + !: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 + !важно: при multipart не указывать content-type ^mail:send[ -# ïî-óìîë÷àíèþ, ñîâïàäàåò ñ source encoding. -# çàäà¸ò êîäèðîâêó body +# по-умолчанию, Ñ�овпадает Ñ� 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 +#длÑ� удобÑ�тва Ñ�криптованиÑ� можно указать только одну чаÑ�ть, при Ñ�том не будет multipart $.file[ $.value[^file::load[my beloved.doc]] - $.name[ìîé ëþáèìûé.doc] + $.name[мой любимый.doc] $.format[base64] ] $.file2[ $.value[^file::load[my beloved.doc]] - $.name[ìîé ëþáèìûé.doc] + $.name[мой любимый.doc] ] ] ] - !äëÿ îòïðàâêè - ïîä unix èñïîëüçóåòñÿ ïðîãðàììà ñ ïàðàìåòðàìè, çàäàâàåìàÿ - $MAIL.sendmail[êîìàíäà] - åñëè íå áóäåò çàäàíà, ïðîâåðÿåòñÿ, äîñòóïíà ëè - /usr/sbin/sendmail èëè + !длÑ� отправки + под unix иÑ�пользуетÑ�Ñ� программа Ñ� параметрами, задаваемаÑ� + $MAIL.sendmail[команда] + еÑ�ли не будет задана, проверÑ�етÑ�Ñ�, доÑ�тупна ли + /usr/sbin/sendmail или /usr/lib/sendmail - è, åñëè äîñòóïíà, òî çàïóñêàåòñÿ ñ ïàðàìåòðîì "-t". - ïîä win32 èñïîëüçóåòñÿ SMTP ïðîòîêîë, ñåðâåð çàäà¸òñÿ + и, еÑ�ли доÑ�тупна, то запуÑ�каетÑ�Ñ� Ñ� параметром "-t". + под win32 иÑ�пользуетÑ�Ñ� SMTP протокол, Ñ�ервер задаётÑ�Ñ� $MAIL.SMTP[smtp.domain.ru] !image - !$êàðòèíêà[^image::measure[DATA]] - ñìîòðèò íà .ext case insensitive, - óìååò ìåðèòü ïîêà òîëüêî .gif è .jpg .jpeg - !$êàðòèíêà.exif << hash ïîñëå measure jpeg ñ exif èíôîðìàöèåé + !$картинка[^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 + [полный Ñ�пиÑ�ок Ñ�м. 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)] - óçíàòü èëè çàäàòü öâåò ïèêñåëà + !^картинка.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;èìÿ ôàéëà[;$.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]]]]]]] - âîçâðàù¸ííûé çàãîëîâîê ðàññûïàåòñÿ íà $ïîëÿ + !$файл_из_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[[text|binary;]èìÿ ôàéëà[;env hash[;1cmd[;2line[;3ar[;4g[;5s;...under unix max 50 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: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) + $.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 - !^ôàéë.sql-string[] âíóòðè ^connect äàñò ïðàâèëüíî escaped ñòðîêó, êîòîðóþ ìîæíî â çàïðîñ îòäàòü + !^файл.sql-string[] внутри ^connect даÑ�Ñ‚ правильно escaped Ñ�троку, которую можно в запроÑ� отдать !^file::sql{query}[[ - $.name[èìÿ_ôàéëà_äëÿ_download] - $.content-type[ïîëüçîâàòåëüñêèé content-type] + $.name[имÑ�_файла_длÑ�_download] + $.content-type[пользовательÑ�кий content-type] ]] - ðåçóëüòàò çàïðîñà äîëæåí áûòü "îäíà ñòðîêà". - êîëîíêè: - ïåðâàÿ êîëîíêà - äàííûå - åñëè åñòü âòîðàÿ - ýòî èìÿ ôàéëà - åñëè åñòü òðåòüÿ - ýòî content-type - !^ôàéë.base64[] encode - !^file:base64[èìÿ ôàéëà] + результат запроÑ�а должен быть "одна Ñ�трока". + колонки: + перваÑ� колонка - данные + еÑ�ли еÑ�ть втораÑ� - Ñ�то имÑ� файла + еÑ�ли еÑ�ть третьÑ� - Ñ�то content-type + !^файл.base64[] encode + !^file:base64[имÑ� файла] encode !^file::base64[encoded string] - !^file::base64[mode;èìÿ ôàéëà;encoded string[;$.content-type[...]]] + !^file::base64[mode;имÑ� файла;encoded string[;$.content-type[...]]] decode - !^file:crc32[èìÿ ôàéëà] - âû÷èñëÿåò crc32 ôàéëà ñ óêàçàííûì èìåíåì - !^ôàéë.crc32[] - âû÷èñëÿåò crc32 îáúåêòà - !^ôàéë.md5[] - !^file:md5[èìÿ ôàéëà] - âûäàåò digest ôàéëà, äëèíîé 16 áàéò â âèäå ñòðîêè, - ãäå áàéòû digest âûäàíû â hex âèäå, âïðèòûê, â íèæíåì ðåãèñòðå + !^file:crc32[имÑ� файла] + вычиÑ�лÑ�ет crc32 файла Ñ� указанным именем + !^файл.crc32[] + вычиÑ�лÑ�ет crc32 объекта + !^файл.md5[] + !^file:md5[имÑ� файла] + выдает digest файла, длиной 16 байт в виде Ñ�троки, + где байты digest выданы в hex виде, впритык, в нижнем региÑ�тре !math @@ -804,119 +804,119 @@ odbc c:\drives\y\parser3project\odbc\deb !^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 ñòðîêè + вычиÑ�лÑ�ет crc32 Ñ�троки !^math:sha1[string] - !^math:convert[number](base-from;base-to) ïðåîáðàçóåò ñòðîêó ñ ÷èñëîì èç îäíîé ñèñòåìû èñ÷èñëåíèÿ â äðóãóþ - !^math:digest[[md5|sha1|sha256|sha512];ñòðîêà èëè ôàéë][[ $.format[hex|base64] $.hmac[êëþ÷] ]] - îáúåäèíÿåò â ñåáå âîçìîæíîñòü ðàáîòû ñ ðàçíûìè àëãîðèòìàìè êðèïòîãðàôè÷åñêîãî õåøèðîâàíèÿ. - $.hmac[êëþ÷] äëÿ ïðîâåðêè öåëîñòíîñòè ïåðåäàííûõ äàííûõ + !^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 àäðåñà â èìÿ + !^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: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-Ñ�троку в Ñ…Ñ�ш !^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 + $.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 (ïî óìîë÷àíèþ) - èëè ïóñòîé ñòðîêè + $.file[text|base64|stat] вывеÑ�ти тело файла в указанном виде (по умолчание тело файла + не попадает в output) + $.xdoc[hash] параметры преобразованиÑ� xdoc в Ñ�троку (как в ^xdoc.string[]) + $.тип[method-junction] любой тип можно вывеÑ�ти Ñ� помощью пользовательÑ�кого метода, который + должен принимать 3 параметра: ключ, объект данного типа и опции + вызова ^json:string[] + $._default[имÑ� метода] имÑ� пользователького метода, при его наличии он будет вызван длÑ� + Ñ�ериализации + $.void[null|string] неопределенное значение будет выдано в виде null (по умолчанию) + или пуÑ�той Ñ�троки ]] - ñåðèàëèçóåò ñèñòåìíûé èëè ïîëüçîâàòåëüñêèé îáúåêò â json-ñòðîêó + Ñ�ериализует Ñ�иÑ�темный или пользовательÑ�кий объект в json-Ñ�троку !date - !âðåìÿ òèïà time ìîæíî èñïîëüçîâàòü â âûðàæåíèÿõ, ïîäñòàâëÿåò - êîëè÷åñòâî äíåé ñ epoch [1 ÿíâàðÿ 1970 (UTC)], äðîáíîå - !ñòðîêîâîå çíà÷åíèå â ìåñòíîì âðåìåíè, ÷èñëåííîå â UTC - !ïî óìîë÷àíèþ èñïîëüçóåòñÿ óñòàíîâëåííàÿ ñðåäñòâàìè OS âðåìåííàÿ çîíà + !времÑ� типа time можно иÑ�пользовать в выражениÑ�Ñ…, подÑ�тавлÑ�ет + количеÑ�тво дней Ñ� epoch [1 Ñ�нварÑ� 1970 (UTC)], дробное + !Ñ�троковое значение в меÑ�тном времени, чиÑ�ленное в UTC + !по умолчанию иÑ�пользуетÑ�Ñ� уÑ�тановленнаÑ� Ñ�редÑ�твами OS временнаÑ� зона !^date::now[] - !^date::now(ñìåùåíèå â äíÿõ) âûäà¸ò ñåé÷àñ+ñìåùåíèå - !^date::today[] äàòà íà 00:00:00 òåêóùåãî äíÿ - !^date::create(äíåé ñ epoch) + !^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::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 + !^дата.unix-timestamp[] + !$дата.year month day hour minute second weekday yearday(0...) daylightsaving TZ weekyear read-only - TZ="" << ëîêàëüíàÿ çîíà - !^äàòà.roll[year|month|day](+-ñìåùåíèå) ñäâèãàåò äàòó - !^äàòà.roll[TZ;Íîâàÿ çîíà] ãîâîðèò, ÷òî äàòà â òàêîì-òî ÷àñîâîì ïîÿñå: âëèÿåò íà .hour & Co - !^date:roll[TZ;Íîâàÿ çîíà] ãîâîðèò, ÷òî ïî óìîë÷àíèþ âñå äàòû â òàêîì-òî ÷àñîâîì ïîÿñå - !^äàòà.sql-string[[datetime|date|time]] - datetime èëè áåç ïàðàìåòðà -- %Y-%m-%d %H:%M:%S + 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 + 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) @@ -945,21 +945,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 - äëÿ êàòàëîãîâ êîíå÷íûé / îáÿçàòåëåí + длÑ� каталогов конечный / обÑ�зателен !::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 ïðèîðèòåòíåå] + !::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: @@ -1076,7 +1076,7 @@ xdoc(xnode) !^node.selectNumber[xpath/query/expression] = double if any or die !^node.selectString[xpath/query/expression] = string if any or die - !error codes(ïîêà ïðèäóò êàê òåêñò â ñëó÷àå ñîîòâåòñòâóþùèõ îøèáîê): + !error codes(пока придут как текÑ�Ñ‚ в Ñ�лучае Ñ�оответÑ�твующих ошибок): INDEX_SIZE_ERR If index or size is negative, or greater than the allowed value @@ -1113,17 +1113,17 @@ xdoc(xnode) elsewhere !memory - !^memory:compact[] ñîáðàòü ìóñîð, îñâîáîäèâ ìåñòî ïîä íîâûå äàííûå - (ïðåäóïðåæäåíèå: ïàìÿòü ïðîöåññà íèêîãäà íå îñâîáîæäàåòñÿ) - ïîëåçíî äåëàòü ïåðåä XSL transform. + !^memory:compact[] Ñ�обрать муÑ�ор, оÑ�вободив меÑ�то под новые данные + (предупреждение: памÑ�ть процеÑ�Ñ�а никогда не оÑ�вобождаетÑ�Ñ�) + полезно делать перед XSL transform. !status - !÷òîáû êëàññ áûë äîñòóïåí, â apache íóæíî ñêàçàòü + !чтобы клаÑ�Ñ� был доÑ�тупен, в apache нужно Ñ�казать ParserStatusAllowed - !â cgi äîñòóïåí âåçäå - !â isapi íå äîñòóïåí íèãäå + !в cgi доÑ�тупен везде + !в isapi не доÑ�тупен нигде !$status:sql hash !cache table @@ -1167,56 +1167,56 @@ xdoc(xnode) console $console:timeout !$console:line - read/write ñòðîêó + read/write Ñ�троку DATA::=string | file | hash -!hash âèäà +!hash вида [ - $.file[èìÿ ôàéëà íà äèñêå] - $.name[èìÿ ôàéëà äëÿ ïîëüçîâàòåëÿ] + $.file[имÑ� файла на диÑ�ке] + $.name[имÑ� файла длÑ� пользователÑ�] $.mdate[date] ] !MAIN - ýòî êëàññ, çàãðóæàåìûé íà àâòîìàòå èç êîíôèãóðàöèîííîãî auto.p, - êó÷è auto.p è çàïðàøèâàåìîãî äîêóìåíòà: - !êîíôèãóðàöèîííûé auto.p + Ñ�то клаÑ�Ñ�, загружаемый на автомате из конфигурационного 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[] - !ðåçóëüòàò êîòîðîãî ïåðåäà¸òñÿ â åãî @postprocess[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.colno ôàéë, ñòðîêà è ïîçèöèÿ, ãäå ñëó÷èëàñü ïðîáëåìà [åñëè íå çàïðåùåíû ïðè êîìïèëÿöèè] - !$exception.source ñòðîêà, èç-çà êîòîðîé ñëó÷èëàñü ïðîáëåìà - !$exception.comment êîììåíòàðèé english - !stack òàáëè÷êà èç êîëîíîê file line name, - òàì ëåæàò â îáðàòíîì ïîðÿäêå èìåíà[name] è ìåñòà âûçîâîâ[file line] - îïåðàòîðîâ/ìåòîäîâ, ïðèâåäøèõ ê îøèáêå. + !$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) ìîæíî óêàçàòü òàêîå èìÿ ôàéëà: +!при загрузке файла (file::load, table::load, xdoc::load) можно указать такое имÑ� файла: !http://domain/document[?params<> ñîçäàåò http.status îøèáêó, - !ýòî ìîæíî îòêëþ÷èòü, ïåðåäàâ + !по-умолчанию, user-agent=parser3 + !по-умолчанию, получение http status != 200 >> Ñ�оздает 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). ïàðàìåòðû (áîëüøå/ìåíüøå, ÷åì íóæíî, íå òåõ òèïîâ, ...) + !$.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 @@ -1270,12 +1270,12 @@ DATA::=string | file | hash !http.status ^file::load[http://ok/there] host found, connection accepted, status!=200 !date.range ^date::create(1950;1;1) date out of valid range -!åñëè â MAIN îïðåäåë¸í $SIGPIPE(1) òî â ñëó÷àå, åñëè îáðàáîòêà áûëà ïðåðâàíà ïîëüçîâàòåëåì, ñîîáùåíèå - îá ýòîì áóäåò çàïèñàíî â parser3.log (ðàíüøå îíî âñåãäà ïèñàëîñü) +!еÑ�ли в MAIN определён $SIGPIPE(1) то в Ñ�лучае, еÑ�ли обработка была прервана пользователем, Ñ�ообщение + об Ñ�том будет запиÑ�ано в parser3.log (раньше оно вÑ�егда пиÑ�алоÑ�ÑŒ) -!åñëè îïèñàíèå ìåòîäà ñîäåðæèò ëîêàëüíóþ ïåðåìåííóþ result â ÿâíîì âèäå - (åñòü è íåÿâíàÿ ïåðåìåííàÿ) - òî êîä âûâîäà ñòðîêîâûõ ëèòåðàëîâ íå ïîïàäàåò â êîíå÷íûé áàéò-êîä, - à íåïðîáåëüíûå ñèìâîëû ñ÷èòàþòñÿ ñèíòàêñè÷åñêîé îøèáêîé - äëÿ âûâîäà ÷åãî áû òî íè áûëî íàäî ïîëüçîâàòüñÿ ýòîé ïåðåìåííîé +!еÑ�ли опиÑ�ание метода Ñ�одержит локальную переменную result в Ñ�вном виде + (еÑ�ть и неÑ�внаÑ� переменнаÑ�) + то код вывода Ñ�троковых литералов не попадает в конечный байт-код, + а непробельные Ñ�имволы Ñ�читаютÑ�Ñ� Ñ�интакÑ�ичеÑ�кой ошибкой + длÑ� вывода чего бы то ни было надо пользоватьÑ�Ñ� Ñ�той переменной