Diff for /parser3/operators.ru.txt between versions 1.192 and 1.218

version 1.192, 2007/04/18 06:45:02 version 1.218, 2009/06/29 02:31:29
Line 62  Xне сделано, видимо, не будет сделано Line 62  Xне сделано, видимо, не будет сделано
     !^use[модуль]      !^use[модуль]
     !^try{      !^try{
         ...          ...
         !^throw[sql.connect;вася;болван] // был ^error[текст]          !^throw[sql.connect[;вася[;болван]]] // был ^error[текст]
           !^throw[
                   $.type[sql.connect]
                   $.source[вася]
                   $.comment[болван]
           ]
         ...          ...
     }{      }{
         ^if($exception.type eq sql){          ^if($exception.type eq "sql"){
             $exception.handled(1)  ^rem{флаг, что exception обработан}              $exception.handled(1|true)  ^rem{флаг, что exception обработан}
             ....              ....
         }          }
                   
         ^switch($exception.type){          ^switch[$exception.type]{
             ^case[sql;mail]{              ^case[sql;mail]{
                 $exception.handled(1)                  $exception.handled(1)
                 код, обрабатывающий sql ошибку                  код, обрабатывающий sql ошибку
                 $exception.type = sql.connect                  $exception.type = sql.connect
                 $exception.file $exception.lineno [если не запрещены при компиляции]                  $exception.file $exception.lineno $exception.colno [если не запрещены при компиляции]
                 $exception.source = вася                  $exception.source = вася
                 $exception.comment = болван                  $exception.comment = болван
             }              }
             ^case[_default]{              ^case[DEFAULT]{
                 код, обрабатывающий другую ошибку                  код, обрабатывающий другую ошибку
                 ^throw[$exception] << re-throw                  ^throw[$exception] << re-throw // DON'T! It's default behaviour!
             }              }
         }          }
     }      }
Line 91  Xне сделано, видимо, не будет сделано Line 96  Xне сделано, видимо, не будет сделано
         выдавая нестандартный результат          выдавая нестандартный результат
     !^break[] + - обрывает цикл      !^break[] + - обрывает цикл
     !^continue[] + - обрывает итерацию цикла      !^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          default as-is
     !^taint[[lang]][код]      !^taint[[lang]][код]
         default "just tainted, language unknown"          default "just tainted, language unknown"
Line 107  Xне сделано, видимо, не будет сделано Line 112  Xне сделано, видимо, не будет сделано
             ClientCharset=parser-charset << charset in which parser thinks client works              ClientCharset=parser-charset << charset in which parser thinks client works
             charset=cp1251_koi8&              charset=cp1251_koi8&
             timeout=3&              timeout=3&
             compress=1&              compress=0&
             named_pipe=1&              named_pipe=1&
               multi_statements=1& allow execute more then one query in one parser :sql{} request
             autocommit=1              autocommit=1
             autocommit если выставить в 0, будет делать commit/rollback              autocommit если выставить в 0, будет делать commit/rollback
   
Line 133  Xне сделано, видимо, не будет сделано Line 139  Xне сделано, видимо, не будет сделано
         !odbc://DSN=dsn^;UID=user^;PWD=password^;ClientCharset=parser-charset          !odbc://DSN=dsn^;UID=user^;PWD=password^;ClientCharset=parser-charset
             ClientCharset << charset in which parser thinks client works              ClientCharset << charset in which parser thinks client works
                           
         !sqlite://database          !sqlite://DBfile?
                   ClientCharset=parser-charset& << charset in which parser thinks client works
                   autocommit=1
   
         для работы connect нужно, чтобы заранее(рекомендуется в системном parser3)          для работы connect нужно, чтобы заранее(рекомендуется в системном конфигурационном auto.p)
         была определена таблица          была определена таблица
 #sql drivers  #sql drivers
 $SQL[  $SQL[
     $.drivers[^table::create{protocol    driver    client      $.drivers[^table::create{protocol   driver  client
 mysql    /www/parser3/libparser3mysql.so    /usr/local/lib/mysql/libmysqlclient.so  mysql   /www/parser3/libparser3mysql.so /usr/local/lib/mysql/libmysqlclient.so
 pgsql    /www/parser3/libparser3pgsql.so    /usr/local/pgsql/lib/libpq.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  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  sqlite  /www/parser3/libparser3sqlite.so        /usr/local/sqlite/lib/sqlite3.so
 odbc    c:\drives\y\parser3project\odbc\debug\parser3odbc.dll  odbc    c:\drives\y\parser3project\odbc\debug\parser3odbc.dll
 }]  }]
 ]  ]
         !в таблице у oracle в столбце клиентской библиотеки          !в таблице у oracle в столбце клиентской библиотеки
