Wikipedia:Lua

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacja, szukaj
Przestrzenie nazw
p. przedmiotowe Lista stron p. dyskusji Lista stron
(główna) (0) Dyskusja (1)
Wikipedyst(k)a (2) Dyskusja wikipedysty/-ki (3)
Wikipedia (4) Dyskusja Wikipedii (5)
Plik (6) Dyskusja pliku (7)
MediaWiki (8) Dyskusja MediaWiki (9)
Szablon (10) Dyskusja szablonu (11)
Pomoc (12) Dyskusja pomocy (13)
Kategoria (14) Dyskusja kategorii (15)
Portal (100) Dyskusja portalu (101)
Wikiprojekt (102) Dyskusja wikiprojektu (103)
Moduł (828) Dyskusja modułu (829)
Gadżet (2300) Dyskusja gadżetu (2301)
Definicja gadżetu (2302) Dyskusja definicji gadżetu (2303)
p. globalna
Wątek (2600)
p. wirtualne
Specjalna (-1)
Media (-2)

Lua to język programowania, który jest dostępny na polskiej Wikipedii dzięki rozszerzeniu oprogramowania MediaWiki o nazwie Scribunto. Kod Lua można osadzać z wykorzystaniem „{{#invoke:}}”, jednej z funkcji rozszerzenia Scribunto. Rozszerzenie to wspiera Lua w wersji 5.1.

Kod źródłowy Lua jest przechowywany na stronach nazywanych modułami (np. Moduł:Banany). Te indywidualne moduły są następnie wywoływane (przy użyciu kodu {{#invoke:}}) na stronach szablonów (np. Moduł:Banany/opis wykorzystuje kod {{#invoke:Banany|hello}} aby wyświetlić tekst „Hello, world!”).

Uruchamianie modułu[edytuj]

Moduły są uruchamiane na normalnych stronach z wykorzystaniem funkcji parsera, #invoke. Składnia #invoke jest podobna do składni szablonów, z pewnymi jednak różnicami. Najważniejszą różnicą jest fakt, że należy określić nazwę funkcji, którą chcemy uruchomić. Funkcja jest zestawem instrukcji która pobiera wartości wejściowe, przetwarza je i zwraca wartość wyjściową[a]. To proces podobny to tego, który jest wykonywany przez szablony: podajesz im parametry, są one przetwarzane, i w rezultacie otrzymujesz pewien wynik. Jednakże, w jednym module Lua możesz zdefiniować wiele funkcji, tymczasem możesz zdefiniować tylko jeden szablon na jednej stronie.

Ponadto, nie możesz po prostu bezpośrednio uruchomić modułu Lua – możesz jedynie uruchomić jedną z funkcji modułu. Moduł jest tylko kontenerem dla funkcji i sam w sobie nic nie robi. Dlatego istnieją dwa powody dla których musimy wprowadzić nazwę funkcji: nie możemy uruchomić samego modułu, a bez określenia nazwy funkcji Lua nie rozpozna którą funkcję chcielibyśmy uruchomić.

Oto najprostszy sposób na uruchomienie modułu z poziomu jakiejś strony wiki:

{{#invoke:nazwa modułu|nazwa funkcji}}

Przykładowo, możemy uruchomić Moduł:Banany, posiadający funkcję „hello” w następujący sposób:

  • {{#invoke:Banany|hello}} → Hello, world!

Używanie argumentów[edytuj]

Argumenty są przenoszone do modułów w ten sam sposób, co parametry do szablonów. Należy jednak zwrócić uwagę na fakt, że tekst po pierwszym znaku potoku jest zawsze nazwą funkcji; pierwszy argument pozycyjny jest tekstem po drugim znaku potoku.

{{#invoke:nazwa modułu|nazwa funkcji|pierwszy argument pozycyjny|drugi argument pozycyjny|nazwany argument = wartość}}

Przykładowo, w Moduł:Banany/argumenty, funkcja „hello” wita różnych ludzi w zależności od pierwszego argumentu pozycyjnego. W praktyce działa to tak:

  • {{#invoke:Banany/argumenty|hello|Kate}} → Witaj, Kate!
  • {{#invoke:Banany/argumenty|hello|Fred}} → Witaj, Fred!

Moduł Banany/argumenty posiada także funkcję o nazwie „policz_owoce”, która używa nazwanych parametrów: banany i jabłka do policzenia liczby bananów i jabłek, jaką mamy. Funkcję tą możemy wywołać w ten sposób:

  • {{#invoke:Banany/argumenty|policz_owoce|jablka=3|banany=4}} → Mam 4 bananów i 3 jabłek
  • {{#invoke:Banany/argumenty|policz_owoce|banany=5|jablka=2}} → Mam 5 bananów i 2 jabłek

Większość modułów posiada swoje strony dokumentacji, objaśniające jakie argumenty mogą być użyte i jakie będą efekty ich zastosowania.

Przykładowe moduły[edytuj]

 Zobacz też kategorię: Przykładowe moduły.
  • Moduł:Banany: najprostszy możliwy skrypt, zapewniający pojedynczą funkcję bez argumentów.
  • Moduł:Banany/argumenty: demonstruje jak używać i uzyskać dostęp do argumentów.

Poproś o skrypt[edytuj]

Odwiedź stronę dyskusji, aby poprosić o pomoc w pisaniu skryptu Lua, który będzie wykonywać określone zadanie w Wikipedii lub innym projekcie Fundacji Wikimedia.

Historia[edytuj]

Po wieloletnich dyskusjach, Lua została uruchomiona do testów w 2012 roku na testowej wiki test2.wikipedia.org, z otwartym zaproszeniem dla wszytkich edytotów do eksperymentowania z rozwijaniem modułów Lua. Na angielskiej Wikipedii rozszerzenie Scribunto zostało wdrożone w lutym 2013, po testach na mediawiki.org i testowych wiki Fundacji Wikimedia.

O Lua[edytuj]

Zobacz też Krótką prezentację Brad’a Jorsch’a zawierającą prosty przykład konwersji szablonu w moduł Lua.

Lua jest językiem skryptowym, który może być wykorzystywany do analizowania danych, obliczania wyrażeń i formatowania otrzymanych wyników z wykorzystaniem funkcji lub programowania obiektowego. Chociaż niektóre skrypty Lua mogą być proste w celu ich łatwiejszego zrozumienia, Lua pozwala na tworzenie kompleksowych struktur takich jak tabele, funkcje dynamiczne, czy tablice asocjacyjne, gdzie indeksy dolne mogą być zarówno słowami, jak również wskaźnikami. Lua wspiera także rekurencję zagnieżdżonych funkcji, dlatego należy zachować szczególną ostrożność, aby uniknąć nadmiernej złożoności, kiedy inni użytkownicy mogliby nie zrozumieć, w jaki sposób utrzymać moduł Lua. Poniżej przedstawiono przykład kodu źródłowego Lua dla funkcji hello world:

-- All Lua modules on Wikipedia must begin by defining a variable that will hold their
-- externally accessible functions. They can have any name and may also hold data.
my_object = {}

-- Add a function to the variable. These are callable in Wikipedia via the #invoke command.
-- "frame" will contain the data that Wikipedia sends this function when it is called.
my_object.hello = function( frame )

    -- Declare a local variable and assign data to it.
    local str = "Hello World!"

    -- Quit this function and send the information in "str" back to Wikipedia.
    -- The "print" function is not allowed, so all output is accomplished via
    -- returning strings in this fashion.
    return str

-- End the function.
end

-- All modules end by returning the variable containing its functions to Wikipedia.
return my_object

-- We can now use this module by calling {{#invoke: HelloWorld | hello}}.
-- The #invoke command begins with the module's name, in this case "HelloWorld",
-- then takes the name of one of its functions as an argument, in this case "hello".

Przykład kodu źródłowego Lua jest uwydatniony z wykorzystaniem tagów <source lang="lua">kod źródłowy</source> umieszczonych wokół kodu. Więcej przykładów kodu źródłowego tego języka programowania znaleźć można w encyklopedycznym artykule w Wikipedii, „Lua”.

Instrukcje dotyczące sposobu korzystania z Lua w oprogramowaniu MediaWiki (a tym samym w Wikipedii) znajdują się na stronie mw:Extension:Scribunto/Lua reference manual.

Testy jednostkowe[edytuj]

Na tę sekcję wskazuje przekierowanie ze strony Wikipedia:Brudnopisy i strony testowe modułów. Zobacz też analogiczny opis dla stron testowych i brudnopisów szablonów.

Platformę dla testów jednostkowych modułów Lua w Wikipedii zapewnia Moduł:Testy jednostkowe. Pozwala na wykonanie danego skryptu z wykorzystaniem określonego zestawu wejść i na sprawdzenie, czy dane wyjściowe są zgodne z oczekiwaniami. Testy jednostkowe są szczególnie przydatne do szybkiego wykrywania regresji, kiedy modyfikacje w skrypcie wprowadzają nowe (lub stare) problemy.

Umownie, testy jednostkowe modułów umieszczane są na podstronie /test – np. dla Moduł:Banany będzie to strona Moduł:Banany/test – a wykonywane są na stronie dyskusji tej podstrony, Dyskusja modułu:Banany/test z wywołaniem np. {{#invoke: Banany/test | uruchom_testy}}. Sposoby badania muszą rozpoczynać się słowem „test”. Prosty przykład ze strony Moduł:Banany/test przedstawiono poniżej.

-- Testy jednostkowe dla [[Moduł:Banany]]. Kliknij na link do strony dyskusji powyżej, aby uruchomić te testy.
local p = require('Moduł:Testy jednostkowe')

function p:test_hello()
    self:preprocess_equals('{{#invoke:Banany | hello}}', 'Hello, world!')
end

return p

Aby uzyskać listę wszystkich modułów wykorzystujących testy jednostkowe, zobacz stronę Specjalna:Linkujące/Moduł:Testy jednostkowe.

Funkcje specyficzne dla Wikipedii[edytuj]

Ogólnie: Lua może pobierać dane wejściowe tylko i wyłącznie jako łańcuchy tekstu przekazywane do funkcji {{#invoke:}} i które mogą być pobierane za pośrednictwem mw.title.new(...):getContent() i frame:expandTemplate(). Dane wyjściowe Lua nie będą preprocesowane, chyba że frame:preprocess() zostało wyraźnie wywołane; co oznacza że wywołania szablonów, funkcje parsera, itp. w wyjściu nie będą funkcjonować poprawnie. Ponadto, wszystkie wywołania Lua na stronie są ograniczone do 10 sekund pracy procesora (możesz sprawdzić czas parsowania szablonu lub modułu w komentarzu HTML w kodzie źródłowym renderowanej strony). W stosunku do standardowego języka Lua, w Lua w rozszerzeniu Scribunto brakuje różnego rodzaju funkcji (zobacz mw:Extension:Scribunto/Lua reference manual § Differences from standard Lua).

Ograniczenia wejściowe Lua[edytuj]

Kod Lua w Scribunto uruchamiany jest tylko w momencie parsowania strony. Zatem jedynym sposobem na wprowadzenie danych wejściowych, jakie może odebrać Lua, jest edytowanie strony – nie jest możliwym, przykładowo, stworzenie okienka, które oblicza pierwiastek kwadratowy podanej liczby lub przelicza kawałek zbioru Mandelbrota w zależności od tego, którą część zbioru dominującego klikniesz. Danymi wejściowymi Lua może być dowolna transkludowalna strona tekstowa w Wikipedii. Nie dotyczy to plików graficznych (nawet plików .SVG, mimo że są one właściwie tekstem, o ile nie wytniesz i wkleisz kodu źródłowego do tekstowej, transkludowalnej strony wiki), list stron w kategorii, ani zawartości nietranskludowalnych stron specjalnych.

Wikitekst[edytuj]

Transkludowane nagłówki Wikipedii często zawierają ukryty kod, na przykład „UNIQ5ae8f2aa414ff233-h-3--QINU”, który być może musi być usunięty w celu ich skutecznego parsowania.

Wikilinki typu [[Wikipedia:Pomoc|]] nie będą działać, jeśli będą zwrócone jako wyjście – muszą być zapisane wprost jako [[Wikipedia:Pomoc|Pomoc]]. Inne transformacje wikikodu zachodzące przy zapisywaniu strony, takie jak zamiana ~~~~ na podpisy, również nie zostaną poprawnie przetworzone. Transkluzje szablonów, wywołania funkcji parsera i podstawienia zmiennych (tj. cokolwiek z {{...}}) nie będą przetworzone, podobnie jak tagi typu <ref> lub <nowiki>.

Oznaczanie szablonów korzystających z modułów Lua[edytuj]

Proszę umieszczać szablon {{Lua}} na stronach dokumentacji szablonów korzystających z modułu Lua. Pomoże to w poprawieniu komunikacji między modułami, a szablonami. Przykładowo, {{Lua|Moduł:Banany}} daje w rezultacie komunikat:

Zobacz też[edytuj]

 Zobacz też kategorię: Szablony wykorzystujące moduły Lua.

Uwagi

  1. Możesz również mieć wiele wartości wyjściowych, ale funkcje które to robią nie są normalnie przeznaczone do uzyskania dostępu ze stron wiki.