Вікі про вікі
Вікі про вікі
Lua-logo

Lua (лу́а, з порт. — «місяць») — скриптова мова програмування з відкритим вихідним кодом. У рушію MediaWiki Lua версії 5.1 підключається за допомогою розширення Scribunto.

Розширення є на всіх вікі-проєктах від 13 червня 2014 року[1], а до цього деякий час воно використовувалося лише на певних проєктах в рамках тестування.

Використання[]

Code compare

Порівняння коду до і після використання Lua (обидва фрагмента дають однаковий результат)

Lua досить часто використовується для створення скриптів, додаткових програм для вирішення конкретних завдань. Наприклад, саме ця мова часто застосовується в ігровій індустрії для створення, розширення інтерфейсу; на ньому працюють такі відомі відеоігри, як World of Warcraft або Angry Birds. Винятком у визначенні завдань мови не стає і Фандом, де Lua грає свого роду допоміжну роль, адже, на відміну від CSS або JavaScript, ця мова програмування цілком собі замінимо традиційної вікірозмітки (разом з функціями парсеру). Більш того, в деяких випадках він виявляється ефективніше звичних засобів, зокрема:

  • При використання в інфобоксах. Хоча функції парсера[2] дозволяють виробляти найрізноманітніші операції всередині шаблону і створювати досить складні конструкції, вони мають ряд значних недоліків: обробка складних шаблонів вимагає від сервера безліч ресурсів і часу, що в підсумку позначається на часі завантаження сторінки, а код таких шаблонів зазвичай складно прочитати. При використанні Lua можна збільшити швидкість завантаження сторінки, а також — в теорії — зробити код більш зрозумілим.
    • При створенні нових інфобоксів за допомогою Infoboxbuilder’a[3] (не варто плутати з однойменною спеціальною сторінкою). На поточний момент дана можливість вважається застарілою і має обмежену підтримку на Фандомі.
  • При створенні тексту з використанням HTML або вікірозмітки в тих випадках, коли потрібно вивести конкретні дані з великого їх масиву. Наприклад, дані про епізоди серіалу, що використовуються в виносках.

Характеристика[]