Line 170  odbc    c:\drives\y\parser3project\odbc\ Line 178  odbc    c:\drives\y\parser3project\odbc\
         !скэшировать строку, которая получается при выполнении кода на 'секунд' секунд          !скэшировать строку, которая получается при выполнении кода на 'секунд' секунд
         !если 0секунд, значит не кэшировать, а старый такой стереть          !если 0секунд, значит не кэшировать, а старый такой стереть
         !в catch коде $exception.handled[cache]  ^rem{флаг, что exception обработан}          !в catch коде $exception.handled[cache]  ^rem{флаг, что exception обработан}
     !^cache[файл][expires date]{код}      !^cache[файл][expires date]{код}[{catch код}]
         !абсолютное задание времени          !абсолютное задание времени
     X^cache[файл] удалить файл [не ругает, если его нет] // такое было, больше не будет, делать ^cache(0)      X^cache[файл] удалить файл [не ругает, если его нет] // такое было, больше не будет, делать ^cache(0)
     !^cache(секунд)      !^cache(секунд)
Line 179  odbc    c:\drives\y\parser3project\odbc\ Line 187  odbc    c:\drives\y\parser3project\odbc\
         !в пределе: ^cache(0) отменить кэширование          !в пределе: ^cache(0) отменить кэширование
     !^cache[] выдаёт текущую expires date      !^cache[] выдаёт текущую expires date
     X^cache[read]       X^cache[read] 
         сигнализирует вышестоящему ^cache "взять скэшированное насильно, игнорируя expires", <br>          сигнализирует вышестоящему ^cache "взять скэшированное насильно, игнорируя expires",
         выдаёт bool "получилось/нет"          выдаёт bool "получилось/нет"
         !^sleep(seconds)          !^sleep(seconds)
   
Line 251  odbc    c:\drives\y\parser3project\odbc\ Line 259  odbc    c:\drives\y\parser3project\odbc\
         0          0
     !^имя.pos[...]      !^имя.pos[...]
         -1          -1
     !^void.left(n)      !^имя.left(n)
        ничего не выдаёт         ничего не выдаёт
     !^void.right(n)      !^имя.right(n)
        ничего не выдаёт         ничего не выдаёт
     !^void.mid(p[;n])      !^имя.mid(p[;n])
        ничего не выдаёт         ничего не выдаёт
     !^имя.int[]  (default)       !^имя.int[]  (default) 
         0 или default          0 или default
     !^имя.double[] (default)      !^имя.double[] (default)
         0 или default          0 или default
     !^имя.bool[] + .bool(true|false)  bool значение      !^имя.bool[] (default)
           false или default
     !^void:sql{запрос без результата}{$.bind[см. table::sql]}      !^void:sql{запрос без результата}{$.bind[см. table::sql]}
   
   
Line 289  odbc    c:\drives\y\parser3project\odbc\ Line 298  odbc    c:\drives\y\parser3project\odbc\
         ^if($user.isAlive) истина? [автопреобразование к числу, не ноль?]          ^if($user.isAlive) истина? [автопреобразование к числу, не ноль?]
     !^string::sql{query}[[$.limit(1) $.offset(4) $.default{n/a} $.bind[см. table::sql]]]      !^string::sql{query}[[$.limit(1) $.offset(4) $.default{n/a} $.bind[см. table::sql]]]
         результат запроса должен быть один столбец/одна строка          результат запроса должен быть один столбец/одна строка
     !^имя.int[] .int(default) целочисленное значение строки.       !^строка.int[] .int(default) целочисленное значение строки. 
         если ломается преобразование, берётся default          если ломается преобразование, берётся default
     !^имя.double[]+ .double(default)  double значение строки      !^строка.double[]+ .double(default)  double значение строки
     !^имя.bool[] + .bool(default)  bool значение строки      !^строка.bool[] + .bool(default)  bool значение строки
         если ломается преобразование, берётся default          если ломается преобразование, берётся default
     !^имя.format[формат] %d  %.2f %02d...      !^строка.format[формат] %d  %.2f %02d...
     !^строка.match[шаблон][[опции поиска]]  $prematch $match $postmatch $1 $2...      !^строка.match[шаблон-строка|шаблон-regex][[опции поиска]]  $prematch $match $postmatch $1 $2...
         опции поиска=          опции поиска=
         i CASELESS          i CASELESS
         x whitespace in regex ignored          x whitespace in regex ignored
