From 12090eb4e9b0be0db7ae60b38399386548a110be Mon Sep 17 00:00:00 2001 From: dakkar Date: Sun, 23 Oct 2011 13:03:34 +0100 Subject: script per creare fogli di incantesimi --- excel_to_incantesimi.pl | 134 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 excel_to_incantesimi.pl diff --git a/excel_to_incantesimi.pl b/excel_to_incantesimi.pl new file mode 100644 index 0000000..e2d1899 --- /dev/null +++ b/excel_to_incantesimi.pl @@ -0,0 +1,134 @@ +#!/usr/bin/perl +use strict; +use warnings; +use Spreadsheet::ParseExcel; +use LaTeX::Encode; +use Template; +use Data::Printer; + +# excel => latex +my %fieldmap = ( + spellname => 'name', + level => 'level', + school => 'scuola', + comp => 'components', + ct => 'tempo', + range => 'range', + target => 'target', + duration => 'durata', + st => 'st', + sr => 'sr', + spell => 'descrizione', + special => 'specialcomp', + page => 'ref', + notes => 'note', +); + +my ($input_filename,$output_filename)=@ARGV; + +die "$0 \$input \$output\n" + unless $input_filename && $output_filename; + +my $parser = Spreadsheet::ParseExcel->new(); +my $wb = $parser->parse($input_filename) + or die $parser->error; + +my $spells = parse_table($wb->worksheet('Incantesimi') + // $wb->worksheet(0)); + +munge($spells); +p $spells; +my $template = Template->new(); +$template->process( + \*DATA, + { + spells => $spells, + fieldmap => \%fieldmap, + lt => \&latexise, + }, + $output_filename, +) + or die $template->error; + +sub parse_table { + my ($ws) = @_; + + my ($min_col,$max_col) = $ws->col_range(); + my ($min_row,$max_row) = $ws->row_range(); + my @headings = map { eval { $ws->get_cell($min_row,$_)->value } } + $min_col .. $max_col; + + for my $h (@headings) { + $h =~ s{\W.*$}{}; + $h = lc($h); + } + + my @ret = (); + + for my $row ((1+$min_row) .. $max_row) { + # allow and skip empty rows + next unless eval { $ws->get_cell($row,$min_col)->value }; + my %record; + + keys @headings; + while (my ($idx,$heading) = each @headings) { + # allow and skip empty cols + next unless $heading; + $record{$heading} = + eval { $ws->get_cell($row,$idx+$min_col)->value } // ''; + } + push @ret,\%record; + } + return \@ret; +} + +sub munge { + my ($spells) = @_; + + for my $spell (@$spells) { + if ($spell->{page} =~ m{^\d+$}) { + $spell->{page} = 'PHB'.$spell->{page}; + } + } + return; +} + +sub latexise { + my ($str) = @_; + + $str = latex_encode($str); + $str =~ s{(?