Lua — это язык программирования, доступный через расширение Scribunto MediaWiki в английской Википедии. С февраля 2013 года код Lua можно встраивать в шаблоны вики, используя функциональность Scribunto «{{#invoke:}}». Это расширение поддерживает Lua 5.1 по состоянию на октябрь 2022 года [обновлять].
Исходный код Lua хранится на страницах, называемых модулями (например, Module:Example ). Эти отдельные модули затем вызываются (по коду {{#invoke:<Module name>|<Function name>|(optional) param1 | param2...}}
). Пример:
Модули запускаются на обычных страницах вики с помощью функции-анализатора #invoke. Синтаксис #invoke похож на синтаксис шаблона, но с некоторыми отличиями. Самое важное отличие заключается в том, что вам нужно указать имя функции . Функция — это набор инструкций, которая принимает входные значения, обрабатывает их и возвращает выходное значение. [1] Это очень похоже на то, что делает шаблон: вы даете ему аргументы, он их обрабатывает, и вы получаете результат. Однако вы можете определить много функций в одном модуле Lua, тогда как на одной странице вы можете определить только один шаблон.
Более того, вы не можете просто запустить модуль Lua напрямую — вы можете запустить только одну из функций модуля. Модуль — это просто контейнер для функций, и сам по себе он ничего не делает. Поэтому есть две причины, по которым нам нужно ввести имя функции: мы не можем запустить модуль сам по себе, и без указания имени функции Lua не будет знать, какую именно функцию мы хотим запустить.
Самый простой способ запустить модуль со страницы вики — это:
{{#invoke: имя модуля | имя функции }}
Например, таким образом мы можем запустить Module:Example , в котором есть функция с именем «hello».
{{#invoke:Example|hello}}
→ Привет, мир!Аргументы передаются модулям так же, как и шаблонам. Однако следует отметить, что текст после первого символа вертикальной черты всегда является именем функции; первый позиционный аргумент — это текст после второго символа вертикальной черты.
{{#invoke: имя модуля | имя функции | первый позиционный аргумент | второй позиционный аргумент | именованный аргумент = значение }}
В Module:Example функция "hello_to" приветствует разных людей в зависимости от первого позиционного аргумента. Работает это так:
{{#invoke:Example|hello_to|Kate}}
→ Привет, Кейт!{{#invoke:Example|hello_to|Fred}}
→ Привет, Фред!Третья функция в Module:Example , названная "count_fruit", использует именованные аргументы bananas
и apples
для подсчета количества бананов и яблок, которые у нас есть. Ее можно запустить так:
{{#invoke:Example|count_fruit|apples=3|bananas=4}}
→ У меня 4 банана и 3 яблока{{#invoke:Example|count_fruit|bananas=5|apples=2}}
→ У меня 5 бананов и 2 яблокаБольшинство модулей имеют страницу документации, объясняющую, какие аргументы можно использовать и каковы будут их последствия.
В настоящее время VisualEditor не позволяет вызывать модули через свой интерфейс, хотя он может редактировать существующие вызовы модулей. Возможным решением этой проблемы является использование {{ invoke }} вместо этого. Синтаксис очень похож на #invoke, поэтому для использования его в VisualEditor его первый неименованный аргумент должен быть именем модуля, второй — именем функции, а все аргументы, передаваемые модулю, могут быть указаны так же, как и для обычных шаблонов . Обратите внимание, что это не будет работать для модулей, которые ожидают чтения данных из вызывающего шаблона (поскольку вызывающий шаблон — это сам {{ invoke }}, а не страница, которая его использует), как показано в примере ниже:
{{#invoke:TEMPLATENAME|main}}
→ Википедия:Lua{{invoke|TEMPLATENAME|main}}
→ Шаблон:ВызовОднако это патологический случай, большинство модулей в любом случае будут вести себя одинаково.
Посетите Wikipedia talk:Lua , чтобы запросить помощь в написании скрипта Lua для выполнения определенной задачи в Википедии или другом проекте Фонда Викимедиа.
Грязная история. {{ qif }} , ParserFunctions, расширение Lua, споры о языке сценариев вики (JavaScript против Lua), mw:Extension:WikiScripts, Тим пишет Scribunto с первоначальной поддержкой Lua.
Обсуждаемый годами, Lua был установлен в 2012 году для тестирования на test2.wikipedia.org, с открытым приглашением всем редакторам поэкспериментировать с разработкой модулей Lua. Lua был установлен в английской Википедии в феврале 2013 года после тестирования на mediawiki.org и тестовых вики Wikimedia.
Lua — это скриптовый язык , который можно использовать для анализа данных, вычисления выражений и форматирования результатов с помощью функций или объектно-ориентированного программирования . Хотя некоторые скрипты Lua могут быть простыми, для простоты понимания Lua допускает сложные структуры, включая таблицы, динамические функции и ассоциативные массивы , где индексные индексы могут быть как словами, так и числами индексов. Lua также поддерживает рекурсию повторно вложенных функций, поэтому следует проявлять осторожность, чтобы избежать чрезмерной сложности, когда другие пользователи не поймут, как поддерживать модуль Lua. Ниже приведен исходный код модуля, используемого для приведенных выше примеров.
local p = {}; --Все модули Lua в Википедии должны начинаться с определения переменной --которые будут выполнять свои внешне доступные функции. --Такие переменные могут иметь любое имя, которое вы захотите, и могут --также содержат различные данные и функции.p . hello = function ( frame ) --Добавить функцию к "p". --Такие функции можно вызывать в Википедии --через команду #invoke. --"frame" будет содержать данные, которые Википедия --отправляет эту функцию при запуске. -- 'Hello' — имя по вашему выбору. Это же имя должно быть указано при использовании модуля. local str = "Hello World!" --Объявляем локальную переменную и устанавливаем ее равной --"Привет, мир!". return str --Это говорит нам о необходимости выйти из функции и отправить информацию в --"str" вернуться в Википедию. конец -- конец функции "привет"function p . hello_to ( frame ) — Добавить еще одну функциюлокальное имя = frame.args [ 1 ] — Для доступа к аргументам , переданным модулю, используйте `frame.args` -- `frame.args[1]` ссылается на первый безымянный параметр -- дано модулюreturn "Привет, " .. имя .. "!" -- `..` объединяет строки. Это вернет настроенный -- приветствие в зависимости от указанного имени, например: «Привет, Фред!»конецфункция p.count_fruit ( frame )local num_bananas = tonumber ( frame . args . bananas ) или 0 -- Именованные аргументы ({{#invoke:Example|count_fruit|foo=bar}})local num_apples = tonumber ( frame . args . apples ) или 0 — также доступны путем индексации `frame.args` по имени (`frame.args["bananas"]`,-- или эквивалентно `frame.args.bananas`.локальный conj_bananas = num_bananas == 1 и 'банан' или 'бананы' локальный conj_apples = num_apples == 1 и 'apple' или 'apples' -- Тернарные операторы назначают значения на основе условия в компактной форме.-- Здесь `conj_bananas` возвращает `'banana'`, если `num_bananas` равно 1, в противном случае `'bananas'`.-- Аналогично, `conj_apples` возвращает `'apple'`, если `num_apples` равно 1, в противном случае `'apples'`. вернуть 'У меня есть ' .. num_bananas .. ' ' .. conj_bananas .. ' и ' .. num_apples .. ' ' .. conj_apples -- Как и выше, объедините несколько строк вместе, чтобы получить -- предложение, основанное на приведённых аргументах.конецreturn p --Все модули завершаются возвратом переменной, содержащей их функции, в Википедию.-- Теперь мы можем использовать этот модуль, вызвав {{#invoke: Example | hello }},-- {{#invoke: Пример | hello_to | foo }}, или {{#invoke:Пример|count_fruit|bananas=5|apples=6}}-- Обратите внимание, что первая часть вызова — это имя вики-страницы модуля,-- а вторая часть — это название одной из функций, прикрепленных к-- переменная, которую вы вернули.-- Функция "print" не допускается в Википедии. Весь вывод выполняется-- через строки, «возвращенные» в Википедию.
Образец Lua выделен тегом, <syntaxhighlight lang="lua">...</syntaxhighlight>
размещенным вокруг исходного кода Lua. Чтобы просмотреть более сложные примеры Lua, см. статью: " Lua (язык программирования) ".
Инструкции по использованию Lua в MediaWiki (и, следовательно, в Wikipedia) см. в справочном руководстве mw:Extension:Scribunto/Lua.
Несколько фреймворков модульного тестирования доступны для скриптов Lua в Википедии. Они позволяют редактору выполнить модуль с заданным набором входных данных и проверить, что получены ожидаемые выходные данные. Они полезны для быстрого обнаружения регрессий программного обеспечения , когда изменения в скрипте приводят к появлению новых (или выявлению старых) проблем.
По соглашению модульные тесты для модуля типа Module:Example помещаются в Module:Example/testcases и выполняются в Module talk:Example/testcases .
Module:UnitTests — это предварительно заполненный код, используемый при создании страницы тестовых случаев. Вы запускаете эти модульные тесты, размещая их{{#invoke:Example/testcases|run_tests}}
на странице обсуждения тестовых случаев.
Модуль:ScribuntoUnit — еще один широко используемый тестовый фреймворк. Категория:Модули для тестовых инструментов содержит несколько других для обзора, которые могут быть интересны.
В целом: Lua может получать входные данные только в виде текстовых строк, переданных в {{#invoke:}}
и то, что может быть извлечено через mw.title.new(...):getContent() и frame:expandTemplate(). Вывод Lua не будет предварительно обработан, если frame:preprocess() не вызван явно, что означает, что вызовы шаблонов, функции парсера и т. д. в выводе не будут работать правильно. Кроме того, весь Lua на странице ограничен 10 секундами процессорного времени (вы можете посмотреть в исходном коде отрисованной страницы, чтобы увидеть, сколько времени потребовалось шаблону или модулю для парсинга). И по сравнению со стандартным Lua, Lua Scribunto не имеет всех видов функций (см. справочное руководство mw:Extension:Scribunto/Lua § Отличия от стандартного Lua).
Код Lua в Scribunto запускается только при разборе страницы. Таким образом, единственный пользовательский ввод, который может получить Lua, — это редактирование страницы — он не может создать поле, вычисляющее квадратный корень введенного вами числа, или пересчитать часть множества Мандельброта в зависимости от того, на какую часть родительского множества вы нажимаете. Ввод, который может получить Lua, включает любую транслируемую текстовую страницу в Википедии. Это не включает графические файлы (даже файлы .SVG , хотя они на самом деле являются текстом, если вы не вырезаете и не вставляете их на текстовую страницу Вики), список страниц, перечисленных в категории , или содержимое нетранслируемых специальных страниц .
Включенные заголовки Википедии часто содержат скрытый код, такой как «UNIQ5ae8f2aa414ff233-h-3--QINU», который может потребоваться удалить для эффективного анализа.
Wikilinks, использующие трюк с конвейером, [[Wikipedia:Help| ]] не будут работать, если возвращены как вывод – их нужно явно записать как [[Wikipedia:Help|Help]]. Другие преобразования до сохранения, такие как замена ~~~~сигнатурами, также не будут обработаны. Шаблонные трансляции, вызовы функций парсера и подстановки переменных (т. е. все, что с {{...}}
) не будут обработаны, как и теги, такие как <ref>
или <nowiki>
. Используйте frame:extensionTag для добавления тегов, таких как <ref>
или <syntaxhighlight>
к выводу.
Пожалуйста, разместите шаблон {{ lua }} на подстранице документации всех шаблонов, использующих Lua. Это поможет лучше информировать об использовании Lua и преобразованиях шаблонов.