Diff for /parser3/operators.ru.txt between versions 1.31 and 1.80

version 1.31, 2002/04/09 06:47:05 version 1.80, 2002/09/02 14:59:48
Line 34  Xне сделано, видимо, не будет сделано Line 34  Xне сделано, видимо, не будет сделано
            %left "==" "!="  "eq" "ne"             %left "==" "!="  "eq" "ne"
            %left "is" "def" "in" "-f" "-d"             %left "is" "def" "in" "-f" "-d"
            %left '!'             %left '!'
              условие ? когдаДа: когдаНет
   
            /* bitwise */             /* bitwise */
            %left '#'             %left '#'
Line 45  Xне сделано, видимо, не будет сделано Line 46  Xне сделано, видимо, не будет сделано
            %left '-' '+'             %left '-' '+'
            %left '*' '/' '%' '\\'             %left '*' '/' '%' '\\'
            %left NEG     /* negation: unary - */             %left NEG     /* negation: unary - */
   
              
     !^if(условие){когда да}{когда нет}      !^if(условие){когда да}{когда нет}
     !^switch[значение]{^case[вариант1[;вариант2...]]{действие}^case[DEFAULT]{действие по умолчанию}}      !^switch[значение]{^case[вариант1[;вариант2...]]{действие}^case[DEFAULT]{действие по умолчанию}}
     !^while(условие){тело}      !^while(условие){тело}
Line 216  odbc    c:\drives\y\parser3project\odbc\ Line 219  odbc    c:\drives\y\parser3project\odbc\
   
   
 !void  !void
           !^имя.length[]
                   0
           !^имя.pos[...]
                   -1
     !^имя.int[]  (default)       !^имя.int[]  (default) 
         0 или default          0 или default
     !^имя.double[] (default)      !^имя.double[] (default)
Line 231  odbc    c:\drives\y\parser3project\odbc\ Line 238  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}]]
         запрос, результат которого должен быть один столбец/одна строка          запрос, результат которого должен быть один столбец/одна строка
   
 !string  !string
Line 243  odbc    c:\drives\y\parser3project\odbc\ Line 250  odbc    c:\drives\y\parser3project\odbc\
         пример:          пример:
         ^if(def $form:name) не пуста?          ^if(def $form:name) не пуста?
         ^if($user.isAlive) истина? [автопреобразование к числу, не ноль?]          ^if($user.isAlive) истина? [автопреобразование к числу, не ноль?]
     !^string::sql{query}[[$.limit(2) $.offset(4) $.default[n/a]]]      !^string::sql{query}[[$.limit(2) $.offset(4) $.default{n/a}]]
         результат запроса должен быть один столбец/одна строка          результат запроса должен быть один столбец/одна строка
     !^имя.int[] .int(default) целочисленное значение строки.       !^имя.int[] .int(default) целочисленное значение строки. 
         если ломается преобразование, берётся default          если ломается преобразование, берётся default
