stringtranslate.com

Википедия:Луа

WP: Луа (разговаривать) Помощь Делать Ресурсы Справочное руководство

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: имя модуля | имя функции | первый позиционный аргумент | второй позиционный аргумент | именованный аргумент = значение }}

В Module:Example функция hello_to приветствует разных людей в зависимости от первого позиционного аргумента. Это работает следующим образом:

Третья функция в Module:Example с именем «count_fruit» использует именованные аргументы bananasи applesподсчитывает количество имеющихся у нас бананов и яблок. Его можно запустить следующим образом:

У большинства модулей есть страница документации, объясняющая, какие аргументы можно использовать и каковы будут их последствия.

Запросить сценарий

Посетите 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 также поддерживает рекурсию повторно вложенных функций, поэтому следует проявлять осторожность, чтобы избежать чрезмерной сложности, когда другие пользователи не смогут понять, как поддерживать модуль Lua. Ниже приведен исходный код модуля, используемого в приведенных выше примерах.

локальный  р  =  {};  --Все модули Lua в Википедии должны начинаться с определения переменной  , --которая будет содержать их функции, доступные извне.  --Такие переменные могут иметь любое имя и  --также содержать различные данные и функции. п . hello  =  function (  frame  )  --Добавьте функцию в "p".  --Такие функции можно вызвать в Википедии  --с помощью команды #invoke.  --"frame" будет содержать данные, которые Wikipedia  --отправляет этой функции при ее запуске.  -- «Привет» — это имя по вашему выбору. При использовании модуля необходимо использовать одно и то же имя.  local  str  =  "Привет, мир!"  --Объявите локальную переменную и присвойте ей значение  --"Hello World!".   return  str  --Это говорит нам о выходе из этой функции и отправке информации в  --"str" ​​обратно в Википедию. end  -- конец функции "привет" function  p . hello_to ( frame ) — Добавить еще одну функцию с локальным  именем  =  frame . args [ 1 ]  – для доступа к аргументам, передаваемым в модуль, используйте `frame.args`  -- `frame.args[1]` относится к первому безымянному параметру  , который передается модулю и возвращает  "Hello, "  ..  name  ..  "!"  -- `..` объединяет строки. Это вернет индивидуальное  приветствие в зависимости от заданного имени, например «Привет, Фред!» конечная функция  p . count_fruit ( кадр )local  num_bananas  =  tonumber ( frame.args.banans ) или 0 именованные аргументы ( { { #invoke : Example| count_fruit |foo=bar}}) local num_apples = tonumber ( frame.args.apples ) или 0 аналогично доступ осуществляется путем индексации `frame.args` по имени (`frame.args["bananas"]`, -- или, что эквивалентно, `frame.args.bananas`.       local  conj_bananas  =  num_bananas  ==  1  и  'banana'  или  'bananas'  local  conj_apples  =  num_apples  ==  1  и  'apple'  или  'apples'  — Тернарные операторы компактно присваивают значения на основе условия. -- Здесь conj_bananas получает банан, если num_bananas равен 1, иначе — бананы. -- Аналогично, `'conj_apples` получает `'apple'`, если `'num_apples` равно 1, иначе `'apples'`.  return  'I have '  ..  num_bananas  ..  ' '  ..  conj_bananas  ..  ' и '  ..  num_apples  ..  ' '  ..  conj_apples  -- Как и выше, объедините несколько строк вместе, чтобы создать  -- предложение, основанное на аргументы приведены. конецreturn  p  --Все модули завершаются возвратом переменной, содержащей их функции, в Википедию. -- Теперь мы можем использовать этот модуль, вызвав {{#invoke: Пример | привет }}, -- {{#invoke: Пример | привет_то | foo }} или {{#invoke:Example|count_fruit|bananas=5|apples=6}} -- Обратите внимание, что первая часть вызова – это имя вики-страницы Модуля, -- а вторая часть — это имя одной из функций, прикрепленных к возвращаемой вами переменной --.-- Функция «печать» не разрешена в Википедии. Весь вывод осуществляется через строки, «возвращенные» в Википедию.

