mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 09:40:04 +00:00 
			
		
		
		
	Support for overview block in text product, and relax formatting guidelines
This commit is contained in:
		
							parent
							
								
									835ee644b5
								
							
						
					
					
						commit
						80579dbff2
					
				
					 4 changed files with 44 additions and 5 deletions
				
			
		|  | @ -1 +1 @@ | ||||||
| Subproject commit b8c76bd23f636f9dad08efafa348dcbfe878f0b1 | Subproject commit a1b78dcb40b85271270afd7dc9d88fe8594471b2 | ||||||
|  | @ -33,7 +33,9 @@ INSTANTIATE_TEST_SUITE_P( | ||||||
|    testing::Values("/warnings/warnings_20210604_21.txt", |    testing::Values("/warnings/warnings_20210604_21.txt", | ||||||
|                    "/warnings/warnings_20210606_15.txt", |                    "/warnings/warnings_20210606_15.txt", | ||||||
|                    "/warnings/warnings_20210606_22-59.txt", |                    "/warnings/warnings_20210606_22-59.txt", | ||||||
|                    "/nexrad/level3/KLSX_NOUS63_FTMLSX_202201041404")); |                    "/nexrad/level3/KLSX_NOUS63_FTMLSX_202201041404", | ||||||
|  |                    "/text/PGUM_WHPQ41_CFWPQ1_202201231710.nids", | ||||||
|  |                    "/text/PGUM_WHPQ42_CFWPQ2_202201231924.nids")); | ||||||
| 
 | 
 | ||||||