Line 303  odbc    c:\drives\y\parser3project\odbc\ Line 312  odbc    c:\drives\y\parser3project\odbc\
         m multiline = $ считается концом строки[\n], не концом всего текста          m multiline = $ считается концом строки[\n], не концом всего текста
         g найти все вхождения, а не одно          g найти все вхождения, а не одно
         ' создавать столбцы prematch, match, postmatch          ' создавать столбцы prematch, match, postmatch
     !^строка.match[шаблон][опции поиска]{замена}          n вернуть цисло с количеством найденных совпадений, а не таблицу с результатами
           U инвертировать смысл модификатора '?'
       !^строка.match[шаблон-строка|шаблон-regex][опции поиска]{замена}
         опции поиска+=          опции поиска+=
         g заменить все вхождения, а не одно          g заменить все вхождения, а не одно
     !^строка.split[разделитель][[lrhv]]      !^строка.split[разделитель][[lrhv]][[название столбца для вертикального разбиения]]
         l слева направо [default]          l слева направо [default]
         r справа налево          r справа налево
         h nameless таблица          h nameless таблица с ключами 0, 1, 2, ...
         v таблица из столбца piece [default]          v таблица из 1 столбца 'piece' или как передадут [default]
     !^строка.{l|r}split[разделитель] таблица из столбца $piece      !^строка.{l|r}split[разделитель] таблица из столбца $piece
         оставлен для совместимости          оставлен для совместимости
     !^строка.upper|lower[]       !^строка.upper|lower[] 
