Diff for /parser3/operators.ru.txt between versions 1.150 and 1.183

version 1.150, 2004/01/13 11:00:05 version 1.183, 2006/11/14 17:28:15
Line 50  Xне сделано, видимо, не будет сделано Line 50  Xне сделано, видимо, не будет сделано
            %left '-' '+'             %left '-' '+'
            %left '*' '/' '%' '\\'             %left '*' '/' '%' '\\'
            %left NEG     /* negation: unary - */             %left NEG     /* negation: unary - */
           !литералы
              true
              false
   
                         
     !^if(условие){когда да}{когда нет}      !^if(условие){когда да}{когда нет}
     !^switch[значение]{^case[вариант1[;вариант2...]]{действие}^case[DEFAULT]{действие по умолчанию}}      !^switch[значение]{^case[вариант1[;вариант2...]]{действие}^case[DEFAULT]{действие по умолчанию}}
     !^while(условие){тело}      !^while(условие){тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}]
     !^for[i](0;4){тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}]      !^for[i](0;4){тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}]
     !^use[модуль]      !^use[модуль]
     !^try{      !^try{
Line 86  Xне сделано, видимо, не будет сделано Line 89  Xне сделано, видимо, не будет сделано
         удобно сделать после выставления 401 ошибки          удобно сделать после выставления 401 ошибки
     ^return[результат] + - отваливает из выполнения метода,       ^return[результат] + - отваливает из выполнения метода, 
         выдавая нестандартный результат          выдавая нестандартный результат
     X^break[] + - обрывает цикл      !^break[] + - обрывает цикл
     X^continue[] + - обрывает итерацию цикла      !^continue[] + - обрывает итерацию цикла
     !^untaint[[as-is|file-spec|http-header|mail-header|uri|table|sql|js|xml|html|optimized-html]]{код}      !^untaint[[as-is|file-spec|http-header|mail-header|uri|sql|js|xml|html|optimized-html]]{код}
         default as-is          default as-is
     !^taint[[lang]][код]      !^taint[[lang]][код]
         default "just tainted, language unknown"          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]      !^process..[путь][во что переименовать @main]
       по умолчанию, методы компилируются в $self [в случае оператора, $self=$MAIN:CLASS]        по умолчанию, методы компилируются в $self [в случае оператора, $self=$MAIN:CLASS]
     !^connect[protocol://строка соединения]]{код с ^sql[...]-ями}      !^connect[protocol://строка соединения]]{код с ^sql[...]-ями}
         !mysql://user:pass@{host[:port]|[/unix/socket]}/database?          !mysql://user:pass@{host[:port]|[/unix/socket]}/database?
               ClientCharset=parser-charset << charset in which parser thinks client works
             charset=cp1251_koi8&              charset=cp1251_koi8&
             timeout=3&              timeout=3&
             compress=1&              compress=1&
Line 105  Xне сделано, видимо, не будет сделано Line 113  Xне сделано, видимо, не будет сделано
             autocommit если выставить в 0, будет делать commit/rollback              autocommit если выставить в 0, будет делать commit/rollback
   
         !pgsql://user:pass@{host[:port]|[local]}/database?          !pgsql://user:pass@{host[:port]|[local]}/database?
             client_encoding=win,[to-find-out]&              client_encoding=win,[to-find-out]
             datestyle=ISO,SQL,Postgres,European,NonEuropean=US,German,DEFAULT=ISO              &datestyle=ISO,SQL,Postgres,European,NonEuropean=US,German,DEFAULT=ISO
               &ClientCharset=parser-charset << charset in which parser thinks client works
                   
         !oracle://user:pass@service?          !oracle://user:pass@service?
             NLS_LANG=RUSSIAN_AMERICA.CL8MSWIN1251&              NLS_LANG=RUSSIAN_AMERICA.CL8MSWIN1251&
Line 121  Xне сделано, видимо, не будет сделано Line 130  Xне сделано, видимо, не будет сделано
             ORA_ENCRYPT_LOGIN=TRUE              ORA_ENCRYPT_LOGIN=TRUE
             ClientCharset=parser-charset << charset in which parser thinks client works              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)          для работы connect нужно, чтобы заранее(рекомендуется в системном parser3)
         была определена таблица          была определена таблица
Line 164  odbc    c:\drives\y\parser3project\odbc\ Line 174  odbc    c:\drives\y\parser3project\odbc\
     !^cache[expires date]      !^cache[expires date]
         !сигнализирует вышестоящему ^cache "уменьши до стольких-то 'секунд'/'expires'"          !сигнализирует вышестоящему ^cache "уменьши до стольких-то 'секунд'/'expires'"
         !в пределе: ^cache(0) отменить кэширование          !в пределе: ^cache(0) отменить кэширование
       !^cache[] выдаёт текущую expires date
     X^cache[read]       X^cache[read] 
         сигнализирует вышестоящему ^cache "взять скэшированное насильно, игнорируя expires", <br>          сигнализирует вышестоящему ^cache "взять скэшированное насильно, игнорируя expires", <br>
         выдаёт bool "получилось/нет"          выдаёт bool "получилось/нет"
           !^sleep(seconds)
   
   
     Xесть глобальный флажок в свойствах/командной строке "не оптимизировать"      Xесть глобальный флажок в свойствах/командной строке "не оптимизировать"
Line 235  odbc    c:\drives\y\parser3project\odbc\ Line 247  odbc    c:\drives\y\parser3project\odbc\
         0          0
     !^имя.pos[...]      !^имя.pos[...]
         -1          -1
       !^void.left(n)
          ничего не выдаёт
       !^void.right(n)
          ничего не выдаёт
       !^void.mid(p[;n])
          ничего не выдаёт
     !^имя.int[]  (default)       !^имя.int[]  (default) 
         0 или default          0 или default
     !^имя.double[] (default)      !^имя.double[] (default)
         0 или default          0 или default
     !^void:sql{запрос без результата}      !^void:sql{запрос без результата}{$.bind[см. table::sql]}
   
   
 !int,double  !int,double
     !^имя.int[]  целочисленное значение       !^имя.int[]  целочисленное значение 
Line 250  odbc    c:\drives\y\parser3project\odbc\ Line 269  odbc    c:\drives\y\parser3project\odbc\
     !^имя.div(на сколько /)      !^имя.div(на сколько /)
     !^имя.mod(на сколько %)      !^имя.mod(на сколько %)
     !^имя.format[формат]      !^имя.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  !string
Line 262  odbc    c:\drives\y\parser3project\odbc\ Line 281  odbc    c:\drives\y\parser3project\odbc\
         пример:          пример:
         ^if(def $form:name) не пуста?          ^if(def $form:name) не пуста?
         ^if($user.isAlive) истина? [автопреобразование к числу, не ноль?]          ^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          если ломается преобразование, берётся default
Line 301  odbc    c:\drives\y\parser3project\odbc\ Line 320  odbc    c:\drives\y\parser3project\odbc\
     !^строка.normalize[] выдает другую строку, в которой фрагменты на одном языке объединены      !^строка.normalize[] выдает другую строку, в которой фрагменты на одном языке объединены
         полезно делать перед сложными match операциями, если вы знаете, что входная строка          полезно делать перед сложными match операциями, если вы знаете, что входная строка
         состоит из большого числа фрагментов          состоит из большого числа фрагментов
       !^string.trim[start|both|end[;chars]] выкидывает charset из начала/конца/и начала и конца
           default 'chars' -- whitespace chars
       !^string.append[string]
       !^string.base64[] encode
       !^string:base64[encoded] decode
   
 !table  !table
     в выражении       в выражении 
Line 315  odbc    c:\drives\y\parser3project\odbc\ Line 339  odbc    c:\drives\y\parser3project\odbc\
         !пустые строки, и строки в первой колонке содержащие '#', игнорируются                  !пустые строки, и строки в первой колонке содержащие '#', игнорируются        
         !$.separator[^#09]          !$.separator[^#09]
         !$.encloser["] по-умолчанию, нет.          !$.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]]      !^таблица.save[[nameless|append;]путь[;опции, см. load]]
     !$таблица.поле      !$таблица.поле
     !$таблица.fields  из named таблицы выдаёт текущую запись как Hash      !$таблица.fields  из named таблицы выдаёт текущую запись как Hash
Line 371  odbc    c:\drives\y\parser3project\odbc\ Line 399  odbc    c:\drives\y\parser3project\odbc\
     !^hash::sql{запрос}[[$.distinct(1) $.limit(2) $.offset(4) todo:$.default{$.field[]...}]]      !^hash::sql{запрос}[[$.distinct(1) $.limit(2) $.offset(4) todo:$.default{$.field[]...}]]
         получается hash(ключи=значения первая колонка ответа)          получается hash(ключи=значения первая колонка ответа)
         of hash(ключи=названия остальных колонкок ответа)          of hash(ключи=названия остальных колонкок ответа)
     !^hash._keys[]+ таблица из одного столбца $key      !^hash._keys[[название колонки с ключами]]+ таблица из одного столбца $key или как передадут
     !^hash._count[]      !^hash._count[]
     !^foreach[key;value]{тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}]      !^foreach[key;value]{тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}]
     !^delete[ключ]  удалить ключ      !^delete[ключ]  удалить ключ
Line 392  odbc    c:\drives\y\parser3project\odbc\ Line 420  odbc    c:\drives\y\parser3project\odbc\
     !^foreach[key|value]{тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}]      !^foreach[key|value]{тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}]
   
     пример:      пример:
     $uids[^hashfile::open[/db/uids]]      $sessions[^hashfile::open[/db/sessions]]
          
     $random[23847387taduigh345XGHWElxjgdjg]      $sid[^math:uuid[]]
     $uids.$random[$.value[$uid] $.expires(1)]      $sessions.$sid[$.value[$uid] $.expires(1)]
     $uid[$persistent.logins.$random]      $uid[$sessions.$sid]
   
 !form  !form
     [берётся первый элемент из одноимённых из GET, потом первый из POST]      [берётся первый элемент из одноимённых из GET, потом первый из POST]
