Может ли пользовательский JavaScript на MediaWiki вызывать модуль Lua?
На вики-ресурсах MediaWiki у каждого пользователя есть пользовательская страница JavaScript, в которую он может вставить код, очень похожий на GreaseMonkey, но без расширений. Такой как в User:YourUsername/vector.js
MediaWiki также имеет встроенный Lua, который называется Scribunto, на некоторое время.
Я знаю, что модули Lua можно вызывать из шаблонов MediaWiki, и я полагаю, что это их основное использование. Но гуглить и охотиться за документами MediWiki я не могу найти, есть ли способ вызвать модуль Lua из вашего пользовательского JavaScript.
(Мне нужно сопоставить названия языков с кодами языков в моем JS, и есть модуль Lua, чтобы сделать это без дублирования кода (в основном данных) на другом языке.)
1 ответ
Вы не можете сделать это напрямую, потому что JS работает на клиенте, а Lua на сервере. Что вы можете сделать, это использовать API MediaWiki из JS для вызова модуля. В частности, используя expandtemplates
Модуль API.
Например, если вы хотите вызвать функцию h2d
из модуля: Hex с параметром FF
({{#invoke:hex|h2d|FF}}
в викитексте) и alert
результат, то JS будет выглядеть так:
var api = new mw.Api();
api.get( {
action: 'expandtemplates',
text: '{{#invoke:hex|h2d|FF}}'
} ).done ( function ( data ) {
alert(data.expandtemplates['*']);
} );
А для конкретного случая ОП, работающего на английском Викисловарь:
var langName = 'Esperanto';
(new mw.Api()).get({
action: 'expandtemplates',
format: 'json',
prop: 'wikitext',
text: '{{#invoke:languages/templates|getByCanonicalName|' + langName + '|getCode}}'
}).done(function(data) {
alert('Language name: ' + langName + '\nLanguage code: ' + data.expandtemplates.wikitext);
});
(prop: 'wikitext'
избегает предупреждения от API и позволяет получить доступ к результату как data.expandtemplates.wikitext
а не слегка загадочный data.expandtemplates['*']
, В противном случае нет никакой разницы.)