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 bdade966f9..4be693e300 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 @@ -95,6 +95,8 @@ bool CompareNormalized(std::string const & original, ParserResult const & preten boost::to_lower(original_copy); boost::to_lower(pretendent_copy); + boost::replace_all(original_copy, "off", "closed"); + boost::replace_all(original_copy, " ", ""); boost::replace_all(pretendent_copy, " ", ""); @@ -858,6 +860,11 @@ BOOST_AUTO_TEST_CASE(OpeningHoursRuleSequence_TestParseUnparse) auto const parsedUnparsed = ParseAndUnparse(rule); BOOST_CHECK_EQUAL(parsedUnparsed, rule); } + { + auto const rule = "Mo-Fr 10:00-18:00, Sa 10:00-13:00"; + auto const parsedUnparsed = ParseAndUnparse(rule); + BOOST_CHECK_EQUAL(parsedUnparsed, rule); + } { auto const rule = ( "We-Sa; Mo[1,3] closed; Su[-1,-2] closed; " "Fr[2] open; Fr[-2], Fr open; Su[-2] -2 days" ); diff --git a/3party/opening_hours/osm_parsers.hpp b/3party/opening_hours/osm_parsers.hpp index 4d23655646..ceec9b11d8 100644 --- a/3party/opening_hours/osm_parsers.hpp +++ b/3party/opening_hours/osm_parsers.hpp @@ -2,7 +2,7 @@ #include "osm_time_range.hpp" -// #define BOOST_SPIRIT_DEBUG 1 +// #define BOOST_SPIRIT_DEBUG #define BOOST_SPIRIT_USE_PHOENIX_V3 #include #include @@ -301,12 +301,12 @@ class weekday_selector : public qi::grammar> ushort_ [_val = _1 * _a] >> - charset::no_case[(lit(L"days") | lit(L"day"))] ) + charset::no_case[(lit("days") | lit("day"))] ) ; - holiday = (charset::no_case[lit(L"SH")] [bind(&osmoh::Holiday::SetPlural, _val, false)] - >> -day_offset [bind(&osmoh::Holiday::SetOffset, _val, _1)]) - | charset::no_case[lit(L"PH")] [bind(&osmoh::Holiday::SetPlural, _val, true)] + holiday = (charset::no_case[lit("SH")] [bind(&osmoh::Holiday::SetPlural, _val, false)] + >> -day_offset [bind(&osmoh::Holiday::SetOffset, _val, _1)]) + | charset::no_case[lit("PH")] [bind(&osmoh::Holiday::SetPlural, _val, true)] ; holiday_sequence %= (holiday % ','); @@ -320,9 +320,10 @@ class weekday_selector : public qi::grammar> !qi::no_skip[charset::alpha] >> -lit(L':'); + weekday_sequence %= (weekday_range % ',') >> !qi::no_skip[charset::alpha] + ; - main = (holiday_sequence >> -lit(L',') >> weekday_sequence) + main = (holiday_sequence >> -lit(',') >> weekday_sequence) [bind(&osmoh::Weekdays::SetHolidays, _val, _1), bind(&osmoh::Weekdays::SetWeekdayRanges, _val, _2)] | holiday_sequence [bind(&osmoh::Weekdays::SetHolidays, _val, _1)] @@ -416,17 +417,17 @@ class time_selector : public qi::grammar> dash >> extended_time >> L'/' >> hour_minutes) + (time >> dash >> extended_time >> '/' >> hour_minutes) [bind(&osmoh::Timespan::SetStart, _val, _1), bind(&osmoh::Timespan::SetEnd, _val, _2), bind(&osmoh::Timespan::SetPeriod, _val, _3)] - | (time >> dash >> extended_time >> L'/' >> minutes) + | (time >> dash >> extended_time >> '/' >> minutes) [bind(&osmoh::Timespan::SetStart, _val, _1), bind(&osmoh::Timespan::SetEnd, _val, _2), bind(&osmoh::Timespan::SetPeriod, _val, _3)] - | (time >> dash >> extended_time >> char_(L'+')) + | (time >> dash >> extended_time >> '+') [bind(&osmoh::Timespan::SetStart, _val, _1), bind(&osmoh::Timespan::SetEnd, _val, _2), bind(&osmoh::Timespan::SetPlus, _val, true)] @@ -435,7 +436,7 @@ class time_selector : public qi::grammar> char_(L'+')) + | (time >> '+') [bind(&osmoh::Timespan::SetStart, _val, _1), bind(&osmoh::Timespan::SetPlus, _val, true)] @@ -593,10 +594,9 @@ public: -rule_modifier(_val) ) ; - main %= - ( -(lit("opening_hours") >> lit('=')) >> - (rule_sequence % (separator - [phx::bind(&osmoh::RuleSequence::SetAnySeparator, &back(_val), _1)]))) + main = ( -(lit("opening_hours") >> lit('=')) >> + (rule_sequence [push_back(_val, _1)] % + (separator [phx::bind(&osmoh::RuleSequence::SetAnySeparator, back(_val), _1)]))) ; // diff --git a/3party/opening_hours/osm_time_range.cpp b/3party/opening_hours/osm_time_range.cpp index b56b1b3e00..1b45c78d11 100644 --- a/3party/opening_hours/osm_time_range.cpp +++ b/3party/opening_hours/osm_time_range.cpp @@ -37,16 +37,19 @@ namespace template void PrintVector(std::ostream & ost, std::vector const & v, - SeparatorExtrauctor && sep) + SeparatorExtrauctor && sepFunc) { auto it = begin(v); if (it == end(v)) return; + auto sep = sepFunc(*it); ost << *it++; - while(it != end(v)) + while (it != end(v)) { - ost << sep(*it) << *it++; + ost << sep << *it; + sep = sepFunc(*it); + ++it; } }