wtorek, 20 sierpnia 2013

Misja S0 - wprowadzenie do transkluzji

Witacie! Ten post jest pierwszym z cyklu poświęconego tworzeniu szablonów. Jest on w zasadzie wprowadzeniem do podstawowych mechanizmów, których zrozumienie zagwarantuje wam łatwe wejście do jego właściwej części. Spróbuję napisać go tak, aby każdy poradził sobie jak najlepiej :)

Wersjonowanie


Jak zauważyliście, lub też nie, każdy artykuł, na jaki wchodzicie, nie jest to pojedynczy, jednolity byt. To nie jest tak, że jak edytujecie i zapisujecie zmiany, to nadpisujecie jakąś treść. Tak naprawdę, podczas zapisywania każdych zmian tworzycie nową wersję. W istocie, cały silnik Wiki to jeden wielki kombajn służący do obsługi setek tysięcy wersji. Wersja, każda opisana przez unikalny numer i tytuł artykułu, jest tutaj podstawową jednostką danych i tak powinniście myśleć. Każde naciśnięcie przycisku Zapisz zmiany w oknie edycji jest równoznaczne z utworzeniem nowej wersji. Jak zatem orientujemy się w tym bałaganie?

Gdy użytkownik wchodzi na artykuł traktujący np. o Berry Punch, oprogramowanie MediaWiki wyszukuje najnowszą nieusuniętą wersję opisaną jako Berry Punch. Artykuł można wyobrazić sobie zatem jako zbiór wersji - przejrzystą teczkę, którą, gdy chwycimy, widzimy kartkę-wersję na szczycie stosu. Zapisanie zaś tworzy nową wersję, automatycznie umieszczaną na górze stosu. Tym spinaczem, łączącym wszystkie wersje, jest nazwa artykułu. Oczywiście, bazą do stworzenia nowej wersji nie musi być najnowsza, istniejąca wersją. Ręczne wycofywanie zmian zniszczonych np. przez wandali to właśnie taki trik, polegający w istocie na skopiowaniu starszej wersji i umieszczeniu kopii na stosie, przysłaniając tym samym niepożądaną, uszkodzoną wersję.

Przestrzenie nazw


Wyższym stopniem organizacji treści na Wiki są przestrzenie nazw. Są to kolekcje artykułów, traktowanych przez mechanizmy MediaWiki tak samo. Przestrzeń nazw wskazuje na to, jaką rolę pełni artykuł w całym systemie. Nazwa przestrzeni poprzedza nazwę artykułui jest od niego oddzielona dwukropkiem. Aby rozjaśnić, o co tu chodzi, zaprezentuję kilka najważniejszych NS na naszej wiki:

  • (Główna przestrzeń nazw) - należą do niej artykuły stanowiące zasadniczą treść wiki, takie jak artykuły o postaciach, piosenkach, odcinkach itp. Uwaga! Ta przestrzeń nie ma nazwy jako takiej. Zatem wszystkie artykuły, w jakich nie ma nazwy przestrzeni nazw, są traktowane jako znajdujące się w przestrzeni głównej, np. Big Macintosh, Odcinki, Alikorny itp.
  • Dyskusja - tutaj, po usunięciu mechanizmu komentarzy, umieszczane są uwagi odnośnie artykułów. Strony dyskusji są to mechanicznie zwykłe artykuły. Zwróćcie uwagę, że strona dyskusji ma ten sam tytuł co artykuł, na temat którego traktuje. Zatem stronami dyskusji dla powyższych artykułów z głównej przestrzeni nazw będą odpowiednio: Dyskusja:Big Macintosh, Dyskusja:Odcinki, Dyskusja:Alikorny
  • Użytkownik - w tej przestrzeni znajdują się strony profilowe użytkowników oraz ich prywatne brudnopisy. Zachowują się bardzo podobnie do artykułów z głównej przestrzeni nazw
  • Dyskusja użytkownika - analogicznie do stron dyskusji dla głównej NS. U nas rzadko używane
  • My Little Pony Friendship is Magic Wiki - przestrzeń nazw zawierająca artykuły dostyczące samego projektu, jakim jest pl.mlp.wikia. To co zwraca w niej uwagę, to długaaaaaaaaaaśna nazwa. Weźmy choćby naszą stronę główną WikiQuesta, czyli My Little Pony Friendship is Magic Wiki:WikiQuest. OMG, jakie to dłuuuuugie! Czy z tym nie można nic zrobić? Można!
  • Project - to tzw. alias, czyli synonim przestrzeni nazw. Project: jest synonimem dla My Little bla bla bla...: czyli jeżeli stworzymy link Project:WikiQuest, to MediaWiki w locie podmieni nazwę NS na właściwą. Kliknij i sprawdź, jeśli nie wierzysz ;)
  • Dyskusja My Little... - no dobra, pas. I tak tego nie używamy :P
  • Szablon - przestrzeń nazw, która jest najprzyjaźniejsza jeśli chodzi o tworzenie szablonów.
  • Forum - zawiera działy forum. To tzw. przestrzeń wirtualna. Oznacza to, że jej artykuły są sztucznie generowane przez oprogramowanie, a nie są rzeczywistymi artykułami.
  • Wątek - zawiera wątki, także wirtualna
  • Specjalna - mega zajebiście ważna przestrzeń nazw, też wirtualna. Udostępia multum ważnych funkcjonalności, takich jak logowanie, wyszukiwanie, listy artykułów, zestawienie ostatnich zmian i dużo, duuuuużo więcej. Sprawdźcie zresztą sami: Specjalna:Strony specjalne
  • Plik - elementy tej przestrzeni nazw są plikami wraz z opisem. Pliki zachowują się jak artykuły, tj. mają swoje wersje.
  • MediaWiki - bardzo ciekawa przestrzeń, której artykuły są używane jako komunikaty systemowe i elementy interfejsu. Przykładowo, tam definiuje się wygląd głównego menu, treść wiadomości powitalnej, treść kącika społeczności i in. Ciekawskich odsyłam tu: Specjalna:Wszystkie komunikaty. Komunikaty mogą edytować wyłącznie administratorzy
  • Kategoria - umożliwia spójną kategoryzację innych artykułów


Transkluzja


Uff, gdy mamy za sobą już te wprowadzenia, czas przejść do sedna. Jednym z najciekawszych i chyba najistotniejszych mechanizmów, jakie oferuje silnik MediaWiki, jest tzw. transkluzja. Polega on na automatycznym przeklejeniu treści jednego artykułu do innego artykułu, tj. osadzeniu kodu jednego artykułu wewnątrz kodu innego artykułu. To wszystko. Proste, prawda? :) To teraz trochę skomplikujemy.

Jak wiadomo, taka transkluzja musi czemuś służyć. Hmmmm, ale gdzie tak w zasadzie przydaje się taki myk z przeklejaniem? Na pierwszy rzut oka nie jest to zbyt przydatne. Weźmy zatem jakiś konkretny przykład. Wyobraźmy sobie, że jesteśmy nołlajfami od transkryptów (hue hue hue :) i podczas pieczołowitego spisywania słów wypowiadanych przez bohaterów serialu, natrafiliśmy na piosenkę. Oczywiście, nie jakieś tam Evil Enchantess, ale od razu At The Gala albo Winter Wrap Up. Ale w zasadzie, po co mamy pisać to jeszcze raz, skoro już mamy artykuły o piosenkach? Przeklejmy teksty z nich do transkryptów, oszczędzimy sobie pracy i będziemy mieli więcej czasu np. na spacer (no dobra, kogo próbujemy oszukać...). Graficznie wyglądałoby to jakoś tak:



Dociekliwym jednak takie wytłumaczenie nie wystarczy. Co zatem się stanie, jeżeli np. ktoś zmieni treść artykułu z piosenką? Przecież przekleiliśmy jego treść! Zatem tekst transkryptu też się zmieni, czy też wklejony do niego kod piosenki zostanie niezmieniony, taki, jak podczas zapisu treści artykułu nadrzędnego do bazy danych?

Odpowiedź na to pytanie jest prosta: transkluzja może przebiegać na dwa różne sposoby:
  • Metoda subst (z ang. substitution - podstawienie)
    W momencie zapisu do bazy danych, do artykułu macierzystego (w naszym wypadku - transkryptu) automatycznie kopiowany jest kod artykułu osadzanego (tutaj - piosenki). Czyli, zostaje przepisany goły kod, który staje się częścią kodu artykułu macierzystego. Jak łatwo się domyślić, taka piosenka pozostanie niezmienna, chyba że ktoś wyedytuje jej treść, ale już w ramach artykułu macierzystego.
  • Metoda msg (z ang. message - komunikat)
    W kodzie artykułu macierzystego pozostaje odwołanie do artykułu osadzanego. To znaczy, że podczas każdego otwarcia transkryptu przez czytelnika, z bazy danych zostanie pobrana automatycznie treść piosenki, po czym zostanie wklejona w wyznaczone przez edytora miejsce. Taki tekst będzie dynamicznie reagował na wszelkie zmiany w artykule piosenki, zaś jej kod nie będzie widoczny w artykule macierzystym.
Wiem, że może to być trudno zrozumiałe, dlatego - kolejna ilustacja.



Oczywiście, im dalej w las, tym więcej drzew :( Przecież artykuły z piosenkami nie zawierają tylko jej tekstu. Jest tam również jakieś krótkie wprowadzenie, infoboks, ilustracja, opis, ba - zazwyczaj są aż dwa teksty, w dwóch wersjach językowych! Czy zatem nasza transkulzja okazała się niepraktyczna? Nic podobnego :) Jako twórcy, możemy wskazywać różne fragmenty kodu, które chcemy, by były eksportowane. Więcej - możemy w trakcie wklejania zmieniać treść wstawianego kodu, sterować jego wyglądem... Jak widzicie, to potężny mechanizm, ale to i tak dopiero początek. Z czasem, nauczymy się wręcz programować te kawałki kodu, tak by wykonywały np. proste obliczenia bądź dostosowywały swój wygląd w zależności od miejsca, gdzie go wkleimy.

Wyrażenia transkluzyjne


To jednak zostawimy na później. Najpierw - podstawy. Jak zauważyliście w przykładach z msg oraz subst,musimy jakoś dać znać mechanizmowi Wiki, gdzie co chcemy wkleić. Do takiego zasygnalizowania transkluzji posłuży nam tzw. wyrażenie transkluzyjne (nazwa moja, autorska, żeby było jasne). Najbardziej podstawowa forma takiego wyrażenia wygląda następująco:
{{Metoda:Przestrzeń nazw:Nazwa artykułu}}
Chyba każdą część łatwo sobie wytłumaczyć:
  1. Wyrażenie zaczyna i kończy się podwójnymi nawiasami klamrowymi
  2. Metoda może być jedną z dwóch: msg lub subst
  3. Przestrzeń nazw została wyjaśniona wyżej
  4. Nazwa artykułu który wklejamy
Przykładowe wyrażenia:
{{subst::Stara Wiedźma}}
{{msg:Szablon:Ek}}
{{subst:Użytkownik:Skradacz}}
Zwróćcie uwagę, że dla artykułów z głównej przestrzeni nazw, drugi człon wyrażenia pozostaje pusty. Wiadomo jednak, że dąży się do jak największej wygody i skracania niepotrzebnego kodu. Podobnie było z wyrażeniem transkluzyjnym, które posiada skrócone wersje. Ponieważ najczęściej stosowaną metodą wstawiania jest msg, używa się ją, jeżeli pierwszy człon zostanie pominięty, czyli mówiąc prościej, te wyrażenia będą sobie równoważne:
{{msg:Użytkownik:Skradacz}}
{{Użytkownik:Skradacz}}
Dla artykułów z głównej przestrzeni nazw, w wyrażeniu pozostanie tylko poprzedzający nazwę dwukropek:
{{:Księżniczka Luna}}
Co się jednak stanie, gdy zbraknie również drugiego członu? Pamiętacie rozdział o przestrzeniach nazw? Napisałem tam, że przestrzeń Szablon jest nam najbardziej przyjazna. Otóż jest tak dlatego, ponieważ właśnie z tej przestrzeni domyślnie czerpie mechanizm transkluzji. Innymi słowy, takie trzy wyrażenia oznaczają dokładnie to samo:
{{msg:Szablon:Ek}}
{{Szablon:Ek}}
{{Ek}}
Oczywiście, najfajniejsza jest ta ostatnia forma :) To dlatego z niej najczęściej korzystamy (w praktyce - zawsze, wyjątki są bardzo nieliczne).

Podsumowując, wyrażenie w takiej postaci:
{{Nazwa szablonu}}
wklei metodą msg treść artykułu Szablon:Nazwa szablonu

Uffffff... W następnym kursie zaczniemy dyktować transkluzji więcej warunków - nauczymy się wybierać kawałki kodu do wklejenia oraz zmieniać w locie ich treść. Poznamy zatem podstawy tworzenia prawdziwych szablonów.

Zadania

  1. Gdzie jeszcze można w praktyce zastosować mechanizm transkluzji? (2p)
  2. Oprócz metod subst i msg jest jeszcze trzecia, skrajnie rzadko używana: msgnw. Napisz skrótowo, do czego ona służy?(2p)
  3. Czy możliwe jest zapętlenie transkluzji, tj, nieskończone wklejanie artykułu do samego siebie? Sprawdź doświadczalnie i opisz reakcję silnika MediaWiki (2p)
  4. Nie wszystkie przestrzenie nazw da się używać przy transkluzji. Sprawdź doświadczalnie, artykuły których przestrzeni nazw, wymienionych w drugiej sekcji kursu, nadają się do przeklejania w ten sposób.(3p)
Termin wykonania prac: 26 sierpnia 2013

8 komentarzy:

  1. Dla zainteresowanych: oto ranking transkryptowych nołlajfów. Różnica między pierwszym, a drugim miejscem jest wprost oszołamiająca.

    http://pl.mlp.wikia.com/wiki/U%C5%BCytkownik:Vengir/Autorzy_transkrypt%C3%B3w

    OdpowiedzUsuń
    Odpowiedzi
    1. Nom, jest Ty 23, a ja 4. Nie wiedziałam, że mogę trafić na 2 miejsce, ale zaraz Barym mnie dogoni bo ma 3,5. Jak tylko bd 4 sezon, "zabiorę" sobie kilka.

      Usuń
  2. O, i wydaje mi się, że pomyliłeś {{subst:}} z {{msg:}}.

    {{msg:}} nigdy nie używałem, ale {{subst:}} już kilka razy i jestem pewien, że działa tak, jak przedstawiłeś tu {{msg:}}

    OdpowiedzUsuń
    Odpowiedzi
    1. Nom, tak to jest jak się pisze z pamięci :p

      Usuń
    2. Msg i subst były dobrze wytłumaczone, ale poniżej przez nieuwagę używałem ich zamiennie. Już poprawiłem.

      Usuń
  3. Ten komentarz został usunięty przez autora.

    OdpowiedzUsuń
  4. Nie wiem jednej rzeczy, a mianowicie jak wyeksportować ten fragment artykułu, np. sam tekst piosenki

    OdpowiedzUsuń