introdução ao html::untemplate, ou “transmutando os módulos do cpan”

10
Introdução ao HTML::Untemplate ou “Transmutando os módulos do CPAN” (27 de março de 2013) 1 quarta-feira, 27 de março de 13 O quicktalk seria inicialmente sobre o módulo que escrevi, HTML::Untemplate. Porém a técnica que facilitou o desenvolvimento do mesmo aplica-se a qualquer outro módulo. Aliás, HTML::Untemplate já está no CPAN, e documentado.

Upload: stanislaw-pusep

Post on 18-Dec-2014

501 views

Category:

Technology


0 download

DESCRIPTION

http://setemasters.imasters.com.br/edicoes/perl/

TRANSCRIPT

Page 1: Introdução ao HTML::Untemplate, ou “Transmutando os módulos do CPAN”

Introdução ao HTML::Untemplateou “Transmutando os módulos do CPAN”

(27 de março de 2013)

1quarta-feira, 27 de março de 13

O quicktalk seria inicialmente sobre o módulo que escrevi, HTML::Untemplate.Porém a técnica que facilitou o desenvolvimento do mesmo aplica-se a qualquer outro módulo. Aliás, HTML::Untemplate já está no CPAN, e documentado.

Page 2: Introdução ao HTML::Untemplate, ou “Transmutando os módulos do CPAN”

xpathify/html/@langpt-br

//meta[@http-equiv='Content-Type'][1]/@contenttext/html; charset=UTF-8

/html/head[1]/title[1]/text()Perl | 7Masters

//link[@rel='shortcut icon'][1]/@hrefhttp://setemasters.imasters.com.br/wp-content/themes/setemasters/assets/images/favicon.ico

//link[@rel='shortcut icon'][1]/@typeimage/x-icon

//meta[@name='robots'][1]/@contentnoindex,nofollow

//link[@rel='stylesheet'][1]/@hrefhttp://setemasters.imasters.com.br/wp-content/themes/setemasters/style.css?ver=1363802105

//link[@rel='stylesheet'][1]/@mediaall

//link[@rel='stylesheet'][1]/@typetext/css

/html/head[1]/script[1]/@srchttp://setemasters.imasters.com.br/wp-includes/js/jquery/jquery.js?ver=1.8.3

/html/head[1]/script[1]/@typetext/javascript

2quarta-feira, 27 de março de 13

O módulo em questão “reinventa” a apresentação de um documento HTML, transformando a árvore DOM em pares key/value, aonde keys são strings XPath que identificam a localização do conteúdo (em values).

Page 3: Introdução ao HTML::Untemplate, ou “Transmutando os módulos do CPAN”

untemplate/html/head[1]/title[1]/text()PHP | 7MastersPerl | 7Masters.Net | 7MastersJava | 7Masters

//img[@class='attachment-edition-featured wp-post-image'][1]/@srchttp://setemasters.imasters.com.br/wp-content/uploads/sites/3/2013/02/php-160x1601.pnghttp://setemasters.imasters.com.br/wp-content/uploads/sites/3/2013/02/perl-160x160.pnghttp://setemasters.imasters.com.br/wp-content/uploads/sites/3/2013/02/dotnet-160x160.pnghttp://setemasters.imasters.com.br/wp-content/uploads/sites/3/2013/02/java-160x160.png

//img[@class='attachment-edition-featured wp-post-image'][1]/@altphp-160x160perl-160x160dotnet-160x160java-160x160

//h2[@class='featured-edition-title'][1]/strong[1]/text()PHPPerl.NetJava

//span[@class='release-date'][1]/text() 30 de janeiro de 2013  A Partir das 19h00  27 de março de 2013  30 de outubro de 2012  27 de novembro de 2012 

3quarta-feira, 27 de março de 13

Essa representação facilita “diff” de dois (ou mais) páginas em HTML (output de /usr/bin/diff geralmente é uma bagunça para HTML gerado a partir de um template).

Page 4: Introdução ao HTML::Untemplate, ou “Transmutando os módulos do CPAN”

O primeiro passo: um parser de HTMLhttp://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454

4quarta-feira, 27 de março de 13

Parsers parecem simples. De fato, 80% das funcionalidades de um parser são implementados em 20% do tempo de desenvolvimento. Fazer um parser de HTML completo usando regexp está na contramão do sucesso (todavia, pequenos regexp pontuais - OK).

Page 5: Introdução ao HTML::Untemplate, ou “Transmutando os módulos do CPAN”

