<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ondra[sej] Blog &#187; Perl</title>
	<atom:link href="http://www.ondrejsykora.com/blog/category/perl/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ondrejsykora.com/blog</link>
	<description></description>
	<lastBuildDate>Sun, 21 Mar 2010 13:17:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2</generator>
		<item>
		<title>Spojování podmínek v Petalu</title>
		<link>http://www.ondrejsykora.com/blog/2008/06/01/spojovani-podminek-v-petalu/</link>
		<comments>http://www.ondrejsykora.com/blog/2008/06/01/spojovani-podminek-v-petalu/#comments</comments>
		<pubDate>Sun, 01 Jun 2008 13:22:35 +0000</pubDate>
		<dc:creator>ondrasej</dc:creator>
				<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://ondra.sykorky.cz/blog/2008/06/01/spojovani-podminek-v-petalu/</guid>
		<description><![CDATA[Po zápisku o HTML::Mason přidávám pár hintů k dalšímu šablonovacímu systému pro Perl, tentokrát pro Petal. Proti Masonu je Petal o dost jednodušší, ale na weby s několika stránkami bohatě stačí. Petal má navíc velkou výhodu v tom, že je kompletně postavený na XML, takže je možné jeho použití jednoduše kombinovat s dalšími XML nástroji. [...]]]></description>
			<content:encoded><![CDATA[<p>Po zápisku o HTML::Mason přidávám pár hintů k dalšímu šablonovacímu systému pro Perl, tentokrát pro <a title="Petal - Perl Template Attribute Language" href="http://search.cpan.org/~bpostle/Petal-2.19/lib/Petal.pm">Petal</a>. Proti Masonu je Petal o dost jednodušší, ale na weby s několika stránkami bohatě stačí. Petal má navíc velkou výhodu v tom, že je kompletně postavený na XML, takže je možné jeho použití jednoduše kombinovat s dalšími XML nástroji. Některé věci v něm ale jsou zjednodušené možná až příliš &#8211; například syntaxe výrazů v podmínkách. To může znamenat problém, pokud je viditelnost některých prvků stránky řízena složitější logikou a využívá se více proměnných.<br />
<span id="more-161"></span><br />
V podmínkové části šablon lze zadat jenom jednu proměnnou. Nejjednodušší způsob, jak tento problém obejít, je přidat pomocné proměnné obsahující požadované kombinace podmínek.</p>
<pre>$tal->process(a => $a, b => $b, a_or_b => $a || $b);</pre>
<p>To je ale nepříjemné řešení, protože zesložiťuje komunikaci mezi šablonou a &#8220;užitečným kódem&#8221; a může vyžadovat úpravy perlového kódu při změně designu stránky.</p>
<p>Jak tedy zapsat základní logické spojky? V dokumentace to přímo napsané není, ale nakonec to není tak složité:<br />
<em>Pozn.: v příkladech používám pro Petalovské atributy namespace <code>tal</code>, jako to je v příkladech v dokumentaci na CPANu.</em></p>
<h3>Negace</h3>
<p>Nejjednodušší varianta, před podmínku stačí dopsat <code>false:</code></p>
<pre><strong>if</strong> (not $hashref-&gt;{"a"}) {
  #...
}</pre>
<p>lze zapsat jako</p>
<pre>&lt;span tal:condition="false:a"&gt;...&lt;/span&gt;</pre>
<h3>Konjunkce (logické and)</h3>
<p>Logický and jde vytvořit jednoduše, jako vyhodnocení posloupnosti podmínek (tj. vnořením tagů s podmínkou do sebe). Problém je, že tak ve výsledném HTML kódu vzniknou nechtěné elementy. Tomu jde v Petalu zabránit přidáním atributu omit-tag s pravdivou hodnotou (například <code>omit-tag="string:1"</code>) u pomocných tagů, přidaných jen kvůli podmínkám.</p>
<pre><strong>if</strong> ($hashref-&gt;{"a"} &#038;&#038; $hashref-&gt;{"b"}) {
  #...
}</pre>
<p>lze tedy zapsat jako</p>
<pre>&lt;span tal:omit-tag="string:1" tal:condition="a"&gt;
  &lt;span tal:condition="b"&gt;
    ...
  &lt;/span&gt;
&lt;/span&gt;</pre>
<h3>Disjunkce (logické or)</h3>
<p>S disjunkcí to je o něco složitější, trik s vnořování tagů tu zopakovat nejde. Na druhou stranu lze využít schopnost Petalu vkládat hodnoty proměnných přímo do textu pomocí dolarové notace &#8211; ${x} se při zpracování šablony nahradí hodnotou proměnné x. To lze využít ke skládání hodnot pro podmínky. Přidáním <code>string:</code> na začátek podmínkového atributu Petal přinutíme, aby výraz v podmínce zpracovával jako řetězec (a ne jako název proměnné). Pak do něj lze zadat více proměnných najednou (viz příklad). Pokud alespoń jedna z nich bude mít pravdivou hodnotu, pak bude mít pravdivou hodnotu celý řetězec a podmínak bude splněna.</p>
<pre><strong>if</strong> ($hashref-&gt;{"a"} || $hashref-&gt;{"b"}) {
  #...
}</pre>
<p>lze zapsat jako</p>
<pre>&lt;span tal:condition="string:${a}${b}"&gt;
  ...
&lt;/span&gt;</pre>
<h3>Složitější výrazy</h3>
<p>Už budou trochu problém&#8230; každou logickou formuli sice lze přepsat na konjunkci disjunkcí (konjunktivní normální tvar) a na ten pak aplikovat výše uvedené postupy, ale o přehlednosti takové šablony bych si dovolil předem pochybovat. O skutečné potřebě používat takové podmínky také.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ondrejsykora.com/blog/2008/06/01/spojovani-podminek-v-petalu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTML::Mason, mod_perl, čeština a utf-8</title>
		<link>http://www.ondrejsykora.com/blog/2008/05/25/htmlmason-mod_perl-cestina-a-utf-8/</link>
		<comments>http://www.ondrejsykora.com/blog/2008/05/25/htmlmason-mod_perl-cestina-a-utf-8/#comments</comments>
		<pubDate>Sat, 24 May 2008 23:30:56 +0000</pubDate>
		<dc:creator>ondrasej</dc:creator>
				<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://ondra.sykorky.cz/blog/2008/05/31/htmlmason-mod_perl-cestina-a-utf-8/</guid>
		<description><![CDATA[HTML::Mason je jednou z výborných (řekl bych nejlepších, ale dost jsem jich ještě nevyzkoušel) voleb při vývoji webových aplikací v Perlu. Výhod je spousta &#8211; komponenty, přehledná syntax, jednoduché na naučení. Dokud je vyvýjená aplikace v angličtině a pro anglicky mluvící, je všechno krásné, funkční a jednoduché. Problém začne až ve chvíli, kdy se na [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.masonhq.com">HTML::Mason</a> je jednou z výborných (řekl bych nejlepších, ale dost jsem jich ještě nevyzkoušel) voleb při vývoji webových aplikací v Perlu. Výhod je spousta &#8211; komponenty, přehledná syntax, jednoduché na naučení. Dokud je vyvýjená aplikace v angličtině a pro anglicky mluvící, je všechno krásné, funkční a jednoduché. Problém začne až ve chvíli, kdy se na web začne míchat Unicode.<br />
<span id="more-159"></span><br />
Podle dokumentace funguje Unicode v Perlu tak nějak automaticky a interní reprezentace řetězců je vždy UTF-8. To je sice pravda, ale jen z části. Retězce totiž Perlu interpretuje buď jako řetězec (a pak je interně v Unicode), nebo jako pole bytů. Pak pochopitelně v Unicode není. Dokud pracujeme jen s jedním typem řetězců (a nevadí drobnosti jako nesprávné délky řetězce), není nutné situaci řešit, prostě to nějak funguje a výstup je správně. Horší to je ve chvíli, kdy se začnou kombinovat Unicode řetězce s poli bytů &#8211; v takové chvíli je nutné překódovat oba řetězce do stejného formátu. Perl si vybere Unicode jako menší zlo, ale obě možné volby jsou špatně. Obzvlášť pikantní situace nastane ve chvíli, kdy bytový řetězec už ve skutečnosti je v Unicode: při konverzi nedojde k rozpoznání multibyte znaků a každý byte je interpretován jako samostatný znak (a díky tomu z něj v Unicode reprezentaci opět vznikne multibyte znak). Typicky se tento problém projevuje na místech, kde se kombinují data ze dvou různých zdrojů:</p>
<p><strong>První problém:</strong> soubory s Masonovskými komponentami obsahují HTML kód (z pochopitelných důvodů psaný jako UTF-8) a je potřeba Perl přesvědčit, že je tak také má interpretovat. V &#8220;normálním&#8221; skriptu to lze udělat například přidáním řádku</p>
<pre><strong>use</strong> utf8;</pre>
<p>na začátek souboru. Masonovská šablona sice normální skript není, ale Mason šablony při zpracování překládá na skripty (takže text+html v šabloně padne do řetězcových konstant) a ty pak spouští. Takže zbývá jen odhalit, jakým způsobem do nich propašovat výše uvedený řádek. Přímočerá možnost je uvést ho do sekce <code>&lt;%init&gt;</code> u každé komponenty. Nepraktické, že? Naštěstí jde Masonu v konfiguraci Apache předat kus kódu, který bude přidán na začátek kódu každé komponentu. Při použití přes mod_perl stačí do konfigurace Apache přidat řádek:</p>
<pre>PerlSetVar MasonPreamble "use utf8;"</pre>
<p>Podobně pro (Fast)CGI.</p>
<p><strong>Druhý problém:</strong> <code>Apache2::Request</code> nenastavuje interní Unicode flag automaticky, přestože z HTTP hlaviček ví, že data v Unicode jsou (kvůli možným útokům přes neplatné UTF-8 znaky). Při normální práci přes <code>mod_perl</code> není problém parametry správně překódovat nebo zpracovat ručně, ne přes <code>Apache2::Request</code>. s Masonem to je trochu horší &#8211; parametry si zpracovává sám pomocí <code>Apache2::Request</code> a nepodařilo se mi najít jednoduché řešení, jak zasáhnout přímo do zpracování parametrů, ale bez změn ve zdrojových kódech Masonu. Naštěstí se k parametrům dá dostat  v Masonovských autohandlerech ještě předtím, než se k nim dostane libovolná komponenta. Vložení následujícího kódu do autohandleru v kořenovém adresáři aplikace</p>
<pre><%init>
%ARGS = <strong>map</strong> { 	$_ = Encode::decode('utf8', $_); }%ARGS;
$m->call_next(%ARGS);
<%init></pre>
<p>způsobí překódování parametrů do UTF tak, že všechny ostatní komponenty je dostanou ve správném tvaru.</p>
<p><strong>Třetí, čtvrtý, &#8230; problém:</strong> řetězce z databáze, souborů a dalších zdrojů. Ale to až někdy jindy. A nebo na to přijdete sami <img src='http://www.ondrejsykora.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.ondrejsykora.com/blog/2008/05/25/htmlmason-mod_perl-cestina-a-utf-8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

