]> gitweb.factorcode.org Git - factor.git/commitdiff
metar: fix "1 1/2SM" visibility.
authorJohn Benediktsson <mrjbq7@gmail.com>
Tue, 26 Oct 2021 17:01:14 +0000 (10:01 -0700)
committerJohn Benediktsson <mrjbq7@gmail.com>
Tue, 26 Oct 2021 17:01:14 +0000 (10:01 -0700)
extra/metar/metar-tests.factor
extra/metar/metar.factor

index c32435dbc3796bd7591241be4db6a566bdeee080..9f4d26d973b7513422fc08e5d5325ae08dcd9ce5 100644 (file)
@@ -2,3 +2,5 @@ USING: metar.private tools.test ;
 
 { { "RAB05" "E30" "SNB20" "E55" } }
 [ "RAB05E30SNB20E55" split-recent-weather ] unit-test
+
+{ "1+1/2 statute miles" } [ "1 1/2SM" parse-visibility ] unit-test
index f5292ad545accffbd132ba3cbcc53ac403cab4c3..3162f0069b1e6f6bfc28b2d704bc99e07112a281 100644 (file)
@@ -199,14 +199,13 @@ CONSTANT: compass-directions H{
     "V" split1 [ parse-compass ] bi@
     ", variable from %s to %s" sprintf ;
 
-! FIXME: "1 1/2SM" visibility doesn't work
 : parse-visibility ( str -- str' )
     dup first {
         { CHAR: M [ rest "less than " ] }
         { CHAR: P [ rest "more than " ] }
         [ drop "" ]
     } case swap "SM" ?tail drop
-    CHAR: / over index [ 1 > [ 1 cut "+" glue ] when ] when*
+    CHAR: \s over index [ " " "+" replace ] when
     string>number "%s%s statute miles" sprintf ;
 
 : parse-rvr ( str -- str' )
@@ -287,7 +286,7 @@ CONSTANT: re-station R/ \w{4}/
 CONSTANT: re-temperature R/ [M]?\d{2}\/([M]?\d{2})?/
 CONSTANT: re-wind R/ (VRB|\d{3})\d{2,3}(G\d{2,3})?KT/
 CONSTANT: re-wind-variable R/ \d{3}V\d{3}/
-CONSTANT: re-visibility R/ [MP]?\d+(\/\d+)?SM/
+CONSTANT: re-visibility R/ (\d+ )?[MP]?\d+(\/\d+)?SM/
 CONSTANT: re-rvr R/ R\d{2}[RLC]?\/\d{4}(V\d{4})?FT/
 CONSTANT: re-weather R/ [+-]?(VC)?(\w{2}|\w{4})/
 CONSTANT: re-sky-condition R/ (\w{2,3}\d{3}(\w+)?|\w{3}|CAVOK)/
@@ -301,8 +300,15 @@ CONSTANT: re-altimeter R/ [AQ]\d{4}/
         dup [ f ] [ first @ ] if-empty
     ] [ unclip ] produce rot [ prefix ] when* ; inline
 
-: metar-body ( report seq -- report )
+: fix-visibility ( seq -- seq' )
+    dup [ re-visibility matches? ] find drop [
+        dup 1 - pick ?nth [ R/ \d+/ matches? ] [ f ] if* [
+            cut [ unclip-last ] [ unclip swap ] bi*
+            [ " " glue 1array ] [ 3append ] bi*
+        ] [ drop ] if
+    ] when* ;
 
+: metar-body ( report seq -- report )
     [ { "METAR" "SPECI" } member? ] find-one
     [ pick type<< ] when*
 
@@ -321,6 +327,7 @@ CONSTANT: re-altimeter R/ [AQ]\d{4}/
     [ re-wind-variable matches? ] find-one
     [ parse-wind-variable pick wind>> prepend pick wind<< ] when*
 
+    fix-visibility
     [ re-visibility matches? ] find-one
     [ parse-visibility pick visibility<< ] when*