--- parser3/operators.txt 2007/04/20 10:30:34 1.193 +++ parser3/operators.txt 2008/04/07 15:11:22 1.206 @@ -79,7 +79,7 @@ Xне сделано, видимо, не будет сделано $exception.source = вася $exception.comment = болван } - ^case[_default]{ + ^case[DEFAULT]{ код, обрабатывающий другую ошибку ^throw[$exception] << re-throw } @@ -91,7 +91,7 @@ Xне сделано, видимо, не будет сделано выдавая нестандартный результат !^break[] + - обрывает цикл !^continue[] + - обрывает итерацию цикла - !^untaint[[as-is|file-spec|http-header|mail-header|uri|sql|js|xml|html|optimized-html]]{код} + !^untaint[[as-is|file-spec|http-header|mail-header|uri|sql|js|xml|html|optimized-html|regex]]{код} default as-is !^taint[[lang]][код] default "just tainted, language unknown" @@ -135,7 +135,7 @@ Xне сделано, видимо, не будет сделано !sqlite://database - для работы connect нужно, чтобы заранее(рекомендуется в системном parser3) + для работы connect нужно, чтобы заранее(рекомендуется в системном конфигурационном auto.p) была определена таблица #sql drivers $SQL[ @@ -170,7 +170,7 @@ odbc c:\drives\y\parser3project\odbc\ !скэшировать строку, которая получается при выполнении кода на 'секунд' секунд !если 0секунд, значит не кэшировать, а старый такой стереть !в catch коде $exception.handled[cache] ^rem{флаг, что exception обработан} - !^cache[файл][expires date]{код} + !^cache[файл][expires date]{код}[{catch код}] !абсолютное задание времени X^cache[файл] удалить файл [не ругает, если его нет] // такое было, больше не будет, делать ^cache(0) !^cache(секунд) @@ -179,7 +179,7 @@ odbc c:\drives\y\parser3project\odbc\ !в пределе: ^cache(0) отменить кэширование !^cache[] выдаёт текущую expires date X^cache[read] - сигнализирует вышестоящему ^cache "взять скэшированное насильно, игнорируя expires",
+ сигнализирует вышестоящему ^cache "взять скэшированное насильно, игнорируя expires", выдаёт bool "получилось/нет" !^sleep(seconds) @@ -251,17 +251,18 @@ odbc c:\drives\y\parser3project\odbc\ 0 !^имя.pos[...] -1 - !^void.left(n) + !^имя.left(n) ничего не выдаёт - !^void.right(n) + !^имя.right(n) ничего не выдаёт - !^void.mid(p[;n]) + !^имя.mid(p[;n]) ничего не выдаёт !^имя.int[] (default) 0 или default !^имя.double[] (default) 0 или default - !^имя.bool[] + .bool(true|false) bool значение + !^имя.bool[] (default) + false или default !^void:sql{запрос без результата}{$.bind[см. table::sql]} @@ -289,12 +290,12 @@ odbc c:\drives\y\parser3project\odbc\ ^if($user.isAlive) истина? [автопреобразование к числу, не ноль?] !^string::sql{query}[[$.limit(1) $.offset(4) $.default{n/a} $.bind[см. table::sql]]] результат запроса должен быть один столбец/одна строка - !^имя.int[] .int(default) целочисленное значение строки. + !^строка.int[] .int(default) целочисленное значение строки. если ломается преобразование, берётся default - !^имя.double[]+ .double(default) double значение строки - !^имя.bool[] + .bool(default) bool значение строки + !^строка.double[]+ .double(default) double значение строки + !^строка.bool[] + .bool(default) bool значение строки если ломается преобразование, берётся default - !^имя.format[формат] %d %.2f %02d... + !^строка.format[формат] %d %.2f %02d... !^строка.match[шаблон][[опции поиска]] $prematch $match $postmatch $1 $2... опции поиска= i CASELESS @@ -303,15 +304,15 @@ odbc c:\drives\y\parser3project\odbc\ m multiline = $ считается концом строки[\n], не концом всего текста g найти все вхождения, а не одно ' создавать столбцы prematch, match, postmatch - n вернуть цисло с количеством найденных совпадений, а не таблицу с резальтатами + n вернуть цисло с количеством найденных совпадений, а не таблицу с результатами !^строка.match[шаблон][опции поиска]{замена} опции поиска+= g заменить все вхождения, а не одно - !^строка.split[разделитель][[lrhv]] + !^строка.split[разделитель][[lrhv]][[название столбца для вертикального разбиения]] l слева направо [default] r справа налево - h nameless таблица - v таблица из столбца piece [default] + h nameless таблица с ключами 0, 1, 2, ... + v таблица из 1 столбца 'piece' или как передадут [default] !^строка.{l|r}split[разделитель] таблица из столбца $piece оставлен для совместимости !^строка.upper|lower[] @@ -328,17 +329,17 @@ odbc c:\drives\y\parser3project\odbc\ !^строка.normalize[] выдает другую строку, в которой фрагменты на одном языке объединены полезно делать перед сложными match операциями, если вы знаете, что входная строка состоит из большого числа фрагментов - !^string.trim[start|both|end[;chars]] выкидывает charset из начала/конца/и начала и конца + !^строка.trim[start|both|end[;chars]] выкидывает chars из начала/конца/и начала и конца default 'chars' -- whitespace chars - !^string.append[string] - !^string.base64[] encode + !^строка.append[string] + !^строка.base64[] encode !^string:base64[encoded] decode !table в выражении логическое значение равно "не пуста?" числовое значение равно count[] - !^table::create[[nameless]]{данные} старое имя "set" + !^table::create[[nameless]]{данные}[[$.separator[^#09]]] старое имя "set" !^table::create[table][[$.limit(1) $.offset(5) $.offset[cur] $.reverse(1)]] клонирует таблицу reverse << сзаду на перёд (работает пока только в locate, в table::create НЕ работает) @@ -355,8 +356,9 @@ odbc c:\drives\y\parser3project\odbc\ !^таблица.save[[nameless|append;]путь[;опции, см. load]] !$таблица.поле !$таблица.fields из named таблицы выдаёт текущую запись как Hash - !^таблица.menu{тело}[разделитель] - !^таблица.offset[[whence]](5) сдвигает; без параметра - печатает offset + !^таблица.menu{тело}[[разделитель]] + !^таблица.offset[] печатает offset + !^таблица.offset[[whence]](5) сдвигает !whence=cur|set !без whence - это cur !^таблица.count[] @@ -368,7 +370,7 @@ odbc c:\drives\y\parser3project\odbc\ X^таблица.remove(position[;count]) - стирает запись из текущей позиции [стирает запись из конкретной позиции] [стирает count записей] - !^таблица.join[таблица][$.limit(1) $.offset(5) $.offset[cur]] - добавляет записи из таблицы. + !^таблица.join[таблица][$.limit(1) $.offset(5) $.offset[cur]] - добавляет записи из таблицы. таблицы должны иметь одинаковую структуру. !^таблица.flip[] выдаёт транспонированную, надо куда-то сложить, потом пользовать !^таблица.locate[поле;значение][[$.limit(1) $.offset(5) $.offset[cur] $.reverse(1)]] @@ -380,7 +382,7 @@ odbc c:\drives\y\parser3project\odbc\ поля значений могут быть не указаны, тогда ими будут все столбцы, включая ключевой если distinct содержит true, то не будет ошибки при повторяющихся ключах если distinct содержит tables, то будет создан hash из таблиц, содержащих строки с ключом - !^таблица.columns[]+ таблица из одного столбца $column + !^таблица.columns[[название столбца]]+ таблица из одного столбца 'column' или как передадут !$отобранное[^таблица.select(выражение)] = таблица из тех же столбцов и строк, у которых условие совпало $adults[^man.select($man.age>=18)] ^таблица.color[цвет1;цвет2] @@ -390,33 +392,34 @@ odbc c:\drives\y\parser3project\odbc\ !в выражении !логическое значение равно "не пуста?" !числовое значение равно _count[] - !$hash.ключ + !$хеш.ключ !_default - специальный ключ, если задан, то при обращении по ключу, которому нет соответствия, выдаётся _default значение - !$hash.fields выдает $hash. чтобы класс hash был чуть больше похож на класс table + !$хеш.fields выдает $hash. чтобы класс hash был чуть больше похож на класс table !^hash::create[[!copy_from_hash|copy_from_hashfile]] создаёт новый hash, копию старого - !^hash.add[слагаемое] + !^хеш.add[слагаемое] перезаписывает одноимённые - !^hash.sub[вычитаемое] - !^a.union[b] = объединение + !^хеш.sub[вычитаемое] + !^хеш.union[b] = объединение одноимённые остаются - !^a.intersection[b] = пересечение - значения a - !^a.intersects[b] = bool + !^хеш.intersection[b] = пересечение + значения хеш + !^хеш.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[ключ] удалить ключ + !^хеш._keys[[название колонки с ключами]]+ таблица из одного столбца $key или как передадут + !^хеш._count[] + !^хеш.foreach[key;value]{тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}] + !^хеш.delete[ключ] удалить ключ + !^хеш.contain[ключ] - существует ли в хеше ключ (bool) !hashfile !^hashfile::open[filename] !^хешфайл.clear[] забыть всё !$хешфайл.ключ[значение] положить значение - !$хешфайл.ключ[$.value[значение] $.expires ЗНАЧЕНИЕ} + !$хешфайл.ключ[$.value[значение] $.expires[ЗНАЧЕНИЕ]} положить значение до expires значение поля expires может быть date, или число дней(0дней=на вечно) !$хешфайл.ключ достать @@ -451,7 +454,7 @@ odbc c:\drives\y\parser3project\odbc\ !env !$env:переменная - !$env:PARSER было то же самое, что показывается при запуске parser.cgi + !$env:PARSER то же самое, что показывается при запуске parser.cgi !cookie !$cookie:имя считать старое или свежезаданное @@ -460,6 +463,7 @@ odbc c:\drives\y\parser3project\odbc\ !значение поля expires может быть 'session', date, или число дней(0дней=session) ! если дата, она будет преобразована к формату "Sun, 25-Aug-2002 12:03:45 GMT" ! можно устанавливать bool свойства, например $.secure(true), $.httponly(true) + !$cookie:fields = hash со всеми cookies !request @@ -469,6 +473,7 @@ odbc c:\drives\y\parser3project\odbc\ !$request:document-root каталог, относительно которого считаются пути в parser, по-умолчанию = $env:DOCUMENT_ROOT можно изменить, если на hosting что-то неудобно настроено + !$request:argv = hash с параметрами коммандной строки. ключи 0, 1, ... [0 -- имя обрабатываемого файла]. X!$request:browser это hash, поля: !$type = ie/nn и !$version = номер, скажем 5.5 X$request:user @@ -630,7 +635,7 @@ odbc c:\drives\y\parser3project\odbc\ !$картинка[^image::measure[DATA]] смотрит на .ext case insensitive, умеет мерить пока только .gif и .jpg .jpeg - !$image.exif << hash после measure jpeg с exif информацией + !$картинка.exif << hash после measure jpeg с exif информацией !$image.exif.DateTime & co [полный список см. http://www.ba.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html] !числа типа int/double, @@ -687,11 +692,11 @@ odbc c:\drives\y\parser3project\odbc\ !$файл_который_был_loaded.size !^file::stat[имя файла] !$файл_который_был_stated.size !.adate !.mdate !.cdate - !^file::cgi[имя файла[;env hash +options[;1cmd[;2line[;3ar[;4g[;5s]]]]]]] + !^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 win32 max 10 args]]]]]]] options: $.stdin[текст] если текст пуст, отключается автоматическое пересовывание данных HTTP-POST !^file:move[старое имя файла;новое имя файла] @@ -712,7 +717,7 @@ odbc c:\drives\y\parser3project\odbc\ !^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 строку, которую можно в запрос отдать + !^файл.sql-string[] внутри ^connect даст правильно escaped строку, которую можно в запрос отдать X^file::sql[[имя_файла_для_download]]{} !^file::sql{}[[ $.name[имя_файла_для_download] @@ -723,14 +728,14 @@ odbc c:\drives\y\parser3project\odbc\ первая колонка - данные если есть вторая - это имя файла если есть третья - это content-type - !^file.base64[] encode + !^файл.base64[] encode !^file:base64[имя файла] encode !^file::base64[encoded string] decode !^file:crc32[имя файла] вычисляет crc32 файла с указанным именем - !^file.crc32[] + !^файл.crc32[] вычисляет crc32 объекта - !^file.md5[] + !^файл.md5[] !^file:md5[имя файла] выдает digest файла, длиной 16 байт в виде строки, где байты digest выданы в hex виде, впритык, в нижнем регистре @@ -764,6 +769,8 @@ odbc c:\drives\y\parser3project\odbc\ другие salt читайте документацию по функции OS 'crypt'. !^math:crc32[string] вычисляет crc32 строки + !^math:sha1[string] + !^math:long2ip(long) !date !время типа time можно использовать в выражениях, подставляет @@ -781,19 +788,23 @@ odbc c:\drives\y\parser3project\odbc\ формат1: %Y[-%m[-%d[ %H[:%M[:%S]]]]] формат2: %H:%M[:%S] !^date::unix-timestamp() - !^date.unix-timestamp[] - !$date.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="" << локальная зона - !^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;год;месяц] выдаёт неименованную таблицу + !^дата.roll[year|month|day](+-смещение) сдвигает дату + !^дата.roll[TZ;Новая зона] говорит, что дата в таком-то часовом поясе: влияет на .hour & Co + !^дата.sql-string[] %Y-%m-%d %H:%M:%S + where published='^дата.sql-string[]' + !^date:calendar[rus|eng](год;месяц) выдаёт неименованную таблицу столбцы: 0..6, week, year - !^date:calendar[rus|eng;год;месяц;день] выдаёт именнованную таблицу + !^date:calendar[rus|eng](год;месяц;день) выдаёт именнованную таблицу столбцы: year, month, day, weekday - + !^date:last-day(год;месяц) вернёт последний день месяца + !^дата.last-day[] вернёт последний день месяца $дата + !^дата.gmt-string[] Fri, 23 Mar 2001 09:32:23 GMT + + xdoc(xnode) !$xdoc.search-namespaces hash, where keys=prefixes, values=urls @@ -826,9 +837,11 @@ xdoc(xnode) ::sql{...} !::create[[URI]]{} старое имя 'set' !::create[[URI]][qualifiedName] - !::create[file] can be usable: $f[^file::load[binary;http://;some http options here...]]$x[^xdoc::create[$f]] 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 шаблон кэшируется, кэш обновляется при изменении даты файла шаблона, @@ -888,6 +901,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 @@ -936,7 +951,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, @@ -1082,8 +1098,11 @@ DATA::=string | file | hash !а также, возможно, указать опции: !$.method[GET|POST|HEAD] !$.timeout(3) << в секундах, по-умолчанию =2 + !$.cookies[ + $.имя[значение] + ] !$.headers[ - ! $поле[значение] << значение имеет формат, как $response:ЗАГОЛОВОК + ! $.поле[значение] << значение имеет формат, как $response:ЗАГОЛОВОК !] $.enctype[multipart/form-data] $.form[ @@ -1138,6 +1157,9 @@ DATA::=string | file | hash Xесли в MAIN будет определён флаг $ORIGINS(1) то вместо обычного вывода страницы будет выдан список фрагментов результата с указанием их происхождения +!если в MAIN определён $SIGPIPE(1) то в случае, если обработка была прервана пользователем, сообщение + об этом будет записано в parser3.log (раньше оно всегда писалось) + !если описание метода содержит локальную переменную result в явном виде (есть и неявная переменная) то код вывода строковых литералов не попадает в конечный байт-код,