PPWizard – pokročilá makra, podmínky a standardní definice

31. července 2004

V tomto článku se budeme věnovat pokročilejším makrům. Naučíte se také používat jednoduché podmínky a pracovat se standardními definicemi. Získáte tak nezbytné dovednosti pro tvorbu jednoduchých navigačních menu s vyznačením aktuální polohy.

Pokročilejší makra

V předchozím článku jsme se naučili definovat makra a předávat jim parametry. Na základě této znalosti si cvičně definujme makro pro vložení podpisu autora článku, jehož jméno předáme makru parametrem – #define sign <p class="signature">{$autor}</p>. Makro vyvoláme zápisem <$sign autor="Jan Bien">. Parametr autor je v tomto případě povinný, bez jeho předání by makro nefungovalo.

Představme si ale, že jsem na webu autorem většiny článků já, jen výjimečně je autor někdo jiný. Pak by bylo vhodnější předávat jméno pouze v případě této výjimky. Definujeme makro s nepovinným parametrem – #define sign <p class="signature">{$autor="Jan Bien"}</p>. Když toto makro vyvoláme bez parametru (<$sign>), bude jako implicitní hodnota použito moje jméno. Můžeme jej ale vyvolat i s parametrem <$sign autor="František Vopršálek">, takže se použije hodnota parametru, tedy František Vopršálek.

Jako implicitní hodnotu parametru lze s výhodou využít vyvolání jiného makra. Makro pro podpis bychom mohli ještě vylepšit zápisem #define sign <p class="signature">{$autor="<$myName>"}</p>. Implicitní je v tomto případě autor definovaný samostatným makrem myName.

Implicitní hodnota nepovinného parametru může být dokonce dána hodnotou parametru povinného. Definujme makro pro vložení odkazu, jehož povinným parametrem bude adresa odkazu a nepovinným parametrem jeho text. Pokud nebude text uveden, bude jako text odkazu vypsána adresa – #define link <a href="{$href}">{$text="{$href}"}</a>.

Pro zjednodušení zápisu pro vyvolání maker nemusíme parametry pojmenovávat. Tyto parametry pak nejsou určeny jménem ale svým pořadím při vyvolání. Vraťme se k definici makra pro podpis, které chceme vyvolávat snadněji pomocí zápisu <$sign "František Vopršálek">. V definici makra bychom se museli odvolávat k nepojmenovanému parametru číslo 1 – #define sign <p class="signature">{$#1}</p>. Pro hodnotu druhého parametru bychom se odvolali na {$#2}, pro třetí pak na {$#3} a tak dále.

A co když potřebujete v hodnotě parametru předat i znak dvojité (anglické) uvozovky? Pak můžete pro ohraničení textu požít jednoduchou uvozovku ' (někdy mylně označovanou jako apostrof), ale i znaky #, @, ^, &, %, $, *, ! a další. Takže zápis <$sign autor=@František Vopršálek@> je zcela podle pravidel. Jakýkoli znak, krom číslice a písmena, je přípustný, jen nesmí být součástí samotného obsahu parametru.

Podmínky

Ani u toho nejjednoduššího webu se neobejdeme bez podmínek. Potřebujeme je například při tvorbě navigace k vyznačení umístění v hierarchii a jiných dynamických částí webu.

Základní podmínková syntaxe v PPWizardu je následující:

#if podmínka
  Podmínka byla splněna.
#else
  Podmínka nebyla splněna
#endif

Podmínka samotná je dána možnostmi jazyka REXX. Tvoří ji dvě hodnoty v uvozovkách oddělené vzájemně operátorem. Hodnotami mohou být výstupy maker a hodnoty parametrů (mohou jimi být i návratové hodnoty funkcí, systémové proměnné a podobně, ale k těm se dostaneme až v některém dalším článku). Operátory máme k dispozici tyto:

  • == – přísná shoda – obě hodnoty musí být naprosto shodné, aby byla podmínka splněna
  • = – shoda – obě hodnoty musí být shodné, ale porovnávání je benevolentní k drobným rozdílům (například jiný počet mezer bezprostředně za sebou u řetězců nebrání shodě)
  • <> – neshoda – obě hodnoty musí být různé
  • < – menší než, > – větší než, <= – menší nebo rovno, >= – větší nebo rovno – používají se pro porovnávání číselných hodnot a význam mají zejména u cyklů

Pro názornost se nyní vrátíme k našemu ukázkovému webu z předchozího článku. V textovém editoru si otevřete soubor macros.ih. Řádky 23 až 25 makra document obsahují jednoduchou podmínku:

#if „{$description=“}“ <> „“
  <meta name=“description“ content=“{$description}“>
#endif

Jak s tím PPWizard naloží? Parametr „description“ je nepovinný, v levé části podmínky se proto nastavuje jeho implicitní hodnota na prázdný řetězec. Pouze pokud parametr nabývá jiné hodnoty než implicitní, vloží se do stránky příslušný metaelement, díky čemuž nemusíte vypisovat parametr „description“ pro všechny stránky svého webu. Všimněte si, že musíte pro ohraničení implicitní hodnoty parametru použít jiný ohraničující znak než pro celý parametr.

