Выложена версия 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 Исправлена ошибка, из-за которой неверно производился поиск буквы 'Ф' без учёта регистра.
- Выложена версия 3.4.1 beta 1, Misha v.3 [M] 26.11.2010 16:24 / 26.11.2010 16:24