parser

Новости

28 января 2021

Выпущена версия 3.4.6

В парсер встроен веб-сервер, активируется при запуске с опцией -p <номер порта> из командной строки. В режиме веб-сервера запросы обрабатываются методом main класса httpd, который добавлен в конфигурационный auto.p и в котором реализована логика работы веб-сервера.

Доступна 64-х битная версия парсера под Windows.

Метод определения размера изображений ^image::measure[] теперь поддерживает определение размера у файлов в форматах tiff, bmp, webp, а при указании опции $.video(true) еще и mp4 (mov).

В методе определения размера изображений ^image::measure[] добавились опции загрузки XMP и EXIF, $.xmp(true) и $.exif(true). Несовместимое изменение: по умолчанию EXIF теперь не загружается, поскольку это ресурсоемко.

Метод перевода чисел между системами исчисления ^math:convert[] теперь поддерживает произвольную разрядность чисел, возможно задание собственного алфавита, поддерживаются системы исчисления с основанием больше 16.

Методам перевода в base64 и обратно добавлены опции $.wrap(false) для удаления переносов строк, $.url-safe(true) для использования модифицированного алфавита (вместо «+» и «/» используются «-» и «_»).

Добавлен метод ^memory:auto-compact(N) для включения режима автоматической сборки мусора.

Добавлен метод ^table.rename[column name from;column name to] для переименовывания колонки или нескольких колонок.

С помощью опции $.http_version[2] можно указать curl протокол подключения к сайту.

Методу копирования файлов ^file:copy[] добавлена опция $.append(true), позволяющая дописать файл в конец другого файла.

Добавлен метод ^hash.select[key;value](bool-condition)[опции], аналогичный методу ^table.select[] и метод ^hash.reverse[], возвращающий хеш с элементами в обратном порядке.

Вызов ^table.hash[] поддерживается для неименованных таблиц, колонки без названий не игнорируются.

Методу получения даты на начало суток ^date::today(N)добавлен опциональный параметр для сдвига на произвольное число дней.

Методу получения GUID ^math:uuid[] добавлены опции $.lower(true) и $.solid(true) для получения GUID в нижнем регистре и исключения из результата «-».

В драйвере mysql реализована возможность последовательного подключения к нескольким серверам (в случае недоступности указанных первыми), для этого надо перечислить их в строке подключения, mysql://user:password@host1,host2,.../database.

В драйвере mysql добавлены опции подключения config_file и config_group для подключения my.cnf, реализована работа multi_statements.

Как давно сделано для хеша, пробельная строка теперь считается корректным аргументом для табличного параметра, эквивалентным пустой таблице.

При использовании совместно с fcgiwrap требуется задавать меньше переменных окружения.

Для больших файлов многократно ускорена работа $response:download[ $.file[file.name] ], корректно обрабатываются запросы на выдачу части файла (Range Requests).

Методу ^use[файл] можно указать опцию $.main(true) для загрузки auto.p, расположенных выше и в одной директории с файлом.

В конфигурационном методе @conf[] можно задать $LOCALS(true), чтобы все переменные по умолчанию были локальными.

^xdoc::create[] поддерживает разбор очень больших файлов (используется режим XML_PARSE_HUGE).

Проведена унификация исключений в SQL, теперь все они показывают запрос, который привел к ошибке.

Улучшена диагностика об ошибках методов ^curl:load[] и ^file::load[].

Обновлены используемые библиотеки: сборки мусора gc (8.0.4), регулярных выражений pcre (8.43), xml (2.9.9), xslt (1.1.34).

Существенно увеличено покрытие тестами исходного кода парсера.

Разбор приходящих писем (опция -m командной строки) поддерживает работу с библиотекой gmime версии 3.X.

Исправлен ряд ошибок:

В 32-х битном режиме поддерживается корректная работа с файлами размером более 4Gb.

Исправлено зацикливание при рекурсивном наследовании классов при использовании @autouse[].

Длинные почтовые заголовки теперь разделяются на несколько строк.

В Windows версии методы -f и -d теперь корректно работают с русскими именами файлов в UTF-8.

В Windows версии исправлена ошибка перемещения директорий, заканчивающихся на /.

Присвоение $result последним действием в методе больше не вызывает сбоя определения использование $result.

Вызовы ^return{code} и ^return(expre+ssion) работают корректно.

Длина сообщения в $exception.comment не ограничивается 1024 символами.

28 апреля 2017

Выпущена версия 3.4.5

Проведены оптимизации, ускорившие обращение к переменным, вывод результатов и обработку выражений. В тестах общее ускорение составляет до 15%.

Реализован вариант вызова ^reflection:create[ $.class[имя класса] $.constructor[имя конструктора] $.arguments[хеш аргументов] ], в котором поддерживается переменное количество аргументов.

Добавлен метод ^reflection:mixin[$source;options] для копирования полей и методов из одного класса в другой. По умолчанию копируется в класс, из которого вызван метод, можно поменять через $.to[куда]. Можно не копировать методы $.methods(false) или поля $.fields(false). Если при копировании нужно перезаписывать имеющиеся методы или поля, нужно указать $.overwrite(true).

C помощью нового метода ^reflection:stack[] появилась возможность во время выполнения кода посмотреть стек вызовов. В отличии от стека, который выводится при исключении, ^reflection:stack[] возвращает только методы на парсере, но зато есть возможность получить параметры $.args(true) и локальные переменные $.locals(true).

Скорректирована объектная модель. Теперь корректнее говорить не «объект является экземпляром класса», а «объект имеет прототипом класс». Различие только при работе со статическими свойствами класса из объекта. По аналогии с Java Script — при чтении $self.class_field происходит обращение к полю class_field в классе, а при записи $self.class_field[value] запись происходит в объект и последующие обращения к $self.class_field читают уже значение из объекта.

Появилась возможность эффективно работать с объектом, как с хешом, используя $h[^reflection:fields_reference[$o]]. Написать $h[^hash::create[$o]] можно было и раньше, но fields_reference создает не новый хеш с такими же ключами, как были поля в объекте, а специальный хеш-ссылку, напрямую связанный с объектом. Например при ^h.delete[name] в самом объекте удалится поле name.

Реализован оператор ^return[] (^return[результат]), осуществляющий выход из метода при его вызове.

У операторов ^break[] и ^continue[] добавился опциональный параметр с условием их выполнения. Теперь вместо ^if($condition){ ^break[] } можно писать ^break($condition).

Через синтаксис $method.name можно узнать имя метода.

Под Windows теперь используется Unicode API для работы с файлами, поэтому с русскими именами файлов можно работать не только в кодировке Windows-1251, но и в UTF-8.

Добавлено ограничение на размер загружаемых файлов (по умолчанию 512Мб). Под Windows обеспечена корректная работа ^file::stat[] с файлами размером более 4-х гигабайт.

Добавлен параметр $.from-charset[кодировка] в ^file::create[]. Теперь парсер можно использовать для перекодировки данных в любую сторону, а не только в указанную кодировку, как раньше.

С помощью ^hash.contains[_default] можно проверить, задано ли в хеше значение по умолчанию.

С ключом _default был связан тонкий момент — такое значение мог задать не только разработчик. Если ключи хеша принимаются из внешнего источника, то и пользователь мог передать _default, что могло бы привести к некорректной работе кода. Теперь же _default воспринимается только если его написать в коде на парсере.

Хеш, в котором задан только _default, теперь считается определенным (def $h).

Убрана блокировка хеша на запись при переборе его элементов.

Возможно создание хеша на основе свойств файла ^hash::create[$file].

Добавился вариант вызова ^reflection:method[$method;$object], при вызове результата $method будет работать в контексте $object ($self будет равен $object). Таким образом можно добавить или переопределить метод в конкретном объекте.

Добавился метод ^reflection:filename[class or object or method] для получения имени файла, в котором определен класс или метод.

Для получении информации о методе добавлена поддержка варианта вызова ^reflection:method_info[$junction].

С помощью нового метода ^reflection:tainting[$string] можно посмотреть, в преобразованиях какого вида нуждаются символы строки.

Результат ^reflection:methods[имя класса] теперь отсортирован в порядке, обратном порядку добавления методов. С помощью дополнительной опции $.reverse(false) можно задать прямой порядок.

При подключении модулей через @USE теперь вызывается оператор ^use[]. Его можно переопределить и реализовать свою логику загрузки модулей. Реализация на парсере используемой в самом парсере логики ^use[] выглядит так.

Добавлена опция $.encloser[] к ^table::create[] (аналогична существующей в ^table::load[]).

Обращение $строка.что-угодно допустимо (не вызывает исключение) не только у пустых, но и у пробельных строк.

При определении локальной переменной result включается оптимизация, удаляющая при компиляции все пробельные символы. Теперь в этом режиме можно использовать и непробельные символы — раньше это приводило к исключению, теперь же эти символы выводятся в результат.

При выводе даты в формате ISO 8601 (^date.iso-string[]) добавлены опции $.colon(true/false) для исключения двоеточия во временной зоне, $.ms(true) для добавления миллисекунд (всегда .000) и $.z(false) чтобы временная зона UTC записывалась как +00:00. При разборе даты теперь понимается формат временной зоны +hhmm.

При создании даты через конструктор с перечислением полей появился дополнительный параметром в котором можно указать временную зону.

Некоторые поля даты (year, month, day, hour, minute, second) можно менять, $date.year(2017).

В конфигурационном методе @conf[] можно задавать лимит итераций в циклах и максимальную глубину рекурсии. $LIMITS[ $.max_loop(20000) $.max_recoursion(1000) ] - значения по умолчанию.

При задании $response:status меньше 100 он будет возвращен в виде кода выхода процесса парсера.

Новая реализация $caller исправила некоторые ошибки и позволяет через $caller.method получить вызывающий метод.

При отправке писем (^mail:send[]) разделитель multipart частей сделан случайным, убран устаревший заголовок errors-to.

В методе ^table.hash[] можно динамически задавать не только ключ, но и значение ^table.hash{...;...}

^curl:load[] по аналогии с ^file::load[] возвращает хеш tables с таблицами всех заголовков.

Исправлен ряд ошибок:

Теперь в ^file::exec[] можно корректно передать бинарный файл в качестве $.stdin.

При вызове ^curl:load[] значение content-type по умолчанию теперь берется из заголовков ответа.

Увеличен стек в Windows версии, в некоторых случаях бесконечной рекурсии его не хватало.

Новая реализация обращения к базовым классам (^BASE:method[]) быстрее и лишена ошибок старой реализации.

Исправлены ошибки, приводившие к неполному выполнению кода finally и наоборот выполнению лишнего кода после вызова ^break[].

Исправлена ошибка, в результате которой обращение к $date.week меняло дату.

Исправлена некорректная обработка null значений в драйвере SQLite.

28 апреля 2016

Открылась обновленная версия сайта

Ко дню четырнадцатилетия «Парсера» открылась обновленная версия сайта. Заработал раздел «Библиотека», в котором по тегам сгруппированы готовые решения различных задач. У зарегистрированных пользователей появилась возможность самостоятельно добавлять свои сайты в раздел «В действии».
18 ноября 2015
Выпущена версия 3.4.4

Расширен диапазон дат, поддерживаемых классом date. Поддерживаются даты от 0000-00-00 00:00:00 до 9999-12-31 23:59:59.

Реализовано редактирование таблиц. Теперь можно изменить значение ячейки и вставить строку ($t.name[value] и ^t.insert{row}).

При добавлении строки в таблицу можно задать ее в виде хеша ^таблица.append[ $.a[строка] $.b[строка] ].

В таблице и хеше реализован приоритет поиска метода при вызове метода (^таблица.count[]), при обращению к полю ($таблица.count) методы не возвращаются в принципе. Ранее независимо от способа обращения в таблице был приоритет метода, а в хеше приоритет поля, что приводило к проблемам например если в хеше был ключ foreach.

В класс hash добавлены методы ^хеш.keys[], ^хеш.count[], ^хеш.at[...] в дополнение к существующим методам, начинающимся с _.

Классом date поддерживается подмножество формата ISO 8601, можно работать с датами в любой временной зоне (^date::create[2015-09-08T18:24:52+03:00]).

Добавлена возможность задания временной зоны по умолчанию, например если время сервера отличается от времени сайта, ^date:roll[TZ;MSK-3].

Расширен c 32 до 64 бит поддерживаемый диапазон чисел в функции ^math:convert[] и при записи числа в шестнадцатеричном виде (0XNN).

Реализована поддержка IDNA (кириллических доменов), как при загрузке файлов по HTTP, так и в виде отдельных методов кодирования и декодирования (^строка.idna[] и ^string:idna[закодированная строка]).