Line 321  odbc    c:\drives\y\parser3project\odbc\ Line 332  odbc    c:\drives\y\parser3project\odbc\
     !^строка.left(N)      !^строка.left(N)
     !^строка.right(N)      !^строка.right(N)
     !^строка.pos[подстрока]      !^строка.pos[подстрока]
       !^строка.pos[подстрока](позиция, с которой ищем)
         <0 = не найдено          <0 = не найдено
     !^строка.replace[$таблица_подстановок_строка_на_строку]      !^строка.replace[$таблица_подстановок_строка_на_строку]
     !^строка.save[[append;]путь]      !^строка.save[[append;]путь]
     !^строка.normalize[] выдает другую строку, в которой фрагменты на одном языке объединены      !^строка.normalize[] выдает другую строку, в которой фрагменты на одном языке объединены
         полезно делать перед сложными match операциями, если вы знаете, что входная строка          полезно делать перед сложными match операциями, если вы знаете, что входная строка
         состоит из большого числа фрагментов          состоит из большого числа фрагментов
     !^string.trim[start|both|end[;chars]] выкидывает charset из начала/конца/и начала и конца      !^строка.trim[start|both|end|left|right[;chars]] выкидывает chars из начала/конца/и начала и конца
         default 'chars' -- whitespace chars          default 'chars' -- whitespace chars
     !^string.append[string]      !^строка.append[string]
     !^string.base64[] encode      !^строка.base64[] encode
     !^string:base64[encoded] decode      !^string:base64[encoded] decode
   
 !table  !table
     в выражении       в выражении 
         логическое значение равно "не пуста?"          логическое значение равно "не пуста?"
         числовое значение равно count[]          числовое значение равно count[]
     !^table::create[[nameless]]{данные} старое имя "set"      !^table::create[[nameless]]{данные}[[$.separator[^#09]]] старое имя "set"
     !^table::create[table][[$.limit(1) $.offset(5) $.offset[cur] $.reverse(1)]]      !^table::create[table][[$.limit(1) $.offset(5) $.offset[cur] $.reverse(1)]]
         клонирует таблицу              клонирует таблицу    
         reverse << сзаду на перёд (работает пока только в locate, в table::create НЕ работает)          reverse << сзаду на перёд (работает пока только в locate, в table::create НЕ работает)
Line 354  odbc    c:\drives\y\parser3project\odbc\ Line 366  odbc    c:\drives\y\parser3project\odbc\
     !^таблица.save[[nameless|append;]путь[;опции, см. load]]      !^таблица.save[[nameless|append;]путь[;опции, см. load]]
     !$таблица.поле      !$таблица.поле
     !$таблица.fields  из named таблицы выдаёт текущую запись как Hash      !$таблица.fields  из named таблицы выдаёт текущую запись как Hash
     !^таблица.menu{тело}[разделитель]      !^таблица.menu{тело}[[разделитель]]
     !^таблица.offset[[whence]](5) сдвигает; без параметра - печатает offset      !^таблица.offset[] печатает offset
       !^таблица.offset[[whence]](5) сдвигает
         !whence=cur|set          !whence=cur|set
         !без whence - это cur          !без whence - это cur
     !^таблица.count[]      !^таблица.count[]
Line 367  odbc    c:\drives\y\parser3project\odbc\ Line 380  odbc    c:\drives\y\parser3project\odbc\
     X^таблица.remove(position[;count]) - стирает запись       X^таблица.remove(position[;count]) - стирает запись 
         из текущей позиции [стирает запись из конкретной позиции]           из текущей позиции [стирает запись из конкретной позиции] 
             [стирает count записей]              [стирает count записей]
     !^таблица.join[таблица][$.limit(1) $.offset(5) $.offset[cur]]     - добавляет записи из таблицы.       !^таблица.join[таблица][$.limit(1) $.offset(5) $.offset[cur]] - добавляет записи из таблицы. 
         таблицы должны иметь одинаковую структуру.          таблицы должны иметь одинаковую структуру.
     !^таблица.flip[] выдаёт транспонированную, надо куда-то сложить, потом пользовать      !^таблица.flip[] выдаёт транспонированную, надо куда-то сложить, потом пользовать
     !^таблица.locate[поле;значение][[$.limit(1) $.offset(5) $.offset[cur] $.reverse(1)]]       !^таблица.locate[поле;значение][[$.limit(1) $.offset(5) $.offset[cur] $.reverse(1)]] 
Line 379  odbc    c:\drives\y\parser3project\odbc\ Line 392  odbc    c:\drives\y\parser3project\odbc\
         поля значений могут быть не указаны, тогда ими будут все столбцы, включая ключевой          поля значений могут быть не указаны, тогда ими будут все столбцы, включая ключевой
         если distinct содержит true, то не будет ошибки при повторяющихся ключах          если distinct содержит true, то не будет ошибки при повторяющихся ключах
         если distinct содержит tables, то будет создан hash из таблиц, содержащих строки с ключом          если distinct содержит tables, то будет создан hash из таблиц, содержащих строки с ключом
     !^таблица.columns[]+ таблица из одного столбца $column      !^таблица.columns[[название столбца]]+ таблица из одного столбца 'column' или как передадут
     !$отобранное[^таблица.select(выражение)] = таблица из тех же столбцов и строк, у которых условие совпало      !$отобранное[^таблица.select(выражение)] = таблица из тех же столбцов и строк, у которых условие совпало
         $adults[^man.select($man.age>=18)]          $adults[^man.select($man.age>=18)]
     ^таблица.color[цвет1;цвет2]      ^таблица.color[цвет1;цвет2]
Line 389  odbc    c:\drives\y\parser3project\odbc\ Line 402  odbc    c:\drives\y\parser3project\odbc\
     !в выражении       !в выражении 
         !логическое значение равно "не пуста?"          !логическое значение равно "не пуста?"
         !числовое значение равно _count[]          !числовое значение равно _count[]
     !$hash.ключ      !$хеш.ключ
         !_default - специальный ключ, если задан,           !_default - специальный ключ, если задан, 
         то при обращении по ключу, которому нет соответствия, выдаётся _default значение           то при обращении по ключу, которому нет соответствия, выдаётся _default значение 
     !$hash.fields выдает $hash. чтобы класс hash был чуть больше похож на класс table      !$хеш.fields выдает $hash. чтобы класс hash был чуть больше похож на класс table
     !^hash::create[[!copy_from_hash|copy_from_hashfile]]      !^hash::create[[!copy_from_hash|copy_from_hashfile]]
         создаёт новый hash, копию старого          создаёт новый hash, копию старого
     !^hash.add[слагаемое]      !^хеш.add[слагаемое]
         перезаписывает одноимённые          перезаписывает одноимённые
     !^hash.sub[вычитаемое]      !^хеш.sub[вычитаемое]
     !^a.union[b] = объединение      !^хеш.union[b] = объединение
         одноимённые остаются          одноимённые остаются
     !^a.intersection[b] = пересечение      !^хеш.intersection[b] = пересечение
         значения a          значения хеш
     !^a.intersects[b] = bool      !^хеш.intersects[b] = bool
     !^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 или как передадут      !^хеш._keys[[название колонки с ключами]]+ таблица из одного столбца $key или как передадут
     !^hash._count[]      !^хеш._count[]
     !^foreach[key;value]{тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}]      !^хеш.foreach[key;value]{тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}]
     !^delete[ключ]  удалить ключ      !^хеш.delete[ключ]  удалить ключ
       !^хеш.contain[ключ] - существует ли в хеше ключ (bool)
   
 !hashfile  !hashfile
     !^hashfile::open[filename]      !^hashfile::open[filename]
     !^hashfile.clear[]  забыть всё      !^хешфайл.clear[]  забыть всё
     !.ключ[значение]  положить значение      !$хешфайл.ключ[значение]  положить значение
     !.ключ[$.value[значение] $.expires ЗНАЧЕНИЕ}      !$хешфайл.ключ[$.value[значение] $.expires[ЗНАЧЕНИЕ]}
       положить значение до expires        положить значение до expires
       значение поля expires может быть date, или число дней(0дней=на вечно)        значение поля expires может быть date, или число дней(0дней=на вечно)
     !.ключ  достать      !$хешфайл.ключ  достать
     !^delete[ключ]  удалить ключ      !^хешфайл.delete[ключ]  удалить ключ
     !^delete[]  удалить файлы, содержащие данные      !^хешфайл.delete[]  удалить файлы, содержащие данные
     !^hash[]      !^хешфайл.hash[]
         преобразовать в обычный hash          преобразовать в обычный hash
         попутно стирает устаревшие пары          попутно стирает устаревшие пары
     !^foreach[key|value]{тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}]      !^хешфайл.foreach[key;value]{тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}]
       !^хешфайл.release[]
           записать данные и снять блокировки.
           при повторном обращении к элементам откроется автоматически.
       !^хешфайл.cleanup[]  пробежаться по всем элементам и удалить устаревшие.
   
     пример:      пример:
     $sessions[^hashfile::open[/db/sessions]]      $sessions[^hashfile::open[/db/sessions]]
