use v5.30; use HexGrid; use HexGrid::Pin; use MWTemplate; use Getopt::Long; use File::Find; use File::Basename; use Carp; use Data::Dumper; $Data::Dumper::Indent = 1; use feature "signatures"; no warnings "experimental::signatures"; my $template_name = "MapRegion"; my $border_width = 1; my $border_colour = 'black'; my $show_coords = 0; my @region_files; my @pin_files; my @include_dirs; GetOptions( 'border-width=f' => \$border_width, 'border-colour|border-color=s' => \$border_colour, 'show-coords|coords!' => \$show_coords, 'region-file=s' => \@region_files, 'pin-file=s' => \@pin_files, 'directory|include-directory=s' => \@include_dirs ); my $grid = HexGrid->new(defaults => { style => { 'stroke-width' => $border_width, stroke => $border_colour }, show_coords => $show_coords }); @region_files = split(/,/, join(',', @region_files)); @pin_files = split(/,/, join(',', @pin_files)); @include_dirs = split(/,/, join(',', @include_dirs)); find(sub { push @region_files, $File::Find::name if /\.region$/; push @pin_files, $File::Find::name if /\.pin$/; }, @include_dirs); foreach my $file (@region_files) { my $name = fileparse($file, qr/\.region/); open my $fh, $file || croak "Couldn't open region file $file: $!"; my @region_lines = <$fh>; close $fh; my $tiles_file = $file; $tiles_file =~ s/region$/tiles/; open my $tfh, $tiles_file || croak "Couldn't open tiles file $tiles_file: $!"; my @tiles = <$tfh>; close $tfh; process_region($grid, $name, (join "", @region_lines), (join "", @tiles)); } foreach my $file (@pin_files) { my $name = fileparse($file, qr/\.pin/); open my $fh, $file || croak "Couldn't open pin file $file: $!"; my @lines = <$fh>; close $fh; process_pin($grid, $name, @lines); } say wrap_in_html($grid); sub process_region($grid, $name, $region_spec, $tiles) { my $region = $grid->make_region($name); my $parsed_template = MWTemplate::Parse($region_spec, $template_name); $region->{defaults}{colour} = $parsed_template->{named_params}{colour}; $region->{defaults}{image} = $parsed_template->{named_params}{background}; say STDERR Dumper($tiles); foreach my $coords (split /;/, $tiles) { # The below regex is a whitespace forgiving version of /^(-?\d+),(-?\d+)/, an int pair do { carp "Skipping bad spec: $coords"; next; } unless $coords =~ /^\s*(-?\s*\d+)\s*,\s*(-?\s*\d+)\s*$/; $region->make_tile_at($1,$2); } } sub process_pin($file) { } sub wrap_in_html($grid) { my $html_builder = ""; $html_builder .= "\n\n"; $html_builder .= "\n" . < function clickPin(pinId, containerId) { let popup = document.getElementById(pinId + '-popup'); popup.style.visibility = popup.style.visibility == 'visible' ? 'hidden' : 'visible'; } EOS $html_builder .= "\n" . $grid->render; $html_builder .= "\n\n"; return $html_builder; }