#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:}}
синтаксического анализатора.
Его параметры:
- условие,
- значение, возвращаемое, если первый параметр не преобразуется в пустую строку или пробел,
- значение, возвращаемое, если первый параметр пуст.
Поэтому семантическая аннотация должна быть во втором параметре, а не в первом:
{{#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. Вау! Большое вам спасибо! Я разберусь со всем этим! Я бы не справился с этим без вас!