Line 433  odbc    c:\drives\y\parser3project\odbc\ Line 451  odbc    c:\drives\y\parser3project\odbc\
     $sessions.$sid[$.value[$uid] $.expires(1)]      $sessions.$sid[$.value[$uid] $.expires(1)]
     $uid[$sessions.$sid]      $uid[$sessions.$sid]
   
   
 !form  !form
     [берётся первый элемент из одноимённых из GET, потом первый из POST]      [берётся первый элемент из одноимённых из GET, потом первый из POST]
     !$form:поле = string/file       !$form:поле = string/file 
Line 444  odbc    c:\drives\y\parser3project\odbc\ Line 463  odbc    c:\drives\y\parser3project\odbc\
     !$form:imap = хэш с ключами 'x' и 'y'      !$form:imap = хэш с ключами 'x' и 'y'
         со значением ?1,2 приписки при использовании server-site image map          со значением ?1,2 приписки при использовании server-site image map
   
   
 !env  !env
     !$env:переменная      !$env:переменная
     !$env:PARSER было то же самое, что показывается при запуске parser.cgi      !$env:PARSER то же самое, что показывается при запуске parser.cgi
   
   
 !cookie  !cookie
     !$cookie:имя считать старое или свежезаданное      !$cookie:имя считать старое или свежезаданное
Line 455  odbc    c:\drives\y\parser3project\odbc\ Line 476  odbc    c:\drives\y\parser3project\odbc\
     !значение поля expires может быть 'session', date, или число дней(0дней=session)      !значение поля expires может быть 'session', date, или число дней(0дней=session)
     ! если дата, она будет преобразована к формату "Sun, 25-Aug-2002 12:03:45 GMT"      ! если дата, она будет преобразована к формату "Sun, 25-Aug-2002 12:03:45 GMT"
     ! можно устанавливать bool свойства, например $.secure(true), $.httponly(true)      ! можно устанавливать bool свойства, например $.secure(true), $.httponly(true)
       !$cookie:fields = hash со всеми cookies
   
   
 !request  !request
Line 464  odbc    c:\drives\y\parser3project\odbc\ Line 486  odbc    c:\drives\y\parser3project\odbc\
     !$request:document-root      !$request:document-root
         каталог, относительно которого считаются пути в parser, по-умолчанию = $env:DOCUMENT_ROOT          каталог, относительно которого считаются пути в parser, по-умолчанию = $env:DOCUMENT_ROOT
         можно изменить, если на hosting что-то неудобно настроено          можно изменить, если на hosting что-то неудобно настроено
       !$request:argv = hash с параметрами коммандной строки. ключи 0, 1, ... [0 -- имя обрабатываемого файла].
     X!$request:browser  это hash, поля:      X!$request:browser  это hash, поля:
         !$type = ie/nn и !$version = номер, скажем 5.5                 !$type = ie/nn и !$version = номер, скажем 5.5       
     X$request:user      X$request:user
Line 474  odbc    c:\drives\y\parser3project\odbc\ Line 497  odbc    c:\drives\y\parser3project\odbc\
         ПРЕДУПРЕЖДЕНИЕ: класс form получает свои поля после обработки всех auto класса MAIN          ПРЕДУПРЕЖДЕНИЕ: класс form получает свои поля после обработки всех auto класса MAIN
         поэтому необходимо задать $request/response:charset в одном из них. не после.          поэтому необходимо задать $request/response:charset в одном из них. не после.
   
   
 !response  !response
     !$response:поле[значение]  и можно считать старое -- $response:поле      !$response:поле[значение]  и можно считать старое -- $response:поле
         !значение может быть string а может быть hash:          !значение может быть string а может быть hash:
Line 496  odbc    c:\drives\y\parser3project\odbc\ Line 520  odbc    c:\drives\y\parser3project\odbc\
         ПРЕДУПРЕЖДЕНИЕ: класс form получает свои поля после обработки всех auto класса MAIN          ПРЕДУПРЕЖДЕНИЕ: класс form получает свои поля после обработки всех auto класса MAIN
         поэтому необходимо задать $request/response:charset в одном из них. не после.          поэтому необходимо задать $request/response:charset в одном из них. не после.
   
   
   !regex
       !в выражении 
           !логическое значение всегда равно true
           !числовое значение равно количеству байт скомпилированного шаблона.
       !^regex::create[шаблон-строка][[опции поиска]]
       !^шаблон.size[] количество байт скомпилированного шаблона
           если значение очень большое -- стоит почитать документацию по pcre и, возможно, переписать шаблон.
       !^шаблон.study_size[] размер study-структуры. если==0 -- шаблон не может быть "изучен"
       ^шаблон.save[filespec]
       ^шаблон.load[filespec]
   
   
 !mail  !mail
     !$mail.received=MESSAGE:      !$mail.received=MESSAGE:
         .from          .from
Line 625  odbc    c:\drives\y\parser3project\odbc\ Line 662  odbc    c:\drives\y\parser3project\odbc\
     !$картинка[^image::measure[DATA]]      !$картинка[^image::measure[DATA]]
         смотрит на .ext case insensitive,           смотрит на .ext case insensitive, 
         умеет мерить пока только .gif и .jpg .jpeg          умеет мерить пока только .gif и .jpg .jpeg
     !$image.exif << hash после measure jpeg с exif информацией       !$картинка.exif << hash после measure jpeg с exif информацией 
         !$image.exif.DateTime & co           !$image.exif.DateTime & co 
             [полный список см. http://www.ba.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html]              [полный список см. http://www.ba.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html]
         !числа типа int/double,          !числа типа int/double,
Line 646  odbc    c:\drives\y\parser3project\odbc\ Line 683  odbc    c:\drives\y\parser3project\odbc\
     !^картинка.polyline+(цвет)[table x:y точки]      !^картинка.polyline+(цвет)[table x:y точки]
     !^картинка.polygon(цвет)[table x:y вершины_многоугольника]      !^картинка.polygon(цвет)[table x:y вершины_многоугольника]
     !^картинка.polybar(цвет)[table x;y вершины_многоугольника]      !^картинка.polybar(цвет)[table x;y вершины_многоугольника]
     !^картинка.font[набор_букв;имя_файла_шрифта.gif](ширина_пробела[;ширина_символа])      !^картинка.font[набор_букв;имя_файла_шрифта.gif][(ширина_пробела[;ширина_символа])]
         высота символа = высота картинки/количество букв в наборе          высота символа = высота картинки/количество букв в наборе
         если указана ширина_символа, то monospaced, если 0, то ширина_символа = ширине gif          если указана ширина_символа, то monospaced, если 0, то ширина_символа = ширине gif
       !^картинка.font[набор_букв;имя_файла_шрифта.gif;
              $.space(ширина_пробела)             // по умолчанию = ширине gif
              $.width(ширина_символа)             // см. выше, по умолчанию proportional
              $.spacing(расстояние между буквами) // по умолчанию = 1
        ]
     !^картинка.text(x;y)[текст_надписи] AS_IS      !^картинка.text(x;y)[текст_надписи] AS_IS
     !^картинка.length[текст_надписи] AS_IS      !^картинка.length[текст_надписи] AS_IS
     !^картинка.gif[возможно, имя файла] -- кодирует в FILE с content-type=image/gif      !^картинка.gif[возможно, имя файла] -- кодирует в FILE с content-type=image/gif
Line 669  odbc    c:\drives\y\parser3project\odbc\ Line 711  odbc    c:\drives\y\parser3project\odbc\
     !^картинка.pixel(x;y)[(color)]      !^картинка.pixel(x;y)[(color)]
         узнать или задать цвет пиксела          узнать или задать цвет пиксела
   
   
 !file  !file
     !$файл_из_post.name       !$файл_из_post.name 
     !$файл_из_post.size       !$файл_из_post.size 
Line 676  odbc    c:\drives\y\parser3project\odbc\ Line 719  odbc    c:\drives\y\parser3project\odbc\
     !^файл.save[text|binary;имя файла]      !^файл.save[text|binary;имя файла]
     !^file:delete[имя файла]      !^file:delete[имя файла]
     !^file:find[имя файла][{когда не нашли}]      !^file:find[имя файла][{когда не нашли}]
     !^file:list[путь[;шаблон]] = table с колонкой name      !^file:list[путь[;шаблон-строка|шаблон-regex]] = 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}]      !^file::create[text;имя;^untaint[xml]{data}]
     !$файл_который_был_loaded.size      !$файл_который_был_loaded.size
       !$файл_который_был_loaded_или_created.mode = text/binary
     !^file::stat[имя файла]      !^file::stat[имя файла]
     !$файл_который_был_stated.size !.adate !.mdate !.cdate      !$файл_который_был_stated_или_loaded.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          $status
         $stderr          $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:          options:
             $.stdin[текст]  если текст пуст, отключается автоматическое пересовывание данных HTTP-POST               $.stdin[текст]  если текст пуст, отключается автоматическое пересовывание данных HTTP-POST 
     !^file:move[старое имя файла;новое имя файла]       !^file:move[старое имя файла;новое имя файла] 
Line 707  odbc    c:\drives\y\parser3project\odbc\ Line 751  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 строку, которую можно в запрос отдать      !^файл.sql-string[] внутри ^connect даст правильно escaped строку, которую можно в запрос отдать
     X^file::sql[[имя_файла_для_download]]{}      X^file::sql[[имя_файла_для_download]]{}
     !^file::sql{}[[      !^file::sql{}[[
         $.name[имя_файла_для_download]          $.name[имя_файла_для_download]
Line 718  odbc    c:\drives\y\parser3project\odbc\ Line 762  odbc    c:\drives\y\parser3project\odbc\
         первая колонка - данные          первая колонка - данные
         если есть вторая - это имя файла          если есть вторая - это имя файла
         если есть третья - это content-type          если есть третья - это content-type
     !^file.base64[] encode      !^файл.base64[] encode
     !^file:base64[имя файла] encode      !^file:base64[имя файла] encode
     !^file::base64[encoded string] decode      !^file::base64[encoded string] decode
     !^file:crc32[имя файла]      !^file:crc32[имя файла]
        вычисляет crc32 файла с указанным именем         вычисляет crc32 файла с указанным именем
     !^file.crc32[]      !^файл.crc32[]
                 вычисляет crc32 объекта                  вычисляет crc32 объекта
         !^file.md5[]          !^файл.md5[]
         !^file:md5[имя файла]          !^file:md5[имя файла]
         выдает digest файла, длиной 16 байт в виде строки,           выдает digest файла, длиной 16 байт в виде строки, 
         где байты digest выданы в hex виде, впритык, в нижнем регистре          где байты digest выданы в hex виде, впритык, в нижнем регистре
   
   
 !math  !math
     !$math:PI      !$math:PI
     !^math:round floor ceiling       !^math:round floor ceiling 
Line 759  odbc    c:\drives\y\parser3project\odbc\ Line 804  odbc    c:\drives\y\parser3project\odbc\
        другие salt читайте документацию по функции OS 'crypt'.         другие salt читайте документацию по функции OS 'crypt'.
     !^math:crc32[string]      !^math:crc32[string]
        вычисляет crc32 строки         вычисляет crc32 строки
       !^math:sha1[string]
   
   
   !inet
       !^inet:ntoa(long)
       !^inet:aton[IP]
   
   
 !date  !date
     !время типа time можно использовать в выражениях, подставляет       !время типа time можно использовать в выражениях, подставляет 
Line 776  odbc    c:\drives\y\parser3project\odbc\ Line 828  odbc    c:\drives\y\parser3project\odbc\
         формат1: %Y[-%m[-%d[ %H[:%M[:%S]]]]]          формат1: %Y[-%m[-%d[ %H[:%M[:%S]]]]]
         формат2: %H:%M[:%S]          формат2: %H:%M[:%S]
     !^date::unix-timestamp()      !^date::unix-timestamp()
     !^date.unix-timestamp[]      !^дата.unix-timestamp[]
     !$date.year month day  hour minute second  weekday yearday(0...) daylightsaving TZ weekyear      !$дата.year month day  hour minute second  weekday yearday(0...) daylightsaving TZ weekyear
         read-only          read-only
         TZ="" << локальная зона          TZ="" << локальная зона
     !^date.roll[year|month|day](+-смещение) сдвигает дату      !^дата.roll[year|month|day](+-смещение) сдвигает дату
     !^date.roll[TZ;Новая зона] говорит, что дата в таком-то часовом поясе: влияет на .hour&co      !^дата.roll[TZ;Новая зона] говорит, что дата в таком-то часовом поясе: влияет на .hour & Co
     !^date.sql-string[] %Y-%m-%d %H:%M:%S      !^дата.sql-string[] %Y-%m-%d %H:%M:%S
         where published='$дата.sql-string[]'          where published='^дата.sql-string[]'
     !^date:calendar[rus|eng;год;месяц] выдаёт неименованную таблицу       !^date:calendar[rus|eng](год;месяц) выдаёт неименованную таблицу 
         столбцы: 0..6, week, year          столбцы: 0..6, week, year
     !^date:calendar[rus|eng;год;месяц;день] выдаёт именнованную таблицу      !^date:calendar[rus|eng](год;месяц;день) выдаёт именнованную таблицу
         столбцы: year, month, day, weekday          столбцы: year, month, day, weekday
           !^date:last-day(год;месяц) вернёт последний день месяца
       !^дата.last-day[] вернёт последний день месяца $дата
       !^дата.gmt-string[]  Fri, 23 Mar 2001 09:32:23 GMT
   
   
 xdoc(xnode)  xdoc(xnode)
     !$xdoc.search-namespaces hash, where keys=prefixes, values=urls      !$xdoc.search-namespaces hash, where keys=prefixes, values=urls
           
Line 821  xdoc(xnode) Line 877  xdoc(xnode)
     ::sql{...}      ::sql{...}
     !::create[[URI]]{<?xml?><string/>} старое имя 'set'      !::create[[URI]]{<?xml?><string/>} старое имя 'set'
     !::create[[URI]][qualifiedName]      !::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        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[;опции]]      !::load[file.xml[;опции]]
     !.transform[rules.xsl|xdoc][[params hash]] выдаёт dom      !.transform[rules.xsl|xdoc][[params hash]] выдаёт dom
         шаблон кэшируется, кэш обновляется при изменении даты файла шаблона,          шаблон кэшируется, кэш обновляется при изменении даты файла шаблона,
Line 883  xdoc(xnode) Line 941  xdoc(xnode)
     !$node.previousSibling      !$node.previousSibling
     !$node.nextSibling      !$node.nextSibling
     !$node.ownerDocument = xdoc      !$node.ownerDocument = xdoc
       !$node.prefix
       !$node.namespaceURI
     !$element_node.attributes = hash of xnodes      !$element_node.attributes = hash of xnodes
     !$element_node.tagName      !$element_node.tagName
     !$attribute_node.specified = boolean      !$attribute_node.specified = boolean
Line 931  xdoc(xnode) Line 991  xdoc(xnode)
   
     !Introduced in DOM Level 2:      !Introduced in DOM Level 2:
     !Node importNode(in Node importedNode, in boolean deep) raises(DOMException)      !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:      !XPath:
     !^node.select[xpath/query/expression] = array of nodes,       !^node.select[xpath/query/expression] = array of nodes, 
Line 1065  DATA::=string | file | hash Line 1126  DATA::=string | file | hash
     !определив      !определив
     !@unhandled_exception[exception;stack]      !@unhandled_exception[exception;stack]
     !$exception.type  строка "тип проблемы"      !$exception.type  строка "тип проблемы"
     !$exception.file $exception.lineno файл и строка где случилась проблема [если не запрещены при компиляции]      !$exception.file $exception.lineno $exception.colno файл, строка и позиция, где случилась проблема [если не запрещены при компиляции]
     !$exception.source строка, из-за которой случилась проблема      !$exception.source строка, из-за которой случилась проблема
     !$exception.comment комментарий english      !$exception.comment комментарий english
     !stack табличка из колонок file line name,      !stack табличка из колонок file line name,
Line 1077  DATA::=string | file | hash Line 1138  DATA::=string | file | hash
     !а также, возможно, указать опции:      !а также, возможно, указать опции:
         !$.method[GET|POST|HEAD]          !$.method[GET|POST|HEAD]
         !$.timeout(3)  << в секундах, по-умолчанию =2          !$.timeout(3)  << в секундах, по-умолчанию =2
           !$.cookies[
                   $.имя[значение]
           ]
         !$.headers[          !$.headers[
         !    $поле[значение] << значение имеет формат, как $response:ЗАГОЛОВОК          !    $.поле[значение] << значение имеет формат, как $response:ЗАГОЛОВОК
         !]          !]
         $.enctype[multipart/form-data]          $.enctype[multipart/form-data]
         $.form[          $.form[
Line 1109  DATA::=string | file | hash Line 1173  DATA::=string | file | hash
     !file.lock                                                        shared/exclusive lock error      !file.lock                                                        shared/exclusive lock error
     !file.missing         ^file:delete[delme]                         not found      !file.missing         ^file:delete[delme]                         not found
     !file.access          ^table::load[.]                             no rights      !file.access          ^table::load[.]                             no rights
       !file.read            ^file::load[...]                            error while reading file
     !file.seek                                                        seek failed      !file.seek                                                        seek failed
       !file.execute         ^file::cgi[...]                             incorrect cgi header/can't execute
     !image.format         ^image::measure[index.html]                 not gif/jpg      !image.format         ^image::measure[index.html]                 not gif/jpg
     !sql.connect          ^connect[mysql://baduser:pass@host/db]{}    not found/timeout      !sql.connect          ^connect[mysql://baduser:pass@host/db]{}    not found/timeout
     !sql.execute          ^void:sql{select bad}                       syntax error      !sql.execute          ^void:sql{select bad}                       syntax error
Line 1127  DATA::=string | file | hash Line 1193  DATA::=string | file | hash
     !http.timeout         ^file::load[http://host/doc]                whole load operation failed to complete in # seconds      !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.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      !http.status          ^file::load[http://ok/there]                host found, connection accepted, status!=200
           !date.range           ^date::create(1950;1;1)                     date out of valid range
   
 !нужно выключить русский apache: CharsetDisable on  !нужно выключить русский apache: CharsetDisable on
   
 Xесли в MAIN будет определён флаг $ORIGINS(1) то вместо обычного вывода страницы будет  Xесли в MAIN будет определён флаг $ORIGINS(1) то вместо обычного вывода страницы будет
     выдан список фрагментов результата с указанием их происхождения      выдан список фрагментов результата с указанием их происхождения
   
   !если в MAIN определён $SIGPIPE(1) то в случае, если обработка была прервана пользователем, сообщение
           об этом будет записано в parser3.log (раньше оно всегда писалось)
   
 !если описание метода содержит локальную переменную result в явном виде  !если описание метода содержит локальную переменную result в явном виде
     (есть и неявная переменная)      (есть и неявная переменная)
     то код вывода строковых литералов не попадает в конечный байт-код,      то код вывода строковых литералов не попадает в конечный байт-код,

Removed from v.1.192  
changed lines
  Added in v.1.218


E-mail: