Directory

Wikipedia:Lua – Wikipedia, wolna encyklopedia Przejdź do zawartości

Wikipedia:Lua

Z Wikipedii, wolnej encyklopedii
Przestrzenie nazw
(dla każdej standardowej przestrzeni jest przestrzeń dyskusji z nr n+1)
nr nazwa i opis lista
stron
dyskusja lista
stron
główne
0 (artykuł) lista ns:0 Dyskusja lista ns:1
6 Plik lista ns:6 Dyskusja pliku lista ns:7
14 Kategoria lista ns:14 Dyskusja kategorii lista ns:15
meta
2 Wikipedysta(-ka) lista ns:2 Dyskusja wikipedysty(-ki) lista ns:3
4 Wikipedia lista ns:4 Dyskusja Wikipedii lista ns:5
12 Pomoc lista ns:12 Dyskusja pomocy lista ns:13
100 Portal lista ns:100 Dyskusja portalu lista ns:101
102 Wikiprojekt lista ns:102 Dyskusja wikiprojektu lista ns:103
techniczne
8 MediaWiki lista ns:8 Dyskusja MediaWiki lista ns:9
10 Szablon lista ns:10 Dyskusja szablonu lista ns:11
828 Moduł lista ns:828 Dyskusja modułu lista ns:829
wirtualne
-1 Specjalna
-2 Media
nieużywane i wycofywane
2300 Gadżet
(miała być dla gad. 2.0)
lista ns:2300 Dyskusja gadżetu lista ns:2301
2302 Definicja gadżetu
(powiązana z gad. 2.0)
lista ns:2302 Dyskusja definicji gadżetu lista ns:2303
2600 Wątek lista ns:2600

Lua – język programowania, który jest dostępny na polskojęzycznej 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 | edytuj kod]

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 | edytuj kod]

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 | edytuj kod]
 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 | edytuj kod]

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 | edytuj kod]

Po wieloletnich dyskusjach, Lua została uruchomiona do testów w 2012 roku na testowej wiki test2.wikipedia.org, z otwartym zaproszeniem dla wszystkich edytoró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.

Zobacz też Krótką prezentację Brada Jorscha 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 <syntaxhighlight lang="lua">kod źródłowy</syntaxhighlight> 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/pl.

Testy jednostkowe

[edytuj | edytuj kod]
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 | edytuj kod]

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/pl § Differences from standard Lua).

Ograniczenia wejściowe Lua

[edytuj | edytuj kod]

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 | edytuj kod]

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 | edytuj kod]

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 | edytuj kod]
 Zobacz też kategorię: Szablony wykorzystujące moduły Lua.
  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.