Line 260  odbc    c:\drives\y\parser3project\odbc\ Line 267  odbc    c:\drives\y\parser3project\odbc\
     !^строка.match[шаблон][опции поиска]{замена}      !^строка.match[шаблон][опции поиска]{замена}
         опции поиска+=          опции поиска+=
         g заменить все вхождения, а не одно          g заменить все вхождения, а не одно
       !^строка.split[разделитель][[lrhv]]
           l слева направо [default]
           r справа налево
           h nameless таблица
           v таблица из столбца piece [default]
     !^строка.{l|r}split[разделитель] таблица из столбца $piece      !^строка.{l|r}split[разделитель] таблица из столбца $piece
           оставлен для совместимости
     !^строка.upper|lower[]       !^строка.upper|lower[] 
     X^строка.truncate(предел терпенья) стиль :(      X^строка.truncate(предел терпенья) стиль :(
     !^строка.length[]      !^строка.length[]
Line 272  odbc    c:\drives\y\parser3project\odbc\ Line 285  odbc    c:\drives\y\parser3project\odbc\
         <0 = не найдено          <0 = не найдено
     !^строка.replace[$таблица_подстановок_строка_на_строку]      !^строка.replace[$таблица_подстановок_строка_на_строку]
     !^строка.save[[append;]путь]      !^строка.save[[append;]путь]
       !^строка.normalize[] выдает другую строку, в которой фрагменты на одном языке объединены
           полезно делать перед сложными match операциями, если вы знаете, что входная строка
           состоит из большого числа фрагментов
   
 !table  !table
     в выражении       в выражении 
         логическое значение равно "не пуста?"          логическое значение равно "не пуста?"
         числовое значение равно count[]          числовое значение равно count[]
     !^table::create[[nameless]]{данные} старое имя "set"      !^table::create[[nameless]]{данные} старое имя "set"
     !^table::create[table]      !^table::create[table][[$.limit(1) $.offset(5) $.offset[cur]]]
         клонирует таблицу          клонирует таблицу    
     !^table::load[[nameless;]путь]      !^table::load[[nameless;]путь]
         !если не nameless, названия колонок берутся из первой строки          !если не nameless, названия колонок берутся из первой строки
         !пустые строки, и строки в первой колонке содержащие '#', игнорируются                  !пустые строки, и строки в первой колонке содержащие '#', игнорируются        
     !^table::sql{query}[[$.limit(2) $.offset(4)]]      !^table::sql{query}[[$.limit(2) $.offset(4) todo:$.default{ ^table::create[...] }]]
     !^таблица.save[[nameless|append;]путь]      !^таблица.save[[nameless|append;]путь]
     !$таблица.поле      !$таблица.поле
     !$таблица.fields+  из named таблицы выдаёт текущую запись как Hash      !$таблица.fields+  из named таблицы выдаёт текущую запись как Hash
Line 300  odbc    c:\drives\y\parser3project\odbc\ Line 316  odbc    c:\drives\y\parser3project\odbc\
     X^таблица.remove(position[;count]) - стирает запись       X^таблица.remove(position[;count]) - стирает запись 
         из текущей позиции [стирает запись из конкретной позиции]           из текущей позиции [стирает запись из конкретной позиции] 
             [стирает count записей]              [стирает count записей]
     !^таблица.join[таблица] - добавляет записи из таблицы.       !^таблица.join[таблица][$.limit(1) $.offset(5) $.offset[cur]]        - добавляет записи из таблицы. 
         таблицы должны иметь одинаковую структуру.          таблицы должны иметь одинаковую структуру.
     !^таблица.flip[] выдаёт транспонированную, надо куда-то сложить, потом пользовать      !^таблица.flip[] выдаёт транспонированную, надо куда-то сложить, потом пользовать
     !^таблица.locate[поле;значение] передвигает текущую строку, если найдёт. выдаёт bool      !^таблица.locate[поле;значение] передвигает текущую строку, если найдёт. выдаёт bool
Line 309  odbc    c:\drives\y\parser3project\odbc\ Line 325  odbc    c:\drives\y\parser3project\odbc\
         значением $hash.ключ будет hash в котором поля значений будут ключами          значением $hash.ключ будет hash в котором поля значений будут ключами
         поля значений могут быть не указаны, тогда ими будут все столбцы, включая ключевой          поля значений могут быть не указаны, тогда ими будут все столбцы, включая ключевой
     !^таблица.columns[]+ таблица из одного столбца $column      !^таблица.columns[]+ таблица из одного столбца $column
     $отфильтрованное[^таблица.filter(выражение)]      !$отобранное[^таблица.select(выражение)] = таблица из тех же столбцов и строк, у которых условие совпало
     $adults[^man.filter($man.age>=18)]              $adults[^man.select($man.age>=18)]
           ^таблица.color[цвет1;цвет2]
   
   
 !hash  !hash
Line 331  odbc    c:\drives\y\parser3project\odbc\ Line 347  odbc    c:\drives\y\parser3project\odbc\
     !^a.intersection[b] = пересечение      !^a.intersection[b] = пересечение
         значения a          значения a
     !^a.intersects[b] = bool      !^a.intersects[b] = bool
     !^hash::sql{запрос}[[$.limit(2) $.offset(4)]]      !^hash::sql{запрос}[[$.limit(2) $.offset(4) todo:$.default{$.field[]...}]]
         получается hash(ключи=значения первая колонка ответа)          получается hash(ключи=значения первая колонка ответа)
         of hash(ключи=названия остальных колонкок ответа)          of hash(ключи=названия остальных колонкок ответа)
     !^hash._keys[]+ таблица из одного столбца $key      !^hash._keys[]+ таблица из одного столбца $key
Line 355  odbc    c:\drives\y\parser3project\odbc\ Line 371  odbc    c:\drives\y\parser3project\odbc\
   
 !request  !request
     !$request:query          !$request:query    
       !$request:body unprocessed POST request body
     !$request:uri      !$request:uri
     X!$request:browser  это hash, поля:      X!$request:browser  это hash, поля:
         !$type = ie/nn и !$version = номер, скажем 5.5                 !$type = ie/nn и !$version = номер, скажем 5.5       
Line 371  odbc    c:\drives\y\parser3project\odbc\ Line 388  odbc    c:\drives\y\parser3project\odbc\
         !значение может быть string а может быть hash:          !значение может быть string а может быть hash:
         ! $value[abc] field: {abc}<<часть          ! $value[abc] field: {abc}<<часть
         ! $attribute[zzz] field: abc; {attribute=zzz}<<часть          ! $attribute[zzz] field: abc; {attribute=zzz}<<часть
           !значение поля или атрибута может быть string или date
           ! если дата, она будет преобразована к формату "Sun, 25-Aug-2002 12:03:45 GMT"
     !$response:body[DATA]  замещает стандартный ответ      !$response:body[DATA]  замещает стандартный ответ
     !$response:status      !$response:status
     !^response:clear[] забыть все заданные response поля      !^response:clear[] забыть все заданные response поля
Line 414  Xhashfile Line 433  Xhashfile
     ^code.cache[заголовки новостей](35){....}      ^code.cache[заголовки новостей](35){....}
   
 !mail  !mail
       !$mail.received=MESSAGE:
           .from
           .reply-to
           .subject
           .date класса date
           .message-id
           .raw[
               .СЫРОЕ_ПОЛЬЗОВАТЕЛЬСКОЕ-ПОЛЕ-ЗАГОЛОВКА
           ]
           $.{text|html|file#}[ << нумеруется как и в mail:send (text, text2, ...) (file, file2, ...)
               $.content-type[
                   $.value[{text|...|x-unknown}/{plain|html|...|x-unknown}]
                   [$.charset[windows-1251]] << в каком пришло, сейчас уже перекодировано
                   $.ПОЛЬЗОВАТЕЛЬСКИЙ-ПАРАМЕТР-ЗАГОЛОВКА
               ]
               $.description
               $.content-id
               $.content-md5
               $.content-location
               .raw[
                   .СЫРОЕ_ПОЛЬЗОВАТЕЛЬСКОЕ-ПОЛЕ-ЗАГОЛОВКА
               ]
               $.value[строка|FILE]
           ]
           $.message#[MESSAGE] (message, message2, ...)
   
       !^mail:send[
           $.charset[кодировка заголовка и текстовых блоков] 
           $.any-header-field 
           $.text[string]
           $.text[
              $.any-header-field 
              $.value[string]
           ]
           $.html{string}
           $.html[
               $.any-header-field 
               $.value{string}
           ]
           $.file#[FILE]
           $.file#[
               $.any-header-field 
               $value[FILE]
           ]
       ]
       !если charset указан, письмо перекодируется в этот charset
       !content-type.charset не влияет на перекодирование
       !после имени части может идти # число
           ^mail:send[
   #           по-умолчанию, совпадает с source encoding.
   #           задаёт кодировку body
               $.charset[windows-1251] 
   #           нет умолчания
               $.content-type[$.value[text/plain] $.charset[windows-1251]]
               $.from["вася" <vasya@design.ru>]
               $.to["петя" <petya@design.ru>]
               $.subject[пойдём пивка]
               $.body[
                   слова
               ]
           ]
     !:send[$.header-field[] $.charset[кодировка письма] $.body[когда body не строка,       !:send[$.header-field[] $.charset[кодировка письма] $.body[когда body не строка, 
         а hash, отсылается multipart письмо]]          а hash, отсылается multipart письмо]]
     !если charset указан, письмо перекодируется в этот charset      !если charset указан, письмо перекодируется в этот charset
     !content-type.charset не влияет на перекодирование      !content-type.charset не влияет на перекодирование
       !после имени части может идти целое число, части пойдут в порядке чисел.
     !если body указан строкой, то это текст письма, никаких вложений.      !если body указан строкой, то это текст письма, никаких вложений.
     !если body указан hash, то это части, будут собраны текстовые блоки, затем вложения      !если body указан hash, то это части, будут собраны текстовые блоки, затем вложения
       !это старый формат, поддерживается для обратной совместимости
     !если имя части начинается со слова text, то это текстовый блок.      !если имя части начинается со слова text, то это текстовый блок.
     !если имя части начинается со слова attach, то это вложение, формат задания::      !если имя части начинается со слова attach, то это вложение, формат задания::
         !$attach[$.format[!uue|Xbase64] $.value[DATA] $.file-name[user-file-name]]          !$attach[$.format[!uue|Xbase64] $.value[DATA] $.file-name[user-file-name]]
     !после имени части может идти целое число, части пойдут в порядке чисел.  
     !важно: при multipart не указывать content-type      !важно: при multipart не указывать content-type
         ^mail:send[          ^mail:send[
 #           по-умолчанию, совпадает с source encoding.  #           по-умолчанию, совпадает с source encoding.
Line 526  Xhashfile Line 607  Xhashfile
         возвращённый заголовок рассыпается на $поля          возвращённый заголовок рассыпается на $поля
         $status          $status
         $stderr          $stderr
     !^file::exec[имя файла[;env hash[;1cmd[;2line[;3ar[;4g[;5s;...under win32 max 10 args]]]]]]]      !^file::exec[имя файла[;env hash $.stdin[текст][;1cmd[;2line[;3ar[;4g[;5s;...under win32 max 10 args]]]]]]]
     !^file:move[старое имя файла;новое имя файла]       !^file:move[старое имя файла;новое имя файла] 
         можно переименовывать и двигать каталоги[win32: но не через границу дисков]          можно переименовывать и двигать каталоги[win32: но не через границу дисков]
         каталоги для dest создаются с правами 775          каталоги для dest создаются с правами 775
Line 537  Xhashfile Line 618  Xhashfile
         выполняется код          выполняется код
         разблокируется          разблокируется
     Xchmod[...] НЕТ И НЕ БУДЕТ, ЧТОБЫ НЕ МОГЛИ СДЕЛАТЬ executable и запустить, даже если ftp запрещает chmod.      Xchmod[...] НЕТ И НЕ БУДЕТ, ЧТОБЫ НЕ МОГЛИ СДЕЛАТЬ executable и запустить, даже если ftp запрещает chmod.
       !^file:dirname[/a/some.tar.gz]=/a
       !^file:dirname[/a/b/]=/a
       !^file:basename[/a/some.tar.gz]=some.tar.gz
       !^file:justname[/a/some.tar.gz]=some.tar
       !^file:justext[/a/some.tar.gz]=gz
   
 !math  math
     !$math:PI      !$math:PI
     !^math:round floor ceiling       !^math:round floor ceiling 
     !^math:trunc frac      !^math:trunc frac
Line 548  Xhashfile Line 634  Xhashfile
     !^math:degrees radians      !^math:degrees radians
     !^math:pow sqrt      !^math:pow sqrt
     !^math:random(ширина диапазона)      !^math:random(ширина диапазона)
       ^math:GUID {C2C0983C-E26E-4169-BD07-77ECE9405BA5}
       !^math:crypt[password;salt]
          salt prefix $apr1$ вызывает встроенный MD5 алгоритм, 
            если нет тела salt, оно создаётся случайным
          $1$ вызывает MD5 алгоритм функции OS 'crypt', если поддерживается [заведомо нет на solaris].
          другие salt читайте документацию по функции OS 'crypt'.
   
 !date  !date
     !время типа time можно использовать в выражениях, подставляет       !время типа time можно использовать в выражениях, подставляет 
         количество дней с epoch [1 января 1970 (UTC)], дробное          количество дней с epoch [1 января 1970 (UTC)], дробное
     !всё происходит в localtime,       !всё происходит в localtime, 
     !временная зона задаётся вне parser средствами OS      !временная зона задаётся вне parser средствами OS
       $date:UTC-offset  сколько дней надо прибавить,чтобы попасть в local время
       $date:TZ  наш часовой пояс, дробное, в часах (где-то есть с точностью до получаса)
     !^date::now[]      !^date::now[]
     !^date::now(смещение в днях) выдаёт сейчас+смещение      !^date::now(смещение в днях) выдаёт сейчас+смещение
     !^date::create(дней с epoch) // старое имя set      !^date::create(дней с epoch) // старое имя set
     !^date::create(year;month[;day[;hour[;minute[;second]]]]) // старое имя set      !^date::create(year;month[;day[;hour[;minute[;second]]]]) // старое имя set
     ^date::sql-create[дата в формате %Y-%m-%d %H:%M:%S]      !^date::create[дата в формате %Y-%m-%d %H:%M:%S]
         для удобного создания по значению из базы          для удобного создания по значению из базы
     !$date.year month day  hour minute second  weekday read-only              формат1: %Y[-%m[-%d[ %H[:%M[:%S]]]]]
           формат2: %H:%M[:%S]
       !$date.year month day  hour minute second  weekday yearday(0...) daylightsaving
           read-only
     !^date.roll[year|month|day](+-смещение) сдвигает дату      !^date.roll[year|month|day](+-смещение) сдвигает дату
     !^date.sql-string[] %Y-%m-%d %H:%M:%S      !^date.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           столбцы: 0..6, week, weekyear
     !^date:calendar[rus|eng;год;месяц;день] выдаёт именнованную таблицу      !^date:calendar[rus|eng;год;месяц;день] выдаёт именнованную таблицу
         столбцы: year, month, day, weekday          столбцы: year, month, day, weekday
           
Line 597  xdoc(xnode) Line 694  xdoc(xnode)
     !равно текущей кодировке выходной страницы,      !равно текущей кодировке выходной страницы,
         $response:charset          $response:charset
     ::sql{...}      ::sql{...}
     !::create{<string/>} старое имя 'set'      !::create[[URI]]{<?xml?><string/>} старое имя 'set'
     !::create[qualifiedName]      !::create[[URI]][qualifiedName]
         URI default = disk path to requested document
         для каталогов конечный / обязателен
     !::load[file.xml]      !::load[file.xml]
     !.transform[rules.xsl][[params hash]] выдаёт dom      !.transform[rules.xsl|xdoc][[params hash]] выдаёт dom
         шаблон кэшируется, кэш обновляется при изменении даты файла шаблона,          шаблон кэшируется, кэш обновляется при изменении даты файла шаблона,
         или изменении даты файла "имя шаблона.stamp"[проверка даты stamp приоритетнее]          или изменении даты файла "имя шаблона.stamp"[проверка даты stamp приоритетнее]
         <xsl:output          <xsl:output
Line 616  xdoc(xnode) Line 715  xdoc(xnode)
         !cdata-section-elements = qnames           !cdata-section-elements = qnames 
         !indent = "yes" | "no"          !indent = "yes" | "no"
         !media-type = string />           !media-type = string /> 
           !параметры передаются как есть, не xpath выражения
   
     !.string[output options]      !.string[[output options]]
     !.save[file.xml;output options] с шапкой      !.save[file.xml[;output options]] с шапкой
     !.file[output options] = file      !.file[[output options]] = file
         output options идентичны атрибутам xsl:output           output options идентичны атрибутам xsl:output 
             [исключение: игнорируется cdata-section-elements, нужно будет, сделаю]              [исключение: игнорируется cdata-section-elements, нужно будет, сделаю]
         выдаёт media-type при подстановке $response:body[сюда]          выдаёт media-type при подстановке $response:body[сюда]
Line 656  xdoc(xnode) Line 756  xdoc(xnode)
         true if the attribute received its value explicitly in the XML document,           true if the attribute received its value explicitly in the XML document, 
         or if a value was assigned programatically with the setValue function.          or if a value was assigned programatically with the setValue function.
         false if the attribute value came from the default value declared in the document's DTD.           false if the attribute value came from the default value declared in the document's DTD. 
       !$attribute_node.name
       !$attribute_node.value
     $text_node/cdata_node/comment_node.substringData      $text_node/cdata_node/comment_node.substringData
     !$pi_node.target = target of this processing instruction      !$pi_node.target = target of this processing instruction
         XML defines this as being the first token following the markup           XML defines this as being the first token following the markup 
         that begins the processing instruction.          that begins the processing instruction.
       !$pi_node.data = The content of this processing instruction
           This is from the first non white space character after the target 
           to the character immediately preceding the ?>. 
     document_node.      document_node.
         readonly attribute DocumentType doctype          readonly attribute DocumentType doctype
         readonly attribute DOMImplementation implementation              readonly attribute DOMImplementation implementation    
Line 686  xdoc(xnode) Line 791  xdoc(xnode)
     !void removeAttribute(in DOMString name) raises(DOMException)      !void removeAttribute(in DOMString name) raises(DOMException)
     !Attr getAttributeNode(in DOMString name)      !Attr getAttributeNode(in DOMString name)
     !Attr setAttributeNode(in Attr newAttr) raises(DOMException)      !Attr setAttributeNode(in Attr newAttr) raises(DOMException)
     !/*Attr*/ removeAttributeNode(in Attr oldAttr) raises(DOMException)      !Attr removeAttributeNode(in Attr oldAttr) raises(DOMException)
     !NodeList getElementsByTagName(in DOMString name)      !NodeList getElementsByTagName(in DOMString name)
     !void normalize()      !void normalize()
   
Line 699  xdoc(xnode) Line 804  xdoc(xnode)
     !^node.select[xpath/query/expression] = array of nodes,       !^node.select[xpath/query/expression] = array of nodes, 
         empty array if nothing found          empty array if nothing found
     !^node.selectSingle[xpath/query/expression] = first node if any      !^node.selectSingle[xpath/query/expression] = first node if any
     !^node.selectBool[xpath/query/expression] = bool if any      !^node.selectBool[xpath/query/expression] = bool if any or die
     !^node.selectNumber[xpath/query/expression] = double if any      !^node.selectNumber[xpath/query/expression] = double if any or die
     !^node.selectString[xpath/query/expression] = string if any      !^node.selectString[xpath/query/expression] = string if any or die
   
     !error codes(пока придут как текст в случае соответствующих ошибок):      !error codes(пока придут как текст в случае соответствующих ошибок):
         INDEX_SIZE_ERR          INDEX_SIZE_ERR
Line 783  xdoc(xnode) Line 888  xdoc(xnode)
     кучи auto.p и запрашиваемого документа:      кучи auto.p и запрашиваемого документа:
         !parser3.conf           !parser3.conf 
             cgi:               cgi: 
                 1. или полный путь из переменной окружения HTTP_PARSER_ROOT_CONFIG                  1. или полный путь из переменной окружения CGI_PARSER_SITE_CONFIG
                    или configure sysconfdir|windows directory   
                 2. или полный путь из переменной окружения HTTP_PARSER_SITE_CONFIG  
                    или рядом с бинарником parser'а                      или рядом с бинарником parser'а 
             isapi: windows directory              isapi: windows directory
             apache module:               apache module: 
                 1) ParserRootConfig [httpd.conf only]                   1) ParserConfig [can be in .htaccess]
                 2) ParserSiteConfig [can be in .htaccess]  
         !auto.p вниз от DOCUMENT_ROOT/ по дереву до каталога с обрабатываемым файлом включительно          !auto.p вниз от DOCUMENT_ROOT/ по дереву до каталога с обрабатываемым файлом включительно
     класс собирается из всех этих файлов, последующие становятся родителями предыдущих      класс собирается из всех этих файлов, последующие становятся родителями предыдущих
     имя последнего загруженного MAIN, имён у предыдущих нет      имя последнего загруженного MAIN, имён у предыдущих нет
