dev

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:

  1. Copy the module to your wiki, e.g. Module:Links
  2. 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:
    1. Open the module page and find sections that contain text like require("text"), e.g. in module links text =="Dev:Arguments".
    2. Search for the module in dev.fandom or any other wiki, e.g. Module:Arguments
    3. Copy this Module:Arguments to your wiki
    4. Replace all mentions of require("Dev:") with require("module:"), e.g. require("Module:Arguments")
  3. 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

Отладочная консоль — это терминал, который делает отладку вашего кода проще.

See also

Ссылки