From 3617d469d94c238c1eac4e9594b7f3ed63e92d10 Mon Sep 17 00:00:00 2001 From: "hieda_kyuko@hpr" <ugo58956@protonmail.com> Date: Wed, 7 May 2025 14:46:42 +0200 Subject: [PATCH] Move stations to the master frame --- src/oud2_parser.pl | 68 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 3 deletions(-) diff --git a/src/oud2_parser.pl b/src/oud2_parser.pl index b3b6e6f..ac8c7fd 100644 --- a/src/oud2_parser.pl +++ b/src/oud2_parser.pl @@ -26,7 +26,9 @@ use Data::Printer; use File::BOM; use File::Basename; use Getopt::Long; +use List::Util qw(any); +use App::Log; use App::Ts; use App::Ressya; use App::Frame; @@ -211,6 +213,8 @@ opendir my $dir, $trains_path or die "Error opening $trains_path"; my @trains = readdir $dir; closedir $dir; +# Parsing step. +# Build "temporary" frames for each diagram. foreach my $file (@trains) { next if ($file =~ /^\.+$/); @@ -240,13 +244,71 @@ foreach my $file (@trains) print "\n"; my %frame = %{ ${$recce->value()} }; + $frame{'id'} = $basename; Frame::frame_info \%frame; - # p %frame; $master{$basename} = \%frame; - # FrameUtils::hassya_hyou \%frame, 11; - close $dia_file; } + +# Processing step 1. +# Bring stations back to the master frame and use unique IDs in children frames. +# Assume stations with the same name are identical. +# TODO cases where different stations have the same names +# TODO cases where the same station has two distinct names +# > maybe use a null footpath? +# TODO overall, find more generic criteria for matching two similar stations +my @master_ekis; +foreach my $frame (values %master) +{ + my @old_ekis = @{ $frame->{'eki'} }; + my @new_ekis; + my $index = 0; + my $update_index = 1; + for (my $i = 0; $i < $#old_ekis; $i++) + { + $update_index = 1; + + my %new_struct; + my $ekimei = $old_ekis[$i]; + my @prev = @old_ekis[0..$i-1]; + my $restart = 0; + + # Run all similarity checks first + # Station occurs twice on the same route (branch line) + foreach my $old (@new_ekis) + { + if ($old->{'ekimei'} eq $ekimei) + { + Log::i "$ekimei has already appeared on this route before, assuming branch line"; + push @new_ekis, $old; + $restart = 1; + last; + } + } + + if ($restart) { next; } + + # TODO Station has already been processed in another route + foreach my $old (@master_ekis) + { + + } + + my $id = $frame->{'id'} . "_$index"; + print "Adding station $ekimei to master frame with id $id\n"; + + $new_struct{'ekimei'} = $ekimei; + $new_struct{'found_in'} = $frame->{'id'}; + + push @new_ekis, \%new_struct; + + if ($update_index) { $index++; } + } + + push @master_ekis, @new_ekis; +} + +p @master_ekis; -- GitLab