Reutilizando HTML::Tree<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml"> @0 <head> @0.0 <title> @0.0.0 "The Perl Programming Language - www.perl.org" <meta content="text/html;charset=utf-8" http-equiv="Content-Type" /> @0.0.1 <link href="http://st.pimg.net/perlweb/favicon.v249dfa7.ico" rel="shortcut icon" /> @0.0.2 <link href="http://st.pimg.net/perlweb/css/leostyle.vf79cee0.css" rel="stylesheet" type="text/css" /> @0.0.3 <link href="http://st.pimg.net/perlweb/css/www.ve1fe6bb.css" rel="stylesheet" type="text/css" /> @0.0.4 <meta content="The Perl Programming Language at Perl.org. Links and other helpful resources for new and experienced Perl programmers." name="description" /> @0.0.5 <script charset="utf-8" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js" type="text/javascript"> @0.0.6 <script charset="utf-8" src="http://st.pimg.net/perlweb/js/jquery.corner.v84b7681.js" type="text/javascript"> @0.0.7 <script charset="utf-8" src="http://st.pimg.net/perlweb/js/leo.v9872b9c.js" type="text/javascript"> @0.0.8 <body class="section_home"> @0.1 <div id="header_holder"> @0.1.0 <div class="sub_holder"> @0.1.0.0 <div id="page_image"> @0.1.0.0.0 <h1> @0.1.0.0.1 " The Perl Programming Language " <div id="logo_holder"> @0.1.0.0.2 <a href="/"> @0.1.0.0.2.0 <img align="right" alt="Perl, modern programming" height="65" id="logo" src="http://st.pimg.net/perlweb/images/camel_head.v25e738a.png" /> @0.1.0.0.2.0.0 " " <span> @0.1.0.0.2.2 "www.perl.org" <div id="nav"> @0.1.1

5quarta-feira, 27 de março de 13

HTML::Tree existe e é ativamente mantido desde 1998. Extremamente robusto, tolera bem input “disforme”. Implementa o método address() que aponta a localização do nó na árvore DOM. Bom ponto de partida!

Page 6: Introdução ao HTML::Untemplate, ou “Transmutando os módulos do CPAN”

SUPER:: power

1 package HTML::Linear; 2 use base 'HTML::TreeBuilder'; 3 use strict; 4 use warnings 'all'; 5 6 sub eof { 7 my ($self, @args) = @_; 8 my $retval = $self->SUPER::eof(@args); 9 10 $self->deparse($self, []);11 ...;12 13 return $retval;14 }

6quarta-feira, 27 de março de 13

Modelo de herança “tradicional” presente em qualquer linguagem que implementa o paradigma OOP. No caso do Perl, SUPER:: “cru” muda o foco de “o que fazer” para “como fazer” (too many code!).

Page 7: Introdução ao HTML::Untemplate, ou “Transmutando os módulos do CPAN”

Aspect-Oriented Programming através de Moose Method Modifiers

1 package HTML::Linear; 2 use Moo; 3 extends 'HTML::TreeBuilder'; 4 5 after eof => sub { 6 my ($self) = @_; 7 8 $self->deparse($self, []); 9 ...;10 };

7quarta-feira, 27 de março de 13

AOP existe em Java. No Perl, o maior representante é o Moose, que introduziu os “method modifiers”. Menos código, mais abstração. Mais foco em “o que fazer” do que “como fazer”.

Page 8: Introdução ao HTML::Untemplate, ou “Transmutando os módulos do CPAN”

Moose::Manual::MethodModifiers para mais detalhes.

1 package Example; 2 3 use Moo; # Moose, Mouse? 4 5 sub foo { 6 print " foo\n"; 7 } 8 9 before foo => sub { print "about to call foo\n" };10 after foo => sub { print "just called foo\n" };11 12 around foo => sub {13 my $orig = shift;14 my $self = shift;15 16 print " I'm around foo\n";17 18 $orig->($self => @_);19 20 print " I'm still around foo\n";21 };

8quarta-feira, 27 de março de 13

“before” altera os parâmetros da função. “after” altera o valor do ‘return’. “around” seria o equivalente ao SUPER:: que funciona através de um callback.

Page 9: Introdução ao HTML::Untemplate, ou “Transmutando os módulos do CPAN”

Moose, Mouse, Any::Moose, Moo...Obs.: Moo dispensa ::NonMoose!

CPAN: all your method are belong to us!

9quarta-feira, 27 de março de 13

Alteração dos métodos é possível, nativamente, em qualquer módulo do CPAN que utilize Moose ou Mouse. Outros módulos podem ser assimilados via Mo[ou]seX::NonMoose.Já o Moo é capaz de aplicar after/before/around sem nenhum “artefato externo”; inclusive nos módulos do tipo XS!