You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
191 lines
5.6 KiB
191 lines
5.6 KiB
|
|
# This file is part of KWeather.
|
|
# Copyright (c) 2021 Emanoil Kotsev <deloptes@gmail.com>
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
# As a special exception, permission is given to link this program
|
|
# with any edition of TQt, and distribute the resulting executable,
|
|
# without including the source code for TQt in the source distribution.
|
|
|
|
|
|
use strict;
|
|
use warnings;
|
|
use utf8;
|
|
#use Data::Dumper qw(Dumper);
|
|
|
|
######## pick arguments
|
|
|
|
my $stationsNSD = $ARGV[0]; # data/nsd_cccc.txt
|
|
my $stationNames = $ARGV[1]; # data/station_names.txt
|
|
my $desktopIn = $ARGV[2]; # weather_stations.desktop.in
|
|
|
|
######## generate stations.dat
|
|
|
|
#input format ICAO;status;location;name;INFO1;INFO2
|
|
|
|
my %stnames;
|
|
open(FDSN, "<", $stationNames) || die "can not open file $!";
|
|
while (<FDSN>) {
|
|
my $line = $_; chomp $line;
|
|
my ($key,$status,$loc,$name,$v1,$v2) = split(/;/,$line);
|
|
$status = '' if $status =~ /none|false|na|decomissioned/;
|
|
$stnames{$key} = { 'status' => $status,
|
|
'loc' => $loc,
|
|
'name' => $name,
|
|
'v1' => $v1,
|
|
'v2' => $v2
|
|
};
|
|
}
|
|
close(FDSN);
|
|
|
|
open(FDNSD, "<", $stationsNSD) || die "can not open file $!";
|
|
open(FDOUT, ">", "stations.dat") || die "can not open file $!";
|
|
while (<FDNSD>) {
|
|
my $line = $_; chomp $line;
|
|
my @entries = split(/;/,$line,6);
|
|
if ( exists $stnames{$entries[0]} ) {
|
|
next if ! exists $stnames{$entries[0]}{'status'};
|
|
$entries[3] = $stnames{$entries[0]}{'name'};
|
|
}
|
|
print FDOUT join(';', @entries) , "\n";
|
|
# print join(';', @entries) , "\n" ;
|
|
}
|
|
close(FDOUT);
|
|
close(FDNSD);
|
|
|
|
#print Dumper \%stnames and exit;
|
|
|
|
######## generate weather_stations.desktop
|
|
|
|
my $section;
|
|
my %data;
|
|
|
|
## parse weather_stations.desktop.in
|
|
|
|
open(FDWSTIN, "<", $desktopIn) || die "can not open file $!";
|
|
while (my $line = <FDWSTIN>) {
|
|
if ($line =~ /^\s*#/) {
|
|
next; # skip comments
|
|
}
|
|
if ($line =~ /^\s*$/) {
|
|
next; # skip empty lines
|
|
}
|
|
if ($line =~ /^\[(.*)\]\s*$/) {
|
|
$section = $1;
|
|
next;
|
|
}
|
|
|
|
if ($line =~ /^([^=]+?)\s*=\s*(.*?)\s*$/) {
|
|
my ($field, $value) = ($1, $2);
|
|
if (not defined $section) {
|
|
warn "Line outside of seciton '$line'\n";
|
|
next;
|
|
}
|
|
$data{$section}{$field} = $value;
|
|
}
|
|
}
|
|
close(FDWSTIN);
|
|
|
|
#print Dumper \%data and exit;
|
|
|
|
open(FDST, "<", "stations.dat") || die "can not open file $!";
|
|
while(<FDST>) {
|
|
my $line = $_; chomp $line;
|
|
my @entries = split(/;/,$line);
|
|
#print Dumper \@entries and exit;
|
|
my $k;
|
|
my $found = 0;
|
|
|
|
if ( ! exists $stnames{$entries[0]}{'loc'} ) {
|
|
my @regions = split (/\s/, $data{'Main'}{'regions'});
|
|
foreach my $r (@regions) {
|
|
if (!$entries[4]) {
|
|
my @states = split (/\s/, $data{$r}{'states'});
|
|
foreach my $s (@states) {
|
|
$k = "$r" . "_" . "$s";
|
|
if ( exists $data{$k}{'name'}
|
|
and $data{$k}{'name'} eq $entries[5]) { # state/country matches
|
|
$found = 1;
|
|
last;
|
|
}
|
|
}
|
|
} else {
|
|
$k = "$r" . "_" . $entries[4];
|
|
$found = 1;
|
|
}
|
|
last if $found;
|
|
}
|
|
} else {
|
|
$k = $stnames{$entries[0]}{'loc'};
|
|
$found = 1;
|
|
}
|
|
|
|
if ( ! $found ) {
|
|
warn "not found in weather_stations.desktop.in: $entries[0]\t$entries[5]\t$entries[3]\n";
|
|
next ;
|
|
}
|
|
|
|
my $name = $entries[3] ;
|
|
$name =~ s/\s+$//; # remove last space from the name
|
|
$name =~ s/\s/\\\\\ /g; # replace space with \\space
|
|
|
|
my ($v1,$v2) ;
|
|
$v1 = $stnames{$entries[0]}{'v1'} if exists $stnames{$entries[0]}{'v1'};
|
|
$v2 = $stnames{$entries[0]}{'v2'} if exists $stnames{$entries[0]}{'v2'};
|
|
$v1 = "-------" if !$v1;
|
|
$v2 = "---" if !$v2;
|
|
|
|
$data{$k}{'loc'}[++$#{$data{$k}{'loc'}}] = $name ." ".$entries[0] ." $v1 $v2";
|
|
}
|
|
close(FDST);
|
|
|
|
#print Dumper \%data;
|
|
|
|
## write output to weather_stations.desktop
|
|
|
|
open(FDWSTOUT, ">", "weather_stations.desktop") || die "can not open file $!";
|
|
|
|
print FDWSTOUT "[Main]" . "\n";
|
|
print FDWSTOUT "regions=" . $data{'Main'}{'regions'} . "\n";
|
|
print FDWSTOUT "\n";
|
|
|
|
my @regions = split (/\s+/, $data{'Main'}{'regions'});
|
|
|
|
foreach my $r (@regions) {
|
|
print FDWSTOUT "[$r]" . "\n";
|
|
print FDWSTOUT "name=" . $data{$r}{'name'} . "\n";
|
|
foreach my $f (keys %{$data{$r}}) {
|
|
next if $f eq 'states';
|
|
next if $f eq 'name';
|
|
print FDWSTOUT $f . "=" . $data{$r}{$f} . "\n";
|
|
}
|
|
print FDWSTOUT "states=" . $data{$r}{'states'} . "\n";
|
|
print FDWSTOUT "\n";
|
|
|
|
my @states = split (/\s+/, $data{$r}{'states'});
|
|
|
|
foreach my $s (@states) {
|
|
my $k = "$r" . "_" . "$s";
|
|
print FDWSTOUT "[" . $k . "]\n";
|
|
print FDWSTOUT "name=" . $data{$k}{'name'} . "\n";
|
|
|
|
for ( my $i=0; $i <= $#{$data{$k}{'loc'}}; $i++ ) {
|
|
print FDWSTOUT "loc" . $i . "=" . $data{$k}{'loc'}[$i] . "\n";
|
|
}
|
|
print FDWSTOUT "\n";
|
|
}
|
|
}
|
|
close(FDWSTOUT);
|