--- parser3/operators.ru.txt 2003/04/15 14:30:14 1.114 +++ parser3/operators.ru.txt 2004/04/06 07:50:33 1.171 @@ -86,24 +86,33 @@ Xне сделано, видимо, не будет сделано удобно сделать после выставления 401 ошибки ^return[результат] + - отваливает из выполнения метода, выдавая нестандартный результат - ^break[] + - обрывает цикл - ^continue[] + - обрывает итерацию цикла + X^break[] + - обрывает цикл + X^continue[] + - обрывает итерацию цикла !^untaint[[as-is|file-spec|http-header|mail-header|uri|table|sql|js|xml|html|optimized-html]]{код} default as-is !^taint[[lang]][код] default "just tainted, language unknown" - !^process[[$caller.CLASS|$object|$КЛАСС:CLASS]]{строка, которая будет process-ed, как код} + !^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? + ClientCharset=parser-charset << charset in which parser thinks client works charset=cp1251_koi8& timeout=3& compress=1& - named_pipe=1 + named_pipe=1& + 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,8 +125,10 @@ 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 для работы connect нужно, чтобы заранее(рекомендуется в системном parser3) была определена таблица @@ -148,10 +159,11 @@ odbc c:\drives\y\parser3project\odbc\ ставить такой префикс перед открывающим апострофом, впритык, везде без проблелов /**имя_поля**/'literal' !^rem{} - !^cache[файл](секунд){код} + !^cache[файл](секунд){код}[{catch код}] !относительное задание времени !скэшировать строку, которая получается при выполнении кода на 'секунд' секунд !если 0секунд, значит не кэшировать, а старый такой стереть + !в catch коде $exception.handled[cache] ^rem{флаг, что exception обработан} !^cache[файл][expires date]{код} !абсолютное задание времени X^cache[файл] удалить файл [не ругает, если его нет] // такое было, больше не будет, делать ^cache(0) @@ -230,12 +242,19 @@ odbc c:\drives\y\parser3project\odbc\ 0 !^имя.pos[...] -1 + !^void.left(n) + ничего не выдаёт + !^void.right(n) + ничего не выдаёт + !^void.mid(p[;n]) + ничего не выдаёт !^имя.int[] (default) 0 или default !^имя.double[] (default) 0 или default !^void:sql{запрос без результата} + !int,double !^имя.int[] целочисленное значение !^имя.double[]+ double значение @@ -271,6 +290,7 @@ odbc c:\drives\y\parser3project\odbc\ s singleline = $ считается концом всего текста m multiline = $ считается концом строки[\n], не концом всего текста g найти все вхождения, а не одно + ' создавать столбцы prematch, match, postmatch !^строка.match[шаблон][опции поиска]{замена} опции поиска+= g заменить все вхождения, а не одно @@ -295,6 +315,8 @@ odbc c:\drives\y\parser3project\odbc\ !^строка.normalize[] выдает другую строку, в которой фрагменты на одном языке объединены полезно делать перед сложными match операциями, если вы знаете, что входная строка состоит из большого числа фрагментов + !^string.trim[start|both|end[;chars]] выкидывает charset из начала/конца/и начала и конца + default 'chars' -- whitespace chars !table в выражении @@ -307,8 +329,10 @@ odbc c:\drives\y\parser3project\odbc\ !^table::load[[nameless;]путь[;опции]] !если не nameless, названия колонок берутся из первой строки !пустые строки, и строки в первой колонке содержащие '#', игнорируются + !$.separator[^#09] + !$.encloser["] по-умолчанию, нет. !^table::sql{query}[[$.limit(2) $.offset(4) todo:$.default{ ^table::create[...] }]] - !^таблица.save[[nameless|append;]путь] + !^таблица.save[[nameless|append;]путь[;опции, см. load]] !$таблица.поле !$таблица.fields из named таблицы выдаёт текущую запись как Hash !^таблица.menu{тело}[разделитель] @@ -350,7 +374,7 @@ odbc c:\drives\y\parser3project\odbc\ !_default - специальный ключ, если задан, то при обращении по ключу, которому нет соответствия, выдаётся _default значение !$hash.fields выдает $hash. чтобы класс hash был чуть больше похож на класс table - !^hash::create[[!copy_from_hash|Xcopy_from_hashfile]] + !^hash::create[[!copy_from_hash|copy_from_hashfile]] создаёт новый hash, копию старого !^hash.add[слагаемое] перезаписывает одноимённые @@ -363,11 +387,33 @@ odbc c:\drives\y\parser3project\odbc\ !^hash::sql{запрос}[[$.distinct(1) $.limit(2) $.offset(4) todo:$.default{$.field[]...}]] получается hash(ключи=значения первая колонка ответа) of hash(ключи=названия остальных колонкок ответа) - !^hash._keys[]+ таблица из одного столбца $key + !^hash._keys[[название колонки с ключами]]+ таблица из одного столбца $key или как передадут !^hash._count[] !^foreach[key;value]{тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}] !^delete[ключ] удалить ключ +!hashfile + !^hashfile::open[filename] + !^hashfile.clear[] забыть всё + !.ключ[значение] положить значение + !.ключ[$.value[значение] $.expires ЗНАЧЕНИЕ} + положить значение до expires + значение поля expires может быть date, или число дней(0дней=на вечно) + !.ключ достать + !^delete[ключ] удалить ключ + !^delete[] удалить файлы, содержащие данные + !^hash[] + преобразовать в обычный hash + попутно стирает устаревшие пары + !^foreach[key|value]{тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}] + + пример: + $sessions[^hashfile::open[/db/sessions]] + + $sid[^math:uuid[]] + $sessions.$sid[$.value[$uid] $.expires(1)] + $uid[$sessions.$sid] + !form [берётся первый элемент из одноимённых из GET, потом первый из POST] !$form:поле = string/file @@ -384,12 +430,17 @@ odbc c:\drives\y\parser3project\odbc\ !cookie !$cookie:имя считать старое или свежезаданное !$cookie:имя[значение] на 90 дней - !$cookie:имя[$.value[значение] $.expires(дней, 0дней=session)] + !$cookie:имя[$.value[значение] $.expires ЗНАЧЕНИЕ ] + !значение поля expires может быть 'session', date, или число дней(0дней=session) + ! если дата, она будет преобразована к формату "Sun, 25-Aug-2002 12:03:45 GMT" !request !$request:query !$request:body unprocessed POST request body !$request:uri + !$request:document-root + каталог, относительно которого считаются пути в parser, по-умолчанию = $env:DOCUMENT_ROOT + можно изменить, если на hosting что-то неудобно настроено X!$request:browser это hash, поля: !$type = ie/nn и !$version = номер, скажем 5.5 X$request:user @@ -421,36 +472,6 @@ odbc c:\drives\y\parser3project\odbc\ ПРЕДУПРЕЖДЕНИЕ: класс form получает свои поля после обработки всех auto класса MAIN поэтому необходимо задать $request/response:charset в одном из них. не после. -Xhashfile - !^hashfile::open[$DB_HOME;filename] - !^hashfile.clear[] - забыть всё - !.ключ[значение] положить значение навечно - !.ключ[$.value[значение] $.expires(секунд)} положить значение на expires секунд - !.ключ достать - !^cache[ключ](секунд){код} - !суть то же, что и "положить+достать", но за один раз и компактнее - !если 0секунд, значит не кэшировать, а старый такой стереть - !внутри {кода} может быть вызван ^delete[] - !^delete[[ключ]] удалить ключ - !буде вызван без параметра изнутри cache, отменяет кэширование блока: - !блок не будет скэширован, его старое значение будет стёрто - !^hash[] - преобразовать в обычный hash - !^foreach[key|value]{тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}] - - - примеры: - $uids[^hashfile::assign[/db/uids]] - $code:clear[/db/cache]] - $code[^hashfile::assign[/db/cache]] - - $random[23847387taduigh345XGHWElxjgdjg] - $uids.$random[$.value[$uid] $.expires(60*30)] - $uid[$persistent.logins.$random] - - ^code.cache[заголовки новостей](35){....} - !mail !$mail.received=MESSAGE: .from @@ -479,6 +500,10 @@ Xhashfile $.message#[MESSAGE] (message, message2, ...) !^mail:send[ + $.options[-odd] + unix: строка, которая будет добавлена к команде запуска sendmail + -odd означает "быстро поставь в очередь без проверки email" + win32: игнорируется $.charset[кодировка заголовка и текстовых блоков] $.any-header-field $.text[string] @@ -601,7 +626,8 @@ Xhashfile если указана ширина_символа, то monospaced, если 0, то ширина_символа = ширине gif !^картинка.text(x;y)[текст_надписи] AS_IS !^картинка.length[текст_надписи] AS_IS - !^картинка.gif[] -- кодирует в FILE с content-type=image/gif + !^картинка.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) @@ -615,6 +641,8 @@ Xhashfile определяющее прожорливость выделялки цветов из палитры [default=150] меньше - точнее приближает цвета, но они быстро кончаются больше - неточно приближает цвет, но бОльшей части хватит + !^картинка.pixel(x;y)[(color)] + узнать или задать цвет пиксела !file !$файл_из_post.name @@ -651,6 +679,13 @@ Xhashfile !^file:justname[/a/some.tar.gz]=some.tar !^file:justext[/a/some.tar.gz]=gz !/some/page.html: ^file:fullpath[a.gif] => /some/a.gif + !^file.sql-string[] внутри ^connect даст правильно escaped строку, которую можно в запрос отдать + !^file::sql[[имя_файла_для_download]]{} + результат запроса должен быть "одна строка". + колонки: + первая колонка - данные + если есть вторая - это имя файла + если есть третья - это content-type !math @@ -663,7 +698,7 @@ Xhashfile !^math:degrees radians !^math:pow sqrt !^math:random(ширина диапазона) - !^math:uuid + !^math:uuid[] 22C0983C-E26E-4169-BD07-77ECE9405BA5 win32: пользуется cryptapi unix: пользуется /dev/urandom, @@ -696,17 +731,23 @@ Xhashfile для удобного создания по значению из базы формат1: %Y[-%m[-%d[ %H[:%M[:%S]]]]] формат2: %H:%M[:%S] - !$date.year month day hour minute second weekday yearday(0...) daylightsaving + !^date::unix-timestamp() + !^date.unix-timestamp[] + !$date.year month day hour minute second weekday yearday(0...) daylightsaving TZ read-only + TZ="" << локальная зона !^date.roll[year|month|day](+-смещение) сдвигает дату + !^date.roll[TZ;Новая зона] говорит, что дата в таком-то часовом поясе: влияет на .hour&co !^date.sql-string[] %Y-%m-%d %H:%M:%S where published='$дата.sql-string[]' !^date:calendar[rus|eng;год;месяц] выдаёт неименованную таблицу - столбцы: 0..6, week, weekyear + столбцы: 0..6, week, year !^date:calendar[rus|eng;год;месяц;день] выдаёт именнованную таблицу столбцы: year, month, day, weekday xdoc(xnode) + !$xdoc.search-namespaces hash, where keys=prefixes, values=urls + DOM1 attributes: !readonly attribute DocumentType doctype Xreadonly attribute DOMImplementation implementation @@ -765,10 +806,17 @@ xdoc(xnode) выдаёт 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 @@ -884,6 +932,11 @@ xdoc(xnode) attribute that is already inuse elsewhere +!memory + !^memory:compact[] собрать мусор, освободив место под новые данные + (предупреждение: память процесса никогда не освобождается) + полезно делать перед XSL transform. + !status !чтобы класс был доступен, в apache нужно сказать @@ -902,11 +955,6 @@ xdoc(xnode) file time file time file time - !$status:charset hash - !cache table - file - file - file !$status:rusage hash !utime user time used @@ -920,6 +968,26 @@ xdoc(xnode) $s[$status:rusage] ^s.tv_sec.format[%.0f].^s.tv_usec.format[%06.0f] + !$status:memory hash + !used + Includes some pages that were allocated but never written. + + !free + + !ever_allocated_since_compact + Return the number of bytes allocated since the last collection. + + !ever_allocated_since_start + Return the total number of bytes [EVER(c)PAF] allocated in this process. + Never decreases. + + !$status:pid process id + !$status:tid thread id + +console + $console:timeout + !$console:line + read/write строку !DATA::=string | file @@ -953,18 +1021,33 @@ xdoc(xnode) операторов/методов, приведших к ошибке. !при загрузке файла (file::load, table::load, xdoc::load) можно указать такое имя файла: - !http://domain/document?params + !http://domain/document[?params<> создает http.status ошибку, !это можно отключить, передав !$.any-status(1) - !file::load в дополнительные поля записывает ПОЛЕ:значение (имена полей ответа заглавными буквами) + !$.charset[кодировка удалённых докуметов по-умолчанию] << если сервер вернёт content-type:charset=ОНА_ПЕРЕБИВАЕТ + !$.user[пользователь] + !$.password[пароль] + !file::load в дополнительные поля записывает + !ПОЛЕ:значение (имена полей ответа заглавными буквами) + !tables << хеш их ПОЛЕ->table с единственным столбцом "value". + в таких таблицах можно брать повторяющиеся заголовки. например, несколько set-cookies + todo:сделать отдельный cookies !системные типы ошибок: !parser.compile ^test[} компиляция (непарная скобка, ...) @@ -995,5 +1078,5 @@ xdoc(xnode) !нужно выключить русский apache: CharsetDisable on -!если в MAIN будет определён флаг $ORIGINS(1) то вместо обычного вывода страницы будет +Xесли в MAIN будет определён флаг $ORIGINS(1) то вместо обычного вывода страницы будет выдан список фрагментов результата с указанием их происхождения