Может ли пользовательский 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['*'], В противном случае нет никакой разницы.)

Другие вопросы по тегам