[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Amélioration des scripts de message (était : wml://News/2011/20110625.wml)



Salut David et la liste.

Le samedi 08 oct. 2011 à 16:15:17 (-0400), David Prévot a écrit :
> Après avoir encore peiné en préparant la mise en page de l'annonce de
> Squeeze 6.0.3, je confirme que toute amélioration du script existant
> pour s'occuper de la DPN, et toute proposition pour se faciliter la vie
> pour les autres nouvelles, serait apprécié (par l'équipe de presse et de
> publicité aussi ;-).

J'avais effectivement commencé à travailler sur une adaptation du
scripts pour les news Debian. Ce n'est pas une version beaucoup plus
fonctionnel que celle utilisé pour DPN mais bon vous le trouverais en
pièce jointe.

Par rapport au script de DPN:
 * les « entêtes » du mail ont été modifiés parce
   que ce n'est pas la même équipe.
 * Le dossier racine considéré par défaut est celui des news et pas
   celui de DPN.
 * Il n'y a pas de génération de la liste des liens comme: dans le cas
   des news de mise à jour il y en a tellement que ça devient imbuvable à
   mon avis. Mais je pense mettre une option pour activer ou désactiver
   cette option.

Ce qu'il manque c'est la gestion des tableaux html notamment générés par
notamment la liste des bogues corrigés. Il y a du boulot car je n'ai
aucun morceau de code pour le moment pour le faire.

Une utilisation classique pour récupérer la news de la mise à jour de
6.0.3 en français :

./DNhtml2mail.pl -i 2011/20111008 -l fr

Après on se rend compte que le tableaux des « Corrections de bogues
divers » n'est pas rendu correctement au contraire de la version w3m.

S'il n'y a pas de tableau dans le message je pense que c'est utilisable.
À vous de voir et de me dire. Je suis ouvert à toute proposition/idée.

Amicalement,

Thomas
#!/usr/bin/env perl

# Author: Thomas Blein, tblein in tblein.eu

# adaptation of the DWNhtml2mail to use it with Debian News
# iniatial work of DWNhtml2mail by Jean-Edouard Babin, radius in gmail.com

# TODO
# - $links activation/desactivation on command line
# - layout of tables
#  (from DWNhtml2mail)
# - Debug need to be implemented/improved
# - Remove the remaining space un first <li>
# - Better \n removing


use strict;
use warnings;

use HTML::TokeParser::Simple;
use LWP::UserAgent;
use Getopt::Long;
use Text::Wrap;

$Text::Wrap::columns = 72;
my %opts;
my $data;
my @links;

my $link_index = 1;
my $footer_found = 0;
my $stories_index = 0;
my $paragraph_index = 0;


# Output to UTF-8, May be needed for some langage
# binmode(STDOUT, ":encoding(UTF-8)");

# Base config
my $default_url  = $opts{u} = 'http://www.debian.org/News/';
my $default_lang = $opts{l} = 'en';
                   $opts{d} = 0;

# Option parsing
GetOptions(\%opts, 'u=s', 'i=s', 'l=s', 'd');

if (!defined($opts{i})) {
    print STDERR "Usage: $0 -i issue [-l lang] [-u base_url] [-d]\n";
    print STDERR " -i issue number (i.e.: 2011/20110625)\n";
    print STDERR " -l langage (i.e.: fr). Default value is";
    print STDERR "    \"-l $default_lang\"\n";
    print STDERR " -u base_url: News common URL. Default value is";
    print STDERR "    \"-u $default_url\"\n";
    print STDERR " -d for verbose output\n";
    exit 1;
}

if ($opts{d} == 1) {
	use Data::Dumper; #useful for debug only
}

# HTML file fetching
my $ua = LWP::UserAgent->new;
$ua->agent("DNhtml2mail", 
           'Accept-Charset' => 'utf-8'
);

my $url = "$opts{u}$opts{i}.$opts{l}.html";
my $req = HTTP::Request->new(GET => $url);
my $res = $ua->request($req);
if (! $res->is_success) {
	die "Can't fetch $url ".$res->status_line;
}

# Start of parsing / storage
my $p = HTML::TokeParser::Simple->new(\$res->content);
my $token = $p->get_tag("h1");
$data->{header}{title} = $p->get_trimmed_text;
$data->{header}{url}   = "$opts{u}$opts{i}.html";
$data->{header}{dn} = $data->{header}{title};
$data->{header}{date} = '';

if ($opts{l} eq "fr") {
	$data->{header}{project} = 'Projet Debian';
}
elsif ($opts{l} eq "es") {
	$data->{header}{project} = 'El proyecto Debian';
}
elsif ($opts{l} eq "it") {
	$data->{header}{project} = 'Il progetto Debian';
}
else {
	$data->{header}{project} = 'The Debian Project';
}

my $links = 0;

while (my $token = $p->get_tag) {
    # Heading of a paragraph
    if ($token->is_start_tag('h2')) {
        $paragraph_index = 0;
        $stories_index++;
        # Get story name
        $data->{stories}[$stories_index]{'title'} = $p->get_trimmed_text;
    }
    # Links
    if ($token->is_start_tag('a')) {
        if ($token->[1]{'href'} !~ /^#\w+.*$/) {# Common link
            if ($links){
                $data->{stories}[$stories_index]{'paragraph'}[$paragraph_index]{'text'} .= $p->get_trimmed_text . " [".$link_index."]";
            }else{
                $data->{stories}[$stories_index]{'paragraph'}[$paragraph_index]{'text'} .= $p->get_trimmed_text;
            }
            push(@{$data->{stories}[$stories_index]{'paragraph'}[$paragraph_index]{'links'}}, { 'index' => $link_index++, 'link' => $token->[1]{'href'} || '-' });
        } else {# First internal links
            $data->{stories}[$stories_index]{'paragraph'}[$paragraph_index]{'text'} .= $p->get_trimmed_text;
        }
    # Quotes
    } elsif ($token->is_tag('q')) {
        # Open
        if ($token->is_start_tag('q')) {
            if ($opts{l} eq "fr") {
                $data->{stories}[$stories_index]{'paragraph'}[$paragraph_index]{'text'} .= "« ".$p->get_trimmed_text;
            } elsif ($opts{l} eq "de") {
                $data->{stories}[$stories_index]{'paragraph'}[$paragraph_index]{'text'} .= " »".$p->get_trimmed_text;
            } elsif ($opts{l} eq "es" or $opts{l} eq "it") {
                $data->{stories}[$stories_index]{'paragraph'}[$paragraph_index]{'text'} .= " «".$p->get_trimmed_text;
            } else {
                $data->{stories}[$stories_index]{'paragraph'}[$paragraph_index]{'text'} .= " \"".$p->get_trimmed_text;
            }
        # Close
        } elsif ($token->is_end_tag('q')) {
            if ($opts{l} eq "fr") {
                $data->{stories}[$stories_index]{'paragraph'}[$paragraph_index]{'text'} .= " »".$p->get_trimmed_text;
            } elsif ($opts{l} eq "de") {
                $data->{stories}[$stories_index]{'paragraph'}[$paragraph_index]{'text'} .= "« ".$p->get_trimmed_text;
            } elsif ($opts{l} eq "es" or $opts{l} eq "it") {
                $data->{stories}[$stories_index]{'paragraph'}[$paragraph_index]{'text'} .= "» ".$p->get_trimmed_text;
            } else {
                $data->{stories}[$stories_index]{'paragraph'}[$paragraph_index]{'text'} .= "\" ".$p->get_trimmed_text;
            }
        }
    # Paragraph
    } elsif ($token->is_end_tag('p')) {
        $data->{stories}[$stories_index]{'paragraph'}[$paragraph_index]{'text'} .= "\n\n";
        delete @links[0..$#links];
        $paragraph_index++;
        $data->{stories}[$stories_index]{'paragraph'}[$paragraph_index]{'text'} .= $p->get_text;
    # List
    } elsif ($token->is_tag('li')) {
        if ($token->is_start_tag('li')) {
            $data->{stories}[$stories_index]{'paragraph'}[$paragraph_index]{'text'} .= "  * ".$p->get_trimmed_text;
        } elsif ($token->is_end_tag('li')) {
            $data->{stories}[$stories_index]{'paragraph'}[$paragraph_index]{'text'} .= "\n" . $p->get_trimmed_text;
        }
    # Horizontal line ie end of the content
    } elsif ($token->is_start_tag('hr')) {
        last;
    } else {
        my $text = $p->get_text;
        $data->{stories}[$stories_index]{'paragraph'}[$paragraph_index]{'text'} .= $text;
        if (!$data->{header}{date}){
            if ($opts{l} eq "en") {
                #March 19th, 2011
                if ($text =~ m/^[A-Z][a-z]+.\d{2}[a-z]{2},.\d{4}$/){
                    $data->{header}{date} = $text;
                }
            } else {
                if ($text =~ m/^\d+.*\d{4}$/){
                    $data->{header}{date} = $text;
                }
            }
        }
    }
    }

# Start of formating / printing

print "------------------------------------------------------------------------\n";
print "$data->{header}{project}"." "x(72-length($data->{header}{project})-22)."http://www.debian.org/\n";;
print "$data->{header}{dn}"." "x(72-length($data->{header}{dn})-20)."press\@lists.debian.org\n";
print "$data->{header}{date}"." "x(72-length($data->{header}{date})-length($data->{header}{url}))."$data->{header}{url}\n";
print "------------------------------------------------------------------------";



foreach my $stories (@{$data->{stories}}) {
	print "\n" . $stories->{'title'} . "\n" . '-'x(length($stories->{'title'})) if (defined($stories->{'title'}));
	foreach my $paragraph (@{$stories->{paragraph}}) {
		$paragraph->{'text'} =~ s/(\S)\n(\S)/$1 $2/g;
		print wrap("","",$paragraph->{'text'});
		if ($links){
            print "\n";
            foreach my $link (@{$paragraph->{'links'}}) {
                $link->{'link'}  =~ s,^\.\./\.\.,http://www.debian.org,;
                $link->{'link'}  =~ s,^\.\.,http://www.debian.org/News,;
                print "   $link->{'index'} : $link->{'link'}\n";
            }
        }
	}
}

Reply to: