Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Lua - это язык программирования, доступный через расширение Scribunto MediaWiki в английской Википедии. Код Lua теперь можно встраивать в шаблоны вики, используя функцию "{{#invoke:}}" Scribunto. Это расширение поддерживает Lua 5.1 по состоянию на июль 2015 года .

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

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

  • {{#invoke:Example|hello_to|Kate}} → Привет, Катя!
  • {{#invoke:Example|hello_to|Fred}} → Привет, Фред!

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

  • {{#invoke:Example|count_fruit|apples=3|bananas=4}} → У меня 4 банана и 3 яблока
  • {{#invoke:Example|count_fruit|bananas=5|apples=2}} → У меня 5 бананов и 2 яблока

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

Запросить скрипт

Посетите Wikipedia talk: Lua, чтобы запросить помощь в написании сценария Lua для выполнения определенной задачи в Википедии или другом проекте Wikimedia Foundation.

История

Грязная история . {{ qif }}, ParserFunctions , расширение Lua , обсуждается язык сценариев вики (JavaScript против Lua), mw: Extension: WikiScripts , Тим пишет Scribunto с начальной поддержкой Lua.

Обсуждаемый в течение многих лет, Lua был установлен в 2012 году для тестирования на test2.wikipedia.org с открытым приглашением для всех редакторов поэкспериментировать с разработкой модулей Lua. Lua был установлен в английской Википедии в феврале 2013 года после тестирования на mediawiki.org и тестовых вики-сайтах Викимедиа.

О Lua

См. Также короткую презентацию Брэда Йорша, где вы найдете базовый пример того, как преобразовать шаблон вики-текста в модуль Lua.

Lua - это язык сценариев, который можно использовать для анализа данных, вычисления выражений и форматирования результатов с помощью функций или объектно-ориентированного программирования . Хотя некоторые сценарии Lua можно сделать простыми, для облегчения понимания Lua допускает сложные структуры, включая таблицы, динамические функции и ассоциативные массивы, где индексы индекса могут быть словами, а также номерами индексов. Lua также поддерживает рекурсию повторно вложенных функций, поэтому следует проявлять осторожность, чтобы избежать чрезмерной сложности, когда другие пользователи не поймут, как поддерживать модуль Lua. Ниже приведен исходный код модуля, использованного в приведенных выше примерах.

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

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

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

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

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

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

Module: ScribuntoUnit и Module: UnitTests - наиболее часто используемые среды тестирования. В категории «Модули для инструментов тестирования» есть несколько других, которые могут быть интересны.

Особенности Википедии

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

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

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

Викитекст

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

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

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

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

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

  • Special: PrefixIndex / Module: - отслеживание модулей Lua может быть выполнено с помощью Special: PrefixIndex
  • Справка: Отладка Lua - руководство по отладке модулей Lua
  • Модуль: Sandbox предоставляет псевдо-пространство имен для экспериментов с модулями Lua.
  • WP: запросы Lua - запросы для шаблонов или задач на основе Lua
  • Категория: Шаблоны на основе Lua - группы шаблонов на основе Lua
  • Категория: метамодули Lua
  • Руководство: Соглашения о кодировании / Lua - стандарты для улучшения читаемости кода за счет согласованности
  • mw: Расширение: справочное руководство Scribunto / Lua и все модули .
  • Википедия: Расширенное кодирование шаблонов

Заметки

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