mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 13:10: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", | ||||
|                    "/warnings/warnings_20210606_15.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) | ||||
| { | ||||
|  |  | |||
|  | @ -75,6 +75,7 @@ static std::vector<std::string>     ParseProductContent(std::istream& is); | |||
| void                                SkipBlankLines(std::istream& is); | ||||
| bool                                TryParseEndOfProduct(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<Vtec>          TryParseVtecString(std::istream& is); | ||||
| 
 | ||||
|  | @ -86,6 +87,7 @@ public: | |||
| 
 | ||||
|    std::shared_ptr<WmoHeader>            wmoHeader_; | ||||
|    std::vector<std::string>              mndHeader_; | ||||
|    std::vector<std::string>              overviewBlock_; | ||||
|    std::vector<std::shared_ptr<Segment>> segments_; | ||||
| }; | ||||
| 
 | ||||
|  | @ -136,6 +138,13 @@ bool TextProductMessage::Parse(std::istream& is) | |||
| 
 | ||||
|          p->mndHeader_ = TryParseMndHeader(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()) | ||||
|  | @ -165,7 +174,10 @@ std::vector<std::string> ParseProductContent(std::istream& is) | |||
|    { | ||||
|       util::getline(is, line); | ||||
| 
 | ||||
|       if (!productContent.empty() || !line.starts_with("$$")) | ||||
|       { | ||||
|          productContent.push_back(line); | ||||
|       } | ||||
| 
 | ||||
|       if (line.starts_with("$$")) | ||||
|       { | ||||
|  | @ -263,6 +275,27 @@ std::vector<std::string> TryParseMndHeader(std::istream& is) | |||
|    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) | ||||
| { | ||||
|    // UGC takes the form SSFNNN-NNN>NNN-SSFNNN-DDHHMM- (NWSI 10-1702)
 | ||||
|  |  | |||
|  | @ -170,7 +170,11 @@ bool WmoHeader::Parse(std::istream& is) | |||
|       // Remove delimiters from the end of the line
 | ||||
|       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); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat