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“).
{"a\nb"}
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.
{_asset.title}
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.
{link(_primary) query="a/nebo"}
/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.
{'<?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).
{_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ě.)
{_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.
{map(asList("a", "b"), 1)}
{asList("a", "b")[1]}
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.
{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.
{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.
{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.