Lua надає зовсім інший досвід використання в порівнянні з традиційною вікірозміткою укупі з функціями парсеру. Причиною тому є той факт, що мова походить на «стандартний» синтаксис мов програмування, а це відкриває цілий ряд переваг. Перше і основне — логічні операції в звичному для програмування розумінні. Замість ряду «шаблонів» виду {{#if:{{{1|}}}|...|...}} тут доступні оператори розгалуження («if/else»), цикли for і while, змінні (можна записати часові проміжки виконання коду). Це значною полегшує вирішення великої кількості завдань, а також, що не менш важливо, робить код більш зрозумілим для людини. Наприклад, такий код (в порівнянні з {{#ifeq: x| 100 | identical | different}}):

if 1 == 100 then
    'identical'
else
    'different'
end

виглядає логічніше і простіше для розуміння (особливо для тих, хто хоч якось знайомий з англійською мовою). Хоча варто відзначити, що це твердження вірне не завжди. Lua досить нетиповий для вікісреди і незнайомих з мовою користувачів може і відлякати код шаблон, який використовує Lua: {{#invoke:loop|appendloop}} — замість функцій парсеру тут просто викликається відповідний модуль Lua.

Іншим плюсом мови є продуктивність. При правильному використанні можливостей мови можна прискорити обробку сторінок в рази або навіть десятки разів. Наприклад, громіздкі конструкції {{#switch:}} (Підвид розгалуження) замінюються пошуком даних з певної таблиці — базового типу даних Lua, і така міграція прискорює роботу на ~50% при кількості розгалужень {{#switch:}} рівним 150. Однак, разом з тим деякі операції, як {{#switch:}} (перевірка існування сторінки) залишаються дорогими і в Lua (за винятком деяких реалізацій модулів), а тому виграш в продуктивності або відсутня, або і зовсім стає програшем (при неправильній реалізації модуля).

Мова підтримує основні типи даних: логічні значення, числа, рядки, функції, потоки, а також nil — особливий тип для невизначеного значення. Такі звичні структури даних, як масиви, набори або списки, відсутні, замість всіх них використовується одна базова структура — таблиця. Таблиця в Lua — це безліч пар «ключ-значення». На відміну від того ж JavaScript, ключами можуть бути значення будь-яких типів Lua, крім nil. Запис nil в елемент таблиці рівносильна вилучення даного елемента.

Класична програма Hello, world! на Lua поміщається в один рядок:

print("Hello World!")

Однак на Фандомі дана програма повинна бути написана трохи інакше:

local p = {}
 
function p.hello()
    return 'Hello World!'
end
 
return p

Особливості використання Lua на Фандомі[]

На відміну від JS і CSS, скрипти на Lua може редагувати кожен користувач[4]. Для цього необхідно створити сторінку Module:НазваМодуля з необхідним кодом. Під час роботи може допомогти консоль налагодження[5] — особлива функція редактора Lua.

Вбудовування скриптів на сторінку[]

Для використання модуля необхідно вбудувати його на сторінку. Це можна зробити за допомогою наступної конструкції: {{#invoke:НазваМодуля|НазваФункції|параметр1|параметр2|параметр3|…}}. Якщо у функції відсутні будь-які параметри, то після назви потрібно поставити закривающі фігурні дужки.

Якщо модуль був коректно написаний і викликаний, то результат його роботи стане (або не стане, в залежності від коду) видно, в іншому випадку буде виведений текст «Помилка скрипту», а сторінка додасться в особливу категорію «Pages with script errors».

Примітка: не слід вбудовувати скрипти таким чином прямо на сторінку, найкраще створити окремий шаблон і використовувати скрипт через нього; проте вбудовування скрипта безпосередньо не забороняється.

Написання коду[]

Після того як сторінка модуля була створена, необхідно додати на неї код (інакше створення модуля не має сенсу). Якщо потрібно почати написання модуля з нуля, на сторінку потрібно додати наступний код:

local p = {}
 
function p.hello()
    --Код функції
    --Повернення значення
end
 
return p

Щоб передати у функцію аргументи, необхідно всередині круглих дужок додати frame.

Усередині функціїї hello відбуваються різні операції (які саме — залежить від написаного коду), результат яких потім буде повернуто користувачеві. Всередині модуля можна реалізувати кілька функцій, які можуть бути основними (безпосередньо повертаючи результат своєї роботи при виклику модуля) або допоміжними (повертаючи результат для іншої функції).

Прикладом допоміжної функції може бути отримання даних з об'єкта frame, в якому містяться параметри, зазначені при виклику модуля:

Код Результат
local str = {}
local result = ''
 
-- Основна функція
function str.build( frame )
    local new_args = str._getP(frame.args, {'name', 'text'});
    local n = new_args['name'] or "новий користувач";
    local t = new_args['text'] or "Як справи?";
    local result='';
    result = "Привіт, " .. n .. "! " .. t .. "<br/>"
 
    return result;
end
 
-- Отримання параметрів
function str._getP( frame_args, arg_list )
    local new_args = {};
    local index = 1;
    local value;
 
    for i,arg in ipairs( arg_list ) do
        value = frame_args[arg]
        if value == nil then
            value = frame_args[index];
            index = index + 1;
        end
        new_args[arg] = value;
    end
 
    return new_args;
end 
 
return str;
Даний модуль виводить рядок, в якій є два змінних: перша з них відповідає за «одержувача» вітання, а друга — за додатковий текст. При виклику такого модуля за допомогою коду {{#invoke:Test2|build|анонім|Це — тестовий модуль!}} буде отримано такий результат:
Module output example

Для того щоб полегшити процес створення нового модуля, можна скористатися різними бібліотеками або імпортом вже готових скриптів.

Бібліотеки[]

Lua div create example

Приклад створення тега з текстом всередині

Всього на Фандомі використовуються два види бібліотек: стандартні і бібліотеки Scribunto.

Стандартні бібліотеки містять:

  • Базові функції (висновок версії, повідомлення про помилку і т.д.);
  • Математичні функції (генерація випадкових чисел, обчислення різних функцій);
  • Функції для виведення часу;
  • Функції для завантаження модулів;
  • Функції для роботи з рядками;
  • Функції для роботи з таблицями (table).

У свою чергу, бібліотеки Scribunto більшою мірою призначені для роботи на Фандомі і використовуються для роботи зі сторінками: отримання URL-адреси, доступ до frame і подальша робота з ним, робота з рядками, створення HTML тегів і багато іншого. Детальніше вивчити вміст бібліотек можна на FANDOM Open Source Library[6].

На Фандомі також доступні різні глобальні модулі; їх можна знайти на FANDOM Open Source Library[7]. Вони можуть використовуватися як в якості основи для інших модулів, так і самостійно.

Імпорт[]

Після 25 червня 2015 року на Фандомі з'явилася можливість безпосередньо імпортувати скрипти на Lua з FANDOM Open Source Library[8]. Для цього потрібно додати на сторінку наступний код:

return require("Dev:ModuleName")

Тобто, якщо ви хочете імпортувати на свою вікі Модуль: Quote, то вам буде потрібно створити нову сторінку модуля, після чого додати на неї наступний код:

return require("Dev:Quote")

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

Якщо ж ви хочете створити модуль, який використовує не тільки скопійований код, але і свій — можна помістити модуль в окрему змінну, після чого викликати його при необхідності. Нижче наведено приклад з глобального модуля Asof (який, в свою чергу, використовує інші глобальні модулі)[9]:

local u = require("Dev:Utility")
local dateHelper = require("Dev:Date")

Посилання[]

  • Раздел Dev Wiki, присвячений Lua
  • Список готових скриптів на Lua з докладною документацією
  • Заготівки для полегшення написання модулей
  • Советы по переносу інфобоксів на Lua

Примітки[]