Line 815  xdoc(xnode) Line 917  xdoc(xnode)
     !parser.runtime       ^if(0).                параметры (больше/меньше, чем нужно, не тех типов, ...)      !parser.runtime       ^if(0).                параметры (больше/меньше, чем нужно, не тех типов, ...)
     !number.zerodivision  ^eval(1/0) ^eval(1%0)      !number.zerodivision  ^eval(1/0) ^eval(1%0)
     !number.format        ^eval(abc*5)      !number.format        ^eval(abc*5)
       !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
     !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
       sql.duplicate
       sql.access
       sql.missing
       sql.xxx [serge asked]
     !xml                  ^xdoc::create{<forgot?>}                    any error in xml/xslt libs      !xml                  ^xdoc::create{<forgot?>}                    any error in xml/xslt libs
     !smtp.connect                                                     not found/timeout      !smtp.connect                                                     not found/timeout
     !smtp.execute                                                     communication error      !smtp.execute                                                     communication error
       !email.format         hren tam@null.ru                            wrong email format(bad chars/empty)
       !email.send           $MAIL.sendmail[/shit]                       sendmail not executable
       
 !нужно выключить русский apache: CharsetDisable on  !нужно выключить русский apache: CharsetDisable on
   
 !если в MAIN будет определён флаг $ORIGINS(1) то вместо обычного вывода страницы будет  !если в MAIN будет определён флаг $ORIGINS(1) то вместо обычного вывода страницы будет

Removed from v.1.31  
changed lines
  Added in v.1.80


E-mail: