Typy hodnot v TFS

TFS je jazyk bez typů v tom smyslu, že se v nejběžnějších konstruktech neprovádí žádná kontrola typu hodnoty.

Implicitní převody hodnot a chování hodnot v různých kontextech jsou voleny tak, aby byly dostatečně intuitivní.

Přesto je občas nutné vzít na vědomí, že každá hodnota, se kterou se v šabloně pracuje, je objekt určitého typu, s poměrně pevně vymezeným rozhraním pro autora šablony.

Pro každý typ je tu zdokumentováno, co se stane v následujících situacích:

Toto rozdělení se řídí kontraktem konformní hodnoty. V dokumentaci se úmyslně zamlčuje rozlišování mezi prostou hodnotou a její konformní obálkou.

Pokud má autor šablon pracovat s hodnotou typu zavedeného pro daný projekt, může maintainer projektu pro tento typ sám nadefinovat, jak se má chovat v níže uvedených případech.

Kromě toho dokumentace uvádí nesystematicky také:

  • nejběžnější výrazy, které vedou při vyhodnocení na hodnotu daného typu,
  • funkce, které hodnotu daného typu vyžadují,
  • způsob zpracování hodnoty ostatními funkcemi,
  • typické případy použití.

Výpis hodnoty

Řeč je o konečném zpracování hodnoty, tedy o případech, kdy hodnota už není vstupem pro další výpočet. V typickém případě takové zpracování znamená výpis nějaké reprezentace této hodnoty na výstup.

Vypsání hodnoty se provádí příkazem, který je tvořený samotným výrazem, který se na hodnotu vyhodnocuje (tzv. „value statement“).

Příklad: Vypsání literálu
Vstup
{"a\nb"}
Výstup
a
b

Řetězec tvořený znakem "a", znakem konce řádku a znakem "b" se vypíše na výstup.

Příkaz je tvořený samotným výrazem "a\nb", tedy literálem reprezentujícím tento řetězec.

Příklad: Vypsání podhodnoty
Vstup
{_asset.title}
Výstup
Tiskové prohlášení

Výsledkem vyhodnocení výrazu _asset.title je řetězec. Při dalším zpracování se tento řetězec vypíše na výstup.

Příkaz pro výpis hodnoty se může volat s pojmenovanými parametry. Způsob použití těchto parametrů při výpisu závisí na typu vypisované hodnoty.

Příklad: Vypsání identifikátoru stránky se zadáním parametrů
Vstup
{link(_primary) query="a/nebo"}
Výstup
/jnp/cz/index.html?query=a%2Fnebo

Výsledkem vyhodnocení výrazu link(_primary) je identifikátor stránky.

Jako reprezentace této hodnoty se na výstup zapisuje URL.

Při tomto vypsání se použije parametr query, jehož hodnotou je řetězec "a/nebo". Protože vypisovaný objekt je identifikátor stránky, použije se tento parametr pro přidání parametru k vypisovanému URL.

Způsob výpisu je také možné modifikovat pomocí bezhodnotových parametrů. Možnosti opět závisejí na typu vypisované hodnoty.

Příklad: Potlačení escapování "<", ">", "&" – parametr raw
Vstup
{'<?xml version="1.0" encoding="UTF-8" ?>' raw}

Parametry výpisu, které nemají žádný význam pro daný typ hodnoty, budou ignorovány.

Selekce podhodnoty

Některé hodnoty se při použití v TFS mohou chovat jako struktura: soubor podhodnot dostupných pod určitými klíči. Je tedy možné získat libovolnou podhodnotu podle známého klíče. Klíčem je vždy řetězec.

K vyhledání podhodnoty se použije operátor ., řetězec představující klíč se uvádí bez uvozovek (tedy způsobem obvyklým v jiných jazycích).

Příklad: Vyhledání podhodnoty uložené pod klíčem "name"
Vstup
{_asset.name}

(Výraz vyhodnocující se jako selekce bude pochopitelně vždy součástí dalšího výrazu. Zde výraz nemá žádný další kontext, je to tedy „value statement“, příkaz pro výpis hodnoty.)

Pokud pro daný objekt není pod uvedeným klíčem dostupná žádná podhodnota, vracejí uvedené výrazy null.

Pokud nějaký objekt vrací null pro libovolný klíč, říkáme, že se chová jako prázdná struktura.

Pro assety je vedle operátoru . k dispozici také operátor a funktor explicitní akvizice. (O implicitní a explicitní akvizici se podrobněji mluví na patřičném místě.)

Příklad: Akvizice podhodnoty uložené po klíčem "title"
Vstup
{_asset!title}
{acquire(_asset, "title")}

Oba uvedené zápisy jsou ekvivalentní.

Pro neassety se tyto operátory vyhodnocují stejně jako běžná selekce podhodnoty.

Selekce podhodnoty se ve většině případů vyhodnocuje stejně jako mapování (viz dále); výjimky jsou uvedené na příslušných místech.

Mapování

Mapování je koncept podobný selekci podhodnoty: vstupem je výchozí hodnota a klíč a výstupem libovolný objekt (nebo null). Klíčem pro mapování ale může být libovolný objekt; vedle řetězce se v praxi může použít také celé číslo.

V novějších verzích TFS je mapování odlišeno od selekce podhodnoty. Může tedy v některých případech vracet jiný výsledek.

Pro mapování se používá funkce map nebo (v novějších verzích TFS) operátor []. Ve starších verzích TFS by měl být dostupný operátor @ s týmž významem.

Příklad: Mapování na hodnotu dostupnou pod klíčem 1
Vstup
{map(asList("a", "b"), 1)}
{asList("a", "b")[1]}
Výstup
b
b

Pokud nějaký objekt vrací null při mapování pro libovolný klíč, říkáme, že se chová jako prázdná mapa.

Sekvenční zpracování

Některé hodnoty se mohou chovat jako posloupnosti prvků, které je možné projít v cyklu a každý zpracovat. K takovému zpracování slouží primárně příkaz while.

Příklad: Iterace přes hodnotu
Vstup
{while _asset}
  {_.title}
{/while}

Část typů hodnot se chová jako prázdná sekvence; to znamená, že tělo cyklu, ve kterém se přes takovou hodnotu iteruje, se nevyhodnotí ani jednou, a pokud má cyklus větev else, vyhodnotí se tato větev.

Chování některých hodnot při sekvenčním zpracování se může projevit také při vyhodnocování některých funkcí: viz například funkci in.

Převod na logickou hodnotu

Pro každý typ je nějakým způsobem specifikováno, jak se převádí na logickou hodnotu; to znamená které hodnoty se chovají stejně jako true a které jako false.

Tímto způsobem je určeno chování při testování v&nsbp;podmíněném příkazu.

Příklad: Test hodnoty
Vstup
{if _asset.perex}
  <p class="perex">{_asset.perex}</p>
{/if}

Stejná konverze se provádí také v případě, že hodnota má být vstupem funkce, která předpokládá Boolean na vstupu.

Příklad: Vstupy funkce and
Vstup
{if and(_asset.perex, _asset.body)}
  <a href="{link(_asset)}">detail článku</a>
{/if}

Ilustruje se tu implicitní konverze vstupů na logickou hodnotu. V příkladu se tak testuje přítomnost dvou atributů assetu v jedné podmínce.

Pro vložení příspěvku do diskuse se přihlašte.