gilou Modérateur Modzilla | C'était trop beau, Chess::Pgn est trop simpliste et ne supporte pas les champs FEN ou commentaires, etc.
Chess::PGN::Parse devrait lui marcher.
Je regarde ça et je poste une soluce.
Bon déjà, une utilisation 'vanilla' du module, non customisée pour ta sortie:
Code :
#!/usr/bin/perl use Modern::Perl; # version moderne de use strict et use warnings, mais il faut installer le module use experimental 'smartmatch'; # évite le warning lors de l'emploi de ~~ (utilisé pour vérifier si un mot est dans une liste) use Chess::PGN::Parse; my @mandatory = ('Event', 'Site', 'Date', 'Round', 'White', 'Black', 'Result'); my @optional = ('WhiteTitle', 'BlackTitle', 'WhiteElo', 'BlackElo', 'WhiteUSCF', 'BlackUSCF', 'WhiteNA', 'BlackNA', 'WhiteType', 'BlackType', 'EventDate', 'EventSponsor', 'Section', 'Stage', 'Board', 'Opening', 'Variation', 'SubVariation', 'ECO', 'NIC', 'Time', 'UTCTime', 'UTCDate', 'Timecontrol', 'SetUp', 'FEN', 'Termination', 'Annotator', 'Mode', 'PlyCount'); # Va imprimer en sortie ce qui a été lu en entrée, modulo le parsing de Chess::PGN::Parse sub process_file($) { my $pgn = Chess:: PGN:: Parse->new ($pgnfile) or die "Erreur fatale a la lecture de $pgnfile!"; while ($pgn->read_game()) { # impression des champs obligatoires (hormis Game), ordre fixé, celui de @mandatory foreach (@mandatory) { my $text = $pgn->{'gamedescr'}->{$_}; print "[$_ \"$text\"]\n"; } # impression des champs non-obligatoires connus, ordre de @optional # changer l'ordre dans optional selon ses besoins en sortie foreach (@optional) { if ($pgn->{'gamedescr'}->{$_}) { my $text = $pgn->{'gamedescr'}->{$_}; print "[$_ \"$text\"]\n"; } } # impression des champs non-obligatoires restant, ordre aléatoire des clés foreach (keys % {$pgn-> {'gamedescr'}}) { unless ($_ ~~ @mandatory or $_ ~~ @optional or $_ eq 'Game') { my $text = $pgn->{'gamedescr'}->{$_}; print "[$_ \"$text\"]\n"; } } # impression du champ Game print "\n$pgn->{'gamedescr'}->{'Game'}\n\n"; } } process_file('partie.pgn');
|
Et la customisation se fait en 5 mn:
Code :
#!/usr/bin/perl use Modern::Perl; # version moderne de use strict et use warnings, mais il faut installer le module use experimental 'smartmatch'; # évite le warning lors de l'emploi de ~~ (utilisé pour vérifier si un mot est dans une liste) use Chess::PGN::Parse; my @mandatory = ('Event', 'Site', 'Date', 'Round', 'White', 'Black', 'Result'); my @optional = ('WhiteTitle', 'BlackTitle', 'WhiteElo', 'BlackElo', 'WhiteUSCF', 'BlackUSCF', 'WhiteNA', 'BlackNA', 'WhiteType', 'BlackType', 'EventDate', 'EventSponsor', 'Section', 'Stage', 'Board', 'Opening', 'Variation', 'SubVariation', 'ECO', 'NIC', 'Time', 'UTCTime', 'UTCDate', 'Timecontrol', 'SetUp', 'FEN', 'Termination', 'Annotator', 'Mode', 'PlyCount'); sub process_file($) { my $pgn = Chess:: PGN:: Parse->new ($pgnfile) or die "Erreur fatale a la lecture de $pgnfile!"; while ($pgn->read_game()) { # impression des champs obligatoires (hormis Game), ordre fixé, celui de @mandatory foreach (@mandatory) { my $text = $pgn->{'gamedescr'}->{$_}; if (/Round/ and $text =~ /^(\?)*$/) { $text = 'position ' . $get_pos->(); } print "[$_ \"$text\"]\n"; } # impression des champs non-obligatoires connus, ordre de @optional # changer l'ordre dans optional selon ses besoins en sortie foreach (@optional) { if ($pgn->{'gamedescr'}->{$_}) { my $text = $pgn->{'gamedescr'}->{$_}; print "[$_ \"$text\"]\n"; } } # impression des champs non-obligatoires restant, ordre aléatoire des clés foreach (keys % {$pgn-> {'gamedescr'}}) { unless ($_ ~~ @mandatory or $_ ~~ @optional or $_ eq 'Game') { my $text = $pgn->{'gamedescr'}->{$_}; print "[$_ \"$text\"]\n"; } } # impression du champ Game } } process_file('partie.pgn');
|
A+, Message édité par gilou le 03-09-2015 à 15:40:36 ---------------
There's more than what can be linked! -- Iyashikei Anime Forever! -- AngularJS c'est un framework d'engulé! --
|