This page, or parts of it, are still untranslated. Please translate it to the appropriate language (русский).
Эта страница затрагивает некоторые основы разработки простых шаблонов на Lua.
Основы[]
- Main article: Basics
Перед началом работы с шаблонами на Lua, необходимо понимать как использовать обычные шаблоны с вики-текстом, а также желательно изучить информацию о Lua на таких сайтах как Wikibooks и прочитать мануал по его использованию.
Рабочее пространство[]
Шаблоны на Lua находятся в пространстве имён "Модули" и всегда должны находится здесь. Например: модуль под названием "helloworld" должен хранится на странице под названием Модуль:Helloworld (или Module:Helloworld, если вики англоязычная).
Создание модулей[]
В модуле всегда должна быть таблица, а также строка, которая возвращает эту таблицу (если это только не мета-модуль, см. ниже).
--Таблица
local p = {}
-- Здесь какой-то код
return p
Для вызова модуля (или использования его на странице) необходимо чтобы в нём была хотя бы одна функция. Но эта функция должна быть частью возвращаемой таблицы (например invocable):
--Таблица
local invocable = {}
--Можно вызвать на странице
function invocable.greet(frame)
return "Живите долго и счастливо"
end
--Нельзя вызвать
function askname(frame)
return "Как вас зовут?"
end
return invocable
Время выполнения[]
Модули Lua могут работать максимум 7 секунд. Это значит, что время выполнения всех модулей на Lua не должно превышать 7 секунд. В противном случае появится ошибка.
Копирование модулей на другую вики[]
Modules hosted here can be used in another wiki, but this may require steps:
- Copy the module to your wiki, e.g. Module:Links
- Copy all modules it depends on to your wiki. This is a bit complicated because Fandom uses an older Scribunto version. But these steps should help:
- Open the module page and find sections that contain text like
require("text"), e.g. in module links text=="Dev:Arguments". - Search for the module in
dev.fandomor any other wiki, e.g. Module:Arguments - Copy this Module:Arguments to your wiki
- Replace all mentions of
require("Dev:")withrequire("module:"), e.g.require("Module:Arguments")
- Open the module page and find sections that contain text like
- Redo step two, for every time a
require("")is found in copied module.
Использование ввода (параметов)[]
Ввод (параметры шаблонов) могут быть введены в модуль во время его вызова.
Синтаксис[]
{{#invoke:название_модуля|название_функции|параметр1|параметр2|параметр3|...}}
Когда код выше вызовется, создастся таблица (называемая frame), которая содержи в себе весь ввод. Эта таблица передастся в вызываемую функцию, а все параметры будут хранится в под-таблице args (например frame.args). Например:
{{#invoke:invocable|greet|john}}
{{#invoke:invocable|greet|name=john}}
--Модуль:Invocable
--Таблица
local invocable = {}
function invocable.greet(frame)
local name = frame.args[1] or frame.args["name"]
return "Живите долго и счастливо " ..name
end
return invocable
- Вывод
Живите долго и счастливо john
Объяснение:
Args — это список, хранящий в себе все введённые параметры, args[1] ссылается на значение первого введённого параметра, например john, args["name"] отсылает к именованному параметру "name".
Получение ввода в шаблоне[]
Код из модуля выше не может получить значения параметров, если он был обёрнут в шаблон. Но вы можете получить доступ к родительскому объекту frame при помощи frame:getParent(), а затем получить под-таблицу со значениями аргументов frame:getParent().args:
- Шаблон:greet
{{#invoke:invocable|greet}}
- Модуль:invocable
--Таблица
local invocable = {}
function invocable.greet(frame)
local parent = frame:getParent()
local name = parent.args[1]
local name2 = parent.args[2] or ""
return "Живите долго и счастливо :" ..name ..' '..name2
end
return invocable
- Использование
{{greet|Jack}}
- Вывод
Живите долго и счастливо :Jack
- Использование
{{greet|Jack|Jill}}
- Вывод
Живите долго и счастливо :Jack Jill
| Пример | Параметр | Шаблон | Модуль | Вывод |
|---|---|---|---|---|
| {{greet|john}} | 1 | {{{1}}} | frame:getParent().args[1] | john |
| {{greet|name=Spock}} | name | {{{name}}}} | frame:getParent().args["name"] | Spock |
| {{#invoke:invocable|greet|john}} | 1 | frame.args[1] | john | |
| {{#invoke:invocable|greet|name=Worf}} | name | frame.args["name"] | Worf | |
| {{#invoke:invocable|greet|jack|jill}} | 1,2 | frame.args[1], frame.args[2] | Jack , Jill |
Ошибки скрипта[]
Когда модуль не срабатывает корректно, он выводит ошибку скрипта. Хорошее объяснение об ошибках скриптов есть на Википедии.
Продвинутое использование[]
Использование сторонних модулей и таблиц является большим преимуществом Lua. Это убирает потребность в "переизобретении колеса", вместо этого можно потратить больше времени на конкретное решение проблемы.
Использование других модулей[]
Чтобы использовать библиотеки или модули, вам нужно их импортировать. Это можно сделать при помощи метода require.
--Модуль:Libraries
local library = {}
function library.greet(frame)
local invocable = require("Модуль:invocable")
return invocable.greet(frame)
end
return library
{{#invoke:library|greet|Zeus}}
- Вывод
Живите долго и счастливо Zeus
Примечание: синтаксис является чувствительным к регистру, а потому "Dev" != "dev".
Мета-модули[]
Это модули, которые не задумывались для использования на страницах (например при помощи {{#invoke:}}), а также не всегда имеют функции, которые можно вызывать.
Использование внешних таблиц[]
Внешние таблицы могут быть использованы тем же методом, что и внешние модули, кроме того факта, что для этого есть особый метод (mw.loadData), который загружает таблицу единожды на страницу, делая использование таких таблиц более эффективным.
--Модуль:tables
local tables = {'food','garden','relic'}
return tables
- Использование
--Модуль:showobjects
local p = {}
function p.show(frame)
local objects = require("Модуль:tables")
--Использование mw.loadData
local objects2 = mw.loadData("Модуль:tables")
return objects[1] ..' & ' objects2[2]
end
return p
{{#invoke:showobjects|show}}
- Вывод
food & garden
Глобальные модули[]
- Main article: Global modules
Модули, которые находятся на вики dev.fandom.com называются глобальными. Они работают также, как и другие модули. находящиеся на вики, но могут быть вызваны в любом другом модуле на любой другой вики (например food.fandom.com). Разница только в синтаксисе (используется слово Dev вместо Модуль или Module).
local global_invocable = require("Dev:Invocable")
local global_Tables = mw.loadData("Dev:Tables")
Инструменты[]
Существует множество полезных инструментов, которые могут помочь в создании модулей:
Редактор кода[]
Редактор кода — это редактор по-умолчанию, который можно отключить при желании.
В редакторе кода есть несколько скрытых фич, таких как шорткаты и макросы.[1]
Шорткаты[]
Краткий список полезных шорткатов приведён ниже:
| Windows/Linux | Mac | Действие |
|---|---|---|
| ⎇ Alt + ⇧ Shift + ↓ | ⌘ Command + ⌥ Option + ↓ | Копирует строку ниже |
| ⎇ Alt + ⇧ Shift + ↑ | ⌘ Command + ⌥ Option + ↑ | Копирует строку выше |
| ⎇ Alt + ↓ | ⌥ Option + ↓ | Перемещает строку ниже |
| ⎇ Alt + ↑ | ⌥ Option + ↑ | Перемещает строку выше |
| ⎇ Alt + ⌦ Delete | Ctrl + K | Удаляет строку до конца |
| ⎇ Alt + ← Backspace | ⌘ Command + ← Backspace | Удаляет строку до начала |
| Ctrl + ← Backspace | ⌥ Option + ← Backspace, Ctrl + ⌥ Option + ← Backspace | Удаляет слово слева |
| Ctrl + ⌦ Delete | ⌥ Option + ⌦ Delete | Удаляет слово справа |
| --- | Ctrl + O | Разделяет строку |
| Windows/Linux | Mac | Действие |
|---|---|---|
| Ctrl + ⇧ Shift + E | ⌘ Command + ⇧ Shift + E | Включить макрос |
| Ctrl + ⎇ Alt + E | --- | Записать макрос |
Подсветка синтаксиса и его проверка[]
Редактор кода посвечивает ошибки синтаксиса, а также даёт информацию, которая может помочь в из устранении.
Отладочная консоль[]
- Main article: Debug console
Отладочная консоль — это терминал, который делает отладку вашего кода проще.