Aula de 19

hpl

Nós, fartos de HTML, resolvemos:

Como?

Seguindo a seguinte gramática

Segue-se a grmática
 HTML    --> comando*
 comando --> ID CHAV comando* CHAV
         --> TEXT

Código do Programa!

#!/usr/bin/perl -s
use Text::RewriteRules;
use Data::Dumper;

our ($t);
use strict;
use warnings;

our %TAB;
our %TAB_ARGS;
undef $/;

my $N = qr{[A-Z]\w+};
my $A = qr{([a-zA-Z]\w*)};
my $B = qr{\{((?:\\\{|\\\}|[^\{\}])*)\}};  ## bloco  {...\{...} {...{...\}.}}
while(<>){
  if($t){ print head(), _loadit(h2(html($_))), foot();}
  else  { print         _loadit(h2(html($_)));        }
}

RULES html
\bperl$B=e=> do($1),$@ !! -f $1
\bperl$B==> (((***** o FICHEIRO desapareceu '$1')))

\b(\w+)$B=e=> $TAB{$1}->($2)!! defined $TAB{$1} 

\binc$B=e=> `cat $1`!! -f $1
\binc$B==> (((***** o FICHEIRO desapareceu '$1')))

\b$A:$B==>__ATRIB__$1='$2'__ENDATRIB__

\b$A=$B=e=> savefun($1,$2,1),""
\b$A#(\d)=$B=e=> savefun($1,$3,$2),""

(\w+)$B==><$1>$2</$1>
<([^<>]*)>\s*__ATRIB__(.*?)__ENDATRIB__==><$1 $2>
$B=e=>_savit("{$1}")

ENDRULES

RULES/m h2
<vinc>(.*?)</vinc>=e=> bpre( protege( `cat $1` ))!! -f $1
<vinc>(.*?)</vinc>==> (((o FICHEIRO desapareceu '$1')))

ENDRULES

RULES/m protege
<==>\&lt;
>==>\&gt;
\&==>\&amp;

ENDRULES

sub bpre{
 my $a = shift;
 $a =~ s/^\s*\n/\n/;
 $a =~ s/\n\s*$/\n/;
 _savit("<pre class='boxed'>$a</pre>");
}

sub savefun{
 my ($n,$f,$i)=@_;
 my @a= m/#(\d+)/g;
 $i ||= (sort { <=> } @a)[-1];
 $TAB_ARGS{$n}=$i;
 $TAB{$n}=sub{
     my $a=shift;
     my $c = $f ;
     $c =~ s/#1/$a/g;
     $c};
}

sub head{
 q{<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <style type="text/css">
<!--/* <![CDATA[ */
<!--
  hr       { border: none; border-top: solid thin #f36e21; }
  *.boxed  { border: solid 1px #f36e21; margin: 6pt; padding: 6pt; }
  *.orange { color: #f36e21; }
  a        { color: #d25c10; text-decoration: none; }
  a:white  { color: #ffffff; text-decoration: none; }
  a:hover  { color: #000; text-decoration: none; }
  h1.newslide  { background-color: #f9ce87; font-size: large;
             color: #000; padding: 3px; margin-top: 400px; }
  h1       { background-color: #f9ce87; font-size: large;
             color: #000; padding: 3px; margin-bottom: 2px; }
  h2       { background-color: #fbdea7; font-size: medium;
	     color: #000; padding: 3px; margin-bottom: 2px; }
  h3       { background-color: #fbdea7; font-size: small;
	     color: #000; padding: 3px; margin-bottom: 2px; }
  div.body { margin-left: 15px; margin-right: 15px; }
  p        { text-align: justify; }
  /* for Boxml: */
  table.box   { border: solid 1px #000; margin: 1px;  }
  th.boxtitle { background-color: #548b8e;
                color: #fff; border-bottom: solid 1px #000; }
  *.tiny      { font-size:small;}
  --> 

/* ]]> */-->
  </style>
  </head>
  <body>
}}

sub foot{"</body></html>\n";}

my ($savit_n, %savit_p);

sub _savit{
  my $a=shift;
  $savit_p{++$savit_n}=$a ;
  " __MARCA__$savit_n "
}

sub _loadit{
  my $a = shift;
  while( $a =~ s/ ?__MARCA__(\d+) ?/$savit_p{$1}/g){}
  $savit_n = 0;
  $a;
}