Добавлены методы для работы с DNS: ^inet:name2ip[name; $.ipv[4|6|any] $.table(true) ] для прямого преобразования имени в адрес и ^inet:ip2name[ip; $.ipv[4|6|any] ] для обратного преобразования.

Оптимизированы обращения $var.CLASS, $var.CLASS_NAME, они теперь обрабатываются на этапе компиляции.

Добавлен метод сортировки хеша по строке ^хеш.sort[key;value]{string-key-maker}[[asc|desc]] или числу ^хеш.sort[key;value](numeric-key-maker)[[asc|desc]].

^hash.delete[] (без параметров) очищает существующий хеш.

Добавлены $request:headers, $request:method, $request:поле (ранее эту информацию нужно было получать через $env).

Можно удалить заголовок в $response:fields, задав ему пустое значение.

Добавлена поддержка HTTP метода PUT.

Добавлен метод ^curl:info[...], выдающий информацию о последнем запросе.

При вызове ^file::load[...] можно явно задать $.response-charset (если сервис выдает некорректную кодировку).

Теперь ^строка.left(-1) выдает всю строку.

Поддерживается вызов ^строка.trim[набор], эквивалентный вызову ^строка.trim[both;набор].

^string:js-unescape[...] теперь возвращает «грязную» строку.

Добавлен метод ^string:unescape[[js|url];закодированное1; $.charset[кодировка] ]].

При вызове ^json:string[...] в параметре $._default можно передать имя метода, и при сериализации объектов будет вызываться метод объекта с таким именем.

При вызове ^json:string[...] можно задать способ выдачи неопределенных значений: в виде пустой строки ($.void[string]) или как null ($.void[null], по умолчанию).

Улучшена обработка ошибок ^json:parse[...], теперь в исключении показывается проблемный фрагмент, для частых ошибок сделаны отдельные сообщения.

При вызове ^json:parse[...] можно отключить преобразование целых чисел в числа, оставив их строками $.int(false).

Добавлен метод ^reflection:def[class;name] для проверки класса на существование.

Добавлен метод ^reflection:class_by_name[class_name] для получения класса по имени.

Добавлен метод ^reflection:is[element_name;class_name], расширяющий функциональность оператора is и позволяющий определить, является ли $element_name кодом.

^таблица.count[columns] работает и для неименованных таблиц.

^хеш.at[...] может возвращать не только значение, но и ключ, и пару ключ-значение.

Переменные класса double не могут принимать значения NaN и Inf, вычисление ^math:sqrt(-1) приведет к исключению.

Исключения компиляции кода унифицированы по структуре с исключениями выполнении кода.

Обновлены библиотеки сборки мусора libgc с версии 7.2d до 7.2f и регулярных выражений pcre с версии 8.33 до 8.37.

В Windows версии увеличен лимит памяти в libgc и при ошибках больше не выскакивает окно с сообщением.

Исправлен ряд ошибок:

Исправлена ошибка, приводившая к некорректной обработке чисел, начинавшихся с 0.

При сериализации в json символы \u2028 and \u2029 (разделитель строки/абзаца) теперь корректно экранируются.

Исправлена ошибка, иногда приводившая к исключению при перекодировании пустого параметра.

Исправлена ошибка, приводившая к исключению при передаче пустого хеша в случае ^table::create[$таблица;^hash::create[]].

Исправлена ошибка, приводившая к неполной смене языковых переменных при установке mysql соединения с параметром ?charset.

Исправлена ошибка, иногда приводившая к некорректной сериализации объектов типов, указанных в параметрах ^json:string.

Исправлена ошибка, иногда приводившая к исключению «can’t set base while appending methods to class» при компиляции.

Исправлена работа с грязными данными в присваивании значения xml-узла ($node.nodeValue[^taint[&]test]).

Исправлена ошибка, из-за которой @GET[def] всегда возвращал истину.

Исправлена перекодировка почтовых заголовков в $mail:received.

Исправлена ошибка, приводившая к core если @GET_DEFAULT[] возвращал код.

Исправлена ошибка, в определенных случаях приводившая к исключению при выдаче исключения. :)

Добавлена проверка на пустоту ключей хеш-файла.

Исправлена ошибка, приводившая к исключению при вызове ^json:string($double).

Данные в $mail:received теперь считаются «грязными».

Исправлена ошибка, из-за которой не выдавались исключения при обращении к несуществующим полям класса mail.

Исправлена ошибка вычисления временной зоны в $mail:received.date.

Исправлена ошибка, приводившая к смене имени файла в заголовке Content-Disposition: в новой версии GCC.

Исправлена ошибка, из-за которой не обрабатывались исключения в ^cache[some](0).

Исправлена ошибка, из-за которой не находились директории в файловой системе xfs.

Исправлена ошибка, приводившая к core при сериализации объектов, не имеющих хеш-представления.

Исправлена ошибка, из-за которой ^string:base64[] возвращал «c3RyaW5n».

Исправлена ошибка, из-за которой удалялся BOM-код UTF-8 из файлов, загружаемых в другой кодировке.

27 октября 2015
Выпущена версия 3.4.4 RC

Полный лог изменений доступен в CVS.

01 ноября 2013
Выпущена версия 3.4.3

Классу curl добавлена новая опция: $.ipresolve(0|1|2). Кроме этого, теперь по умолчанию curl использует IPv4(1), а не IPv6(2).

При загрузке файла с помощью ^curl:load[] теперь производится разбор всех полученных от удалённого сервера cookies и помещение их в таблицу .cookies со столбцами name, value, expires, max-age, domain, path, httponly и secure.

Появилась возможность получить список всех переменных окружения сервера с помощью $env:fields.

Необязательный второй параметр статическому методу ^file:list[] теперь может быть указан в виде строки с регулярным выражением, объекта класса regex или хеша. В последнем случае фильтр задаётся в виде $.filter[строка или объект класса regex].

Статический метод ^file:list[] теперь возвращает таблицу, где кроме столбца name также присутствуют столбцы dir, size, cdate, mdate и adate. Значения для name и dir возвращаются всегда (в столбце dir значение 1 означает, что запись является каталогом, 0 — файлом). Для получения информации о размере файлов и их датах, необходимо вызывать метод с опцией $.stat(true).

У статического метода ^file:delete[] с помощью опции $.exception(false) теперь можно подавить выдачу исключения (exception) при невозможности удалить файл.

Статическим методам ^file:delete[] и ^file:move[] были добавлены опции $.keep-empty-dirs(true) с помощью которых можно запретить парсеру удалять пустые каталоги.

Конструктор ^file::load[] теперь принимает опцию $.response-charset[] с помощью которой можно принудительно указать кодировку данных удалённого сервера (некоторые сервера возвращают данные не в той кодировке, которую они сообщают в HTTP заголовке ответа).

Статический метод ^json:string[] опцию $.indent теперь принимает как в виде логического значения (true/false), так и в виде предопределённой пользователем строки.

Статический метод ^json:string[] теперь все символы в диапазоне 0×01-0×1F (кроме специальных управляющих символов \b \f \n \r \t) выводит в виде \u00XX.

Добавлен статический метод ^math:digest[md5|sha1|sha256|sha512;строка или файл; $.format[hex|base64] $.hmac[ключ]].

Классу memcached добавлен метод ^memcached.release[], закрывающий соединение с сервером.

Статический метод ^reflection:method_info[] для методов пользовательских классов теперь также возвращает информацию о допустимом типе вызов ($.call_type), максимальном количестве принимаемых параметров ($.max_params) и имя переменной в которую метод принимает произвольное количество параметров ($.extra_param).

