Семантическая медиавики и свойства в шаблоне

#mediawiki #semantics #mediawiki-templates #semantic-mediawiki

#mediawiki #семантика #mediawiki-шаблоны #семантический-mediawiki

Вопрос:

У меня есть следующая конструкция в шаблоне, чтобы проверить, заполнены ли атрибуты

 {{#if:{{{typeip|}}}|'''Type IP:'''{{{typeip}}}|<big>'''Type IP:'''</big><span style="color: red">not filled in</span>}}
 

Я хочу, чтобы атрибут typyap был свойством, чтобы я мог найти его с помощью семантического поиска или с помощью запроса через функцию #ask .

Я попробовал следующую конструкцию

 {{#if:[[typeip::{{{typeip|}}}]]|'''Type IP:'''{{{typeip}}}|<big>'''Type IP:'''</big><span style="color: red">not filled in</span>}}
 

Но это не работает. Функция #asc возвращает пустой запрос, а страница свойств типа ip пуста. Можете ли вы сказать мне, что я делаю не так? Я выполнил переиндексацию с помощью служебного скрипта rebuildData.php Но это тоже не помогает. Я пытался вставить свойство в другие места шаблона, но это тоже не работает. Шаблон заполняется с помощью формы.

Заранее благодарю вас!

Ответ №1:

Конечно, это не работает. Вы неправильно вызываете функцию {{#if:}} синтаксического анализатора.

Его параметры:

  1. условие,
  2. значение, возвращаемое, если первый параметр не преобразуется в пустую строку или пробел,
  3. значение, возвращаемое, если первый параметр пуст.

Поэтому семантическая аннотация должна быть во втором параметре, а не в первом:

 {{#if:{{{typeip|}}}
| '''Type IP:''' [[typeip::{{{typeip}}}]]
| <big>'''Type IP:'''</big><span style="color: red">not filled in</span>
}}
 

{{{typeip}}} должен быть голый текст без какого-либо вики-форматирования. Если вам необходимо передать в него викитекст для преобразования викилингов в семантические аннотации, задав свойства страницы типа, самый простой способ будет следующим:

  • Установите Scribunto,
  • создайте Module:Inject со следующим содержимым:
 return {
    property = function (frame)
        local wikitext, property = frame.args[1], frame.args[2]
        local annotation = mw.ustring.gsub (
            wikitext,
            '%[%[([^|%]] )(|[^%]]*)?%]%]',
            '[[' .. property .. '::%1%2]]'
        )
        return annotation
    end
}
 
  • поместите в свой шаблон следующее:
 {{#invoke:Inject|property|{{{typeip|}}}|typeip}}
 

Шаблон преобразует любые викилинки в {{{typeip}}} подобных [[A]] или [[B|C]] в семантические аннотации, подобные [[typeip::A]] или [[typeip::B|C]] .

Комментарии:

1. Спасибо за ответ! Это сработало! Но только для полей, где типом данных является текст, дата или число. По какой-то причине он не работает с полями, которые ссылаются на другие страницы. Например, у меня есть поле значения, в котором форма выбирается из списка страниц в другой категории. И это не работает для этого поля. Более того, это поле отображается неправильно в шаблоне, если я добавляю к нему свойство. Не знаете, что делать в этой ситуации?

2. Вы имеете в виду, что если параметр шаблона похож [[Page]] на викилинкинг, то аннотация не работает? Если это так, то не должно. Либо передайте Page шаблон в шаблон, либо обработайте параметр с помощью регулярного выражения — вам понадобится либо расширение MediaWiki, которое позволяет использовать регулярные выражения, либо Lua.

3. Да! Вот что я имею в виду. У меня есть расширение ParserFunctions. Достаточно ли этого? Только я, честно говоря, понятия не имею, как установить свойство с помощью регулярного выражения в этом случае. Не могли бы вы привести пример, пожалуйста?

4. Вау! Большое вам спасибо! Я разберусь со всем этим! Я бы не справился с этим без вас!