Образец Lua выделяется тегом «<syntaxhighlight lang="lua">...</syntaxhighlight>», помещенным вокруг исходного кода Lua. Чтобы просмотреть некоторые более сложные примеры Lua, см. статью: « Lua (язык программирования) ».

Инструкции по использованию Lua в MediaWiki (и, следовательно, в Википедии) см. в справочном руководстве mw:Extension:Scribunto/Lua.

Модульное тестирование

В Википедии доступно несколько фреймворков модульного тестирования для сценариев Lua. Это позволяет редактору запускать модуль с заданным набором входных данных и проверять получение ожидаемых выходных данных. Они полезны для быстрого обнаружения регрессий программного обеспечения , когда изменения в сценарии приводят к возникновению новых (или выявлению старых) проблем.

По соглашению модульные тесты для модуля типа Module:Example помещаются в Module:Example/testcases и выполняются в Module talk:Example/testcases .

Модуль:UnitTests — это предварительно заполненный код, используемый при создании страницы тестовых примеров. Вы запускаете эти модульные тесты, размещая их{{#invoke:Example/testcases|run_tests}}на странице обсуждения тестовых примеров.

Module:ScribuntoUnit — еще одна широко используемая среда тестирования. В категории:Модули для инструментов тестирования есть еще несколько других, которые могут быть интересны.

Особенности MediaWiki

В целом: Lua может получать входные данные только в виде текстовых строк, передаваемых в {{#invoke:}}и которые можно получить через mw.title.new(...):getContent() и Frame:expandTemplate(). Вывод Lua не будет подвергаться предварительной обработке, пока не будет явно вызван метод Frame:preprocess(), а это означает, что вызовы шаблонов, функции синтаксического анализатора и т. д. в выводе не будут работать правильно. Кроме того, время всего Lua на странице ограничено 10 секундами процессорного времени (вы можете посмотреть исходный код отрисованной страницы, чтобы узнать, сколько времени потребовалось для анализа шаблона или модуля). По сравнению со стандартным Lua, в Lua Scribunto отсутствуют все виды функций (см. справочное руководство mw:Extension:Scribunto/Lua § Отличия от стандартного Lua).

Ограничения ввода Lua

Код Lua в Scribunto запускается только во время анализа страницы. Таким образом, единственный пользовательский ввод, который может получить Lua, — это редактирование страницы — он не может создать поле, которое вычисляет квадратный корень из введенного вами числа, или пересчитать часть множества Мандельброта в зависимости от того, на какой части родительского набора вы щелкнете. на. Входные данные, которые может получить Lua, включают любую включаемую текстовую страницу в Википедии. Сюда не входят графические файлы (даже файлы .SVG , хотя на самом деле они являются текстовыми, если только вы не вырежете и не вставите их на текстовую страницу Wiki), список страниц, перечисленных в категории , а также содержимое непереключаемых специальных страниц. .

Викитекст

Включенные заголовки Википедии часто содержат скрытый код, такой как «UNIQ5ae8f2aa414ff233-h-3--QINU», который, возможно, придется удалить для эффективного анализа.

Викиссылки, использующие трюк с каналом, [[Wikipedia:Help| ]] не будут работать, если они будут возвращены в виде вывода — их необходимо явно записать как [[Wikipedia:Help|Help]]. Другие преобразования предварительного сохранения, такие как замена ~~~~подписями, также не будут обработаны. Включения шаблонов, вызовы функций синтаксического анализатора и замены переменных (т. е. все, что имеет {{...}}) не будут обрабатываться, а также такие теги, как <ref>или <nowiki>. Используйте Frame:extensionTag для добавления тегов типа <ref>или <syntaxhighlight>для вывода.

Маркировка преобразованных шаблонов

Пожалуйста, поместите шаблон {{ lua }} на подстраницу документации всех шаблонов, использующих Lua. Это поможет лучше рассказать об использовании Lua и преобразованиях шаблонов.

Смотрите также

Примечания

  1. ^ Вы также можете иметь несколько выходных значений, но функции, которые делают это, обычно не предназначены для доступа с вики-страниц.