mason preprocessing

0 views
Skip to first unread message

Darko Prelec

unread,
Nov 10, 2009, 5:19:50 AM11/10/09
to zagr...@googlegroups.com
Bokdaj svima lepi dan!

Kaj mislite o preprocesuiranju HTML::Masona? Naime, s obzirom da je
Mason zapravo Perl u HTML-u (ili nečem drugom), završni rezultat može
biti dosta nečitljiv i nepraktičan za održavanje. HTML::Mason nema
template konstrukte, nego logiku pišemo u Perlu, što je ok, ali zna
ispast ružno.

Npr, u sljedećem templejtu nije sasvim očigledno što se događa na prvi pogled:

<%args>
$have_items
$items
</%args>

Take one:
<%perl>if ( $have_items) {</%perl>
<%perl>for my $item (@$items) {</%perl>
<table>
<tr>
<td><% $item->{name} %></td>
</tr>
</table>
<%perl>}</%perl>
<%perl>}</%perl>

Take two:
<%perl>for my $item (@$items) {</%perl>
<table><tr>
<td><% $item->{name} %></td>
<td><% $item->{type} %></td>
</tr></table>
<%perl>}</%perl>

Take three:
<%perl>for my $item (grep {$_->type eq 'TEXT'} @$items {</%perl>
<% $item->{name} %>
<%perl>}</%perl>

Ali uz malo preprocessinga, može se dobiti ovo:

<%args>
$have_items
$items
</%args>

Take one:
<%if $have_items>
<%for my $item (@$items)>
<table>
<tr>
<td><% $item->{name} %></td>
</tr>
</table>
</%for>
</%if>

Take two:
<%for my $item (@$items)>
<table><tr>
<td><% $item->{name} %></td>
<td><% $item->{type} %></td>
</tr></table>
</%for>

Take three:
<%for my $item (grep {$_->{type} eq 'TEXT'} @$items)>
<% $item->{name} %>
</%for>

Puno čitljvije i jasnije.

Stoga je moje pitanje u principu: da nastavim s ovim pristupom ili ne?
Preprocessing sam implementirao u par regexa, al nisam ziher da je to
ispravan put, premda je lakši definitivno.
Imam relativno komplicirane mejson templejte koji bi bili puno
čitljiviji uz ovaj pristup.

Za zainteresirane ovo su nabrzinu sklepani regexi:

sub ppmason {
my $str = shift;
# single-line replace only
$$str =~ s/<%for([^\n]*[^\n>]*)>/<%perl>for $1 {<\/%perl>/g;
$$str =~ s/<%if([\n]*[^\n>]*)>/<%perl>if ($1) {<\/%perl>/g;
$$str =~ s/<\/%(for|if)>/<%perl>}<\/%perl>/g;
$$str =~ s/<%else>/<%perl>} else {<\/%perl>/g;
}

Boris Shomodjvarac

unread,
Nov 10, 2009, 5:53:07 AM11/10/09
to zagr...@googlegroups.com

Uf, ja sam davno koristio Mason, ali glupo pitanje zasto ne bih koristio
komponente?

eg:

<& tools/print_one, $items &>
<& tools/print_two, $items &>
<& tools/print_three, $items &>

i onda taj ruzni kod sakrijes u te male funkcije, uglavnom ja sam tako
programirao da sam na glavnom layout-u pisao ove male funkcije, a svaka
funkcija je vracala malio dio HTML koda koji je oko sebe imao div sa
id-em/class-om i onda ih lako kontroliras CSS-om cak i ako je tableless
layout.

U biti ono sto ti radis je isto, smanjujes perl kod da bih imao laksi
overview, koliko se ja sjecam mason-a te njegove komponente su jedna od
glavnih feature?

HTH,
Boris.

signature.asc

Boris Shomodjvarac

unread,
Nov 10, 2009, 6:12:05 AM11/10/09
to zagr...@googlegroups.com
> --~--~---------~--~----~------------~-------~--~----~
> Primili ste ovu poruku jer ste se pretplatili na Google Grupe - grupa "Zagreb Perl Mongers"
> Za postavljanje poruka u ovoj grupi, pošaljite e-poruku na zagr...@googlegroups.com
> Ukoliko ne želite sudjelovati u radu ove grupe, pošaljite e-poruku na zagrebpm+u...@googlegroups.com
> Za više opcija posjetite ovu grupu na http://groups.google.com/group/zagrebpm?hl=hr
> -~----------~----~----~----~------~----~------~--~---
>
>


Ah sorry nisam dobro skuzio, sad kuzim ti hoces <%perl for ... u <%for

E pa pogledaj HTML::Mason::Lexer:

{code}
my %blocks = ( args => 'variable_list_block',
attr => 'key_val_block',
flags => 'key_val_block',
cleanup => 'raw_block',
doc => 'doc_block',
filter => 'raw_block',
init => 'raw_block',
once => 'raw_block',
perl => 'raw_block',
shared => 'raw_block',
text => 'text_block',
);
{code}

tu definiras blokove, znaci dodas tvoj for i onda u start funkciju dodas:

{code}
$self->match_for_line && next;
{code}

i dodas funkciju:

{code}
sub match_for_line
{
my $self = shift;

## magic goes here :)

return 1;
}
}
{code}

Kada zavrsis, probas, posaljes kod Davu i stavis mene u credits :)

HTH,
Boris.

signature.asc

Darko Prelec

unread,
Nov 10, 2009, 8:40:50 AM11/10/09
to zagr...@googlegroups.com
2009/11/10 Boris Shomodjvarac <sho...@gmail.com>:

> Ah sorry nisam dobro skuzio, sad kuzim ti hoces <%perl for ... u <%for
> E pa pogledaj HTML::Mason::Lexer:

U principu želim jednostavniju sintaksu. Radim funkcije u Masonu ali
samo za stvari koje su netrivijalne i koje više puta koristim na više
mjesta. Mislim, mogu pojednostavniti mason source tim funkcijama ali
se uglavnom radi o special casevima pa mi se to čini prekomplicirano.
Nekak mi se čini da mi treba rewrite :)

Već sam prije šarafil po Lexeru, al uz slabe rezultate. Debagiranje
mejsona nije lako.
Razlog tome je uglavnom taj kaj mi se uvijek žuri, a Mason nije na
Moosetu još uvijek :)

S obzirom da je mejson u principu perl sa stringovima, onda se ovakvi
(moji) konstrukti ne uklapaju u bijekcijski mindset mejsona: html +
perl se izvrče u perl + html.

Također bilo je razgovora o tome ovdje:
http://www.openswartz.com/2009/09/01/what-mason-2-0-would-look-like/

Enivej, tenks na hintovima. Idem sad proučavat kaj si mi to napisal :)

Darko Prelec

unread,
Nov 10, 2009, 9:35:33 AM11/10/09
to zagr...@googlegroups.com
2009/11/10 Darko Prelec <darko....@gmail.com>:

> Enivej, tenks na hintovima. Idem sad proučavat kaj si mi to napisal :)

Da, to je to kaj si napisal. Po tome sam i ja šarafil, zapravo.
Tj, dodal sam mogućnost ubacivanja bilo kakvog perl koda u <% ... %> o
čemu je bilo razgovora na spomenutom blog-postu. Al se strgalo nešt u
mejsonu pa sam ostavil to za kasnije..

Reply all
Reply to author
Forward
0 new messages