| TEST(TextProductFile, Update) | TEST(TextProductFile, Update) | ||||||
| { | { | ||||||
|  |  | ||||||
|  | @ -75,6 +75,7 @@ static std::vector<std::string>     ParseProductContent(std::istream& is); | ||||||
| void                                SkipBlankLines(std::istream& is); | void                                SkipBlankLines(std::istream& is); | ||||||
| bool                                TryParseEndOfProduct(std::istream& is); | bool                                TryParseEndOfProduct(std::istream& is); | ||||||
| static std::vector<std::string>     TryParseMndHeader(std::istream& is); | static std::vector<std::string>     TryParseMndHeader(std::istream& is); | ||||||
|  | static std::vector<std::string>     TryParseOverviewBlock(std::istream& is); | ||||||
| static std::optional<SegmentHeader> TryParseSegmentHeader(std::istream& is); | static std::optional<SegmentHeader> TryParseSegmentHeader(std::istream& is); | ||||||
| static std::optional<Vtec>          TryParseVtecString(std::istream& is); | static std::optional<Vtec>          TryParseVtecString(std::istream& is); | ||||||
| 
 | 
 | ||||||
|  | @ -86,6 +87,7 @@ public: | ||||||
| 
 | 
 | ||||||
|    std::shared_ptr<WmoHeader>            wmoHeader_; |    std::shared_ptr<WmoHeader>            wmoHeader_; | ||||||
|    std::vector<std::string>              mndHeader_; |    std::vector<std::string>              mndHeader_; | ||||||
|  |    std::vector<std::string>              overviewBlock_; | ||||||
|    std::vector<std::shared_ptr<Segment>> segments_; |    std::vector<std::shared_ptr<Segment>> segments_; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | @ -136,6 +138,13 @@ bool TextProductMessage::Parse(std::istream& is) | ||||||
| 
 | 
 | ||||||
|          p->mndHeader_ = TryParseMndHeader(is); |          p->mndHeader_ = TryParseMndHeader(is); | ||||||
|          SkipBlankLines(is); |          SkipBlankLines(is); | ||||||
|  | 
 | ||||||
|  |          // Optional overview block appears between MND and segment header
 | ||||||
|  |          if (!segment->header_.has_value()) | ||||||
|  |          { | ||||||
|  |             p->overviewBlock_ = TryParseOverviewBlock(is); | ||||||
|  |             SkipBlankLines(is); | ||||||
|  |          } | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       if (!segment->header_.has_value()) |       if (!segment->header_.has_value()) | ||||||
|  | @ -165,7 +174,10 @@ std::vector<std::string> ParseProductContent(std::istream& is) | ||||||
|    { |    { | ||||||
|       util::getline(is, line); |       util::getline(is, line); | ||||||
| 
 | 
 | ||||||
|       productContent.push_back(line); |       if (!productContent.empty() || !line.starts_with("$$")) | ||||||
|  |       { | ||||||
|  |          productContent.push_back(line); | ||||||
|  |       } | ||||||
| 
 | 
 | ||||||
|       if (line.starts_with("$$")) |       if (line.starts_with("$$")) | ||||||
|       { |       { | ||||||
|  | @ -263,6 +275,27 @@ std::vector<std::string> TryParseMndHeader(std::istream& is) | ||||||
|    return mndHeader; |    return mndHeader; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | std::vector<std::string> TryParseOverviewBlock(std::istream& is) | ||||||
|  | { | ||||||
|  |    // Optional overview block contains text in the following format:
 | ||||||
|  |    // ...OVERVIEW HEADLINE... /OPTIONAL/
 | ||||||
|  |    // .OVERVIEW WITH GENERAL INFORMATION / OPTIONAL /
 | ||||||
|  |    // Key off the block beginning with .
 | ||||||
|  |    std::vector<std::string> overviewBlock; | ||||||
|  |    std::string              line; | ||||||
|  | 
 | ||||||
|  |    if (is.peek() == '.') | ||||||
|  |    { | ||||||
|  |       while (!is.eof() && is.peek() != '\r') | ||||||
|  |       { | ||||||
|  |          util::getline(is, line); | ||||||
|  |          overviewBlock.push_back(line); | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  | 
 | ||||||
|  |    return overviewBlock; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| std::optional<SegmentHeader> TryParseSegmentHeader(std::istream& is) | std::optional<SegmentHeader> TryParseSegmentHeader(std::istream& is) | ||||||
| { | { | ||||||
|    // UGC takes the form SSFNNN-NNN>NNN-SSFNNN-DDHHMM- (NWSI 10-1702)
 |    // UGC takes the form SSFNNN-NNN>NNN-SSFNNN-DDHHMM- (NWSI 10-1702)
 | ||||||
|  |  | ||||||
|  | @ -148,7 +148,7 @@ bool WmoHeader::Parse(std::istream& is) | ||||||
|          << logPrefix_ << "Start of Heading Line is malformed"; |          << logPrefix_ << "Start of Heading Line is malformed"; | ||||||
|       headerValid = false; |       headerValid = false; | ||||||
|    } |    } | ||||||
|    else if (!sequenceLine.empty() && !sequenceLine.ends_with(" \r\r")) |    else if (!sequenceLine.empty() && !sequenceLine.ends_with("\r\r")) | ||||||
|    { |    { | ||||||
|       BOOST_LOG_TRIVIAL(debug) << logPrefix_ << "Sequence Line is malformed"; |       BOOST_LOG_TRIVIAL(debug) << logPrefix_ << "Sequence Line is malformed"; | ||||||
|       headerValid = false; |       headerValid = false; | ||||||
|  | @ -170,7 +170,11 @@ bool WmoHeader::Parse(std::istream& is) | ||||||
|       // Remove delimiters from the end of the line
 |       // Remove delimiters from the end of the line
 | ||||||
|       if (!sequenceLine.empty()) |       if (!sequenceLine.empty()) | ||||||
|       { |       { | ||||||
|          sequenceLine.erase(sequenceLine.length() - 3); |          sequenceLine.erase(sequenceLine.length() - 2); | ||||||
|  |          while (sequenceLine.ends_with(' ')) | ||||||
|  |          { | ||||||
|  |             sequenceLine.erase(sequenceLine.length() - 1); | ||||||
|  |          } | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       wmoLine.erase(wmoLine.length() - 2); |       wmoLine.erase(wmoLine.length() - 2); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat