--- parser3/operators.ru.txt 2002/12/19 10:17:41 1.107
+++ 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,60 +50,75 @@ Xíå ñäåëàíî, âèäèìî, íå áóäåò ñäåëàíî
%left '-' '+'
%left '*' '/' '%' '\\'
%left NEG /* negation: unary - */
+ !литералы
+ true
+ false
- !^if(óñëîâèå){êîãäà äà}{êîãäà íåò}
- !^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[болван]
+ ]
...
}{
- ^if($exception.type eq sql){
- $exception.handled(1) ^rem{ôëàã, ÷òî exception îáðàáîòàí}
+ ^if($exception.type eq "sql"){
+ $exception.handled(1|true) ^rem{флаг, что exception обработан}
....
}
- ^switch($exception.type){
+ ^switch[$exception.type]{
^case[sql;mail]{
$exception.handled(1)
- êîä, îáðàáàòûâàþùèé sql îøèáêó
+ код, обрабатывающий sql ошибку
$exception.type = sql.connect
- $exception.file $exception.lineno [åñëè íå çàïðåùåíû ïðè êîìïèëÿöèè]
- $exception.source = âàñÿ
- $exception.comment = áîëâàí
+ $exception.file $exception.lineno $exception.colno [е�ли не запрещены при компил�ции]
+ $exception.source = ва��
+ $exception.comment = болван
}
- ^case[_default]{
- êîä, îáðàáàòûâàþùèé äðóãóþ îøèáêó
- ^throw[$exception] << re-throw
+ ^case[DEFAULT]{
+ код, обрабатывающий другую ошибку
+ ^throw[$exception] << re-throw // DON'T! It's default behaviour!
}
}
}
- ^exit[] + - ïðåêðàùÿåò îáðàáîòêó çàïðîñà.
- óäîáíî ñäåëàòü ïîñëå âûñòàâëåíèÿ 401 îøèáêè
- ^return[ðåçóëüòàò] + - îòâàëèâàåò èç âûïîëíåíèÿ ìåòîäà,
- âûäàâàÿ íåñòàíäàðòíûé ðåçóëüòàò
- ^break[] + - îáðûâàåò öèêë
- ^continue[] + - îáðûâàåò èòåðàöèþ öèêëà
- !^untaint[[as-is|file-spec|http-header|mail-header|uri|table|sql|js|xml|html|optimized-html]]{êîä}
+ !^break[] + - обрывает цикл
+ !^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, êàê êîä}
- ïî óìîë÷àíèþ, ìåòîäû êîìïèëèðóþòñÿ â $self [â ñëó÷àå îïåðàòîðà, $self=$MAIN:CLASS]
- !^connect[protocol://ñòðîêà ñîåäèíåíèÿ]]{êîä ñ ^sql[...]-ÿìè}
+ !^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?
- charset=cp1251_koi8&
+ ClientCharset=parser-charset << charset in which parser thinks client works
+ charset=UTF-8&
timeout=3&
- compress=1&
- named_pipe=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
!pgsql://user:pass@{host[:port]|[local]}/database?
- client_encoding=win,[to-find-out]&
- datestyle=ISO,SQL,Postgres,European,NonEuropean=US,German,DEFAULT=ISO
+ 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?
NLS_LANG=RUSSIAN_AMERICA.CL8MSWIN1251&
@@ -116,365 +131,455 @@ Xíå ñäåëàíî, âèäèìî, íå áóäåò ñäåëàíî
NLS_ISO_CURRENCY ISO currency symbol
NLS_SORT sort sequence
ORA_ENCRYPT_LOGIN=TRUE
+ ClientCharset=parser-charset << charset in which parser thinks client works
- !odbc://DSN=dsn^;UID=user^;PWD=password
+ !odbc://DSN=dsn^;UID=user^;PWD=password^;ClientCharset=parser-charset
+ ClientCharset << charset in which parser thinks client works
+
+ !sqlite://DBfile?
+ ClientCharset=parser-charset& << charset in which parser thinks client works
+ autocommit=1
- äëÿ ðàáîòû connect íóæíî, ÷òîáû çàðàíåå(ðåêîìåíäóåòñÿ â ñèñòåìíîì parser3)
- áûëà îïðåäåëåíà òàáëèöà
+ дл� работы connect нужно, чтобы заранее(рекомендует�� в �и�темном конфигурационном auto.p)
+ была определена таблица
#sql drivers
$SQL[
- $.drivers[^table::set{protocol driver client
-mysql /www/parser3/libparser3mysql.so /usr/local/lib/mysql/libmysqlclient.so
-pgsql /www/parser3/libparser3pgsql.so /usr/local/pgsql/lib/libpq.so
-oracle /www/parser3/libparser3oracle.so /u01/app/oracle/product/8.1.5/lib/libclntsh.so?ORACLE_HOME=/u01/app/oracle/product/8.1.5&ORA_NLS33=/u01/app/oracle/product/8.1.5/ocommon/nls/admin/data
-odbc c:\drives\y\parser3project\odbc\debug\parser3odbc.dll
+ $.drivers[^table::create{protocol driver client
+mysql /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'
+ !в таблице у oracle в �толбце клиент�кой библиотеки
+ допу�тимо задать environment параметры инициализации(е�ли они не заданы иначе заранее),
+ допу�тимы имена, начинающие�� на NLS_ ORA_ и ORACLE_, или оканчивающие�� на +
+ под win32
+ необходим PATH+=^;C:\Oracle\Ora81\bin
+ к �ведению:
+ ORA_NLS33 нужен дл� �читывани� файлика � клиент�кой кодировкой(задаваемой NLS_LANG)
+ е�ли кодировка не по-умолчанию, об�зательно указать в .drivers,
+ иначе будет �ообщение про неправильный NLS параметр
+ (имеют в виду, что не нашли кодировку из NLS_LANG)
+ ORACLE_HOME нужен дл� �читывани� тек�тов �ообщений об ошибках,
+ можно указывать и в �троке �оединени�, но глобален, и лучше выне�ти за �кобки,
+ в отличие от клиент�кой кодировки NLS_LANG, и прочего.
+
+ В�ИМ��ИЕ: при работе � большими тек�товыми блоками в oracle&pgsql[а лучше в�егда],
+ �тавить такой префик� перед открывающим апо�трофом, впритык, везде без проблелов
+ /**им�_пол�**/'literal'
!^rem{}
- !^cache[ôàéë](ñåêóíä){êîä}
- !îòíîñèòåëüíîå çàäàíèå âðåìåíè
- !ñêýøèðîâàòü ñòðîêó, êîòîðàÿ ïîëó÷àåòñÿ ïðè âûïîëíåíèè êîäà íà 'ñåêóíä' ñåêóíä
- !åñëè 0ñåêóíä, çíà÷èò íå êýøèðîâàòü, à ñòàðûé òàêîé ñòåðåòü
- !^cache[ôàéë][expires date]{êîä}
- !àáñîëþòíîå çàäàíèå âðåìåíè
- X^cache[ôàéë] óäàëèòü ôàéë [íå ðóãàåò, åñëè åãî íåò] // òàêîå áûëî, áîëüøå íå áóäåò, äåëàòü ^cache(0)
- !^cache(ñåêóíä)
+ !^cache[файл](�екунд){код}[{catch код}]
+ !отно�ительное задание времени
+ !�к�шировать �троку, котора� получает�� при выполнении кода на '�екунд' �екунд
+ !е�ли 0�екунд, значит не к�шировать, а �тарый такой �тереть
+ !в catch коде $exception.handled[cache] ^rem{флаг, что exception обработан}
+ !^cache[файл][expires date]{код}[{catch код}]
+ !аб�олютное задание времени
+ !^cache[файл] удалить файл [не ругает, е�ли его нет]
+ !^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 ôàéë, ñ çàãîëîâêîì:
+ !�игнализирует выше�то�щему ^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 êëàññ çíà÷åíèÿ
- !$èìÿ[$.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
- !^èìÿ.length[]
- 0
- !^èìÿ.pos[...]
- -1
- !^èìÿ.int[] (default)
- 0 èëè default
- !^èìÿ.double[] (default)
- 0 èëè default
- !^void:sql{çàïðîñ áåç ðåçóëüòàòà}
+ !до�тупны в�е методы, при�ут�твующие у объекта кла��а string, результат как у пу�той �троки
+ !^void:sql{запро� без результата}{$.bind[�м. table::sql]}
+
!int,double
- !^èìÿ.int[] öåëî÷èñëåííîå çíà÷åíèå
- !^èìÿ.double[]+ double çíà÷åíèå
- !^èìÿ.inc(íà ñêîëüêî +)
- !^èìÿ.dec(íà ñêîëüêî -)
- !^èìÿ.mul(íà ñêîëüêî *)
- !^èìÿ.div(íà ñêîëüêî /)
- !^èìÿ.mod(íà ñêîëüêî %)
- !^èìÿ.format[ôîðìàò]
- !^int/double:sql{query}[[$.limit(2) $.offset(4) $.default{0}]]
- çàïðîñ, ðåçóëüòàò êîòîðîãî äîëæåí áûòü îäèí ñòîëáåö/îäíà ñòðîêà
+ !^им�.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}]]
- ðåçóëüòàò çàïðîñà äîëæåí áûòü îäèí ñòîëáåö/îäíà ñòðîêà
- !^èìÿ.int[] .int(default) öåëî÷èñëåííîå çíà÷åíèå ñòðîêè.
- åñëè ëîìàåòñÿ ïðåîáðàçîâàíèå, áåð¸òñÿ default
- !^èìÿ.double[]+ .double(default) double çíà÷åíèå ñòðîêè
- åñëè ëîìàåòñÿ ïðåîáðàçîâàíèå, áåð¸òñÿ default
- !^èìÿ.format[ôîðìàò] %d %.2f %02d...
- !^ñòðîêà.match[øàáëîí][[îïöèè ïîèñêà]] $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 íàéòè âñå âõîæäåíèÿ, à íå îäíî
- !^ñòðîêà.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 îïåðàöèÿìè, åñëè âû çíàåòå, ÷òî âõîäíàÿ ñòðîêà
- ñîñòîèò èç áîëüøîãî ÷èñëà ôðàãìåíòîâ
+ 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
+ !^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]]{äàííûå} ñòàðîå èìÿ "set"
- !^table::create[table][[$.limit(1) $.offset(5) $.offset[cur]]]
- êëîíèðóåò òàáëèöó
- !^table::load[[nameless;]ïóòü[;îïöèè]]
- !åñëè íå nameless, íàçâàíèÿ êîëîíîê áåðóòñÿ èç ïåðâîé ñòðîêè
- !ïóñòûå ñòðîêè, è ñòðîêè â ïåðâîé êîëîíêå ñîäåðæàùèå '#', èãíîðèðóþòñÿ
- !^table::sql{query}[[$.limit(2) $.offset(4) todo:$.default{ ^table::create[...] }]]
- !^òàáëèöà.save[[nameless|append;]ïóòü]
- !$òàáëèöà.ïîëå
- !$òàáëèöà.fields èç named òàáëèöû âûäà¸ò òåêóùóþ çàïèñü êàê Hash
- !^òàáëèöà.menu{òåëî}[ðàçäåëèòåëü]
- !^òàáëèöà.offset[[whence]](5) ñäâèãàåò; áåç ïàðàìåòðà - ïå÷àòàåò offset
+ в выражении
+ логиче�кое значение равно "не пу�та?"
+ чи�ловое значение равно 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, названи� колонок берут�� из первой �троки
+ !пу�тые �троки, и �троки в первой колонке �одержащие '#', игнорируют��
+ !$.separator[^#09]
+ !$.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) �двигает
!whence=cur|set
- !áåç whence - ýòî cur
- !^òàáëèöà.count[]
- !^òàáëèöà.line[] 1-based offset
- !^òàáëèöà.sort{{êëþ÷åäåëàòåëü ñòðîêà}|(êëþ÷åäåëàòåëü ÷èñëî)}[{desc|asc}] default=asc
- !^òàáëèöà.append{äàííûå}
- X^òàáëèöà.insert{äàííûå}[(n)] äîáàâèòü çàïèñü
- íà òåêóùóþ ïîçèöèþ [äîáàâèòü çàïèñü íà ïîçèöèþ n]
- X^òàáëèöà.remove(position[;count]) - ñòèðàåò çàïèñü
- èç òåêóùåé ïîçèöèè [ñòèðàåò çàïèñü èç êîíêðåòíîé ïîçèöèè]
- [ñòèðàåò count çàïèñåé]
- !^òàáëèöà.join[òàáëèöà][$.limit(1) $.offset(5) $.offset[cur]] - äîáàâëÿåò çàïèñè èç òàáëèöû.
- òàáëèöû äîëæíû èìåòü îäèíàêîâóþ ñòðóêòóðó.
- !^òàáëèöà.flip[] âûäà¸ò òðàíñïîíèðîâàííóþ, íàäî êóäà-òî ñëîæèòü, ïîòîì ïîëüçîâàòü
- !^òàáëèöà.locate[ïîëå;çíà÷åíèå] ïåðåäâèãàåò òåêóùóþ ñòðîêó, åñëè íàéä¸ò. âûäà¸ò bool
- !^òàáëèöà.locate(ëîãè÷åñêîå âûðàæåíèå) ïåðåäâèãàåò òåêóùóþ ñòðîêó, åñëè íàéä¸ò. âûäà¸ò bool
- !^òàáëèöà.hash{[ïîëå]|{êîä}|(âûðàæåíèå)}[[ïîëå çíà÷åíèé|table ïîëÿ çíà÷åíèé]][[$.distinct(1)]]
- çíà÷åíèåì $hash.êëþ÷ áóäåò hash â êîòîðîì ïîëÿ çíà÷åíèé áóäóò êëþ÷àìè
- ïîëÿ çíà÷åíèé ìîãóò áûòü íå óêàçàíû, òîãäà èìè áóäóò âñå ñòîëáöû, âêëþ÷àÿ êëþ÷åâîé
- !^òàáëèöà.columns[]+ òàáëèöà èç îäíîãî ñòîëáöà $column
- !$îòîáðàííîå[^òàáëèöà.select(âûðàæåíèå)] = òàáëèöà èç òåõ æå ñòîëáöîâ è ñòðîê, ó êîòîðûõ óñëîâèå ñîâïàëî
+ !без 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[]
- !$hash.êëþ÷
- !_default - ñïåöèàëüíûé êëþ÷, åñëè çàäàí,
- òî ïðè îáðàùåíèè ïî êëþ÷ó, êîòîðîìó íåò ñîîòâåòñòâèÿ, âûäà¸òñÿ _default çíà÷åíèå
- !$hash.fields âûäàåò $hash. ÷òîáû êëàññ hash áûë ÷óòü áîëüøå ïîõîæ íà êëàññ table
- !^hash::create[[!copy_from_hash|Xcopy_from_hashfile]]
- ñîçäà¸ò íîâûé hash, êîïèþ ñòàðîãî
- !^hash.add[ñëàãàåìîå]
- ïåðåçàïèñûâàåò îäíîèì¸ííûå
- !^hash.sub[âû÷èòàåìîå]
- !^a.union[b] = îáúåäèíåíèå
- îäíîèì¸ííûå îñòàþòñÿ
- !^a.intersection[b] = ïåðåñå÷åíèå
- çíà÷åíèÿ a
- !^a.intersects[b] = bool
- !^hash::sql{çàïðîñ}[[$.distinct(1) $.limit(2) $.offset(4) todo:$.default{$.field[]...}]]
- ïîëó÷àåòñÿ hash(êëþ÷è=çíà÷åíèÿ ïåðâàÿ êîëîíêà îòâåòà)
- of hash(êëþ÷è=íàçâàíèÿ îñòàëüíûõ êîëîíêîê îòâåòà)
- !^hash._keys[]+ òàáëèöà èç îäíîãî ñòîëáöà $key
- !^hash._count[]
- !^foreach[key;value]{òåëî}[[ðàçäåëèòåëü]|{ðàçäåëèòåëü êîòîðûé âûïîëíÿåòñÿ ïåðåä íåïóñòûì î÷åðåäíûì íå ïåðâûì òåëîì}]
- !^delete[êëþ÷] óäàëèòü êëþ÷
+ !в выражении
+ !логиче�кое значение равно "не пу�та?"
+ !чи�ловое значение равно _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
+
+!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: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:переменна�
+ !$env:fields х�ш � переменными окружени�
+ !$env:PARSER_VERSION вер�и� пар�ера
+
!cookie
- !$cookie:èìÿ ñ÷èòàòü ñòàðîå èëè ñâåæåçàäàííîå
- !$cookie:èìÿ[çíà÷åíèå] íà 90 äíåé
- !$cookie:èìÿ[$.value[çíà÷åíèå] $.expires(äíåé, 0äíåé=session)]
+ !$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:body unprocessed POST request body
+ !$request:query
!$request:uri
- X!$request:browser ýòî hash, ïîëÿ:
- !$type = ie/nn è !$version = íîìåð, ñêàæåì 5.5
- X$request:user
- X$request:password
+ !$request:document-root
+ каталог, отно�ительно которого �читают�� пути в parser, по-умолчанию = $env:DOCUMENT_ROOT
+ можно изменить, е�ли на hosting что-то неудобно на�троено
+ !$request:argv = hash � параметрами коммандной �троки. ключи 0, 1, ... [0 -- им� обрабатываемого файла].
!$request:charset
- Êîäèðîâêà èñõîäíîãî äîêóìåíòà
- !èñïîëüçóåòñÿ ïðè upper/lower è match[][i]
- ÏÐÅÄÓÏÐÅÆÄÅÍÈÅ: êëàññ form ïîëó÷àåò ñâîè ïîëÿ ïîñëå îáðàáîòêè âñåõ auto êëàññà MAIN
- ïîýòîìó íåîáõîäèìî çàäàòü $request/response: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_)
+
!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:поле[значение] и можно �читать �тарое -- $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 â îäíîì èç íèõ. íå ïîñëå.
-
-Xhashfile
- !^hashfile::open[$DB_HOME;filename]
- !^hashfile.clear[]
- çàáûòü âñ¸
- !.êëþ÷[çíà÷åíèå] ïîëîæèòü çíà÷åíèå íàâå÷íî
- !.êëþ÷[$.value[çíà÷åíèå] $.expires(ñåêóíä)} ïîëîæèòü çíà÷åíèå íà expires ñåêóíä
- !.êëþ÷ äîñòàòü
- !^cache[êëþ÷](ñåêóíä){êîä}
- !ñóòü òî æå, ÷òî è "ïîëîæèòü+äîñòàòü", íî çà îäèí ðàç è êîìïàêòíåå
- !åñëè 0ñåêóíä, çíà÷èò íå êýøèðîâàòü, à ñòàðûé òàêîé ñòåðåòü
- !âíóòðè {êîäà} ìîæåò áûòü âûçâàí ^delete[]
- !^delete[[êëþ÷]] óäàëèòü êëþ÷
- !áóäå âûçâàí áåç ïàðàìåòðà èçíóòðè cache, îòìåíÿåò êýøèðîâàíèå áëîêà:
- !áëîê íå áóäåò ñêýøèðîâàí, åãî ñòàðîå çíà÷åíèå áóäåò ñò¸ðòî
- !^hash[]
- ïðåîáðàçîâàòü â îáû÷íûé hash
- !^foreach[key|value]{òåëî}[[ðàçäåëèòåëü]|{ðàçäåëèòåëü êîòîðûé âûïîëíÿåòñÿ ïåðåä íåïóñòûì î÷åðåäíûì íå ïåðâûì òåëîì}]
-
-
- ïðèìåðû:
- $uids[^hashfile::assign[/db/uids]]
- $code:clear[/db/cache]]
- $code[^hashfile::assign[/db/cache]]
-
- $random[23847387taduigh345XGHWElxjgdjg]
- $uids.$random[$.value[$uid] $.expires(60*30)]
- $uid[$persistent.logins.$random]
+ кодировка клиента т.е. та,
+ 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 -- шаблон не может быть "изучен"
+
+
+!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, позвол�ющий определить, �вл�ет�� ли �лемент кодом.
- ^code.cache[çàãîëîâêè íîâîñòåé](35){....}
!mail
!$mail.received=MESSAGE:
.from
.reply-to
.subject
- .date êëàññà date
+ .date кла��а date
.message-id
.raw[
- .ÑÛÐÎÅ_ÏÎËÜÇÎÂÀÒÅËÜÑÊÎÅ-ÏÎËÅ-ÇÀÃÎËÎÂÊÀ
+ .СЫРОЕ_ПОЛЬЗОВ�ТЕЛЬСКОЕ-ПОЛЕ-З�ГОЛОВК�
]
- $.{text|html|file#}[ << íóìåðóåòñÿ êàê è â mail:send (text, text2, ...) (file, file2, ...)
+ $.{text|html|file#}[ << нумерует�� как и в mail:send (text, text2, ...) (file, file2, ...)
$.content-type[
$.value[{text|...|x-unknown}/{plain|html|...|x-unknown}]
- [$.charset[windows-1251]] << â êàêîì ïðèøëî, ñåé÷àñ óæå ïåðåêîäèðîâàíî
- $.ÏÎËÜÇÎÂÀÒÅËÜÑÊÈÉ-ÏÀÐÀÌÅÒÐ-ÇÀÃÎËÎÂÊÀ
+ [$.charset[windows-1251]] << в каком пришло, �ейча� уже перекодировано
+ $.ПОЛЬЗОВ�ТЕЛЬСКИЙ-П�Р�МЕТР-З�ГОЛОВК�
]
$.description
$.content-id
$.content-md5
$.content-location
.raw[
- .ÑÛÐÎÅ_ÏÎËÜÇÎÂÀÒÅËÜÑÊÎÅ-ÏÎËÅ-ÇÀÃÎËÎÂÊÀ
+ .СЫРОЕ_ПОЛЬЗОВ�ТЕЛЬСКОЕ-ПОЛЕ-З�ГОЛОВК�
]
- $.value[ñòðîêà|FILE]
+ $.value[�трока|FILE]
]
$.message#[MESSAGE] (message, message2, ...)
!^mail:send[
- $.charset[êîäèðîâêà çàãîëîâêà è òåêñòîâûõ áëîêîâ]
+ $.options[-odd]
+ unix: �трока, котора� будет добавлена к команде запу�ка sendmail
+ -odd означает "бы�тро по�тавь в очередь без проверки email"
+ win32: игнорирует��
+ $.charset[кодировка заголовка и тек�товых блоков]
$.any-header-field
$.text[string]
$.text[
@@ -492,163 +597,205 @@ Xhashfile
$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, òî ýòî òåêñòîâûé áëîê.
- !åñëè èìÿ ÷àñòè íà÷èíàåòñÿ ñî ñëîâà attach, òî ýòî âëîæåíèå, ôîðìàò çàäàíèÿ::
- !$attach[$.format[!uue|Xbase64] $.value[DATA] $.file-name[user-file-name]]
- !âàæíî: ïðè multipart íå óêàçûâàòü content-type
+ !: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
+# по-умолчанию, �овпадает � 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 èëè
+ !дл� отправки
+ под 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
- !$image.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
- !^êàðòèíêà.text(x;y)[òåêñò_íàäïèñè] AS_IS
- !^êàðòèíêà.length[òåêñò_íàäïèñè] AS_IS
- !^êàðòèíêà.gif[] -- êîäèðóåò â FILE ñ content-type=image/gif
- !^êàðòèíêà.arc(center x;center y;width;height;start in degrees;end in degrees;color)
- !^êàðòèíêà.sector(center x;center y;width;height;start in degrees;end in degrees;color)
- !^êàðòèíêà.circle(center x;center y;r;color)
- !^êàðòèíêà.copy[source](src x;src y;src w;src h;dst x;dst y[;dest w[;dest h[;tolerance]]])
- ïðè çàäàííûõ dest_w/dest_h äåëàåò èçìåíåíèå ðàçìåðà êóñî÷êà
- ïðè óìåíüøåíèè äåëàåò resample
- ãîäèòñÿ òîëüêî äëÿ óìåíüøåíèÿ ïðîñòîé[ìàëîöâåòíîé] äðåáåäåíè âðîäå ãðàôèêîâ/pie,
- äëÿ thumbnais íå ãîäèòñÿ.
- ïðè íå óêàçàííîì dest_h ñîõðàíÿåò aspect ratio
- tolerance - íåêîå ÷èñëî[êâàäðàò ðàññòîÿíèÿ â RGB ïðîñòðàíñòâå äî èñêîìîãî öâåòà],
- îïðåäåëÿþùåå ïðîæîðëèâîñòü âûäåëÿëêè öâåòîâ èç ïàëèòðû [default=150]
- ìåíüøå - òî÷íåå ïðèáëèæàåò öâåòà, íî îíè áûñòðî êîí÷àþòñÿ
- áîëüøå - íåòî÷íî ïðèáëèæàåò öâåò, íî áÎëüøåé ÷àñòè õâàòèò
+ [полный �пи�ок �м. 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
+ !^файл.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
+!math
!$math:PI
!^math:round floor ceiling
!^math:trunc frac
@@ -657,40 +804,124 @@ math
!^math:sin asin cos acos tan atan
!^math:degrees radians
!^math:pow sqrt
- !^math:random(øèðèíà äèàïàçîíà)
- ^math:GUID {C2C0983C-E26E-4169-BD07-77ECE9405BA5}
+ !^math:random(ширина диапазона)
+ !^math:uuid[]
+ 22C0983C-E26E-4169-BD07-77ECE9405BA5
+ win32: пользует�� cryptapi
+ unix: пользует�� /dev/urandom,
+ е�ли нет, /dev/random,
+ е�ли нет, rand
+ [на solaris /dev/random можно добавить]
+ !^math:uid64[]
+ BA39BAB6340BE370
+ !^math:md5[string]
+ выдает digest �троки, длиной 16 байт в виде �троки,
+ где байты digest выданы в hex виде, впритык, в нижнем реги�тре
!^math:crypt[password;salt]
- 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.year month day hour minute second weekday yearday(0...) daylightsaving
+ !^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()
+ !^дата.unix-timestamp[]
+ !$дата.year month day hour minute second weekday yearday(0...) daylightsaving TZ weekyear
read-only
- !^date.roll[year|month|day](+-ñìåùåíèå) ñäâèãàåò äàòó
- !^date.sql-string[] %Y-%m-%d %H:%M:%S
- where published='$äàòà.sql-string[]'
- !^date:calendar[rus|eng;ãîä;ìåñÿö] âûäà¸ò íåèìåíîâàííóþ òàáëèöó
- ñòîëáöû: 0..6, week, weekyear
- !^date:calendar[rus|eng;ãîä;ìåñÿö;äåíü] âûäà¸ò èìåííîâàííóþ òàáëèöó
- ñòîëáöû: year, month, day, weekday
-
+ 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
@@ -714,18 +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
- äëÿ êàòàëîãîâ êîíå÷íûé / îáÿçàòåëåí
- !::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]
+ [примечание: в параметр в�егда приходит лидирующа� /, даже, е�ли параметров вообще не было]
+
!xnode
DOM1 attributes:
!$node.nodeName
!$node.nodeValue
+ !read
+ !write
!$node.nodeType = int
ELEMENT_NODE = 1
ATTRIBUTE_NODE = 2
@@ -774,6 +1015,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
@@ -822,7 +1065,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,
@@ -832,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
@@ -868,13 +1112,18 @@ xdoc(xnode)
attribute that is already inuse
elsewhere
+!memory
+ !^memory:compact[] �обрать му�ор, о�вободив ме�то под новые данные
+ (предупреждение: пам�ть проце��а никогда не о�вобождает��)
+ полезно делать перед XSL transform.
+
!status
- !÷òîáû êëàññ áûë äîñòóïåí, â apache íóæíî ñêàçàòü
+ !чтобы кла�� был до�тупен, в apache нужно �казать
ParserStatusAllowed
- !â cgi äîñòóïåí âåçäå
- !â isapi íå äîñòóïåí íèãäå
+ !в cgi до�тупен везде
+ !в isapi не до�тупен нигде
!$status:sql hash
!cache table
@@ -886,11 +1135,6 @@ xdoc(xnode)
file time
file time
file time
- !$status:charset hash
- !cache table
- file
- file
- file
!$status:rusage hash
!utime user time used
@@ -904,58 +1148,109 @@ xdoc(xnode)
$s[$status:rusage]
^s.tv_sec.format[%.0f].^s.tv_usec.format[%06.0f]
-
-!DATA::=string | file
+ !$status:memory hash
+ !used
+ Includes some pages that were allocated but never written.
+
+ !free
+
+ !ever_allocated_since_compact
+ Return the number of bytes allocated since the last collection.
+
+ !ever_allocated_since_start
+ Return the total number of bytes [EVER(c)PAF] allocated in this process.
+ Never decreases.
+
+ !$status:pid process id
+ !$status:tid thread id
+
+console
+ $console:timeout
+ !$console:line
+ read/write �троку
+
+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 ошибку,
+ !�то можно отключить, передав
+ !$.any-status(1)
+ !$.charset[кодировка удалённых документов по-умолчанию], е�ли �ервер вернёт content-type:charset - О��_ПЕРЕБИВ�ЕТ
+ !$.response-charset[кодировка удалённых документов], не перебивае�� content-type:charset
+ !$.user[пользователь]
+ !$.password[пароль]
+ !file::load в дополнительные пол� запи�ывает
+ !ПОЛЕ:значение (имена полей ответа заглавными буквами)
+ !tables << хеш их ПОЛЕ->table � един�твенным �толбцом "value".
+ в таких таблицах можно брать повтор�ющие�� заголовки. например, не�колько set-cookies
+ todo:�делать отдельный cookies
+
+!�и�темные типы ошибок:
+ !parser.compile ^test[} компил�ци� (непарна� �кобка, ...)
+ !parser.runtime ^if(0). параметры (больше/меньше, чем нужно, не тех типов, ...)
!number.zerodivision ^eval(1/0) ^eval(1%0)
!number.format ^eval(abc*5)
!file.lock shared/exclusive lock error
!file.missing ^file:delete[delme] not found
!file.access ^table::load[.] no rights
+ !file.read ^file::load[...] error while reading file
!file.seek seek failed
+ !file.execute ^file::cgi[...] incorrect cgi header/can't execute
!image.format ^image::measure[index.html] not gif/jpg
!sql.connect ^connect[mysql://baduser:pass@host/db]{} not found/timeout
!sql.execute ^void:sql{select bad} syntax error
@@ -973,8 +1268,14 @@ xdoc(xnode)
!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) òî âìåñòî îáû÷íîãî âûâîäà ñòðàíèöû áóäåò
- âûäàí ñïèñîê ôðàãìåíòîâ ðåçóëüòàòà ñ óêàçàíèåì èõ ïðîèñõîæäåíèÿ