Классу table добавлен метод ^таблица.csv-string[[nameless;] $.encloser["] $.separator[,] ] который функционально аналогичен методу ^таблица.save[].

Классу table добавлен метод ^таблица.foreach[rownum;value]{code}[[separator]] который функционально аналогичен методу ^хеш.foreach[]. В переменную, указанную в поле value, помещается ссылка ту же самую таблица, но с изменённой текущей позицией строки.

При загрузке класса с именем, которое уже существует у одного из загруженных классов, теперь по умолчанию выдаётся исключение (exception). Отключить его можно с помощью указания опции $.replace(true) у ^use[] и ^process{}

@SET_DEFAULT и @GET_DEFAULT теперь работают и со статическими классами.

Вещественные числа теперь по умолчанию выводятся с большей точностью (16 знаков против 5).

Восстановлена работоспособность приема почты парсером.

Оптимизированы методы ^строка.int[], ^строка.double[] и ^строка.bool[].

SQL драйвер Oracle теперь устанавливает переменные окружения до загрузки клиентской библиотеки.

SQL драйверу PgSQL добавлена новая опция standard_conforming_strings=1, с помощью которой можно отключить эскейпинг символа ’\’ для соответствия SQL стандартам.

Библиотека разбора JSON заменена на вариант с GPL лицензией.

Версия скомпонована с последними версиями библиотек GC (7.2d), PCRE (8.33), libxml2 (2.9.1) и libxslt (1.1.28).

Переработан процесс сборки под *nix. Теперь нужно использовать buildall вместо buildall-with/without-xml.

При сборке под windows библиотеки , libxml2 и libxslt теперь линкуются статически. Это означает, что для запуска нужен только exe файл и драйвера для SQL серверов.

Сделано некоторое количество внутренних улучшений.

Исправлен ряд ошибок:

Исправлена ошибка, приводящая к core при задании только одного параметра у ^таблица.locate[], если он не был выражением.

Исправлена ошибка, из-за которой некорректно происходило заполнение таблицы $.cookies[] при ^file::load[http://...], что в свою очередь могло приводить к core, например, при попытке сохранить эту таблицу.

Исправлена ошибка, из-за которой не вызывались сеттеры значений у автоматически создаваемых переменных в методах foreach и match.

Исправлена ошибка, возникающая при указании в качестве параметра у ^table::load[] директории.

Исправлена ошибка, из-за которой выполнение ^date::create(0) приводило к исключению.

Исправлено задание $.content-type при выдаче файлов без имени.

Исправлена ошибка, из-за которой методу ^изображение.font[] невозможно было передать ширину пробела из переменной.

Исправлена ошибка, иногда возникающая при работе с junction.

29 июня 2012
Выпущена версия 3.4.2
Выложенная ранее RC версия объявлена релизом.

Также обновлены все SQL драйвера (версия API осталась прежней, т.е. старые драйвера будут продолжать работать), документация, библиотеки xml (для win32 версии) и архив с конфигурационным файлом.

Полный лог изменений доступен в CVS.

23 июня 2012
Выпущен релиз кандидат версии 3.4.2
Классу curl добавлено три новые опции: verbose, stderr и maxfilesize.

Добавлен конструктор ^date::today[], создающий объект типа date на 00:00:00 текущего дня.

Метод ^дата.sql-string[] теперь может принимать один из следующих строковых параметров: «datetime», «date» или «time». В зависимости от параметра вызова он возвращает дату+время, только дату или только время.

Конструктор ^file::create[...] теперь поддерживает binary формат.

Добавлен новый формат вызова конструктора ^file::create[]: ^file::create[строка или файл[;$.name[имя файла] $.mode[text|binary] $.content-type[...] $.charset[...]]].

При выполнении конструктора ^file::create[text;...;содержимое] выполняется нормализация переводов строк в «содержимом». При создании файлов binary нормализация не делается.

Методы ^file:dirname[путь], ^file:basename[путь], ^file:justname[путь] и ^file:justext[путь] теперь корректно обрабатывают пути в формате Windows.

Методы ^file:dirname[путь] и ^file:basename[путь] теперь работают как одноимённые команды *nix.

Конструктор ^file::load[...;http://...] разбирает все полученные от удалённого сервера cookies и помещает их в таблицу .cookies со столбцами name, value, expires, max-age, domain, path, httponly и secure.

Конструктор ^file::base64[закодированное;опции] и метод ^string:base64[закодированное;опции] теперь имеют опцию $.strict(true), при задании которой происходит выдача исключения, если невозможно декодирование всей закодированной строки. Без указания этой опции, как и раньше, возвращается лишь то, что было возможно декодировать.

Снижено потребление памяти при декодировании base64 строки с помощью конструктора ^file::base64[закодированное] и метода ^string:base64[закодированное].

В теле метода ^хеш.foreach обращение к некоторым методам итерируемого хеша (таким как ^хеш._count[], ^хеш._keys[], ^хеш.contains[ключ], ^хеш._at[...]) теперь не приводит к возникновению исключений «hash flocked».

Метод ^json:string[объект;опции] теперь производит поиск методов сериализации, указанных с помощью опций вида $.имя-класса[$метод] также и в родительских классах.

Метод ^json:string[объект;опции] теперь умеет сериализовывать объекты класса xdoc. Параметры преобразования объекта в строку могут быть переданы с помощью опции $.xdoc[].

Метод ^json:string[объект;опции] в качестве значений опции $.file[] в дополнение к значениям text и base64 позволяет задать значение stat, которое равносильно отсутствию опции (способ сериализации файла «по умолчанию»).

Методу ^json:string[объект;опции] теперь с помощью опции $._default[$метод] можно указать пользовательский метод, который будет вызываться для сериализации объектов всех пользовательских классов (кроме тех, для которых метод сериализации явно задан с помощью опций вида $.имя-класса[$метод]).

Методу ^json:parse[json-строка;опции] теперь с помощью опции $.array[$метод] можно указать пользовательский метод, который будет вызываться для разбора массивов.

Методу ^json:parse[json-строка;опции] теперь с помощью опции $.taint[язык преобразования] можно указать «язык», который будет присвоен всем строкам результирующего хеша.

После выполнения метода ^json:parse[json-строка;опции] в результирующем хеше все числовые значения теперь представлены в виде double (double имеет более широкий диапазон, чем используемый ранее для целых чисел int).

Расширен диапазон обрабатываемых значений методом ^math:convert[...]. Кроме этого, при возникновении переполнения (при указании очень больших чисел) теперь возникает исключение.

Появилась встроенная поддержка работы с серверами memcached, реализованная с использованием библиотеки libmemcached.

Добавлен метод ^reflection:uid[объект], возвращающий уникальный идентификатор объекта.

Добавлен метод ^reflection:delete[объект или класс;имя поля], с помощью которого можно удалить поле у указанного объекта или класса (действует аналогично ^хеш.delete[ключ], но для объектов и классов).

Добавлены методы ^reflection:method[класс или объект;имя метода] и ^reflection:field[класс или объект;имя поля] с помощью которых можно получить метод или значение поля у указанного объекта или класса.

При работе метода ^строка.match[] в кодировке UTF8 символьные классы \w и т.п. теперь также включают в себя unicode properties (раньше включали в себя только ASCII символы).

Метод ^строка.replace[...] теперь может быть вызван с двумя строковыми параметрами: «что искать» и «на что заменить». Подобный вариант вызова (как и вариант вызова, когда в таблице замен указана только одна пара для замены) дополнительно оптимизирован.

Метод ^таблица.count[] теперь поддерживает опции. При задании строкового значения columns будет возвращено количество строк в именованной таблице (равносильно следующему: $c[^таблица.columns[]]^c.count[]), cells — будет возвращено количество ячеек в текущей строке таблицы, rows — метод вернёт количество строк в таблице (равносильно вызову без параметров).

Метод ^таблица.select(выражение)[опции] теперь может принимать отрицательные значения в опции $.offset. В этом случае отсчёт целевой строки ведётся с конца таблицы и значение −1 соответствует последней строке.

Добавлена валидация входных параметров в следующих DOM-методах: createElement, createElementNS, createAttribute, createAttributeNS, createEntityReference, getAttribute, getAttributeNS, setAttribute, setAttributeNS, removeAttribute, removeAttributeNS, getAttributeNode, getAttributeNodeNS, hasAttribute, hasAttributeNS, getElementById, getElementsByTagName, getElementsByTagNameNS.

Методу ^xdoc.file[опции] добавлена новая опция $.name[имя файла].

Методам ^xdoc.string[опции] и ^xdoc.file[опции] добавлена опция $.charset[], выполняющая те же самые функции, что и уже имеющаяся опция $.encoding[]. Вы не можете, однако, указывать две эти опции одновременно.

Если у ^switch или ^case указано значение типа bool, то их значения сравниваются сравниваются как bool (раньше сравнивались как double).

Исключения при выполнении операторов ^break[] и ^continue[] вне цикла теперь имеют тип «parser.break» и «parser.continue» соответственно (было: «parser.runtime»).

В конфигурационном методе (@conf[]) класса MAIN можно указать $STRICT-VARS(true), после чего обращение к неинициализированным переменным будет приводить к исключению.

Преобразование данных вида file-spec теперь не трогает символ «&apos;» (апостроф) (раньше он преобразовывался в «_26»).

MySQL драйверу добавлена новая опция local_infile=1, с помощью которой можно включить поддержку LOAD DATA LOCAL из клиентской библиотеки, если MySQL сервер был собран без указания опции —enable-local-infile (подробности).

Версия скомпонована с последними версиями библиотек PCRE (8.30) и libxml2 (2.8.0).


Исправлен ряд ошибок:

При выполнении ^empty.split[...] возвращается таблица с одной пустой ячейкой.

В HTTP заголовке content-disposition имя файла теперь заключается в кавычки.

Запись пустого $request:post-body на диск теперь не приводит к исключению «saving stat-ed file».

При выполнении $t[^table::create{$empty}] теперь создаётся именованная пустая таблица с одним пустым столбцом.

Раньше выполнение ^число.div(0) и ^число.mod(0) не вызывало исключений.

Если в классе присутствует setter (@SET_name[]) и default getter (@GET_DEFAULT[]), то при обращении к свойству $name не возникает исключения «property has no getter method», а происходит выполнение default getter-а.

Исправлена ошибка, возникающая иногда при работе с partial классами.

Исправлена ошибка, из-за которой не всегда корректно проверялось допустимое количество параметров у пользовательских методов.

24 февраля 2011
Выпущена версия 3.4.1

Появилась встроенная поддержка json.

На UNIX появилась возможность собрать Parser с поддержкой библиотеки curl (через которую можно работать с https серверами и устанавливать keep-alive соединения).

Подключаемые через @USE/^use[] классы сначала ищутся относительно текущего файла, в котором эти @USE/^use[] написаны.

Теперь определяемые пользователем методы могут принимать произвольное число параметров: @method[arg;*args] (в переменной $args будет хеш со всеми параметрами с числовыми ключами начинающимися с 0).

Пользовательским методам теперь можно определять допустимые типы их вызова. В директиве @OPTIONS можно указать параметр dynamic или static (если не указано — any), который будет действовать на все методы, описываемые в файле. А определённым методам можно задать только статический тип вызова: @static:method[params].

У пользовательских классов можно определить default setter (@SET_DEFAULT[name;value]) — метод, который будет вызываться при записи в несуществующие поля объектов данного класса.

Оператор if теперь может иметь произвольное число «elseif» секций, например: ^if(a>0){1}(a==0){0}{-1}.

У классов теперь отключено наследование метода @auto[]. Если класс A имеет производные классы B и C, то описанный в нём метод auto в любом случае будет выполнен лишь единожды (раньше он выполнялся при подключении каждого из классов).

Класс void теперь полностью совместим с классом string, т.е. теперь можно вызывать функции строки у неопределённой переменной не проверяя её предварительно на определённость (def).

У класса hash появился метод ^хеш._at($index) (или ^хеш._at[first|last]), который можно использовать для доступа к элементу хеша с нужным индексом (элементы в хеше упорядочены начиная с версии 3.4.0).

Добавлен оператор ^apply-taint[[lang]][...], который приводит к сиюминутному преобразованию всех языковых кусочков в строке. Указанный язык (по умолчанию — as-is) применяется к грязным кусочком с неопределённым языком.

Появился метод для конвертирования чисел из одной системы исчисления в другую: ^math:convert[number](base-from;base-to).

Метод ^таблица.select(...)[опции] теперь понимает опции $.limit(X) и $.reverse(true|false).

У метода поиска и замены в строке ^строка.match[...] появился необязательный четвёртый параметр, значение которого возвращается, если не было найдено совпадений с шаблоном.

Парсер теперь ругается на неизвестные ключи у метода ^строка.match[...].

Метод ^string:js-unescape[...] теперь также декодирует символы, закодированные в виде \uXXXX (раньше декодировал только %uXXXX).

У конструктора ^file::base64[закодированное] теперь есть ещё один способ вызова (по параметрам больше похожий на ^file::create[...]): ^file::base64[text|binary;имя файла;закодированное[;$.content-type[...]]].

Конструктор ^file::create[...] в опциях теперь понимает параметр $.content-type[...].

Добавлен метод ^reflection:copy[$src;$dest], который осуществляет копирование всех полей из $src в $dest.

Если при загрузке таблицы из файла в опциях $.encloser или $.separator задано значение ’#’, то отключается удаление в загружаемом файле строк, начинающихся с этого символа (обычно они автоматически удаляются как комментарии).

Теперь пробельные символы, написанные в коде между методами, не попадают в результат.

В @МЕТАКОМАНДАХ (@USE, @CLASS, @BASE, @OPTIONS) теперь игнорируются пробельные символы в конце строк.

Небезопасная версия (grpunlim) теперь позволяет передавать скриптам, запускаемым через ^file::exec/cgi[...], переменные окружения с любыми именами.

У метода ^изображение.replace(color;color)[poligon] третий параметр теперь не является обязательным. Если он не задан, то цвет заменяется у всего изображения.

Если при загрузке текстовых файлов или таблиц без опции $.charset у загружаемого файла обнаруживается BOM-код, то автоматически происходит его перекодирование из UTF-8 в текущую кодировку ($request:charset).

Теперь метод ^reflection:method_info[класс;метод] в поле $.inherited возвращает имя того класса-предка, в котором находится реально вызываемый унаследованный метод.

Теперь метод ^reflection:method_info[класс;метод] в поле $.overridden возвращает имя класса-предка, в котором находится последний перекрытый метод.

Тело HTTP-запроса в виде файла теперь можно получить из $request:post-body.

Версия скомпонована с последними версиями библиотек PCRE (8.12) и libxml2 (2.7.8).

Исправлен ряд ошибок:

Теперь при вызове ^file::exec/cgi[...;parser3.cgi] без параметров не происходит зацикливания.

Исправлена ошибка, приводящая на некоторых системах к искажению данных.

Исправлена ошибка, из-за которой не работало обращение к $method-junction.CLASS_NAME.

Исправлена ошибка, из-за которой выдавалось невразумительное сообщение об ошибке при записи cookie со слишком большим значением expires.

При выдаче исключений иногда сообщалось «element can not be stored to stateless_class», хотя вместо «stateless_class» должен был указываться конкретный класс.

Исправлена ошибка, приводящая к core при отправке бинарных файлов удалённому серверу в конструкторе ^file::load[...;http://сервер/;$.file[$file]].

Исправлена ошибка, приводящая к core в случае сборки парсера некоторыми компиляторами.

Исправлена ошибка, приводящая к core, если в строках оказывались символы \0 (добиться такого было сложно, но всё-таки можно).

Исправлена ошибка, из-за которой метод ^таблица.locate[field;value] не понимал третий параметр с опциями.

Исправлена ошибка, из-за которой порядок элементов в $form:fields не был определён.

Исправлена ошибка, из-за которой в заголовках отправляемых писем иногда делался избыточный эскейпинг строчных латинских символов (проблем с чтением таких писем не возникало, но их размер получался больше, чем необходимо).

Исправлена ошибка, из-за которой оператор ^sleep(...) понимал только целочисленные значения.

В библиотеке PCRE исправлена ошибка, из-за которой неверно производился поиск заглавной буквы ’Ф’ без учёта регистра.

17 ноября 2009
Выпущена версия 3.4.0

Parser3 теперь собирается и работает как 64-битное приложение (внимание, при этом расходуется больше памяти, т.е. мы продолжаем рекомендовать пользоваться 32-битной версией, если установлены библиотеки поддержки выполнения 32-битных приложений).

Сделано большое количество оптимизаций. Теперь без использования ^memory:compact[] потребление памяти существенно уменьшено, а скорость выполнения увеличена.

У метода @GET[] теперь можно указать один параметр, через который методу будет доступен контекст обращения к объекту. Благодаря этому внутри данного метода можно будет определить контекст, в котором происходит обращение к объекту и выдать соответствующее значение. Например, можно будет отличить, когда объект запрашивается в скалярном числовом контексте (expression), когда в bool-контексте, когда объект проверяется на def, когда от него хотят получить хеш, таблицу или файл.

Больше нельзя создать пользовательский класс, являющийся потомком системного класса. Это не так страшно как может показаться, т.к. во первых далеко не всё можно было реализовать, унаследовавшись от системного класса, а во вторых, используя возможности, предоставляемые теперь свойствами @GET_DEFAULT[] и @GET[] легко сэмулировать наследование от системного класса (в документацию добавлен пример создания класса с функционалом, аналогичным классу table). Внимание, это несовместимое с предыдущей версией изменение. Если вы наследовались от системных классов, вам придётся переделать это.

Каждый метод должен будет или возвращать результат через $result во всех вариантах своего выполнения или не использовать $result вовсе. Внимание, это несовместимое с предыдущей версией изменение и вам необходимо исправить ваш код.

Все регулярные выражения теперь автоматически подвергаются дополнительной обработке (pcre_study), что в некоторых случаях обеспечивает существенный прирост в скорости поиска по шаблону.

Добавлен класс regex. С его помощью можно создавать объект-шаблон и использовать его многократно в ^строка.match[шаблон;...] или ^file:list[...;шаблон], что исключает повторную его компиляцию.

Добавлен статический класс reflection. С помощью его методов стало возможно получать информацию о классах (системных и пользовательских) и их методах. Например, можно получить: базовый класс объекта или класса, список всех классов, список статических полей класса, список динамических полей объекта, список всех методов определённого класса, список переменных метода пользовательского класса или минимально необходимое и максимально допустимое число параметров метода системного класса, узнать как вызывается метод (динамически или статически).

При загрузке файлов по HTTP с помощью конструктора ^file::load[...;http://...] теперь можно отправлять удалённому серверу файлы, для чего нужно воспользоваться добавленной опцией $.enctype[multipart/form-data] (Elik прислал patch).

Значение параметра $.method[] при загрузке файлов по HTTP с помощью конструктора ^file::load[...;http://...] теперь не чувствительно к регистру (раньше его необходимо было задавать только в верхнем регистре).

Hash теперь помнит порядок добавления в него элементов, при этом ^хеш.foreach[...]{...} перебирает элементы в этом порядке, а ^хеш._keys[...] возвращает таблицу с ключами, расположенными в том-же порядке.

При base64-декодировании в строку теперь делается проверка и, в случае обнаружения недопустимых символов в результате, выдаётся исключение (с рекомендацией декодировать в file).

Теперь производится нормализация символов перевода строки после base64-декодирования в строку.

В таблицу taint-преобразований для типа js добавлено преобразование символа с кодом \x0D в \r.

Добавлен новый вид taint-преобразований parser-code, который может быть использован для экранирования всех служебных символов с помощью символа ^.

Тело оператора ^process{...} теперь подвергается автоматическому преобразованию ^untaint[parser-code]{...}. Это несовместимое с предыдущей версией изменение: если в вашем коде в process подставлялись строки, полученные из неблагонадёжных источников (из файла, базы данных, form и т.п.) и ожидалось, код в них выполнится, то для того, чтобы всё продолжало работать, вам необходимо написать ^process{^untaint[as-is]{...}}.

В ^file:list[...] и ^строка.match[...] шаблон-регулярное выражение теперь подвергается автоматическому преобразованию ^untaint[regex]{...}. Это несовместимое с предыдущей версией изменение: если в упомянутых методах в шаблоны у вас подставлялись строки, полученные из неблагонадёжных источников (из файла, базы данных, form и т.п.), то для того, чтобы всё продолжало работать, вам необходимо вокруг подобных шаблонов написать ^untaint[as-is]{...}. Если регулярные выражения были написаны вами прямо в коде, то вам не о чем беспокоиться, т.к. всё будет продолжать работать.

Третий параметр у метода ^строка.match[...] теперь может быть задан не только в виде кода, но и в виде строки. Это работает несколько быстрее и может быть полезно в случаях, когда все найденные по шаблону вхождения нужно заменить одной и той-же строкой или просто выкусить.

Оператор ^rem{...} теперь может иметь произвольное число «параметров», и он исключается из кода на этапе компиляции. Это несовместимое с предыдущей версией изменение: если кто-то создавал свой метод/оператор с таким именем, то его необходимо переименовать, т.к. вызываться он не будет.

При записи в хешфайл, в случае превышения длины записи (ключ+значение), теперь выдаётся более внятное сообщение об ошибке.

У конструктора create класса file добавлен необязательный третий параметр, в котором с помощью опции $.charset[кодировка] можно указать кодировку букв в создаваемом объекте.

У объектов класса file, созданных с помощью конструкторов ^file::create[...], ^file::load[...] и ^file::exec/cgi[...] доступно новое поле mode, содержащее text или binary.

У nameless таблиц теперь также можно получать содержимое текущей строки в виде хеша.

У метода ^изображение.font[...] третий параметр стал не обязательным (значение ширины пробела по умолчанию теперь равно ширине gif-а). Кроме того, третий параметр теперь может быть задан в виде хеша со следующими опциями: $.space(ширина пробела), $.width(ширина букв), $.spacing(расстояние между символами).

Теперь не обязательно, чтобы конструктор был описан непосредственно у используемого класса. Достаточно, чтобы он был описан у любого предка класса.

Обращения к несуществующим классам теперь предваряются выполнением оператора @autouse[name], внутри которого можно осуществить отложенную загрузку класса.

У метода ^файл.save[mode;filespec] добавился третий хеш-параметр с опцией $.charset[...], с помощью которой можно указать кодировку, в которой необходимо сохранить файл.

У метода ^строка.save[filespec] появилась возможность в качестве второго параметра указывать хеш с опциями $.charset[...] и $.append(true).

Все имена заголовков отправляемых писем, выдаваемых браузеру HTTP-заголовков (системных и пользовательских), а также HTTP-заголовков, выдаваемых при загрузке файла с удалённого сервера, теперь подвергаются капитализации (content-type превращается в Content-Type и т.п).

Файлы, отправляемые по почте с помощью ^mail:send[], теперь по умолчанию подвергаются base64 кодированию вместо uue. Старый способ кодирования остаётся доступен с использованием опции $.format[uue].

При base64 и uue-кодировании файлов теперь расходуется меньше памяти.

В SAFE MODE при записи файлов теперь принудительно сбрасываются биты executable.

Версия скомпонована с последними версиями библиотек GC (7.1), PCRE (7.9), libxml2 (2.7.6) и libxslt (1.1.26).

Появился оператор ^taint-implode[lang]{строка}, который выполняет преобразования, заданные языками в строке.

Теперь перед выгрузкой MySQL драйвера производится вызов метода mysql_server_end. Отсутствие вызова этого метода при использовании последних версий клиентской библиотеки приводило на некоторых системах к появлению сообщений об ошибке в error.log или к «тормозам» при генерации страницы, содержащей даже примитивные SQL запросы.

У пользовательских классов можно определить default setter (@SET_DEFAULT[name;value]) — метод, который будет вызываться при записи в несуществующие поля класса или в несуществующие поля объектов данного класса. Во входящие переменные метода передаются: имя поля, в которое была попытка записи и записываемое значение.

Исправлен ряд ошибок:

Исправлена ошибка, из-за которой у конструктора ^file::load[...] было невозможно использовать одновременно четыре параметра, описанные в документации.

Исправлена ошибка некорректного определения кодировки, указанной в пришедшем POST запросе.

Исправлена неоптимальность в поиске по шаблону с запоминанием (круглые скобки в шаблоне). Ускорение особенно заметно при поиске по шаблону в больших текстах.

Исправлена некорректная работа ^строка.trim[...] в кодировке UTF-8 в случае, когда в списке отрезаемых символов содержались многобайтные символы (например русские буквы).

Исправлена некорректная работа методов ^изображение.font[...], ^изображение.text[...] и ^изображение.length[] в кодировке UTF-8.

Исправлена ошибка некорректной записи cookie при указании у неё bool-аттрибута со значение false.

Исправлена ошибка, из-за которой некорректно работало перекрытие свойств при статических вызовах.

Исправлена ошибка, из-за которой формировался некорректный HTTP запрос при выполнении ^file::load[...;http://...] в случае, если в указанных для отправки cookies содержался «чистый» символ перевода строки.

Исправлена ошибка, из-за которой при выполнении ^file::load[...;http://...] «чистые» символы в переданном URL и $.body не перекодировались в указанную кодировку.

Конструкция $пустая_таблица.fields теперь возвращает пустой хеш.

Исправлена ошибка, из-за которой не кодировались интернациональные имена файлов в отправляемых письмах.

Исправлена ошибка /etc/catalog:1 ... read failed на win32 (необходимо использовать новые выложенные версии xml библиотек).

Исправлена ошибка, из-за которой в некоторых случаях некорректно работало сравнение строк.

Исправлена ошибка, из-за которой не всегда корректно вычислялась длина строки при работе в UTF-8.

Исправлено несколько ошибок, приводящих к падению парсера в core в некоторых случаях.

Исправлена ошибка, из-за которой при ^таблица.flip[] в результат не пропадала последняя строка, если в последнем столбце исходной таблицы ничего не было.

Исправлена сортировка таблиц при работе в кодировке KOI8-R.

08 июля 2009
Подготовьтесь к версии 3.4.0 #3

Подготовьтесь к версии 3.4.0, в будет добавлено новый вид taint/untaint-преобразования parser-code. Этот вид преобразования будет экранировать все служебные символы с помощью символа ^. Кроме этого, код оператора process будет подвергаться автоматическому untaint преобразованию этого вида.

Это означает, что если у вас в ^process{...} подставлялись строки, пришедшие из неблагонадёжных источников (из файла, базы данных, form и т.п.) и ожидалось, код в них выполнится, то для того, чтобы всё продолжало работать, вам необходимо написать ^process{^untaint[as-is]{...}}.

29 июня 2009
Подготовьтесь к версии 3.4.0 #2

Подготовьтесь к версии 3.4.0, в которой шаблон-регулярное выражение будет подвергаться автоматическому преобразованию ^untaint[regex]{...}.

Это означает, что если в ^file:list[...] или ^строка.match[...] у вас подставлялись шаблоны, пришедшие из неблагонадёжных источников (загружены из файла, получены из form и т.п.), то для того, чтобы всё продолжало работать, вам необходимо вокруг подобных шаблонов написать ^untaint[as-is]{...}. Если регулярные выражения были написаны вами прямо в коде, то вам не о чем беспокоиться, т.к. всё будет продолжать работать.

11 июня 2009
Подготовьтесь к версии 3.4.0

Подготовьтесь к версии 3.4.0, в которой будет несколько несовместимых с текущей версией изменений.

1. ^rem{...} сможет содержать произвольное количество «параметров» (станет проще комментировать тексты, содержащие символ «;») и будет удаляться на этапе компиляции. Т.е. если вы в своём коде использовали метод/оператор с таким-же именем, то вам его необходимо переименовать, т.к. вызываться он перестанет.

2. Каждый метод должен будет или возвращать результат через $result во всех вариантах своего выполнения или не использовать $result вовсе.

Пожалуйста, проверьте ваш код:

@method[jCondition;jTrue;jFalse]
^if($jCondition){
	$result[$jTrue]
}{
	$jFalse
}

В данном коде необходимо заменить «$jFalse» на «$result[$jFalse]»

3. В выражениях перестанет делаться автоматическое преобразование к числам строк, которые написаны в кавычках, например такая работающая сейчас конструкция работать перестанет:

$var(" 09 ")

Однако следующий код будет продолжать работать как прежде:

$var( 09 )
$str[ 09 ]
$var($str)
09 июня 2009
Parser3 + 64-битная платформа

Теперь Parser3 собирается и работает на 64-битных системах. Т.е. если на используемом вами хостинге не установлены 32-битные клиентские sql-библиотеки, то можно не заниматься поиском и установкой их, а собрать Parser3+драйвер как 64-битные приложения.

Необходимо иметь в виду, что Parser3, собранный как 64-битное приложение, потребляет больше памяти, поэтому мы продолжаем рекомендовать пользоваться 32-битной его версией.

И последнее: в настоящий момент необходимые правки внесены только в CVS (стабильная ветка release_3_3_0 и находящаяся в разработке head), поэтому, если вам нужно собрать Parser3 на 64-битной платформе, исходники необходимо взять из CVS.

04 сентября 2008
Выпущена версия 3.3.0

Перед выдачей браузеру интернациональные символы в cookie теперь преобразуются в %uXXXX (а не в %XX в $request:charset, как раньше). Таким образом теперь упрощается совместное с JavaScript использование данных с интернациональным символами в них (в JavaScript необходимо воспользоваться функциями escape и unescape). Для обеспечения обратной совместимости оставлено декодирование cookie, выданных браузеру предыдущей версией Parser3 в URL-encoding. Это несовместимое с предыдущей версией изменение: если вы в JavaScript использовали собственные механизмы декодирования интернациональных букв, полученных из cookie, вам необходимо заменить их на функции escape/unescape.

У пользовательских классов можно определить метод @GET[], который будет вызываться при обращении к объектам данного класса в скалярном контексте: ^if($oMyObject){...}

У пользовательских классов можно определить default getter (@GET_DEFAULT[name]) — метод, который будет вызываться при обращении к несуществующим полям класса или к несуществующим полям объектов данного класса. В единственную переменную метода передаётся имя поля, к которому было обращение.

Появилась возможность объявить локальными все переменные метода, для чего в объявлении его локальных переменных необходимо написать locals.

Появилась возможность объявить локальными все переменные всех методов определённого класса, для чего в этом классе необходимо добавить инструкцию @OPTIONS со значением locals.

Появилась возможность добавлять методы к уже существующему классу без использования оператора process, для чего при описании класса нужно разрешить добавление ему методов с помощью использования @OPTIONS со значением partial, а затем в файле с добавляемыми к классу методами нужно указать @CLASS с именем подключенного ранее класса, в который планируется произвести добавление методов и @OPTIONS со значением partial.

Теперь в одном файле можно описывать несколько классов: при этом устранены имевшиеся ранее проблемы, возникающие в случае наличия у нескольких классов @BASE и невыполнением метода @auto[] у всех описываемых в файле классов.

При разборе GET параметров теперь происходит автоматическое декодирование символов, пришедших в виде %uXXXX (например отправленных ajax приложением после использования javascript функции escape).

Конструктор ^hash::sql{запрос}[опции] теперь имеет новую опцию $.type[hash|table|string], аналогичную одноимённой опции метода ^таблица.hash[...]. С её помощью можно получать не только хеш хешей, но и хеш таблиц или строк, не используя при этом промежуточные переменные.

Добавлена более строгая проверка форматной строки у ^число.format[формат] и ^eval(выражение)[формат]. Если в качестве форматной строки вы использовали что-либо, не описанное в документации, ваш код может перестать работать.

У объектов класса file, загруженных локально с помощью конструктора ^file::load[], сразу доступны поля $.adate, $.mdate и $.cdate. Таким образом для локально загруженных файлов больше не требуется дополнительно получать эту информацию с помощью конструктора ^file::stat[].

Оператор try теперь имеет третий необязательный параметр (finally) — код, который выполнится в любом случае после выполнения тела оператора или обработчика ошибок, даже если произошедшая ошибка не была обработана.

Оператор throw теперь может принимать один строковый параметр, который будет восприниматься как type. Раньше в случае вызова данного оператора с одним параметром требовалось, чтобы этот параметр был хешом (например: ^throw[$.type[my] $.source[class]]).

Если в HTTP заголовке content-type входящего POST запроса содержится информация о кодировке, то декодирование пришедших символов происходит из неё, а не из той кодировки, которая определена в $response:charset (кодировка должна быть подключена в конфигурационном методе).

Кодировку, указанную в HTTP заголовке content-type входящего POST запроса можно узнать из $request:post-charset (может быть полезно например для того, чтобы в ней же выдать ответ).

При загрузке файла по HTTP с помощью конструктора ^file::load[http://...;$.method[POST]] в HTTP заголовок content-type исходящего запроса теперь по умолчанию добавляется информация о кодировке, в которой был сформирован текст запроса. Это несовместимое с предыдущей версией изменение: если вы таким образом загружаете файлы с удалённого сервера, где в качестве обработчика используется старая версия Parser3, то вам необходимо отключить добавление информации о кодировке с помощью появившейся опции $.omit-post-charset(true), в противном случае на удалённом сервере Parser3 не сможет декодировать пришедшие в POST параметры.

Появились методы по преобразованию IP адреса в число (^inet:aton[IP]) и обратно (^inet:ntoa(число)).

У конструктора ^file::sql{...} появились необязательные параметры $.limit и $.offset.

Классу date для общности добавлен копирующий конструктор ^date::create[дата].

У метода ^строка.pos[] появился необязательный второй параметр, с помощью которого можно задавать позицию начала поиска подстроки.

Методу ^строка.trim[] добавлены варианты значений первого параметра left и right в качестве алиасов для start и end соответственно.

Оператор ^switch[...]{...} теперь работает до нахождения первого совпадения, таким образом не происходит сравнения его первого параметра со значениями первого параметра всех case.

Тело case теперь может быть не только кодом, но и выражением.

Символы @ и # теперь можно добавлять в тело страницы с начала строки, использовав стандартное экранирование с помощью символа ^. Раньше, при необходимости добавить эти символы в начале строки, приходилось использовать конструкции ^#40 и ^#23 соответственно.

У класса string появились методы ^строка.js-escape[] и ^string:js-unescape[закодированное], которые выполняют преобразования, описанные в ECMA-262. Эти механизмы являются аналогами функций JavaScript escape и unescape.

В связи с переходом на новую версию библиотеки PCRE в регулярных выражениях появились новые возможности, такие как именованные подмаски (subpatterns), относительные ссылки, рекурсивные шаблоны и многое другое.

У метода ^строка.match[...] появилась дополнительная опция U (Ungreedy), которая делает все квантификаторы шаблона по умолчанию не «жадными». Чтобы сделать квантификатор «жадным», необходимо после него написать символ ?.

Теперь Parser3 знает больше EXIF тегов (включая теги с GPS информацией).

Добавлены новые типы системных ошибок: pcre.execute, date.range, file.execute и file.read.

Изменён API драйверов к серверам баз данных. Все драйвера обновлены. Данная версия Parser3 не работает со старыми драйверами, а старые версии Parser3 — в новыми драйверами (Sumo прислал исправления).

Драйвер SQLite теперь перекодирует отправляемые данные из $request:charset в UTF-8, а принимаемые — обратно (у SQLite UTF-8 является кодировкой «по умолчанию»). Это несовместимое с предыдущей версией изменение: если вы, используя старую бета версию драйвера, создали базу данных с данными в кодировке отличной от UTF-8, то используя добавленную опцию ClientCharset вы можете отключить данное перекодирование (указав в строке соединения: ?ClientCharset=$request:charset), однако настоятельно рекомендуется не делать этого, а перекодировать базу данных в UTF-8 (Sumo прислал исправления).

Путь к файлу с данными SQLite теперь задаётся относительно document root (раньше задавался относительно исполняемого файла Parser3). Это несовместимое с предыдущей версией изменение: вам надо исправить путь в строке соединения (Sumo прислал исправления).

Драйвер SQLite в строке соединения понимает специальные значения вместо пути к файлу с данными: :memory: и :temporary: — в первом случае будет создаваться временная сессионная база данных в памяти, а во втором случае — на диске.

Драйвер SQLite теперь понимает опции autocommit=0 и multi_statements=1.

У ODBC драйвера изменился способ задания опций, теперь они задаются также как и для других драйверов: после символа ? (несовместимое с предыдущей версией изменение: вам надо исправить строку соединения).

ODBC драйвер теперь понимает в строке соединения опцию autocommit=0.

ODBC драйверу добавлена опция SQL=MSSQL|Pervasive|FireBird, с помощью которой драйверу Parser-а можно сообщить с каким именно SQL-сервером он работает. В этом случае при запросах с limit/offset он будет модифицировать тексты запросов и добавлять в них инструкции, специфичные для данного SQL сервера. Для MSSQL и Pervasive добавляется TOP limit+offset, для FireBird — FIRST (limit) SKIP (offset).

Драйвер PgSQL в строке соединения теперь понимает опцию autocommit=0.

Драйвер Oracle теперь модифицирует SQL запросы с limit/offset, используя специфику Oracle. Кроме того драйверу была добавлена опция DisableQueryModification=1, с помощью которой можно запретить модифицировать тексты запросов.

Произведена оптимизация драйверов SQLite, PgSQL, Oracle и ODBC. У драйверов ODBC и Oracle, в случае запросов с limit, улучшения особенно заметны.

Версия скомпонована с библиотеками PCRE (7.7), libxml2 (2.6.32) и libxslt (1.1.24).

Сделано некоторое количество внутренних оптимизаций.

Исправлен ряд ошибок:

У объектов класса file, созданных с помощью ^file::stat[], поле $.name теперь имеет корректное значение.

Исправлен баг, когда в случае выполнения метода foreach у объекта класса hashfile, в результирующую переменную происходила некорректная запись хеша. Баг проявлялся, например, в следующем коде: $var[^хешфайл.foreach[k;v]{текст}]. Без указания $var всё работало корректно.

Исправлено лишнее перекодирование символов при создании объекта класса xdoc с помощью конструктора ^xdoc::load[http://...], из-за чего загрузка удалённых xml не всегда работала (ошибка появилась в 3.2.2).

Теперь корректно определяется наличие content-type у входящего POST запроса, если в нём была указана кодировка.

Исправлено падение (core) в случае входящего POST запроса с content-type="multipart/form-data", но без boundary.

Методы ^строка.length[], ^строка.pos[подстрока], ^строка.left(N), ^строка.right(N) и ^строка.mid(N;M) теперь работают корректно со строками в кодировке UTF-8.

В связи с переходом на новую версию библиотеки PCRE ^строка.match[...] теперь корректно работает со строками в кодировке UTF-8. Однако необходимо иметь в виду, что из-за особенностей библиотеки PCRE, наборы символов \w и \d не включают в себя символы с кодами больше 255, и при работе в кодировке UTF-8 вместо них необходимо использовать unicode properties (например: \p{Cyrillic}, \pL, \p{Nd}) или множества (например: [0-9a-zа-я_-]). Рекомендуется ознакомиться с комментариями о работе с UTF-8 в документации по PCRE.

При выполнении SQL запросов параметр $.limit(0) теперь воспринимается корректно и не приводит к доставанию всех записей. Это несовместимое с предыдущей версией изменение: некоторые передавали в limit пустое значение в результате чего у них доставались все записи, а не 0, как будет доставаться теперь (Sumo прислал исправления).

Если в строке соединения с MySQL и SQLite сервером указана опция ClientCharset, то сообщения сервера об ошибках теперь также перекодируются из указанной кодировки в $request:charset (Sumo прислал исправления).

Исправлена небольшая ошибка в компиляторе при разборе оператора def в выражении:
^if(defXYZ){должно быть исключение}.

Исправлена ошибка, из-за которой в некоторых случаях не удалялся BOM код из загружаемых файлов в кодировке UTF-8.

Исправлена ошибка, из-за которой не работал ^taint[regex][] при использовании его в фильтре статического метода ^file:list[].

07 июня 2008
Подготовьтесь к версии 3.3.0

Подготовьтесь к версии 3.3.0, в которой будет несколько несовместимых с текущей версией изменений.

1. Форматные строки преобразования числа в строку будут проверяться более строго. Если вы использовали в форматной строке что-либо, не описанное в документации, ваш код начнёт выдавать ошибку. Теперь форматная строка обязана начинаться символом ’%’, заканчиваться символом ’типа’, и должна иметь корректный формат.

Например следующий код некорректен:

^value.format[значение: %d]

Его необходимо преобразовать:

значение: ^value.format[%d]

2. Переменная с именем locals, описанная в списке локальных переменных метода, приобретёт особое значение: она будет переключать видимость всех переменных данного метода. Проверьте, чтобы переменной с таким именем не было в списке локальных переменных методов.

10 апреля 2008
Выпущена версия 3.2.3

Объекту класса hash добавлен метод ^хеш.contains[ключ], который возвращает true если в хеше содержится элемент с указанным ключом и false — если такого ключа в нём нет.

У класса date появился статический метод ^date:last-day(год;месяц), который возвращает последний день указанного месяца.

Объекту класса date добавлен метод ^дата.last-day[], который возвращает последний день месяца данной даты.

Объекту класса date добавлен метод ^дата.gmt-string[], который выводит её в виде строки в формате RFC 822 (Fri, 23 Mar 2001 09:32:23 GMT), которая может быть полезна например при формировании RSS лент.

При загрузке файла по HTTP теперь с помощью опции $.cookies можно указать отправляемые удалённому серверу cookie. Раньше это можно было делать только с помощью ручного формирования HTTP заголовков с помощью опции $.headers.

При загрузке файла по HTTP содержимое отправляемых заголовков, указанных с помощью опции $.headers, перед преобразованием в шестнадцатиричный формат (%XX) теперь конвертируется в указанную с помощью $.charset кодировку (раньше выдавалось в $request:charset). Внимание: несовместимое изменение. В случае, если вы передавали таким образом удалённому серверу cookie, теперь для обеспечения совместимости необходимо использовать опцию $.cookies.

Выдаваемые HTTP заголовки ($response:заголовок) перед преобразованием в шестнадцатиричный формат (%XX) теперь конвертируются в $response:charset (раньше выдавались в $request:charset), кроме того теперь преобразуются и имена заголовков, а не только их значения.

Версия скомпонована с последними библиотеками LibXML (libxml2-2.6.32) и LibXSLT (libxslt-1.1.23).
С измененими в библиотеках вы можете ознакомиться на сайте xmlsoft.org в логах по libxml и libxslt.

Исправлен ряд ошибок:

Исправлена ошибка, вызывающая падение парсера при работе с hashfile совместно с ^memory:compact[] при определённых условиях.

Исправлена ошибка, приводящая к повторному выполнению тела оператора cache в случае возникновения неперехваченного (в теле оператора cache или в его catch секции) exception (появилась в 3.2.2).

Исправлена ошибка, вызывающая падение парсера в случае, если вызванный с помощью ^file::cgi[...] внешний скрипт ничего не возвращал (появилась в 3.2.2).

Исправлена ошибка, вызывающая падение парсера в случае отправки письма с аттачментом в короткой форме ($.file[файл]). В при использовании полной формы ($.file[$.value[файл] ...]) падения не было (появилась в 3.2.2).

Исправлена ошибка некорректного вычисления последнего дня февраля в високосном году (появилась в 3.2.2).

27 декабря 2007
Выпущена версия 3.2.2

Добавлен SQL драйвер для SQLite (прислал: Niko, автор: Creator), огромное им спасибо.

Теперь из $переменной.CLASS_NAME можно узнать имя системного или пользовательского класса.

Добавлен класс bool.

Добавлены методы преобразования чисел и строк в bool: ^число.bool[] и ^строка.bool[].

Добавлены операторы ^break[] и ^continue[] для принудительного завершения цикла и принудительного завершения текущей итерации цикла соответственно. Использование этих операторов допускается только внутри циклов (for, while, menu, foreach).

Объекту класса xdoc добавлен новый вариант конструктора: ^xdoc::create[файл], который может быть удобно использовать для создания объектов из xml файлов, загруженых по HTTP.

У конструктора table::create появился необязательный третий параметр — опции. Теперь для конструируемой таблицы можно указать $.separator (значение по умолчанию, как и раньше, символ табуляции).

У объекта класса string метод ^строка.match[шаблон;опции] теперь всегда возвращает таблицу. Если не было найдено ни одного совпадения, возвращается пустая таблица (раньше возвращалось false). Кроме этого добавлена новая опция N (от Number), при задании которой метод возвращает не таблицу с результатами, а число — количество найденных совпадений.

У класса file появились статические методы: ^file:copy[откуда;куда], ^file:crc32[путь], ^file:md5[путь] и ^file:base64[путь]. Эти методы не сильно требовательны к оперативной памяти даже при обработке больших файлов, т.к. они не считывают файл в память целиком, а производят чтение кусочками по 4 КБ (следует помнить, что результатом base64 является большая строка с закодированным файлом).

У объектов класса file появились методы ^файл.crc32[] и ^файл.md5[].

Для объектов класса bool проверка ^if(def $bool){true}{false} теперь всегда возвращает «true», для анализа содержимого необходимо использовать ^if($bool){true}{false} (ранее проверка с помощью def значения false возвращала false).

При отправке файлов с помощью ^mail:send[] теперь возможно с помощью опции $.format[base64|uuencode] указывать формат их кодирования (раньше был только uuencode).

При отправке файлов с помощью ^mail:send[] и кодировании их методом uuencode, теперь используется меньше памяти (однако при кодировании их методом base64 её расходуется ещё меньше).

При отправке файлов с помощью ^mail:send[] теперь происходит автоматическое переключение content-type из multipart/mixed в multipart/related, в результате чего некоторые почтовые клиенты, до этого имевшие проблемы с отображением аттачментов отправленных парсером писем, начинают нормально их отображать.

При отправке файлов с помощью ^mail:send[] можно указать файлам $.content-id[XYZ], что приведёт к переключению content-disposition из attachement в inline и позволит в html-письмах ссылаться на эти файлы.

У метода преобразования таблицы в хеш ^таблица.hash[ключ;столбцы][опции] добавлена новая опция $.type[hash|table|string]. Указав $.type[string] можно получить хеш, в котором значениями хеша являются строки (а не хеши, как в случае преобразования без указания этой опции). При указании значения string обязательно нужно указать один столбец, значения которого станут строками результирующего хеша. Ключ $.distinct[tables] отныне переведен в разряд deprecated, вместо него нужно использовать комбинацию опций $.distinct(1) и $.type[table].

Изменено поведение объектов класса hashfile: при создании объектов не происходит сиюминутного открытия или создания необходимых файлов. Они будут созданы лишь при первом обращении к элементам хешфайла. Кроме того, теперь не требуется чтобы директория, где будут созданы файлы, существовала: как и при остальных операциях создания файлов, директория создаётся автоматически.

У объекта класса hashfile за ненадобностью убран метод ^хешфайл.clear[]. Для очистки его содержимого необходимо использовать ^хешфайл.delete[], который работает существенно быстрее, т.к. не занимается поэлементным удалением, а просто удаляет файлы. Кроме того, после выполнения метода delete, теперь можно продолжать работать с хешфайлом, при этом необходимые файлы будут автоматически созданы вновь.

Объекту класса hashfile добавлен метод ^хешфайл.cleanup[], который перебирает все пары и удаляет устаревшие (раньше для этого нужно было использовать конструкцию ^хешфайл.foreach[;]{}).

Объекту класса hashfile добавлен метод ^хешфайл.release[], который записывает изменения в файл и снимает блокировки, делая хешфайл доступным другим процессам. Продолжить работу можно в любой момент просто обратившись к его элементам.

Объекту класса hash добавлен метод ^хеш.contain[ключ], который возвращает true если в хеше содержится элемент с указанным ключём и false — если такого ключа в нём нет. —>

У метода ^таблица.columns[] появился необязательный параметр, с помощью которого можно задать имя столбца в формируемой таблице (по умолчанию column).

У метода ^строка.split[] появился необязательный третий параметр, с помощью которого можно задать имя столбца в формируемой при вертикальном разбиении таблицы (по умолчанию piece).

Теперь с помощью ^file::load[text;/local/file.txt] и ^table::load[...] можно загрузить локальный файл или таблицу, даже если они имеют кодировку, отличную от $request:charset, для чего необходимо воспользоваться опцией $.charset[кодировка].

Теперь у ^file::exec/cgi[...] первым параметрам может быть указано text или binary (без указания считается text). При работе в режиме binary полученный результат не перекодируется в $request:charset и данные не обрезаются по первому нулевому символу, таким образом появляется возможность напрямую получить от внешней программы двоичные данные ( прислал готовый фрагмент кода).

Теперь у ^file::exec/cgi[...;аргумент1;аргумент2;...] аргументы можно задавать в виде таблицы с одним столбцом.

У класса form появилось поле files, с помощью которого можно получить доступ ко всем загруженным файлам, даже если некоторые из них имели одинаковые имена формы. Поле аналогично полю tables, однако значениями выступают не таблицы, а хеши с ключами 0, 1, ... N и файл-значениями.

Метод ^таблица.save[...] теперь работает быстрее и использует существенно меньше памяти.

PgSQL: добавлена поддержка связанных переменных (bind variables) и произведены некоторые улучшения (egr прислал готовый фрагмент кода).

Объекту класса date добавлено поле weekyear содержащее год, к которому относится неделя с указанной датой.

Объектам класса xnode добавлены DOM2 поля $узел.prefix и $узел.namespaceURI.

Объекту класса xnode добавлен DOM2 метод ^узел.hasAttributes[].

Добавлен способ получить список всех cookie: $cookie:fields.

Теперь при записи cookie можно задавать параметр с типом bool, при этом будет сформирован заголовок, содержащий указанное имя параметра, но не содержащий значения. Это можно использовать, например, для задания параметра httponly.

Появился статический метод ^math:crc32[строка], вычисляющий crc32 переданной строки.

Появился статический метод ^math:sha1[строка] возвращающий хэш строки по алгоритму sha1 ( прислал готовый фрагмент кода).

Появился статический метод ^math:log10(число), вычисляющий десятичный логарифм переданного числа.

У класса request появилось поле $request:argv — hash с ключами 0, 1, 2, ... Его может быть удобно использовать при запуске парсера из cron (Sumo прислал готовый фрагмент кода).

При записи сообщения об ошибке в parser.log теперь производится замена подряд идущих пробельных символов на пробел, одновременно с этим размер строки с текстом сообщения об ошибке увеличен.

Версия скомпонована с последними библиотеками GC (gc6.8), LibXML (libxml2-2.6.30) и LibXSLT (libxslt-1.1.22). В связи с тем, что в новых XML библиотеках было выполнено одно из требований спецификации XSLT — QName теперь не может содержать символ ’@’.
Со всеми измененими в библиотеках вы можете ознакомиться на сайте xmlsoft.org в логах по libxml и libxslt.

Сообщения о том, что обработка была прервана пользователем (’parser.interrupted’, также известный как ’SIGPIPE’), теперь пишется в parser3.log только в случае, если в MAIN определён флаг $SIGPIPE(1)

Сделано некоторое количество внутренних оптимизаций.

Исправлен ряд ошибок:

Исправлена ошибка блокировки файлов на unix системах, из-за которой не всегда корректно работали операции записи (включая lock, cache, save и операции с hashfile).

Исправлена ошибка и теперь не строковый результат работы code-junction записывается в корректное место. Раньше не работал, например, следующий код (в последней строке производилась попытка записать результат не в $var, а в MAIN):

$d[^date::now[]]
$j{$d}
$var[$j]

Теперь в ^file::load[text;http://...;$.charset[кодировка]$.form[$.name[значение]]] значения, указанные в $.form[], перед отправкой перекодируются в указанную кодировку.

Теперь ^file::exec/cgi[скрипт;$.charset[кодировка];аргумент1;;аргумент2;...] перекодирует аргументы в указанную кодировку и не передает пустые аргументы вызываемому скрипту.

Исправлена ошибка, приводящая к исчезанию у объекта класса hash ключа $._default[...], при добавлении к нему другого хеша.

Исправлено автоформатирование отрицательных дробных чисел при выводе.

Для объекта класса xdoc проверка ^if($xdoc is "xnode«){true}{false} теперь возвращает «true», как и должно быть согласно документации.

Поле week объекта класса date теперь вычисляется корректно.

Отправляемым письмам добавляется заголовок Content-Transfer-Encoding: 8bit.

Теперь ^таблица.locate[...][$.reverse(1)] и ^таблица.join[...][$.reverse(1)] не вызывают падения (core), если не было найдено совпадений.

Исправлена ошибка, из-за которой при загрузке файла по HTTP не всегда понималась кодировка, возвращаемая удаленным сервером.

Исправлена ошибка некорректной обработки эскейп-символов при определённых условиях в clob полях драйвером oracle.

Исправлена ошибка, из-за которой результат работы ^math:md5[строка] иногда выдавался в верхнем регистре.

Теперь подавляется вывод HTTP заголовков в случае, если что-либо было выведено с помощью класса console.

Сделаны другие исправления, в том числе ситуаций, приводивших в редких случаях к core.

13 декабря 2007
Подготовьтесь к версии 3.2.2 #4

Версия 3.2.2 будет скомпонована с последними версиями XML библиотек, в которых переключение контекста в квадратных скобках при вычислении XPath в выражениях приведено в соответствии со спецификацией.

Например, следующий код станет работать не так как раньше:

<xsl:variable name="ext" select="document(’external.xml’)" />
<xsl:value-of select="$ext/path1/item1/[@attr1 = /path2/item2/@attr2]/text()" />

Раньше XPath выражение /path2/item2/@attr2 искало элемент в текущем обрабатываемом document (нарушение спецификации), а должно было искать в том document, к которому принадлежат просматриваемые узлы item1, т.е. в данном примере в external.xml. Если вам надо, чтобы это выражение продолжало искать элемент в текущем обрабатываемом document, используйте или функцию current() или variable:

<xsl:variable name="ext" select="document(’external.xml’)" />
<vsl:variable name="local" select="/path2/item2″ />
<xsl:value-of select="$ext/path1/item1/[@attr1 = $local/@attr2]/text()" />
06 декабря 2007
Подготовьтесь к версии 3.2.2 #3

Версия 3.2.2 будет скомпонована с последними версиями XML библиотек, в которых требуется, чтобы все <xsl:param/> были описаны в самом начале <xsl:template/>, как этого требует xslt спецификация, поэтому следующий код будет вызывать ошибку:

<xsl:template name="template-name">
	…ваш код…
	<xsl:param name="param-name"/>
</xsl:template>

Должно быть так:

<xsl:template name="template-name">
	<xsl:param name="param-name"/>
	…ваш код…
</xsl:template>
25 ноября 2007
Подготовьтесь к версии 3.2.2 #2

Версия 3.2.2 будет скомпонована с последними версиями XML библиотек, в которых запрещено использование необъявленных <xsl:param/>, как этого требует xslt спецификация, поэтому следующий код будет вызывать ошибку:

<xsl:template name="template-name">
	<xsl:value-of select="$param-name"/>
</xsl:template>

Должно быть так:

<xsl:template name="template-name">
	<xsl:param name="param-name" />
	<xsl:value-of select="$param-name"/>
</xsl:template>
13 февраля 2007
Подготовьтесь к версии 3.2.2

Подготовьтесь к версии 3.2.2, в которой будет несколько несовместимых с текущей версией изменений.

1. Для переменной типа bool проверка ^if(def $bool){true}{false} всегда будет возвращать 'true'. Для анализа содержимого используйте ^if($bool){true}{false}

2. Данная версия будет скомпонована с последними версиями XML библиотек, в которых выполнено одно из требований спецификации XSLT — QName не может содержать символ '@'.

Пожалуйста, проверьте ваш код:

Теперь подобное: <xsl:apply-template …mode="@value"…/> будет вызывать ошибку.

09 июня 2006
Скомпилирована и выложена версия 3.2.1sp2 для FreeBSD 6.1

Скомпилирована и выложена версия 3.2.1sp2 для FreeBSD 6.1

17 марта 2006
Выпущены версии 3.1.6sp2 и 3.2.1sp2

Исправлена ошибка с параметром $.encloser[] при работе table.save;

Исправлена уязвимость в mail:send;

В версии 3.2.1 не работало ^string:base64[закодированное].

29 декабря 2005
Выпущена версия 3.1.6

Исправлена досадная ошибка с новым ^taint[regex].

Исправлена трудноуловимая ошибка при работе с памятью с XML через DOM методы.

29 декабря 2005
Выпущена версия 3.2.1

Полностью переписана работа с DOM (XML), теперь в Parser не используется для этого библиотека gdome (и glib);

На Unix значительно упрощена сборка Parser (с XML!) из исходных кодов — теперь достаточно скачать/распаковать архив и запустить один командный файл. Подробности см. в INSTALL.

Теперь трудные сообщения об ошибках компиляции будут сообщаться более внятно.

08 декабря 2005
Выпущена версия 3.1.5

Улучшена работа table::sql и table::load, теперь они работают на 40% быстрее и расходуют только необходимый минимум памяти (раньше оставалось много «мусора»).

Ускорена работа конструкций $var($var+1), теперь они работают на 30% быстрее.

Ускорена работа конструкций ^var.inc(1), теперь они работают на 40% быстрее и расходуют на 30% меньше памяти.

Улучшена работа table.save, теперь расходует немного меньше памяти.

Добавлена возможность игнорирования всех пробелов в методах.

Добавлена поддержка base64, теперь можно кодировать и декодировать произвольные строки и файлы.

Добавлено поле date.week.

Добавлены логические литералы: true и false.

Добавлен способ узнать время, на которое собираются закэшировать выполняемый код.

Добавлен способ получить все выставленные заголовки HTTP ответа, response:headers.

Добавлен новый вид преобразования строк: regex. —>

Добавлен параметр ^while(){}[разделитель].

Добавлена env:PARSER_VERSION.

Изменен способ вывода чисел, теперь $value(1230000) $value напечатает 1230000 (было: 1.23e+006).

Изменено поведение ^int:sql{SELECT NULL}[$.default(5)], теперь эта конструкция вернет 5 (раньше: 0).

Изменено поведение hashfile::open, теперь, если файл пытаются открыть одни скриптом дважды, сразу выдается ошибка.

Улучшен вывод сообщения об ошибке, если ^cache()[]{код}{обработчик ошибок} выполняется впервые и в обработчике ошибок указано $exception.handled[cache].

Снято ограничение на способ передачи параметров file::load, теперь можно ^file::load[text;http://server/document?param1=1;
$.form[$.param2(2)]] (раньше: можно было использовать либо один либо другой способ передачи параметров).

Снято ограничение на стиль задания параметра $.default у методов string/int/double:sql.

Ограничение на количество итераций цикла увеличено до 20 000 (было: 10 000).

Увеличено до 50 число допустимых параметров у скрипта, запускаемого file::cgi/exec (было: 10).

Изменено поведение file:list, теперь он выдает и те файлы/каталоги, имя которых начинается с точки.

Исправлен ряд ошибок:

Теперь ^table.save[...$.encloser[«]] соответствует документации (удваивает кавычки).

Теперь date.sql-string учитывает date.TZ.

Теперь ^date.roll[TZ;...] не влияет на работу других объектов типа date.

Теперь ^file::cgi[скрипт;
$.charset[utf-8] $.QUERY_STRING[tricky=^taint[uri][тоже]]]
передаст скрипту «tricky=%D1%82%D0%BE%D0%B6%D0%B5» (раньше: %F2%EE%E6%E5).

Теперь double.int соответствует документации — обрезает значения (раньше: округлялись).

Теперь выдача $result из @main[], а также использование response:body, вызывает untainting выдаваемого посетителю (раньше: выдавалось as-is).

Теперь о проблеме открытия hashfile будет сообщено ясно (раньше: невразумительное unknown error).

Теперь о проблеме открытия существующего на диске файла с пользовательским классом будет сообщено ясно (раньше: файл не найден).

Теперь можно сохранить file нулевого размера.

Теперь на unix можно отправить письмо, в BCC заголовке которого больше 500 букв.

08 декабря 2005
Выпущена версия 3.2.0

Добавлены «свойства».

Ускорен вызов метода, который берется из родительских классов, теперь на 20% быстрее.

ПОЖАЛУЙСТА внимательно перечитайте новости о трех мелких несовместимостях с предыдущими версиями, опубликованные 28 июля 2005 и 02 декабря 2005, см. архив.

02 декабря 2005
Подготовьтесь к версии 3.2.0 #2

Она будет скомпонована с последними версиями XML библиотек, в которых выполнено одно из требований спецификации XSLT — теперь нельзя использовать переменные в атрибуте match элемента xsl:template.

Пожалуйста, проверьте ваш код:

Теперь это: <xsl:template match="...$variable..." /> будет вызывать ошибку «Undefined variable».

Необходимо явно указать XPath выражение — заменить переменную на ее значение.

28 июля 2005
Подготовьтесь к версии 3.2.0

После тщательного тестирования выйдет версия 3.2.0, в которой добавлен механизм «properties».

Пожалуйста, проверьте ваш код:

1. в версии 3.2.0 будет запрещено использование метода, имеющего то же имя, что и поле объекта.

Другими словами: поля и методы всегда должны называться по-разному; в базовых и производных классах.

Пример: теперь нельзя иметь в базовом классе поле

$test
имея в производном классе метод
@test[]

Если вам необходима подобная переменная, можно объявить её локальной, переименовать переменную, переименовать метод.

2. в версии 3.2.0 методы

@GET_abc[]
и
@SET_abc[value]
приобретут особенное значение, пожалуйста, проверьте, чтобы подобных методов не было в имеющемся коде.

Одновременно выйдет версия 3.1.5, исправляющая две небольших ошибки 3.1.4.

24 декабря 2004
Выпущена версия 3.1.4

Исправлены ошибки, появившиеся в предыдущей версии SQL драйвера для ODBC.

Методы table.hash, hash::create и hash.add теперь правильно обрабатывают спец-ключ _default.

Win32: при запуске интерпретируемых скриптов (#!c:\perl\bin\perl) теперь правильно устанавливается их рабочий каталог.

При загрузке файлов по HTTP теперь правильно разбираются заголовки ответа. Были проблемы при разборе заголовков в которых использовались разные по стилю переносы строк.

В строках соединения пароль теперь может содержать знак @.

Изменена выдача результата xdoc.string. Теперь он выдается as-is. Это важно при работе с JavaScript — ранее встроенная оптимизация результата могла удалить перенос строки если перед ним был пробел.

@unhandled_exception: добавлена возможность предотвратить запись ошибки в журнал.

Oracle: добавлена поддержка связанных переменных (bind variables).

ODBC: изменены рекомендуемые строки подключения. Создавать DSN неудобно и не нужно — есть простой способ обойтись без этого.

Hashfile: увеличено ограничение на размер данных, теперь можно сохранить ключ и значение (в сумме) до 8000 байт.

Win32, IIS: добавлена поддержка использования ошибки «Страница не существует» для организации виртуальных адресов (подобия Apache/mod_rewrite).

Добавлена поддержка докачки файлов ( прислал готовый фрагмент кода).

MS-SQL: В документаци описан простой способ обхода проблем с форматами дат и чисел.

В документации упомянут так называемый «научный» формат числовых литералов.

file::sql: приведен в соответствие с общим по Parser подходом один из вариантов вызова (это единственное изменение, несовместимое с предыдущей версией).

28 мая 2004
Выпущена версия 3.1.3

Добавлена возможность делать POST HTTP запросы, передавая параметры формы.

Добавлена возможность задать кодировку в которой данные будут переданы внешнему скрипту (^file::exec/cgi[$.charset[...]][...]).

В метод date.create добавлена поддержка миллисекунд.

Изменено поведение методов string.left, string.right и string.mid, оно приведено в соответствие с документацией.

Исправлен ряд ошибок:

Теперь table::load правильно загружает конец файла.

Теперь SQL соединения закрываются в конце работы (ошибка появилась в версии 3.1.2).

Теперь строка «009» успешно преобразуется в число, а не выдает ошибку преобразования.

28 мая 2004
Открылась английская версия сайта

Теперь доступна англоязычная документация и форум для общения на английском языке.

24 мая 2004
MacOS X: Parser 3.1.2prerelease, XML, драйвера для MySQL, PgSQL

прислал Parser 3.1.2prerelease, XML, драйвера для MySQL, PgSQL собранные под Mac OS X 10.3. См. прислали пользователи.

29 марта 2004
Задокументирован ряд возможностей версии 3.1.2

Добавлена возможность хранить XML документы в произвольном месте, а не только на диске или HTTP-сервере, достаточно написать метод, реализующий получение XML. Теперь можно, скажем, в main.xsl указать <xsl:import href="parser://external_xsl/some.xsl«/>, и Parser считает данные из заданного вами внешнего источника.

Добавлена возможность работать с датой/временем в UNIX формате. Теперь можно передать в JavaScript дату и время некоего события, и корректно отобразить этот момент в часовом поясе посетителя.

Добавлена возможность считывать и записывать табличные файлы c указанием разделителей столбцов и символов обрамления. Теперь можно аккуратно считывать и записывать файлы в .csv формате (Excel), см. «Опции формата файла».

Добавлена возможность хранить файлы в базе данных MySQL, см. ^file::sql и ^file.sql-string.

Добавлена возможность отправки писем по SMTP на UNIX.

Добавлена возможность обойти проблему некоторых хостингов, где администратор настроил неправильный DocumentRoot, см. $request:document-root.

Добавлена возможность показывать пусть устаревшую (из кеша), но нормальную страницу, вместо страницы с фатальной ошибкой, см. ^cache.

Добавлена возможность увидеть имена файлов, когда ошибка возникает в коде, обработанном ^process.

Добавлена возможность отложенной отправки письма на unix. Задайте ^mail:send[$.options[-odd]...]. Полный список опций см. в документации sendmail. (Недоступна в safe-mode версии)

Добавлена возможность задать ^image.gif[имя файла].

Добавлена возможность ^hash_.keys[задать название колонки].

Добавлена возможность написания на Parser простых текстовых служб вроде NNTP. См. класс console.

26 марта 2004
Выпущена версия 3.1.2

Добавлен новый класс hashfile, реализующий hash на диске, с поддержкой устаревания отдельных пар ключ/значение.

Добавлен метод ^string.trim.

Добавлена возможность передавать параметры и тело внешнего HTTP запроса, см. Работа с HTTP-серверами.

Добавлена возможность записи в поле nodeValue класса xnode.

Добавлена возможность работы с пикселами изображения.

Добавлена возможность делать ^hash::sql{запросы, выдающие одну колонку}.

Добавлена возможность поиска методами ^xnode.select* по элементам и атрибутам с указанием пространств имен.

Добавлены поля $status:pid и $status:tid.

В SQL драйверах появилась возможность задавать кодировку общения с SQL сервером, параметр ClientCharset.

Изменена кодировка, выдаваемая в $.method[html] в <head><meta> и $.method[xml] в <?xml charset=, см. Параметры преобразования документа в текст.

Проверка строки-параметра метода ^date::create[строка] сделана более строгой.

Параметры методов left, right и mid классов string и void теперь проверяются более строго.

^date::create теперь на всех платформах выдает ошибку в случае попадания параметра в разрыв во времени (в России в ночь на последнее воскресенье марта с 2х до 3х ночи).

xdoc, получающийся в результате xdoc.transform, по-умолчанию имел неправильные значения параметров вывода: indent, omit-xml-declaration, standalone.

Теперь Parser автоматически обнаруживает изменения во всех файлах, из которых состоит .xsl шаблон (<xsl:include> и прочих), .stamp файл теперь не используется.

07 ноября 2003
Выпущена версия 3.1.1

В два раза ускорена работа со строками.

Добавлена поддержка UTF-8 кодировки в методах string.upper/lower (Simple case).

Добавлена возможность оперирования часовыми поясами. См. документацию.

Добавлена возможность узнать содержание одноименных заголовков HTTP-ответа. См. документацию.

Oracle: Добавлена возможность отключить автоматическое преобразование имен колонок SQL-ответа к нижнему регистру. См. документацию.

Добавлен ряд DOM2 методов (см. xdoc и xnode).

Исправлены ошибки: оператор cache не работал; методы string.match, string.replace работали медленно; не игнорировалась UTF-8 сигнатура в файлах.

Oracle, PgSQL, ODBC: исправлена ошибка с передачей tainted апострофа.

Исправлена ошибка: в метод postprocess теперь будет приходить то, что передано в $response:body/download. Необходимо иметь это в виду, и, возможно, проверить параметр: ^if($body is file){...}

03 ноября 2003
Подготовьтесь к версии 3.1.1

На днях выйдет версия 3.1.1, в которой в метод postprocess будет приходить то, что передано в $response:body/download. Необходимо иметь это в виду, и, возможно, проверить параметр: ^if($body is file){...}

06 августа 2003
solaris_parser_3_1_0

прислал Parser 3.1.0, собранный на Solaris 8 Intel. См. прислали пользователи.

28 июля 2003
redhat73_parser3_0_8

прислал Parser 3.0.8, собранный на Linux Redhat 7.3. См. прислали пользователи.

25 июля 2003
release_3_0_8

Изменено поведение ^file::exec/cgi[...]: теперь они не будут автоматически получать данные POST запроса. Если эти данные необходимо передать, теперь это надо сделать явно:
$.stdin[$request:body]

Изменено поведение hash.name: теперь, если в хеше есть элемент, одноименный методу, будет взят элемент, не метод.

Добавлена опция поиска в таблице: $.reverse(1) — теперь можно искать и в обратном направлении.

Добавлены опции ряду методов класса table: $.limit(N), $.offset(N) — теперь можно ограничить операцию частью таблицы.

Добавлена опция преобразования таблицы в хеш: $.distinct[tables] — теперь можно получить ассоциативный массив ключ→таблица из строк с этим ключом.

Изменен алгоритм получения случайного числа: теперь на Unix он использует системные устройства /dev/random и|или /dev/urandom, на Win32: системные функции библиотек шифрования.

Добавлены методы: ^math:uuid[], ^math:uid64[], позволяющие получить уникальные идентификаторы.

Добавлен метод: ^math:md5[...], вычисляющий MD5-отпечаток строки.

Теперь $status:rusage доступен и на Win32 (автор: , большое спасибо ему).

Исправлены ошибки:

Элемент хеша «_default» более не подпадает под foreach.

На Linux теперь работает timeout при HTTP-запросах.

В письмах и полях HTTP-запросов/ответов дата теперь имеет стандартный формат (в качестве разделителей теперь пробелы вместо минусов).

SQL-драйвер Oracle: теперь нормально работает с запросы с несколькими CLOB-полями.

25 июля 2003
release_3_1_0

Теперь можно освободить память, занимаемую более не использующимися объектами («не используются» = на них нигде нет ссылок): ^memory:compact[], $status:memory.

Ужесточены правила именования переменных окружения для ^file::exec/cgi[...], теперь имя должно быть написано латинскими буквами в верхнем регистре или цифрами, также допустимы минус и подчеркивание.

Теперь имя кодировки нечувствительно к регистру.

Теперь можно задать кодировку HTTP запроса.

Теперь документ, получаемый по HTTP, перекодируется в $request:charset кодировку.

17 июня 2003
Клиентская библиотека PgSQL обновлена до версии 7.3.2

В раздел для скачивания выложен обновлённый архив с драйвером для PostgreSQL. Клиентская библиотека обновлена до версии 7.3.2.

16 апреля 2003
Win32: Драйвер для Interbase

прислал Win32 драйвер для Interbase. См. прислали пользователи.

27 декабря 2002
release_3_0_0007

Теперь и у нас с вами есть SAFE MODE. Unix версии Parser, доступные в разделе для скачивания, собраны в этом режиме.
Ранее уже имелось ограничение на работу с файлами, принадлежащими другой группе, нежели CGI процесс Parser — теперь SAFE MODE Parser сможет считать файл или запустить программу только если файл/программа принадлежит той же группе или тому же пользователю, что и CGI процесс Parser.

Добавлен метод $response:download.

Добавлена ясность в вопросе изменения почтовой программы: теперь попытка её изменения в SAFE MODE считается ошибкой, а не тихо игнорируется.

Добавлена ясность с ошибкой запуска процесса — более чётко сообщено об ошибке: проблема с fork или pipe.

Исправлен ряд ошибок:

xdoc::load теперь правильно работает с внешними документами.

cookie:field теперь правильно работает с опциями записи cookie.

file:fullpath теперь всегда работает правильно, ранее при определенном условии работал некорректно.

24 декабря 2002
открыт contrib

Открыт раздел «Прислали пользователи», в котором будут размещаться ссылки на страницы, поддерживаемые пользователями Parser, где они разместили результаты собственных усилий по сборке Parser под их платформы.

17 декабря 2002
release_3_0_0006_sp1

Исправлена ошибка в Win32 CGI версии, не позволявшая передавать скрипту ?параметры.

16 декабря 2002
release_3_0_0006

Обновлена документация, описаны классы status, junction; описана функция file:lock, существенно дополнено описание функции math:crypt.

Изменен интерфейс общения с SQL-драйверами, их необходимо обновить!

Сузилась область видимости переменных в составных классах, теперь базовый тип не имеет доступа к полям производного.

Операторами отныне считаются все методы класса MAIN, и выполняться они будут в контексте класса MAIN.

Теперь у всех функций появилась возможность узнать, кто их вызвал и воспользоваться этим, читайте о $caller.

Теперь можно наследоваться от базовых типов, добавился удобный синтаксис ^BASE::create ^BASE:call.

Реализована работа с EXIF информацией в JPEG файлах.

В именах файлов теперь разрешены русские буквы и пробелы.

Изменился оператор process.

У объекта date добавлены поля.

Появилось поле $request:body.

Появилась возможность задавать даты в response полях.

Добавились удобные методы в класс void.

Добавился метод string.split.

Добавился удобный вариант метода table.locate.

Теперь нельзя просто так выполнять hash::sql или table.hash с таблицами, в которых ключевое поле имеет повторящюиеся значения.

Теперь проверять на существование функции надо только так: ^if($name is junction), больше нельзя ^if(def $junction).

Изменен hash.foreach, теперь можно изменять hash по которому идет foreach.

Теперь можно писать комментарии к частям математического выражения.

Добавлено округление при преобразовании double в int.

Пользователям Oracle: теперь успешное выполнение с предупреждениями (OCI_SUCCESS_WITH_INFO) считается успешным.

02 декабря 2002
предупреждение о подготовке кода к 3.0.0006

Идут последние тесты новой версии, и сейчас самое время подготовить ваш код к новвовведениям и улучшениям в языке...

Скоро операторы перестанут выполняться в «текущем» контексте, что сейчас порождает массу непонимания. Операторами будут считаться все методы класса MAIN, и выполняться они будут в контексте класса MAIN. Проверьте имеющийся код, те блоки, которые надеялись, что контекстом выполнения оператора является «текущий контекст», перестанут работать. В грядущей версии контекст выполнения любого метода будет доступен в переменной $caller.

Хотя в документации и не было указано, но многие пользовались конструкцией ^if(def $имя_метода) для проверки наличия метода. Эта конструкция в следующей версии перестанет работать — уже сейчас стоит перейти на проверку вида ^if($имя is junction) она работает сейчас и будет работать и впредь.

22 октября 2002
odbc 3.0.0005

Обновлен SQL-драйвер для Win32 ODBC. Ускорен. Уменьшено фрагментирование памяти.

14 октября 2002
Начинаем перевод документации на английский

Пользователи Parser начали перевод документации на английский язык, используя комментарии к документации. Премодерация с комментариев снята. Список терминов нужно согласовать с другими переводчиками. Перед началом перевода очередной статьи опубликуйте комментарий «перевожу».

09 октября 2002
P2tP3 alfa_0002

Вышла вторая альфа версия преобразователя P2tP3.

27 сентября 2002
Добавлен пример по настройке MySQL и настройка для FAR colorer

В раздел с примерами добавлены рекомендации по настройке кодировок у MySQL.

В раздел скачать добавлена присланная схема подсветки синтаксиса для colorer FAR plugin.

18 сентября 2002
P2tP3

У вас имеется некоторое количество кода на Parser2, и вы хотите перевести его на Parser3?

Попробуйте в деле преобразователь P2tP3, которым с нами поделился .

14 сентября 2002
Появился раздел про хостеров

Появился раздел про хостеров. Вы можете присылать свои комментарии.

13 сентября 2002
Обновлен ODBC драйвер

Обновлен ODBC драйвер: добавлена работа с типами данных MSSQL 2000 и разрешен простой вызов хранимых процедур.

23 августа 2002
Прикручен поиск по онлайн документации

Появился поиск в онлайн документации по языку.

10 августа 2002
Появилась возможность писать комментарии к онлайн документации

В разделе документации по языку в HTML формате появилась возможность писать комментарии к статьям. Данная функция доступна только после регистрации. Премодерация.

09 августа 2002
Добавлен пример по использованию операторов taint/untaint

В раздел с примерами добавлен пример по использованию операторов taint/untaint.

05 августа 2002
Исходные коды проекта для скачивания

Исходные коды проекта теперь доступны не только в CVS, но и в разделе «скачать».

02 августа 2002
release_3_0_0005

Обновлена документация, описаны классы xdoc и xnode.

Упрощена процедура установки (вместо двух конфигурационных файлов — один).

Добавлена возможность определения размеров изображений в PNG формате.

Добавлена возможность создания класса date из строки в стандартном для СУБД формате;

Добавлена возможность передачи текста на стандартный ввод запускаемым программам.

Добавлена возможность хэширования строк (паролей); улучшен метод file:find.

Передача переменных окружения в file::cgi/exec стала более строгой.

Исправлены ошибки:

$response:body[файлы] больше не перекодируются;

Объекты пользовательских классов теперь тоже можно проверять ^if($объект is тип)...;

Файлы из Opera теперь закачиваются нормально.

11 июля 2002
Добавлен пример по изменению размеров изображения

В раздел с примерами добавлен пример использованию внешних программ для масштабирования изображений.

21 июня 2002
Добавлен пример по использованию оператора ^cache[]

В раздел с примерами добавлен пример по использованию оператора ^cache[]

13 июня 2002
Написан Урок 6

«Урок 6. Работаем с XML»

28 мая 2002
Добавлено еще два примера...

В раздел с примерами выложены еще две статьи. В одной из них приведены некоторые регулярные выражения, а в другой — пользовательские операторы.

20 мая 2002
В примеры выложены 2 статьи.

В раздел с примерами выложены две статьи. Там-же есть возможность скачать простенькие классы, предназначенные для работы с MySQL, MSSQL и Oracle.

17 мая 2002
Исправления в документации по языку: ^string.match

В документацию по языку в раздел «match. Поиск подстроки по шаблону» внесены изменения, уточняющие поведение ^string.match[]. Обратите внимание на правила создания столбцов prematch, match и postmatch.

07 мая 2002
Исправления в документации по языку: Урок 4, Урок 5

В документации по языку исправлены ошибки в разделах «Урок 4. Шаг второй — Переходим к работе с БД», и «Урок 5. Пользовательские классы Parser».

06 мая 2002
Дополнение документации по языку: MAIN:class, ^table.select

В документацию по языку добавлены разделы «Класс MAIN, обработка запроса», и «table select. Отбор записей».

29 апреля 2002
Пресс-релиз

Пресс-служба Студии Артемия Лебедева опубликовала пресс-релиз, посвященный официальному выходу Parser 3.0

29 апреля 2002
Официальный выход Parser 3.0

Опубликованы исходные тексты; бинарные версии под Win32, FreeBSD, Linux; документация по языку и исходным текстам.