[Perl] Franciser un module

Résolu/Fermé
julow Messages postés 2198 Date d'inscription dimanche 26 août 2007 Statut Membre Dernière intervention 7 juillet 2015 - 20 mai 2008 à 16:37
julow Messages postés 2198 Date d'inscription dimanche 26 août 2007 Statut Membre Dernière intervention 7 juillet 2015 - 28 mai 2008 à 10:53
Salut à tous!

J'ai là un module PERL que je voudrais "franciser" dirons nous. Le problème c'est que dès que je touche à une portion de code plus rien ne fonctionne!! Le Perl je ne le connais pas assez pour savoir quel est le problème alors je me tourne vers vous. Le code étant assez long je vous demanderais de m'envoyer un MP si vous voulez m'aider afin que je vous l'envoi ensuite. Je préfère le dire de suite, ce module est assez compliqué à comprendre, j'ai tenté de le déchiffrer grâce à mes connaissances en C et C# mais rien à faire je ne le comprend pas.

Bref, si vous voulez bien m'aider...! Merci!

6 réponses

Castor Messages postés 17858 Date d'inscription mardi 3 juillet 2001 Statut Modérateur Dernière intervention 7 novembre 2023 169
20 mai 2008 à 16:47
De plus, pour que tout le monde puisse profiter de la discussion, il est fortement déconseillé de passer par les MP
1
julow Messages postés 2198 Date d'inscription dimanche 26 août 2007 Statut Membre Dernière intervention 7 juillet 2015 244
20 mai 2008 à 21:16
Ce module Perl est un module pour le programme Swish-e que je fais fonctionner sous Fedora Core 5.
Je pensais que mettre le code en ligne ne serait pas autorisé mais comme ce n'est pas le cas, alors le voici:

DateRanges.mp

[code]
# $Id: DateRanges.pm,v 1.1 2003/02/28 06:06:10 whmoseley Exp $

package SWISH::DateRanges;
use strict;

=head1 NAME

DateRanges

=head1 SYNOPSIS

use DateRanges;
use CGI;
my $cgi = CGI->new();
...

my %hash = (
date_ranges => {

# Define what buttons to include
time_periods => [
'All','Tout',
'Today','Aujourd\'hui',
'Yesterday','Hier',
#'Yesterday onward',
'This Week','Cette semaine',
'Last Week','Semaine derniere',
'Last 90 Days','Derniers 90 jours',
'This Month','Ce mois-ci',
'Last Month','Mois dernier',
#'Past',
#'Future',
#'Next 30 Days',
],

# Default button
default => 'All',

# Should buttons be in a row or a column?
line_break => 0,

# Should a date input form be shown, too?
date_range => 1,
},
);




=head1 DESCRIPTION

This module provides I<basic> support for entering and using date ranges. It
was written to use with swish-e (http://swish-e.org).

See swish.cgi in the swish-e distribution for an example.

Sorry about the interface -- if anyone really wants to use this please let me know and I'll
rewrite as OO interface!

=head1 FUNCTIONS

=cut

require Exporter;

use vars qw/$VERSION @ISA @EXPORT/;


@ISA = qw(Exporter);
$VERSION = '0.01';

@EXPORT = qw (
DateRangeForm
DateRangeParse
GetDateRangeArgs
);

# what to pick from
my @TIME_PERIODS = (
'Today', 'Aujourd\'hui',
'Yesterday','Hier',
'Yesterday onward',
'This Week','Cette semaine',
'Last Week','Semaine derniere',
'Last 90 Days','Derniers 90 jours',
'This Month','Ce mois-ci',
'Last Month','Mois dernier',
'Past','Passé',
'Future','Futur',
'Next 30 Days','30 prochains jours',
'All','Tout',
'Select Date Range','Plage de dates',
);

my %Num_to_label;
my %Label_to_num;
my $i = 1;
for ( @TIME_PERIODS ) {
my $label = $_;
$label =~ s/ / /g;
$Num_to_label{$i} = $label;
$Label_to_num{$_} = $i++;
}



use Date::Calc qw /
Day_of_Week_to_Text
Day_of_Week
Date_to_Text
Monday_of_Week
Week_of_Year
Today
Add_Delta_Days
Days_in_Month
check_date
/;

my $prefix = 'dr';

use Time::Local;


=item DateRangeForm( $cgi, $params, $fields );

This function simple creates a simple form for selecting date ranges based
on the fields passed in C<$params>. Will call C<die()> on errors.

C<$params> must be a hash reference with a key named C<time_periods> as shown in
B<SYNOPSIS> above. This is used to select which time periods to display.

C<$fields> is a reference to a hash where C<DateRanges> returns data.

These store the HTML for display on your form.

buttons - the buttons to select the different time ranges
date_range_button - the button to select a date range
date_range_low - the low range select form fields
date_range_hi - the hight range select form fields

=cut

sub DateRangeForm {
my ( $CGI, $params, $fields ) = @_;

die "Must supply array ref for 'options'"
unless $params->{time_periods} && ref $params->{time_periods} eq 'ARRAY';



my @time_periods;

# Filter out valid selections for radio buttons
for ( @{ $params->{time_periods} } ) {
next if !$Label_to_num{$_} || $_ eq 'Select Date Range';
push @time_periods, $Label_to_num{$_};
}


# Set default as default passed in, or the first one, or 'Select Date Range' if none passed in
my $default = $params->{default} && $Label_to_num{$params->{default}}
? $Label_to_num{$params->{default}}
: @time_periods ? $time_periods[0] : $Label_to_num{'Select Date Range'};



$fields->{buttons} = '';
$fields->{date_range_button} = '';
$fields->{date_range_low} = '';
$fields->{date_range_high} = '';

my $autoescape = $CGI->autoEscape(undef); # labels have HTML

$fields->{buttons} =
$CGI->radio_group(
-name => 'dr_o',
-values => \@time_periods,
-default => $default,
-linebreak => (exists $params->{line_break} ? $params->{line_break} : 1),
-labels => \%Num_to_label,
#-columns=>2,
) if @time_periods;


if ( $params->{date_range} ) {

$fields->{date_range_button} =
$CGI->radio_group(
-name => 'dr_o',
-values => [$Label_to_num{'Select Date Range'}],
-default => $default,
-labels => \%Num_to_label,
-linebreak => (exists $params->{line_break} ? $params->{line_break} : 1),
);



$fields->{date_range_low} = show_date_input($CGI, 's');
$fields->{date_range_high} = show_date_input($CGI, 'e');
}


$CGI->autoEscape($autoescape);

}

=item my $args = GetDateRangeArgs( $cgi );

Returns a string to use in a HREF with all the parameters set.

=cut

sub GetDateRangeArgs {
my $CGI = shift;

my %args;


$args{dr_o} = $CGI->param('dr_o')
if defined $CGI->param('dr_o');


for ( qw/ mon day year / ) {
my $start = "dr_s_$_";
my $end = "dr_e_$_";
$args{$start} = $CGI->param($start) if defined $CGI->param($start);
$args{$end} = $CGI->param($end) if defined $CGI->param($end);
}

return '' unless %args;

return join '&', map { "$_=" . $CGI->escape($args{$_}) } keys %args;

}

=item DateRangeParse( $cgi, $form )

Parses the date range form and returns a low and high range unix timestamp.
Returns false on error with the folowing key set in C<$form>:

dr_error - error string explaining the problem

C<$form> is a hash reference where the following keys may be set:

All - no date ranges were selected
dr_time_low - low range unix timestamp
dr_time_high - high range unix timestamp

=cut




#------------------------ Get the report dates ---------------------
sub DateRangeParse {
my ( $q, $form ) = @_;

$form->{dr_error} = '';


# For making HREFs
$form->{data_range_href} = GetDateRangeArgs( $q );





# If requesting ALL (or not found in form) return true for all

my $num = $q->param('dr_o') || $Label_to_num{All};

# In range?

if ( $num !~ /^\d+$/ || $num < 1 || $num > @TIME_PERIODS ) {
return 1;
}

my $time = time();

my ( @start, @end );

for ( $TIME_PERIODS[$num-1] ) {

(/^All/ || /^Tout/) && do { return 1 }; # don't set any dates

(/^Today/ || /^Aujourd\'hui/) && do { @start = @end = Today(); last; };

/^Yesterday onward/ && do {
@start = Add_Delta_Days( Today(), -1 );
@end = (2030,1,1);
last;
};

(/^Yesterday/ || /^Hier/ ) && do {
@start = @end = Add_Delta_Days( Today(), -1 );
last;
};


(/^This Week/|| /^Cette semaine/) && do {
@start = Monday_of_Week( Week_of_Year( Today() ) );
@end = Add_Delta_Days( @start, 6 );
last;
};

(/^Last Week/ || /^Semaine derniere/) && do {
@start = Monday_of_Week( Week_of_Year( Add_Delta_Days( Today(), -7 ) ) );
@end = Add_Delta_Days( @start, 6 );
last;
};

(/^This Month/ || /^Ce mois-ci/) && do {
@start = @end = Today();
$start[2] = 1;
$end[2] = Days_in_Month($end[0],$end[1]);
last;
};

(/^Last Month/ || /^Mois dernier/) && do {
@start = Today();
$start[2] = 1;
--$start[1];
if ( $start[1] == 0 ) {
$start[1] = 12;
$start[0]--;
}
@end = @start;
$end[2] = Days_in_Month($end[0],$end[1]);
last;
};

(/^Last 90 Days/ || /^Derniers 90 jours/) && do {
@end = Today();
@start = Add_Delta_Days( Today(), -90 );
last
};

(/^Past/ || /^Passe/) && return 1; # use defaults;

(/^Futur/ && do {
$form->{dr_time_low} = time;
delete $form->{dr_time_high};
return 1;
};

(/^Next 30 Days/ || /^30 prochains jours/) && do {
@start = Today();
@end = Add_Delta_Days( Today(), +30 );
last
};



(/^Select/ || /^Plage/) && do {
my ( $day, $mon, $year );

$day = $q->param('dr_s_day') || 0;
$mon = $q->param('dr_s_mon') || 0;
$year = $q->param('dr_s_year') || 0;
@start = ( $year, $mon, $day );

$day = $q->param('dr_e_day') || 0;
$mon = $q->param('dr_e_mon') || 0;
$year = $q->param('dr_e_year') || 0;
@end = ( $year, $mon, $day );
last;
};

$form->{dr_error} = 'Invalid Date Option ' . $q->param('dr_o') . ' Selected';
return;
}



$form->{dr_error} = 'Invalid Start Date' && return if @start && !check_date( @start );
$form->{dr_error} = 'Invalid Ending Date' && return if @end && !check_date( @end );


my $start_time = @start ? timelocal( 0, 0, 0, $start[2], $start[1]-1, $start[0]-1900 ) : 0;
my $end_time = @end ? timelocal( 59, 59, 23, $end[2], $end[1]-1, $end[0]-1900 ) : 0;


$form->{dr_error} = "Starting time should be before now, don't you think?" && return
if $start_time && $start_time > time();

$form->{dr_error} = 'Start date must be same day or before end date' && return
if $start_time && $end_time && $start_time > $end_time;


$form->{dr_time_low} = $start_time;
$form->{dr_time_high} = $end_time;

print STDERR "$TIME_PERIODS[$num-1]: ", scalar localtime($start_time), " -> ", scalar localtime($end_time), "\n"
if 0;

return 1;
}


#----------------------------------------------------------------------------
sub show_date_input {
my ( $CGI, $name ) = @_;

$name = "dr_$name";

my @months = qw/Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec/;
my $x = 1;
my %months = map { $x++, $_ } @months;

my ($mon, $day, $year) = (localtime)[4,3,5];

$year = $year + 1900;
$mon++;

my $cur_year = $year;

#$cur_year += 5;

($year,$mon,$day) = Date::Calc::Add_Delta_Days($year,$mon,$day, -28 ) if $name eq 'start';


my $str = join "\n",
$CGI->popup_menu(
-name => "${name}_mon",
-values => [1..12],
-default => $mon,
-labels => \%months
),
' ',
$CGI->popup_menu(
-name => "${name}_day",
-default => $day,
-values => [1..31],
),

' ',
$CGI->popup_menu(
-name => "${name}_year",
-default => $year,
-values => [reverse ($cur_year-8..$cur_year) ],
);


return $str;
}

#----------------------- ymd_to_unix --------------------------
# Silly Date::Calc
sub ymd_to_unix {
my ($y, $m, $d ) = @_;
$m--;
$y -= 1900;
return timelocal( 0, 0, 0, $d, $m, $y );
}

1;

=back

=head1 COPYRIGHT

Copyright 2001 Bill Moseley

This library is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.

=cut
/code

Voici ce que je souhaite :
Modifier le libéllé "Select Date Range" pour qu'il devienne "Plage dates", le truc c'est que lorsque j'ai éssayé j'ai eu des erreurs que je ne parviens pas à résoudre... A l'origine, dans un autre programme (swish.cgi), lorsque l'on coche le bouton radion "Select Date Range" alors on choisi deux intervalles de dates pour effectuer une recherche. Mais je souhaite que ce bouton radion ai pour libéllé "Plages dates" plutot que "Select Date Range" or le libéllé de ce bouton radio ne se trouve pas dans ce programme mais dans ce module ci. (Suis je assez claire... :-/)

Merci de votre aide!!
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
20 mai 2008 à 21:40
Salut,

normalement tu dois modifier tous les occurrences de
"Select Date Range" avec "Plage dates" et ça doit marcher
0
Utilisateur anonyme
20 mai 2008 à 16:41
Perl est un langage où on peut facilement programmer comme un porc et rendre son code illisible, parfois c'est même volontaire (pour empêcher aux autres de comprendre). Où tu as eu ce code? Il y a pas un moyen de contacter son auteur pour qu'il te dise comment il a programmé ça. Autant te dire qu'il est très très compliqué de comprendre un code Perl parfois, sans commentaires ni rien, c'est du temps perdu.
0
Utilisateur anonyme
20 mai 2008 à 21:43
je ne vois pas pourquoi on aurait des erreurs si on modifie juste la chaîne de caractères, en plus il n'y a aucun caractère spécial.
0
julow Messages postés 2198 Date d'inscription dimanche 26 août 2007 Statut Membre Dernière intervention 7 juillet 2015 244
21 mai 2008 à 08:02
Si je modifie tout avec "Plage date" alors je rentre dans une erreur

"Invalid Date Option 16 selected"

Je ne comprend pas pourquoi.... N'étant pas un pro du Perl je ne parviens pas à comprendre pourquoi j'ai cette erreur...
Je pense que "Select Date Range doit etre utilisé comme paramètre dans un autre module lié à l'execution du programme principal et qu'il faut donc ne pas toucher à ce paramètre, le hic c'est que si j'ai bien compris, le nom du libéllé du bouton donne le nom du paramètre donc en changeant le libellé du bouton je crée un paramètre "Plage date" qu'un autre module ne reconnait peut etre pas... En fait je suis perdu lol!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
21 mai 2008 à 09:18
Salut,

dis mois swish-e tu l'as compilé depuis les sources?!
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
21 mai 2008 à 09:59
essaie comme ça
wget http://swish-e.org/distribution/swish-e-2.4.5.tar.gz
tar xzvf swish-e-2.4.5.tar.gz
cd swish-e-2.4.5/
sed -i.orig 's/Select Date Range/Plage Dates/g' example/modules/SWISH/DateRanges.pm
./configure
make
make install
0
julow Messages postés 2198 Date d'inscription dimanche 26 août 2007 Statut Membre Dernière intervention 7 juillet 2015 244
28 mai 2008 à 10:53
Ca ne fonctionne pas avec tout (il doit y avoir plein de référence à des modules externes ce qui fausse le tout) mais dans la majeur partie mon interface PERL ressemble enfin à une interface pour nous autres français!!

Merci!
0