diff --git a/3party/opening_hours/opening_hours_tests/osm_time_range_tests.cpp b/3party/opening_hours/opening_hours_tests/osm_time_range_tests.cpp index 525c409ebf..be44043e07 100644 --- a/3party/opening_hours/opening_hours_tests/osm_time_range_tests.cpp +++ b/3party/opening_hours/opening_hours_tests/osm_time_range_tests.cpp @@ -510,6 +510,46 @@ BOOST_AUTO_TEST_CASE(OpeningHoursMonthdayRanges_TestParseUnparse) auto const parsedUnparsed = ParseAndUnparse(rule); BOOST_CHECK_EQUAL(parsedUnparsed, rule); } + { + auto const rule = "Jan 11-Dec 10,Apr 01-Jun 02"; + auto const parsedUnparsed = ParseAndUnparse(rule); + BOOST_CHECK_EQUAL(parsedUnparsed, rule); + } + { + auto const rule = "2011 Jan"; + auto const parsedUnparsed = ParseAndUnparse(rule); + BOOST_CHECK_EQUAL(parsedUnparsed, rule); + } + { + auto const rule = "1989 Mar 10+"; + auto const parsedUnparsed = ParseAndUnparse(rule); + BOOST_CHECK_EQUAL(parsedUnparsed, rule); + } + { + auto const rule = "Jan 11 +Mo+"; + auto const parsedUnparsed = ParseAndUnparse(rule); + BOOST_CHECK_EQUAL(parsedUnparsed, rule); + } + { + auto const rule = "Jan 11 +3 days+"; + auto const parsedUnparsed = ParseAndUnparse(rule); + BOOST_CHECK_EQUAL(parsedUnparsed, rule); + } + { + auto const rule = "Feb 03 -Mo -2 days+"; + auto const parsedUnparsed = ParseAndUnparse(rule); + BOOST_CHECK_EQUAL(parsedUnparsed, rule); + } + { + auto const rule = "Feb 03 -Mo -2 days-Jan 11 +3 days"; + auto const parsedUnparsed = ParseAndUnparse(rule); + BOOST_CHECK_EQUAL(parsedUnparsed, rule); + } + { + auto const rule = "Feb 03 -Mo -2 days-Jan 11 +3 days,Mar,Apr"; + auto const parsedUnparsed = ParseAndUnparse(rule); + BOOST_CHECK_EQUAL(parsedUnparsed, rule); + } } diff --git a/3party/opening_hours/osm_parsers.hpp b/3party/opening_hours/osm_parsers.hpp index 0644b21ef0..420191ba36 100644 --- a/3party/opening_hours/osm_parsers.hpp +++ b/3party/opening_hours/osm_parsers.hpp @@ -162,23 +162,23 @@ class month_selector : public qi::grammar year = {}; day_offset = ((lit('+')[_a = 1] | lit('-')[_a = -1]) >> - int_ >> charset::no_case[(lit("days") | lit("day"))]) [_val = _a * _1]; + ushort_ >> charset::no_case[(lit("days") | lit("day"))]) [_val = _a * _1]; - date_offset = ((lit('+')[_a = true] | lit('-')[_a = false]) >> wdays >> day_offset) + date_offset = ((lit('+')[_a = true] | lit('-')[_a = false]) + >> charset::no_case[wdays] >> day_offset) [bind(&osmoh::DateOffset::SetWDayOffset, _val, _1), bind(&osmoh::DateOffset::SetOffset, _val, _2), bind(&osmoh::DateOffset::SetWDayOffsetPositive, _val, _a)] - | ((lit('+')[_a = true] | lit('-') [_a = false]) >> wdays) + | ((lit('+')[_a = true] | lit('-') [_a = false]) >> charset::no_case[wdays]) [bind(&osmoh::DateOffset::SetWDayOffset, _val, _1), bind(&osmoh::DateOffset::SetWDayOffsetPositive, _val, _a)] | day_offset [bind(&osmoh::DateOffset::SetOffset, _val, _1)] diff --git a/3party/opening_hours/osm_parsers_terminals.hpp b/3party/opening_hours/osm_parsers_terminals.hpp index 2835a4d47b..a58232f0d5 100644 --- a/3party/opening_hours/osm_parsers_terminals.hpp +++ b/3party/opening_hours/osm_parsers_terminals.hpp @@ -52,13 +52,13 @@ struct wdays_ : qi::symbols } } wdays; -struct month_ : qi::symbols +struct month_ : qi::symbols { month_() { add - (L"jan", 1_M)(L"feb", 2_M)(L"mar", 3_M)(L"apr", 4_M)(L"may", 5_M)(L"jun", 6_M) - (L"jul", 7_M)(L"aug", 8_M)(L"sep", 9_M)(L"oct", 10_M)(L"nov", 11_M)(L"dec", 12_M) + ("jan", 1_M)("feb", 2_M)("mar", 3_M)("apr", 4_M)("may", 5_M)("jun", 6_M) + ("jul", 7_M)("aug", 8_M)("sep", 9_M)("oct", 10_M)("nov", 11_M)("dec", 12_M) ; } } month; diff --git a/3party/opening_hours/osm_time_range.cpp b/3party/opening_hours/osm_time_range.cpp index 6e9e992d9b..1d30c9acf6 100644 --- a/3party/opening_hours/osm_time_range.cpp +++ b/3party/opening_hours/osm_time_range.cpp @@ -46,12 +46,13 @@ void PrintVector(std::ostream & ost, std::vector const & v) } } -void PrintOffset(std::ostream & ost, int32_t const offset) +void PrintOffset(std::ostream & ost, int32_t const offset, bool const space) { if (offset == 0) return; - ost << ' '; + if (space) + ost << ' '; if (offset > 0) ost << '+'; ost << offset; @@ -504,7 +505,7 @@ std::ostream & operator<<(std::ostream & ost, WeekdayRange const & range) { PrintVector(ost, range.GetNths()); } - PrintOffset(ost, range.GetOffset()); + PrintOffset(ost, range.GetOffset(), true); } return ost; } @@ -543,7 +544,7 @@ std::ostream & operator<<(std::ostream & ost, Holiday const & holiday) else { ost << "SH"; - PrintOffset(ost, holiday.GetOffset()); + PrintOffset(ost, holiday.GetOffset(), true); } return ost; } @@ -655,7 +656,7 @@ std::ostream & operator<<(std::ostream & ost, DateOffset const & offset) if (offset.HasWDayOffset()) ost << (offset.IsWDayOffsetPositive() ? '+' : '-') << offset.GetWDayOffset(); - PrintOffset(ost, offset.GetOffset()); + PrintOffset(ost, offset.GetOffset(), offset.HasWDayOffset()); return ost; } @@ -804,7 +805,7 @@ std::ostream & operator<<(std::ostream & ost, MonthDay::EVariableDate const date std::ostream & operator<<(std::ostream & ost, MonthDay const md) { if (md.HasYear()) - ost << md.GetYear(); + ost << md.GetYear() << ' '; if (md.IsVariable()) ost << md.GetVariableDate(); @@ -815,10 +816,10 @@ std::ostream & operator<<(std::ostream & ost, MonthDay const md) if (md.HasDayNum()) { ost << ' '; - PrintPaddedNumber(ost, md.GetDayNum(), 0); + PrintPaddedNumber(ost, md.GetDayNum(), 2); } if (md.HasOffset()) - ost << md.GetOffset(); + ost << ' ' << md.GetOffset(); } return ost; } diff --git a/3party/opening_hours/parse.cpp b/3party/opening_hours/parse.cpp index 74aa051d51..0d41f44cca 100644 --- a/3party/opening_hours/parse.cpp +++ b/3party/opening_hours/parse.cpp @@ -53,17 +53,17 @@ bool ParseImp(std::string const & str, Context & context) namespace osmoh { -bool Parse(std::string const & str, osmoh::TTimespans & s) +bool Parse(std::string const & str, TTimespans & s) { return ParseImp(str, s); } -bool Parse(std::string const & str, osmoh::Weekdays & w) +bool Parse(std::string const & str, Weekdays & w) { return ParseImp(str, w); } -bool Parse(std::string const & str, osmoh::TMonthdayRanges & m) +bool Parse(std::string const & str, TMonthdayRanges & m) { return ParseImp(str, m); }