Bohužel, PPWizard umožňuje v podmínce porovnávat pouze dvě hodnoty. Pokud jich potřebujete porovnat více, musíte podmínky vnořovat. Také vás možná zklame, že příkaz #elseif je jen ekvivalentem příkazu #else a nelze pomocí něj vyhodnocovat další podmínku. Je tedy nutno použít následující konstrukci:

#if podmínka1
  První podmínka byla splněna.
#else
  #if podmínka 2
    Druhá podmínka byla splněna.
  #else
    Žádná z podmínek nebyla splněna.
  #endif
#endif

Zvláštním případem podmínky jsou příkazy #ifdef a #ifndef. Bezprostředně za ně se zapisuje pouze název makra. Pokud je makro definováno, je #ifdef vyhodnocena pozitivně, v opačném případě je pozitivní výstup funkce #ifndef.

#ifdef sign
  Makro sign je definováno.
#else
  Makro sign není definováno.
#endif

Standardní definice

Standardní definice v PPWizardu jsou různé konstanty využitelné ve skriptech. Patří mezi ně například jméno vstupního či výstupního souboru, jméno autora PPWizardu a jiné. Jejich úplný seznam najdete v dokumentaci na stránce standard definitions. Zde se zaměříme jen na úzký výtah těch nejpotřebnějších.

Standardní definice se vyvolávají velmi podobným způsobem jako makra, pouze místo znaku $ použijeme znak ?. Tak kupříkladu definice DirSlash by měla obsahovat znak, který používá operační systém pro oddělování adresářů v cestě. Vyvolá se zápisem <?DirSlash>. Ve Windows se vypíše zpětné lomítko, v Linuxu lomítko obyčejné.

Dalšími užitečnými definicemi jsou InputFile a OutputFile. Obsahují úplnou cestu, jméno a příponu vstupního a výstupního souboru. Pokud potřebujeme pouze určitou část jména, můžeme použít některý z volitelných parametrů. Parametry se zapisují bez mezery s dvojtečkou bezprostředně za jméno definice a je-li jich více, oddělují se čárkou:

<?InputFile>
   ;; vypíše c:ppwprojektppwindex.it
<?InputFile:name>
   ;; vypíše index.it
<?InputFile:extn>
   ;; vypíše it
<?InputFile:name,withoutextn>
   ;; vypíše index
<?InputFile:basename>
   ;; vypíše index
<?InputFile:location>
   ;; vypíše c:ppwprojektppw
<?InputFile:path>
   ;; vypíše ppwprojektppw
<?InputFile:drive>
   ;; vypíše C:

Poslední ze zajímavých standardních definicí je NewestFileDateTime obsahující datum a čas poslední aktualizace souboru. Parametrem určíte, v jakém formátu má být definice vypsána. Přehled všech parametrů je totožný s REXX funkcí FormatTime. Jelikož se práci s formáty data a času budeme věnovat v některém z dalších článků podrobně, uvedu tentokrát jen několik ukázek:

<?NewestFileDateTime:%D>
   ;; vypíše 07/26/04
<?NewestFileDateTime:%#.%m.%Y>
   ;; vypíše 26.07.04
<?NewestFileDateTime:%R>
   ;; vypíše 12:25

Ukázkový web

Nyní by vám mělo být jasné řešení hlavního menu našeho ukázkového webu:

#define getFileName <?InputFile:name,withoutextn>
#(
#define menuItem
  #if ‚<$getFileName>‘ = ‚{$page}‘
    <li class=“active“><strong>{$text}</strong></li>
  #else
    <li><a href=“{$page}.html“>{$text}</a></li>
  #endif
#)
<ul>
  …
    <$menuItem page=“curabitur“ text=“Curabitur“>
  … </ul>

Ještě to není jasné? Vyvoláním makra menuItem se vkládá jedna položka v menu. Makru se předávají dva parametry – text odkazu a jméno stránky, na kterou se má odkazovat. Makro pak porovná jméno odkazovaného souboru s právě generovaným souborem. Pokud se shodují, vloží se text jako zvýrazněná položka, jinak se vloží jako normální odkaz.

Odkazy, zdroje

  • #define – Dennis Bareis (PPWizard manual, 30. 7. 2004)
  • #elseif – Dennis Bareis (PPWizard manual, 30. 7. 2004)
  • #endif – Dennis Bareis (PPWizard manual, 30. 7. 2004)
  • #if – Dennis Bareis (PPWizard manual, 30. 7. 2004)
  • #ifdef – Dennis Bareis (PPWizard manual, 30. 7. 2004)
  • #ifndef – Dennis Bareis (PPWizard manual, 30. 7. 2004)
  • Quoted Text – Dennis Bareis (PPWizard manual, 30. 7. 2004)
  • Standard Definitions – Dennis Bareis (PPWizard manual, 30. 7. 2004)

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *