wtorek, 20 sierpnia 2013

Misja S1 - podstawy szablonów

Czas na kolejny etap. Z fundamentów wyjdziemy na bardziej przestronny parter. Poznajmy podstawowe mechanizmy budowania szablonów. Jak głosi Polska Wikipedia, szablon to specjalna konstrukcja wikikodu umożliwiająca tworzenie obiektu z tekstem lub ilustracją w celu wielokrotnego wstawiania go do stron Wikipedii. Tworzenie najprostszych szablonów opanowaliście już w poprzedniej misji. Wystarczy stworzyć artykuł w przestrzeni nazw Szablon. Jego treśc możemy łatwo wklejać, przy użyciu najprostszej postaci wyrażenia transkluzyjnego {{Nazwa szablonu}}. Poniżej przedstawiłem dwa rozwiązania, bardzo ułatwiające pracę z nimi oraz poszerzają możliwości ich używania.

Parametry

No dobra. Ale przecież nie każde wstawienie szablonu musi wyglądać tak samo. Co, gdybym np. chciał zrobić szablon cytatu? Dla każdego cytatu miałbym tworzyć odrębny szablon?? No way, to jest właśnie najpiękniejsze w szablonach! W wyrażeniu transkluzyjnym, można podać, oprócz nazwy wstawianego artykułu, zestaw parametrów. Co to jest parametr? To jakaś wartość, która podczas wklejania jest przekazywana do treści szablonu i wpływa na nią.

Najpierw od strony żądania. Parametry mogą być nazwane i numerowane. Parametr nazwany ma postać: nazwa=wartość. Są one rozdzielne pionową linią. Oto prosty przykład:

{{Foo|nazwa 1=parametr 1|nazwa 2=parametr 2}}
Tutaj mamy dwa parametry nazwane, chyba nie muszę tłumaczyć. A co z parametrami numerowanymi? Z pewnością spotkaliście się z nimi w prostszych szablonach, gdzie parametry nie miały nazwy. Spojrzyjcie tutaj:
{{Foo|numerowany|kolejny numerowany}}
I co z tym fantem robi interpreter MediaWiki? Wszak każdy parametr musi mieć swoją nazwę! Rozwiązanie jest dziecinnie proste - parametrom są przypisywane kolejne liczby porządkowe. Zatem poprzednie wyrażenie oznacza dokładnie to samo co:
{{Foo|1=numerowany|2=kolejny numerowany}}
Mam nadzieję, że zrozumieliście ;)

A jak to wygląda od strony treści samego szablonu? Otóż bardzo podobnie - szablon może czytać dostarczone parametry przy użyciu wyrażeń parametrycznych. O co tu chodzi? Mają one bardzo podobną budowę do w. transkluzyjnych, tyle, że dostały dodatkowo jedne klamerki, np.:

{{{nazwa 1}}}
Gdy szablon jest wklejany, interpreter wyszukuje pasujących wyrażeń parametrycznych i podmienia je na dostarczone parametry. Tutaj, po wklejeniu szablonu, zamiast wyrażenia pojawiłby się tekst parametr 1. Ech, mam nadzieję, że nie gnam zbytnio :)

Ostatnim trikiem jest parametr alternatywny. Określa on sposób reakcji na brak dostarczenia parametru przez użytkownika. Weźmy trywalny szablon {{Bar}} o następującej treści:

Jestem {{{imię}}}, a mój ulubiony kucyk to {{{kuc}}}

Gdybyśmy spróbowali wstawić ten szablon przy użyciu {{Bar|imię=Krzysiu|kuc=Luna}}, uzyskalibyśmy taki efekt:

Jestem Krzysiu, a mój ulubiony kucyk to Luna

Co jednak, gdybyśmy nie podali jednego z parametrów, na przykład imienia? {{Bar|kuc=Luna}} Wówczas wyrażenie parametryczne pozostanie nienaruszone:

Jestem {{{imię}}}, a mój ulubiony kucyk to Luna

Aby poradzić sobie z eksperymentatorami oraz zmniejszyć ilość wymaganych parametrów (wyobrażacie sobie wywołanie szablonu {{Frekwencja}}? xD), można wymusić na interpreterze podmianę wyrażeń parametrycznych na określoną wartość, jeżli dany parametr nie pojawiłby się. Poprawmy zatem nasz szablon:

Jestem {{{imię|kimś}}}, a mój ulubiony kucyk to {{{kuc}}}

Teraz po wywołaniu bez parametru imienia, dostaniemy bardziej estetyczne:

Jestem kimś, a mój ulubiony kucyk to Luna

Czyli wystarczy dodać wewnątrz wyrażenia pionową kreskę i podać po niej domyślną wartość.

Kontrolery transkluzji

Dotychczas nasz interpreter, podczas procesu transkluzji importował wszystko jak leci, całą zawartość wklejanego artykułu. Można powiedzieć że jest to zachowanie asertywne. Charakteryzuje się ono tym, że objęte tym zachowaniem fragmenty tekstu są widoczne podczas wklejania. Można je jednak zmienić.

Najbardziej charakterystyczną sytuacją, przy której musimy zadbać o zmianę zachowania transkluzji, jest próba kategoryzacji szablonów. Jak doskonale wiecie, do kategorii przypisujemy poprzez umieszczenie wewnątrz artykułu linku do odpowiedniej kategorii. Szablony zachowują się tak samo. Niestety, w ich przypadku napotykamy na solidny problem. Gdy umieścimy link do kategorii, zostanie on przeklejony zawsze, gdy użyjemy szablonu. Czasami jest to przydatne, jednak zazwyczaj uznaje się za bardzo niepożądane zjawisko. Wyobraźmy sobie, że chcemy zebrać w jednej kategorii wszystkie zakładki użytkowników. Ale po kategoryzacji okazuje się, że w kategorii z zakładkami odnajdziemy profilówki wszystkich użytkowników, którzy z nich korzystają! Regularny groch z kapustą. To była sytuacja autentyczna - gdy Fretka wprowadziła zakładki na naszej Wiki :)

Chcemy zatem, by jakiś kawałek naszego artykułu - w tym wypadku link do kategorii - nie był dołączany wraz z szablonem podczas transkluzji. Tu poznamy pierwszy kontroler o znaczącej nazwie <noinclude>. Fragmenty otoczone parą znaczników <noinclude></noinclude> będą się pojawiały, gdy odwiedzimy artykuł szablonu, ale znikną, gdy spróbujemy wkleić szablon. Można to nazwać zachowaniem nieśmiałym. U siebie pokazuje swoją treść, ale na zewnątrz się trochę boi :) Inne użycia zachowania nieśmiałego to np. tworzenie dokumentacji szablonów. Gdy user wchodzi na stronę szablonu, będzie mógł zapoznać się ze sposobem jego użycia. Żywy przykład:

Pójdę zniszczyć Pierścień<noinclude>, ale trochę się boję...</noinclude>

Jednak problem można odwrócić. Chcemy np. utworzyć navbox, który będzie automatycznie kategoryzował artykuły, w których jest umieszczony jako główne bohaterki. Niestety, w tak kompletowanej kategorii odnajdziemy nie tylko artykuły, ale i... nasz szablon! Co zrobić? Otóż rozwiązanie jest proste: musimy link do kategorii otoczyć kontrolerem o nazwie includeonly. Fragmenty opakowane w ten kontroler będą niewidoczne, gdy odwiedzimy sam szablon, ale ujawnią się podczas wklejania. To można nazwać zachowaniem ekstrawertycznym. Szablon lansuje się na zewnątrz.

Ekstrawetykę transkuzji będziecie stosować bardzo często! Systemy szablonów, wyposażone w wiele subszablonów, pobierających potężne ilości parametrów, zwyczajnie nie nadają się do zwykłego wywoływania, bez transkuzji. Dlatego powinniśmy ukrywać ich zawartość poprzez <includeonly>... Kod szablonu...</includeonly>. Zamiast nich, możemy zaserwować np. dokumentację użycia, załączoną, oczywiście, przy użyciu noinclude :)

Składając do kupy, porównajmy równe sposoby kontrolowania transkluzji:

Ten kod zachowuje się asertywnie

<noinclude>Ten kod zachowuje się nieśmiało</noinclude>

<includeonly>Ten kod zachowuje się ekstrawertycznie</includeonly>

Strona szablonu

Ten kod zachowuje się asertywnie

Ten kod zachowuje się nieśmiało

Po wklejeniu

Ten kod zachowuje się asertywnie


Ten kod zachowuje się ekstrawertycznie

Podsumowanie

Treść przykładowego szablonu, napisanego w prawidłowy sposób


Treść szabloniku

Ten szablon powinno wstawiać się tak:
<pre>{{Przykładowy szablon}}</pre>
co daje w efekcie:

{{Przykładowy szablon}}

[[Kategoria:Szablony bezużyteczne]]

Zwróć uwagę na to, że pomiędzy tagami kontroli transkluzji nie ma spacji ani żadnych znaków. Nie powinno być też pustej linijki, bo może to mieć różne niepożądane efekty, np. zbędą przestrzeń nad opisem szablonu. Jeżeli podajemy przykład wywołania, powinniśmy użyć tagu <pre>. Dzięki temu kod wewnątrz będzie dobrze sformatowany. W razie jakiś nieprzewidzianych problemów, można dodatkowo, wewnątrz pre, użyć jeszcze tagu <nowiki> który bezwzględnie unieważnia wikikod.

Zadania

  1. Jest jeszcze jeden tag kontrolowania transkluzji: <onlyinclude>. Poszukaj, gdzie stosuje się je na naszej wiki i opisz pokrótce sposób ich działania.(2p)
  2. Stwórz szablon wiadomości do tablicy, informującej adresata o tym, że jego artykuł został usunięty, gdyż opisywana postać bądź obiekt nie były kanoniczne. Szablon powinien wykorzystywać co najmniej trzy parametry (w tym co najmniej jeden z zadaną wartością domyślną), być prawidłowo skategoryzowany oraz udokumentowany (tj. na stronie szablonu powinna być informacja, jak prawidłowo go używać). Pamiętaj, by komunikat był dostosowany do adresata oraz tłumaczył mu, na czym dokładnie polegał jego błąd. Kod szablonu prześlij na adres mailowy kursu.(8p)
  3. Odnajdź szablon zgłoszenia do odznaczenia na wiki, przeanalizuj jego kod oraz spróbuj napisać do niego instrukcję wstawiania. NIE MUSISZ ROZUMIEĆ DO KOŃCA JEGO DZIAŁANIA! Ważne, byś umiał objaśnić, jak go prawidłowo wstawić. Możesz też poeksperymentować w brudnopisie, jak zachowuje się przy różnych parametrach. (4p)
  4. Dodatkowe zadanie: Poniżej dany jest kod pewnego szablonu, który jest już w użytku na Wiki. Jest on umieszczony na wielu artykułach, zatem poprawianie wywołań w nich wszystich nie jest opłacalne!!! Należy jednak zoptymalizować jego kod, tak, by kolejne jego wywołania: 1) miały mniej parametrów, niż obecnie 2) parametry miały nazwy, co ułatwi używanie szablonu 3) komunikat był dostosowany do płci adresata. Aby zachować kompatybilność, wykorzystaj parametry domyślne. Oprócz tego, dodaj do niego dokumentację wywołania(5p)
'''Witaj drogi/-a {{{1}}}!''' Mamy przyjemność zawiadomić Cię, że zostałeś/-aś awansowana na funkcję {{{2}}}. W ramach tej funkcji, będziesz musiał/-a {{{3}}}. Pamiętaj, że funkcja {{{4}}} jest bardzo odpowiedzialna. Mamy jednak nadzieję, że sobie prowadzisz ;) Gdybyś, drogi/-a {{{5}}}, miał jakiś problem, zgłoś się do {{{6}}}, czyli do mnie. Pozdrawiam w imieniu Administracji,<br />{{{7}}}
Termin wykonania prac: 27 sierpnia 2013 r.

Brak komentarzy:

Prześlij komentarz