mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-10-30 21: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",
|
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