Line 410  odbc    c:\drives\y\parser3project\odbc\ Line 438  odbc    c:\drives\y\parser3project\odbc\
   
 !env  !env
     !$env:переменная      !$env:переменная
       !$env:PARSER было то же самое, что показывается при запуске parser.cgi
   
 !cookie  !cookie
     !$cookie:имя считать старое или свежезаданное      !$cookie:имя считать старое или свежезаданное
Line 442  odbc    c:\drives\y\parser3project\odbc\ Line 471  odbc    c:\drives\y\parser3project\odbc\
         ! $attribute[zzz] field: abc; {attribute=zzz}<<часть          ! $attribute[zzz] field: abc; {attribute=zzz}<<часть
         !значение поля или атрибута может быть string или date          !значение поля или атрибута может быть string или date
         ! если дата, она будет преобразована к формату "Sun, 25-Aug-2002 12:03:45 GMT"          ! если дата, она будет преобразована к формату "Sun, 25-Aug-2002 12:03:45 GMT"
       !$response:headers накопленные поля
     !$response:body[DATA]  замещает стандартный ответ      !$response:body[DATA]  замещает стандартный ответ
     !$response:download[DATA]  замещает стандартный ответ,       !$response:download[DATA]  замещает стандартный ответ, 
         выставляет флаг, заставляющий browser предложить download          выставляет флаг, заставляющий browser предложить download
