Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

865 views

Published on

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

Published in: Technology
  • Be the first to comment

  • Be the first to like this

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

  1. 1. Introdução ao HTML::Untemplate ou “Transmutando os módulos do CPAN” (27 de março de 2013)quarta-feira, 27 de março de 13 1O 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 outromódulo. Aliás, HTML::Untemplate já está no CPAN, e documentado.
  2. 2. xpathify /html/@lang pt-br //meta[@http-equiv=Content-Type][1]/@content text/html; charset=UTF-8 /html/head[1]/title[1]/text() Perl | 7Masters //link[@rel=shortcut icon][1]/@href http://setemasters.imasters.com.br/wp-content/themes/setemasters/assets/images/favicon.ico //link[@rel=shortcut icon][1]/@type image/x-icon //meta[@name=robots][1]/@content noindex,nofollow //link[@rel=stylesheet][1]/@href http://setemasters.imasters.com.br/wp-content/themes/setemasters/style.css?ver=1363802105 //link[@rel=stylesheet][1]/@media all //link[@rel=stylesheet][1]/@type text/css /html/head[1]/script[1]/@src http://setemasters.imasters.com.br/wp-includes/js/jquery/jquery.js?ver=1.8.3 /html/head[1]/script[1]/@type text/javascriptquarta-feira, 27 de março de 13 2O 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çãodo conteúdo (em values).
  3. 3. untemplate /html/head[1]/title[1]/text() PHP | 7Masters Perl | 7Masters .Net | 7Masters Java | 7Masters //img[@class=attachment-edition-featured wp-post-image][1]/@src http://setemasters.imasters.com.br/wp-content/uploads/sites/3/2013/02/php-160x1601.png http://setemasters.imasters.com.br/wp-content/uploads/sites/3/2013/02/perl-160x160.png http://setemasters.imasters.com.br/wp-content/uploads/sites/3/2013/02/dotnet-160x160.png http://setemasters.imasters.com.br/wp-content/uploads/sites/3/2013/02/java-160x160.png //img[@class=attachment-edition-featured wp-post-image][1]/@alt php-160x160 perl-160x160 dotnet-160x160 java-160x160 //h2[@class=featured-edition-title][1]/strong[1]/text() PHP Perl .Net Java //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 quarta-feira, 27 de março de 13 3Essa representação facilita “diff” de dois (ou mais) páginas em HTML (output de /usr/bin/diffgeralmente é uma bagunça para HTML gerado a partir de um template).
  4. 4. O primeiro passo: um parser de HTML http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454quarta-feira, 27 de março de 13 4Parsers parecem simples. De fato, 80% das funcionalidades de um parser são implementadosem 20% do tempo de desenvolvimento. Fazer um parser de HTML completo usando regexpestá na contramão do sucesso (todavia, pequenos regexp pontuais - OK).
  5. 5. 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.1quarta-feira, 27 de março de 13 5HTML::Tree existe e é ativamente mantido desde 1998. Extremamente robusto, tolera beminput “disforme”. Implementa o método address() que aponta a localização do nó na árvoreDOM. Bom ponto de partida!
  6. 6. 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 }quarta-feira, 27 de março de 13 6Modelo de herança “tradicional” presente em qualquer linguagem que implementa oparadigma OOP. No caso do Perl, SUPER:: “cru” muda o foco de “o que fazer” para “comofazer” (too many code!).
  7. 7. 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 };quarta-feira, 27 de março de 13 7AOP existe em Java. No Perl, o maior representante é o Moose, que introduziu os “methodmodifiers”. Menos código, mais abstração. Mais foco em “o que fazer” do que “como fazer”.
  8. 8. Moose::Manual::MethodModifiers para mais detalhes. 1 package Example; 2 3 use Moo; # Moose, Mouse? 4 5 sub foo { 6 print " foon"; 7 } 8 9 before foo => sub { print "about to call foon" }; 10 after foo => sub { print "just called foon" }; 11 12 around foo => sub { 13 my $orig = shift; 14 my $self = shift; 15 16 print " Im around foon"; 17 18 $orig->($self => @_); 19 20 print " Im still around foon"; 21 };quarta-feira, 27 de março de 13 8“before” altera os parâmetros da função. “after” altera o valor do ‘return’. “around” seria oequivalente ao SUPER:: que funciona através de um callback.
  9. 9. Moose, Mouse, Any::Moose, Moo... Obs.: Moo dispensa ::NonMoose! CPAN: all your method are belong to us!quarta-feira, 27 de março de 13 9Alteraçã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 tipoXS!
  10. 10. Obrigado! Stanislaw Pusep <stas@sysd.org> blogs.perl.org/users/stas coderwall.com/creaktive github.com/creaktive twitter.com/creaktivequarta-feira, 27 de março de 13 10

×