Semantic MediaWiki: неформатированный вывод функции ask

Semantic MediaWiki при выводе пытается форматировать числа в соответствии с языком интерфейса, используя подходящие разделители для тысячных разрядов и десятичной точки. Вернее, как раз для русского языка дробную часть отделяет запятая, тысячные разряды ничем не отделяются. Десятичная точка используется, например, для английского языка, а запятая отделяет тысячные разряды.

Это влияет на вывод значений свойств и результатов семантических запросов — функций ask и show. Разбираясь с этой системой я довольно болезненно наступил на грабли.

Дело в том, что результат работы функций ask и show может использоваться для установки значения свойства:

[[NewProperty::{{#ask:[[Page]]|?Property}}]]

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

[[NewProperty::{{#ask:[[Page]]|?Property#-}}]]

Однако указание формата работает далеко не со всеми форматами вывода. Например, при суммировании значений:

[[NewProperty::{{#ask:|?Property#-|format=sum}}]]

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

Я нашел три решения этой проблемы, но одно из них не работает.

  1. Конструкция {{formatnum: number |R}} должна бы из форматированного числа number делать неформатированное. Но, насколько я понял, форматирование ожидается в локали по умолчанию, а не в текущей, поэтому не работает.
  2. Можно пропатчить файл 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 ) );
        }
    }

    Но тут больше вопросов, чем ответов. В частном случае работает, но если суммирование идёт больше, чем по одной колонке, логика непонятна — какой формат учитывать?

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

    [[NewProperty::{{#expr: {{#ask: |mainlabel=-|?Property#=|format=list|sep=+}} }}]]

01.05.2013  Метки: ,   Рубрики: Разработка

Написать комментарий