Line 532  odbc    c:\drives\y\parser3project\odbc\ Line 562  odbc    c:\drives\y\parser3project\odbc\
     !это старый формат, поддерживается для обратной совместимости      !это старый формат, поддерживается для обратной совместимости
     !если имя части начинается со слова text, то это текстовый блок.      !если имя части начинается со слова text, то это текстовый блок.
     !если имя части начинается со слова attach, то это вложение, формат задания::      !если имя части начинается со слова attach, то это вложение, формат задания::
         !$attach[$.format[!uue|Xbase64] $.value[DATA] $.file-name[user-file-name]]          !$attach[$.format[!uue|!base64] $.value[DATA] $.file-name[user-file-name]]
     !важно: при multipart не указывать content-type      !важно: при multipart не указывать content-type
         ^mail:send[          ^mail:send[
 #           по-умолчанию, совпадает с source encoding.  #           по-умолчанию, совпадает с source encoding.
Line 625  odbc    c:\drives\y\parser3project\odbc\ Line 655  odbc    c:\drives\y\parser3project\odbc\
         определяющее прожорливость выделялки цветов из палитры [default=150]          определяющее прожорливость выделялки цветов из палитры [default=150]
             меньше - точнее приближает цвета, но они быстро кончаются              меньше - точнее приближает цвета, но они быстро кончаются
             больше - неточно приближает цвет, но бОльшей части хватит              больше - неточно приближает цвет, но бОльшей части хватит
       !^картинка.pixel(x;y)[(color)]
           узнать или задать цвет пиксела
   
 !file  !file
     !$файл_из_post.name       !$файл_из_post.name 
Line 635  odbc    c:\drives\y\parser3project\odbc\ Line 667  odbc    c:\drives\y\parser3project\odbc\
     !^file:find[имя файла][{когда не нашли}]      !^file:find[имя файла][{когда не нашли}]
     !^file:list[путь[;шаблон]] = table с колонкой name      !^file:list[путь[;шаблон]] = table с колонкой name
     !^file::load[text|binary;!big.zip[;!domain_press_release_2001_03_01.zip][;опции]]      !^file::load[text|binary;!big.zip[;!domain_press_release_2001_03_01.zip][;опции]]
       !^file::create[text;имя;^untaint[xml]{data}]
     !$файл_который_был_loaded.size      !$файл_который_был_loaded.size
     !^file::stat[имя файла]      !^file::stat[имя файла]
     !$файл_который_был_stated.size !.adate !.mdate !.cdate      !$файл_который_был_stated.size !.adate !.mdate !.cdate
Line 661  odbc    c:\drives\y\parser3project\odbc\ Line 694  odbc    c:\drives\y\parser3project\odbc\
     !^file:justname[/a/some.tar.gz]=some.tar      !^file:justname[/a/some.tar.gz]=some.tar
     !^file:justext[/a/some.tar.gz]=gz      !^file:justext[/a/some.tar.gz]=gz
     !/some/page.html: ^file:fullpath[a.gif] => /some/a.gif      !/some/page.html: ^file:fullpath[a.gif] => /some/a.gif
       !^file.sql-string[] внутри ^connect даст правильно escaped строку, которую можно в запрос отдать
       X^file::sql[[имя_файла_для_download]]{}
       !^file::sql{}[[
           $.name[имя_файла_для_download]
           $.content-type[пользовательский content-type]
       ]]
           результат запроса должен быть "одна строка".
           колонки:
           первая колонка - данные
           если есть вторая - это имя файла
           если есть третья - это content-type
       !^file.base64[] encode
       !^file::base64[encoded string] decode
       !^file:crc32[имя файла]
          вычисляет crc32 файла с указанным именем
       !^file.crc32[]
                   вычисляет crc32 объекта
           !^file.md5[]
           !^file:md5[имя файла]
           выдает digest файла, длиной 16 байт в виде строки, 
           где байты digest выданы в hex виде, впритык, в нижнем регистре
   
 !math  !math
     !$math:PI      !$math:PI
Line 690  odbc    c:\drives\y\parser3project\odbc\ Line 743  odbc    c:\drives\y\parser3project\odbc\
          если нет тела salt, оно создаётся случайным           если нет тела salt, оно создаётся случайным
        $1$ вызывает MD5 алгоритм функции OS 'crypt', если поддерживается [заведомо нет на solaris].         $1$ вызывает MD5 алгоритм функции OS 'crypt', если поддерживается [заведомо нет на solaris].
        другие salt читайте документацию по функции OS 'crypt'.         другие salt читайте документацию по функции OS 'crypt'.
       !^math:crc32[string]
          вычисляет crc32 строки
   
 !date  !date
     !время типа time можно использовать в выражениях, подставляет       !время типа time можно использовать в выражениях, подставляет 
Line 721  odbc    c:\drives\y\parser3project\odbc\ Line 776  odbc    c:\drives\y\parser3project\odbc\
         столбцы: year, month, day, weekday          столбцы: year, month, day, weekday
           
 xdoc(xnode)  xdoc(xnode)
       !$xdoc.search-namespaces hash, where keys=prefixes, values=urls
       
     DOM1 attributes:      DOM1 attributes:
     !readonly attribute DocumentType doctype      !readonly attribute DocumentType doctype
     Xreadonly attribute DOMImplementation implementation      Xreadonly attribute DOMImplementation implementation
Line 962  console Line 1019  console
     !$console:line      !$console:line
         read/write строку          read/write строку
   
 !DATA::=string | file  DATA::=string | file | hash
   
   !hash вида
   [
           $.file[имя файла на диске]
           $.name[имя файла для пользователя]
           $.mdate[date]
   ]
   
 !MAIN  !MAIN
     это класс, загружаемый на автомате из parser3.conf,       это класс, загружаемый на автомате из parser3.conf, 
Line 994  console Line 1058  console
         операторов/методов, приведших к ошибке.          операторов/методов, приведших к ошибке.
   
 !при загрузке файла (file::load, table::load, xdoc::load) можно указать такое имя файла:  !при загрузке файла (file::load, table::load, xdoc::load) можно указать такое имя файла:
     !http://domain/document?params      !http://domain/document[?params<<deprecated, use $.form[...]]
     !а также, возможно, указать опции:      !а также, возможно, указать опции:
         !$.method[GET|HEAD]          !$.method[GET|POST|HEAD]
         !$.timeout(3)  << в секундах, по-умолчанию =2          !$.timeout(3)  << в секундах, по-умолчанию =2
         !$.headers[          !$.headers[
         !    $поле[значение] << значение имеет формат, как $response:ЗАГОЛОВОК          !    $поле[значение] << значение имеет формат, как $response:ЗАГОЛОВОК
         !]          !]
           $.enctype[multipart/form-data]
           $.form[
               !$.field1[string]
               !$.field2[^table::create{one_column_only^#0Avalue1^#0Avalue2}]
               $.field3[file]
           ]
           !$.body[string]
                   |file
         !по-умолчанию, user-agent=parser3          !по-умолчанию, user-agent=parser3
         !по-умолчанию, получение http status != 200 >> создает http.status ошибку,          !по-умолчанию, получение http status != 200 >> создает http.status ошибку,
         !это можно отключить, передав          !это можно отключить, передав
         !$.any-status(1)          !$.any-status(1)
         !$.charset[кодировка удалённых докуметов по-умолчанию] << если сервер вернёт content-type:charset=ОНА_ПЕРЕБИВАЕТ          !$.charset[кодировка удалённых докуметов по-умолчанию] << если сервер вернёт content-type:charset=ОНА_ПЕРЕБИВАЕТ
           !$.user[пользователь]
           !$.password[пароль]
     !file::load в дополнительные поля записывает      !file::load в дополнительные поля записывает
         !ПОЛЕ:значение (имена полей ответа заглавными буквами)          !ПОЛЕ:значение (имена полей ответа заглавными буквами)
         !tables << хеш их ПОЛЕ->table с единственным столбцом "value".           !tables << хеш их ПОЛЕ->table с единственным столбцом "value". 
Line 1041  console Line 1115  console
           
 !нужно выключить русский apache: CharsetDisable on  !нужно выключить русский apache: CharsetDisable on
   
 !если в MAIN будет определён флаг $ORIGINS(1) то вместо обычного вывода страницы будет  Xесли в MAIN будет определён флаг $ORIGINS(1) то вместо обычного вывода страницы будет
     выдан список фрагментов результата с указанием их происхождения      выдан список фрагментов результата с указанием их происхождения
   
   !если описание метода содержит локальную переменную result в явном виде
       (есть и неявная переменная)
       то код вывода строковых литералов не попадает в конечный байт-код,
       а непробельные символы считаются синтаксической ошибкой
       для вывода чего бы то ни было надо пользоваться этой переменной
   

Removed from v.1.150  
changed lines
  Added in v.1.183


E-mail: