Jak nadpis praví, at je metajazyk na zpracování textu. Co to vlastně znamená? at přijme na vstupu nějaký text, v něm najde volání maker, makra se rozvinou a na výstupu je vrácen text s rozvinutými makry. Jednoduché. A teď praktické využití.
Nejdříve je potřeba získat zdrojový kód. at je knihovna (dobře, jedna třída, ale já jsem prostě minimalista) pro PHP a má repozitář na githubu. Buď si můžete naklonovat Gití repozitář:
$ git clone git://github.com/jakubkulhan/at.git
Nebo si stáhnout zabalené zdrojáky – buď jako tarball, či v ZIPu.
Šablonovací systém
Docela intuitivní způsob využití, když se jedná o knihovnu na zpracování textu. Příklad mluví za vše:
<?php
require 'at.php'; // potřebujeme knihovničku
// nadefinujeme si nějaké proměnné
${'@foo'} = "hello, world!";
${'@bar'} = "that's at :-)";
// a už jedem
echo at()
->fn('', function ($block) {
$var = trim($block[0]);
if (!isset($GLOBALS['@' . $var])) return '';
return (string) $GLOBALS['@' . $var];
})
->run(substr(file_get_contents(__FILE__), __COMPILER_HALT_OFFSET__));
// šablona
__halt_compiler();
@{foo}
@{bar}
Postupně. Nejdříve se vloží knihovna s at, to je jasné. Poté si nadefinujeme nějaké proměnné (v příkladě jsou to globální proměnné (i když s prefixem, který zabraňuje, abychom si je jen tak s něčím spletli), ale můžeme si klidně celé šablonování zapouzdřit do třídy). A teď už přichází na řadu at. Funkce at() je zkratka pro new at(), abychom nemuseli psát:
$_ = new at; echo $_->...
fn() a definování callbacků maker
Metoda fn() je setter/getter maker. V tomto příkladě konkrétně ten setter, který spojuje název makra (první argument) s callbackem (druhý). Tedy je využito closures z PHP 5.3 (pro nižší verze můžete zkusit použit create_function()). Funkce se podívá, jestli existuje nějaká globální proměnná s požadovaným názvem, a když ano, tak její obsah vrátí.
run() aneb zpracování
run() má jeden argument, který může být:
-
řetězcem; v tom případě je argument naparsován (pomocí
at::parse()) a vytvořen z něj AST -
polem; a tudíž je považován za již naparsovaný AST
V příkladu je využito __halt_compiler(), kterýžto jazykový konstrukt zastaví zpracovávání souboru, takže můžeme mít kód i šablonu v jednom souboru, a run() je předána právě ta šablona, která se nachází za __halt_compiler().
Makra
Je vidět, že šablona je docela jednoduchá, a tak lze lépe vysvětlit, co je vlastně co. Je patrné, že ona makra budou @{foo} a @{bar}. Takové volání makra se skládá z několika částí. Každé volání uvozuje znak @ (česky zavináč, anglicky at (odtud pochází i název knihovny)). Po něm následuje název makra se seznamem parametrů – řetězec mezi zavináčem a levou složenou závorkou ({). U těchto maker je prázdný, a proto i při volání metody fn() byl jako název makra předáván prázdný řetězec. Nakonec je tu obsah složených závorek ({ ... }), který je v terminologii at nazýván blok a v tomto příkladě je obsahem bloku název proměnné, kterou chceme vypsat.
Když se vrátíme ke spojování prázdnojmenného makra s funkcí (fn('', ...)) a podíváme na dotyčnou funkci, je vidět, že blok přebírá jako první argument. To nemusí být vždycky pravda. Jde o to, že tyto makra nemají žádné parametry. Obecně je totiž callback volán s těmito argumenty: param0, param1, ..., paramN, block, name. block je AST bloku a name název, s jakým bylo makro zavoláno (můžete tedy přiřadit jeden callback pod víc názvů maker a podle názvu se rozhodnout, co se má udělat).
Odvozování názvu makra
O rozhodování, co je název makra a co jednotlivé parametry, se stará callback nastavovaný metodou fnname(), jeho defaultní implementace je at::_fnname_(). Ta jako název makra bere všechny znaky až do prvního bílého (mezery, tabulátoru atp.) a argumenty jsou oddělovány čárkou – tzn. že makro @foo bar, baz { ... } by bylo nahrazeno voláním callbacku, který je zaregistrován pod názvem foo s argumenty: "bar", "baz", array( ... ), "foo".
To be continued…
Tohle byla jen taková lehká ukázka, jak využít at pro šablonovací systém. Ještě by bylo samozřejmě potřeba doplnit možnosti větvení a iterování. Ale to již můžete udělat sami. A nejlépe se o to poté podělte.
Další způsoby praktického využití a větší ponoření se do magie at přijde v následujícím článku.
Ze stejné skupiny
- at – rozšiřujeme syntaxi
- at – konfigurujeme
- at – text-processing metalanguage
Doposud žádný komentář
Přidat komentář