#!/usr/bin/perl -w
# bbtrackerwpt - converts named trackpoints from bbtracker GPX
#                into waypoints
# If I knew more XSLT, I'd do it that way
# usage: bbtrackerwpt file.gpx > out.gpx
# scruss.com - 2008/06/28
use strict;
use XML::Simple;
my $ref = XMLin( $ARGV[0] );

# extract all trkpt elements that have 'name' set
my @waypoints = grep { $_->{name} } @{ $ref->{trk}->{trkseg}->{trkpt} };

# nasty hand-rolled GPX XML output
print '<?xml version="1.0" encoding="UTF-8"?>', "\n",
'<gpx xmlns="http://www.topografix.com/GPX/1/1" version="1.1" creator="bbtrackerwpt 20080628" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.topografix.com/GPX/gpx_overlay/0/3 http://www.topografix.com/GPX/gpx_overlay/0/3/gpx_overlay.xsd">',
  "\n";

foreach my $waypoint (@waypoints) {
    my $xml_name = $waypoint->{name};    # crudely escape non-XML chars
    $xml_name =~ s/\&/\&amp;/g;
    $xml_name =~ s/</\&lt;/g;
    print '<wpt lat="', $waypoint->{lat}, '" lon="', $waypoint->{lon}, '">',
      "\n", ' <ele>', $waypoint->{ele}, '</ele>', "\n", ' <time>',
      $waypoint->{time}, '</time>', "\n", ' <name>', $xml_name, '</name>', "\n",
      ' </wpt>', "\n";
}
print '</gpx>', "\n";
exit;
