--- parser3/operators.ru.txt 2003/11/24 12:04:58 1.142
+++ parser3/operators.ru.txt 2007/08/20 14:07:15 1.198
@@ -50,11 +50,14 @@ Xне сделано, видимо, не будет сделано
%left '-' '+'
%left '*' '/' '%' '\\'
%left NEG /* negation: unary - */
+ !литералы
+ true
+ false
!^if(условие){когда да}{когда нет}
!^switch[значение]{^case[вариант1[;вариант2...]]{действие}^case[DEFAULT]{действие по умолчанию}}
- !^while(условие){тело}
+ !^while(условие){тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}]
!^for[i](0;4){тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}]
!^use[модуль]
!^try{
@@ -76,7 +79,7 @@ Xне сделано, видимо, не будет сделано
$exception.source = вася
$exception.comment = болван
}
- ^case[_default]{
+ ^case[DEFAULT]{
код, обрабатывающий другую ошибку
^throw[$exception] << re-throw
}
@@ -86,17 +89,22 @@ Xне сделано, видимо, не будет сделано
удобно сделать после выставления 401 ошибки
^return[результат] + - отваливает из выполнения метода,
выдавая нестандартный результат
- X^break[] + - обрывает цикл
- X^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|http-header|mail-header|uri|sql|js|xml|html|optimized-html|regex]]{код}
default as-is
!^taint[[lang]][код]
default "just tainted, language unknown"
- !^process[[$caller.CLASS|$object|$КЛАСС:CLASS]]{строка, которая будет process-ed, как код}[во что переименовать @main]
+ !^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&
@@ -105,8 +113,9 @@ Xне сделано, видимо, не будет сделано
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&
@@ -119,17 +128,22 @@ 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://database
- для работы connect нужно, чтобы заранее(рекомендуется в системном parser3)
+ для работы connect нужно, чтобы заранее(рекомендуется в системном конфигурационном auto.p)
была определена таблица
#sql drivers
$SQL[
- $.drivers[^table::set{protocol driver client
+ $.drivers[^table::create{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
+sqlite /www/parser3/libparser3sqlite.so /usr/local/sqlite/lib/sqlite3.so
odbc c:\drives\y\parser3project\odbc\debug\parser3odbc.dll
}]
]
@@ -156,16 +170,18 @@ 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(секунд)
!^cache[expires date]
!сигнализирует вышестоящему ^cache "уменьши до стольких-то 'секунд'/'expires'"
!в пределе: ^cache(0) отменить кэширование
+ !^cache[] выдаёт текущую expires date
X^cache[read]
- сигнализирует вышестоящему ^cache "взять скэшированное насильно, игнорируя expires",
+ сигнализирует вышестоящему ^cache "взять скэшированное насильно, игнорируя expires",
выдаёт bool "получилось/нет"
+ !^sleep(seconds)
Xесть глобальный флажок в свойствах/командной строке "не оптимизировать"
@@ -182,7 +198,7 @@ odbc c:\drives\y\parser3project\odbc\
!есть глобальная строка/таблица $MAIN:CLASS_PATH с путём/путями к каталогу с классами.
!корень путя/путей считается от корня веб пространства.
!2. ...относительно строчки из table $MAIN:CLASS_PATH, снизу вверх
- задавайте её в parser3.conf вашего сайта
+ задавайте её в конфигурационном auto.p вашего сайта
!глобальная табличка $CHARSETS[$.название[имя файла]]
!задаёт какие буквы считаются какими(whitespace, letter, etc), а также их unicode
@@ -203,6 +219,7 @@ odbc c:\drives\y\parser3project\odbc\
!$имя whitespace или ${имя}неважно подстановка значения
!^имя параметры вызов
!$имя.CLASS класс значения
+ !$имя.CLASS_NAME имя класса
!$имя[$.key[] () {}] конструктор элемента переменной-хэша $имя.key
!^method[$.key[] () {}] конструктор элемента параметра-хеша $parameter.key
$CLASS.имя обращение к переменной класса
@@ -234,22 +251,32 @@ odbc c:\drives\y\parser3project\odbc\
0
!^имя.pos[...]
-1
+ !^имя.left(n)
+ ничего не выдаёт
+ !^имя.right(n)
+ ничего не выдаёт
+ !^имя.mid(p[;n])
+ ничего не выдаёт
!^имя.int[] (default)
0 или default
!^имя.double[] (default)
0 или default
- !^void:sql{запрос без результата}
+ !^имя.bool[] (default)
+ false или default
+ !^void:sql{запрос без результата}{$.bind[см. table::sql]}
+
!int,double
!^имя.int[] целочисленное значение
!^имя.double[]+ double значение
+ !^имя.bool[] + .bool(true|false) bool значение
!^имя.inc(на сколько +)
!^имя.dec(на сколько -)
!^имя.mul(на сколько *)
!^имя.div(на сколько /)
!^имя.mod(на сколько %)
!^имя.format[формат]
- !^int/double:sql{query}[[$.limit(2) $.offset(4) $.default{0}]]
+ !^int/double:sql{query}[[$.limit(2) $.offset(4) $.default{0} $.bind[см. table::sql]]]
запрос, результат которого должен быть один столбец/одна строка
!string
@@ -261,13 +288,14 @@ odbc c:\drives\y\parser3project\odbc\
пример:
^if(def $form:name) не пуста?
^if($user.isAlive) истина? [автопреобразование к числу, не ноль?]
- !^string::sql{query}[[$.limit(1) $.offset(4) $.default{n/a}]]
+ !^string::sql{query}[[$.limit(1) $.offset(4) $.default{n/a} $.bind[см. table::sql]]]
результат запроса должен быть один столбец/одна строка
- !^имя.int[] .int(default) целочисленное значение строки.
+ !^строка.int[] .int(default) целочисленное значение строки.
если ломается преобразование, берётся default
- !^имя.double[]+ .double(default) double значение строки
+ !^строка.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
@@ -276,13 +304,14 @@ odbc c:\drives\y\parser3project\odbc\
m multiline = $ считается концом строки[\n], не концом всего текста
g найти все вхождения, а не одно
' создавать столбцы prematch, match, postmatch
+ n вернуть цисло с количеством найденных совпадений, а не таблицу с результатами
!^строка.match[шаблон][опции поиска]{замена}
опции поиска+=
g заменить все вхождения, а не одно
!^строка.split[разделитель][[lrhv]]
l слева направо [default]
r справа налево
- h nameless таблица
+ h nameless таблица с ключами 0, 1, 2, ...
v таблица из столбца piece [default]
!^строка.{l|r}split[разделитель] таблица из столбца $piece
оставлен для совместимости
@@ -300,6 +329,11 @@ odbc c:\drives\y\parser3project\odbc\
!^строка.normalize[] выдает другую строку, в которой фрагменты на одном языке объединены
полезно делать перед сложными match операциями, если вы знаете, что входная строка
состоит из большого числа фрагментов
+ !^строка.trim[start|both|end[;chars]] выкидывает chars из начала/конца/и начала и конца
+ default 'chars' -- whitespace chars
+ !^строка.append[string]
+ !^строка.base64[] encode
+ !^string:base64[encoded] decode
!table
в выражении
@@ -314,12 +348,17 @@ odbc c:\drives\y\parser3project\odbc\
!пустые строки, и строки в первой колонке содержащие '#', игнорируются
!$.separator[^#09]
!$.encloser["] по-умолчанию, нет.
- !^table::sql{query}[[$.limit(2) $.offset(4) todo:$.default{ ^table::create[...] }]]
+ !^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[[whence]](5) сдвигает; без параметра - печатает offset
+ !^таблица.menu{тело}[[разделитель]]
+ !^таблица.offset[] печатает offset
+ !^таблица.offset[[whence]](5) сдвигает
!whence=cur|set
!без whence - это cur
!^таблица.count[]
@@ -331,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)]]
@@ -353,49 +392,54 @@ 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]
- !^hashfile.clear[] забыть всё
- !.ключ[значение] положить значение
- !.ключ[$.value[значение] $.expires ЗНАЧЕНИЕ}
+ !^хешфайл.clear[] забыть всё
+ !$хешфайл.ключ[значение] положить значение
+ !$хешфайл.ключ[$.value[значение] $.expires[ЗНАЧЕНИЕ]}
положить значение до expires
значение поля expires может быть date, или число дней(0дней=на вечно)
- !.ключ достать
- !^delete[ключ] удалить ключ
- !^delete[] удалить файлы, содержащие данные
- !^hash[]
+ !$хешфайл.ключ достать
+ !^хешфайл.delete[ключ] удалить ключ
+ !^хешфайл.delete[] удалить файлы, содержащие данные
+ !^хешфайл.hash[]
преобразовать в обычный hash
попутно стирает устаревшие пары
- !^foreach[key|value]{тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}]
+ !^хешфайл.foreach[key;value]{тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}]
+ !^хешфайл.release[]
+ записать данные и снять блокировки.
+ при повторном обращении к элементам откроется автоматически.
+ !^хешфайл.cleanup[] пробежаться по всем элементам и удалить устаревшие.
пример:
- $uids[^hashfile::open[/db/uids]]
-
- $random[23847387taduigh345XGHWElxjgdjg]
- $uids.$random[$.value[$uid] $.expires(1)]
- $uid[$persistent.logins.$random]
+ $sessions[^hashfile::open[/db/sessions]]
+
+ $sid[^math:uuid[]]
+ $sessions.$sid[$.value[$uid] $.expires(1)]
+ $uid[$sessions.$sid]
!form
[берётся первый элемент из одноимённых из GET, потом первый из POST]
@@ -404,18 +448,22 @@ odbc c:\drives\y\parser3project\odbc\
!$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:PARSER то же самое, что показывается при запуске parser.cgi
!cookie
!$cookie:имя считать старое или свежезаданное
!$cookie:имя[значение] на 90 дней
- !$cookie:имя[$.value[значение] $.expires ЗНАЧЕНИЕ ]
+ !$cookie:имя[$.value[значение] $.expires[ЗНАЧЕНИЕ] $.secure(true)]
!значение поля expires может быть 'session', date, или число дней(0дней=session)
! если дата, она будет преобразована к формату "Sun, 25-Aug-2002 12:03:45 GMT"
+ ! можно устанавливать bool свойства, например $.secure(true), $.httponly(true)
+
!request
!$request:query
@@ -441,6 +489,7 @@ odbc c:\drives\y\parser3project\odbc\
! $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
@@ -530,8 +579,8 @@ odbc c:\drives\y\parser3project\odbc\
!если body указан hash, то это части, будут собраны текстовые блоки, затем вложения
!это старый формат, поддерживается для обратной совместимости
!если имя части начинается со слова text, то это текстовый блок.
- !если имя части начинается со слова attach, то это вложение, формат задания::
- !$attach[$.format[!uue|Xbase64] $.value[DATA] $.file-name[user-file-name]]
+ !если имя части начинается со слова file, то это вложение, формат задания::
+ !$file[$.format[!uue|!base64] $.value[DATA] $.name[user-file-name]]
!важно: при multipart не указывать content-type
^mail:send[
# по-умолчанию, совпадает с source encoding.
@@ -559,13 +608,14 @@ odbc c:\drives\y\parser3project\odbc\
$.body[слова]
]
#для удобства скриптования можно указать только одну часть, при этом не будет multipart
- $.attach[
+ $.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]
]
]
]
@@ -583,7 +633,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,
@@ -624,6 +674,8 @@ odbc c:\drives\y\parser3project\odbc\
определяющее прожорливость выделялки цветов из палитры [default=150]
меньше - точнее приближает цвета, но они быстро кончаются
больше - неточно приближает цвет, но бОльшей части хватит
+ !^картинка.pixel(x;y)[(color)]
+ узнать или задать цвет пиксела
!file
!$файл_из_post.name
@@ -634,6 +686,7 @@ odbc c:\drives\y\parser3project\odbc\
!^file:find[имя файла][{когда не нашли}]
!^file:list[путь[;шаблон]] = table с колонкой name
!^file::load[text|binary;!big.zip[;!domain_press_release_2001_03_01.zip][;опции]]
+ !^file::create[text;имя;^untaint[xml]{data}]
!$файл_который_был_loaded.size
!^file::stat[имя файла]
!$файл_который_был_stated.size !.adate !.mdate !.cdate
@@ -648,6 +701,8 @@ odbc c:\drives\y\parser3project\odbc\
можно переименовывать и двигать каталоги[win32: но не через границу дисков]
каталоги для dest создаются с правами 775
каталог старого файла стирается, если после move он остаётся пуст
+ !^file:copy[имя файла;имя копии файла]
+ можно копировать только файлы
!^file:lock[имя файла]{код}
файл при необходимости создаётся
блокируется
@@ -660,7 +715,28 @@ 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
-
+ !^файл.sql-string[] внутри ^connect даст правильно escaped строку, которую можно в запрос отдать
+ X^file::sql[[имя_файла_для_download]]{}
+ !^file::sql{}[[
+ $.name[имя_файла_для_download]
+ $.content-type[пользовательский content-type]
+ ]]
+ результат запроса должен быть "одна строка".
+ колонки:
+ первая колонка - данные
+ если есть вторая - это имя файла
+ если есть третья - это content-type
+ !^файл.base64[] encode
+ !^file:base64[имя файла] encode
+ !^file::base64[encoded string] decode
+ !^file:crc32[имя файла]
+ вычисляет crc32 файла с указанным именем
+ !^файл.crc32[]
+ вычисляет crc32 объекта
+ !^файл.md5[]
+ !^file:md5[имя файла]
+ выдает digest файла, длиной 16 байт в виде строки,
+ где байты digest выданы в hex виде, впритык, в нижнем регистре
!math
!$math:PI
@@ -689,6 +765,10 @@ odbc c:\drives\y\parser3project\odbc\
если нет тела salt, оно создаётся случайным
$1$ вызывает MD5 алгоритм функции OS 'crypt', если поддерживается [заведомо нет на solaris].
другие salt читайте документацию по функции OS 'crypt'.
+ !^math:crc32[string]
+ вычисляет crc32 строки
+ !^math:sha1[string]
+ !^math:long2ip(long)
!date
!время типа time можно использовать в выражениях, подставляет
@@ -706,20 +786,22 @@ 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
+ !^дата.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
+ !^дата.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, 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
@@ -749,6 +831,7 @@ 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
для каталогов конечный / обязателен
!::load[file.xml[;опции]]
@@ -778,6 +861,11 @@ xdoc(xnode)
выдаёт media-type при подстановке $response:body[сюда]
+ !если на документ ссылаются так:
+ parser://method/param/to/that/method
+ то в качестве документа используется ^MAIN:method[/param/to/that/method]
+ [примечание: в параметр всегда приходит лидирующая /, даже, если параметров вообще не было]
+
!xnode
DOM1 attributes:
!$node.nodeName
@@ -853,7 +941,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,
@@ -922,11 +1011,6 @@ xdoc(xnode)
file time
file time
file time
- !$status:charset hash
- !cache table
- file
- file
- file
!$status:rusage hash
!utime user time used
@@ -953,17 +1037,27 @@ xdoc(xnode)
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
+DATA::=string | file | hash
+
+!hash вида
+[
+ $.file[имя файла на диске]
+ $.name[имя файла для пользователя]
+ $.mdate[date]
+]
!MAIN
- это класс, загружаемый на автомате из parser3.conf,
+ это класс, загружаемый на автомате из конфигурационного auto.p,
кучи auto.p и запрашиваемого документа:
- !parser3.conf
+ !конфигурационный auto.p
cgi:
1. или полный путь из переменной окружения CGI_PARSER_SITE_CONFIG
или рядом с бинарником parser'а
@@ -975,7 +1069,7 @@ console
имя последнего загруженного MAIN, имён у предыдущих нет
!после загрузки MAIN класса вызывается его @main[]
- !результат которого передаётся в его @post-process[data] if($data is string) ...
+ !результат которого передаётся в его @postprocess[data] if($data is string) ...
!результат которого отдаётся пользователю
!если встречается ошибка и try не задан, её можно красиво сообщить пользователю,
@@ -990,18 +1084,28 @@ console
операторов/методов, приведших к ошибке.
!при загрузке файла (file::load, table::load, xdoc::load) можно указать такое имя файла:
- !http://domain/document?params
+ !http://domain/document[?params<> создает http.status ошибку,
!это можно отключить, передав
!$.any-status(1)
!$.charset[кодировка удалённых докуметов по-умолчанию] << если сервер вернёт content-type:charset=ОНА_ПЕРЕБИВАЕТ
+ !$.user[пользователь]
+ !$.password[пароль]
!file::load в дополнительные поля записывает
!ПОЛЕ:значение (имена полей ответа заглавными буквами)
!tables << хеш их ПОЛЕ->table с единственным столбцом "value".
@@ -1037,5 +1141,15 @@ console
!нужно выключить русский apache: CharsetDisable on
-!если в MAIN будет определён флаг $ORIGINS(1) то вместо обычного вывода страницы будет
+Xесли в MAIN будет определён флаг $ORIGINS(1) то вместо обычного вывода страницы будет
выдан список фрагментов результата с указанием их происхождения
+
+!если в MAIN определён $SIGPIPE(1) то в случае, если обработка была прервана пользователем, сообщение
+ об этом будет записано в parser3.log (раньше оно всегда писалось)
+
+!если описание метода содержит локальную переменную result в явном виде
+ (есть и неявная переменная)
+ то код вывода строковых литералов не попадает в конечный байт-код,
+ а непробельные символы считаются синтаксической ошибкой
+ для вывода чего бы то ни было надо пользоваться этой переменной
+