Semantic MediaWiki: неформатированный вывод функции ask
Semantic MediaWiki при выводе пытается форматировать числа в соответствии с языком интерфейса, используя подходящие разделители для тысячных разрядов и десятичной точки. Вернее, как раз для русского языка дробную часть отделяет запятая, тысячные разряды ничем не отделяются. Десятичная точка используется, например, для английского языка, а запятая отделяет тысячные разряды.
Это влияет на вывод значений свойств и результатов семантических запросов — функций ask
и show
. Разбираясь с этой системой я довольно болезненно наступил на грабли.
Дело в том, что результат работы функций ask и show может использоваться для установки значения свойства:
[[NewProperty::{{#ask:[[Page]]|?Property}}]]
Но числа, которые являются значениями свойств, должны быть представлены в неформатированном виде — с десятичной точкой и без разделителей тысячных разрядов. Поэтому вышеуказанная конструкция работает не при всех языках и не для всех чисел. Положение исправляет явное указание, что вывод функции форматировать не надо:
[[NewProperty::{{#ask:[[Page]]|?Property#-}}]]
Однако указание формата работает далеко не со всеми форматами вывода. Например, при суммировании значений:
[[NewProperty::{{#ask:|?Property#-|format=sum}}]]
результат всегда выводится в форматированном виде. При разборе числа происходит ошибка и значение свойства не устанавливается.
Я нашел три решения этой проблемы, но одно из них не работает.
- Конструкция
{{formatnum: number |R}}
должна бы из форматированного числа number делать неформатированное. Но, насколько я понял, форматирование ожидается в локали по умолчанию, а не в текущей, поэтому не работает. - Можно пропатчить файл
mediawiki/extensions/SemanticResultFormats/formats/math/SRF_Math.php
, чтобы воспринимались указания форматов. Там есть функцияprotected function buildResult( SMWQueryResult $results ) { global $wgLang; return $wgLang->formatNum( $this->getResultText( $results, SMW_OUTPUT_HTML ) ); }
поведение которой можно сделать зависимым от формата:
protected static function getFormat( SMWQueryResult $res ) { foreach( $res->getPrintRequests() as $request ) { return $request->getOutputFormat(); } } protected function buildResult( SMWQueryResult $results ) { global $wgLang; if( self::getFormat( $results ) == '-' ) { return $this->getResultText( $results, SMW_OUTPUT_HTML ); } else { return $wgLang->formatNum( $this->getResultText( $results, SMW_OUTPUT_HTML ) ); } }
Но тут больше вопросов, чем ответов. В частном случае работает, но если суммирование идёт больше, чем по одной колонке, логика непонятна — какой формат учитывать?
- Вообще не использовать суммирование средствами формата вывода. Вывести слагаемые в список со знаком сложения в качестве разделителя и вычислить полученное выражение с помощью
expr
. Никаких проблем:[[NewProperty::{{#expr: {{#ask: |mainlabel=-|?Property#=|format=list|sep=+}} }}]]
01.05.2013
Метки: mediawiki, semantic mediawiki Рубрики: Разработка
Написать комментарий