parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Выложена версия 3.4.1 beta 1

Misha v.3 26.11.2010 16:24 / 26.11.2010 16:24

Новое:

- Появилась встроенная поддержка json.
парсит json-строку в хэш:
    ^json:parse[-json-строка-[;
        $.double(false)              отключить встроенный парсинг чисел с плавающей точкой (по умолчанию включен)
                                     в этом случае они попадут в результирующий объект как строки
        $.distinct[first|last|all]   как будет происходить разбор дублирующихся ключей у объектов
                                     first -- будет оставлен первый встретившийся элемент
                                     last  -- будет оставлен последний встретившийся элемент
                                     all   -- будут оставлены все элементы. при этом элементы, начиная со 2
                                              получат числовые суффиксы (key_2 итд)
                                     по умолчанию дублирующиеся ключи приведут к exception
        $.object[method-junction]    пользовательский метод[ключ;объект], которому будут передаваться все разобранные
                                     объекты и ключи объекта, метод возвращает новый объект
    ]]
сериализует системный или пользовательский объект в json-строку:
    ^json:string[system or user object[;
        $.skip-unknown(false)    отключить exception и выдавать 'null' при сериализации объектов с типами
                                 отличных от void, bool, string, int, double, date, table, hash и file
        $.indent(true)           форматировать результирующую строку табуляциями по глубине вложенности
        $.date[sql-string|gmt-string|unix-timestamp]    формат вывода даты, по умолчанию -- sql-string
        $.table[object|array|compact]    формат вывода таблицы, по умолчанию -- object
                                 object: [{"c1":"v11","c2":"v12",...},{"c1":"v21","c2":"v22",...},...]
                                 array:  [["c1","c2",...] || null (for nameless),["v11","v12",...],...]
                                 compact:  ["v11" || ["v11","v12",...],...]
        $.file[text|base64]      вывести тело файла в указанном виде (по умолчание тело файла
                                 не попадает в output)
        $.тип[method-junction]   любой тип можно вывести с помощью пользовательского метода, который
                                 должен принимать 3 параметра: ключ, объект данного типа и опции
                                 вызова ^json:string[]
    ]]
- Появилась поддержка библиотеки curl (через которую можно работать с https серверами и устанавливать keep-alive соединения).
Пример:
$f[^curl:load[
	$.url[https://store.artlebedev.ru/?$query]
        $.useragent[Parser3]
        $.timeout(10)
]]
Список допустимых опций curl: http://curl.haxx.se/libcurl/c/curl_easy_setopt.html

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

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

- Пользовательским методам теперь можно задать возможные типы вызова. В @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[...].

- Оператор ^js-unescape[...] теперь декодирует также символы, закодированные в виде \uXXXX.

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

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

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

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

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

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

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

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

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

- Версия скомпонована с последними версиями библиотек PCRE (8.10) и 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::exec/cgi[...;http://сервер/;$.file[$file]].

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

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

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

- Исправлена ошибка, из-за которой оператор ^sleep(...) не понимал дробных долей секунды.

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

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