diff options
-rw-r--r-- | map/bookmark.cpp | 27 | ||||
-rw-r--r-- | map/map_tests/bookmarks_test.cpp | 22 |
2 files changed, 42 insertions, 7 deletions
diff --git a/map/bookmark.cpp b/map/bookmark.cpp index 006f60bf5a..2232507aa1 100644 --- a/map/bookmark.cpp +++ b/map/bookmark.cpp @@ -351,19 +351,38 @@ char const * kmlFooter = "</kml>\n"; } +namespace +{ + // According to kml/xml spec, we need to escape special symbols inside CDATA + inline bool ShouldUseCDATA(string const & s) + { + return s.find_first_of("<&") != string::npos; + } +} + void BookmarkCategory::SaveToKML(ostream & s) { s << kmlHeader; - s << " <name>" << GetName() <<"</name>\n"; + // Use CDATA if we have special symbols in the name + if (ShouldUseCDATA(GetName())) + s << " <name><![CDATA[" << GetName() << "]]></name>\n"; + else + s << " <name>" << GetName() << "</name>\n"; s << " <visibility>" << (IsVisible() ? "1" : "0") <<"</visibility>\n"; for (size_t i = 0; i < m_bookmarks.size(); ++i) { Bookmark const * bm = m_bookmarks[i]; - s << " <Placemark>\n" - << " <name>" << bm->GetName() << "</name>\n" - << " <styleUrl>#" << bm->GetType() << "</styleUrl>\n" + s << " <Placemark>\n"; + + // Use CDATA if we have special symbols in the name + if (ShouldUseCDATA(bm->GetName())) + s << " <name><![CDATA[" << bm->GetName() << "]]></name>\n"; + else + s << " <name>" << bm->GetName() << "</name>\n"; + + s << " <styleUrl>#" << bm->GetType() << "</styleUrl>\n" << " <Point>\n" << " <coordinates>" << PointToString(bm->GetOrg()) << "</coordinates>\n" << " </Point>\n"; diff --git a/map/map_tests/bookmarks_test.cpp b/map/map_tests/bookmarks_test.cpp index c30f596c56..ac621a1c56 100644 --- a/map/map_tests/bookmarks_test.cpp +++ b/map/map_tests/bookmarks_test.cpp @@ -88,7 +88,15 @@ char const * kmlString = "<description><![CDATA[]]></description>" "<styleUrl>#placemark-blue</styleUrl>" "<Point>" - "<coordinates>27.566765,53.900047,0.000000</coordinates>" + "<coordinates>27.566765,53.900047,0</coordinates>" + "</Point>" + "</Placemark>" + "<Placemark>" + "<name><![CDATA[<MWM & Sons>]]></name>" + "<description><![CDATA[Amps & <brackets>]]></description>" + "<styleUrl>#placemark-green</styleUrl>" + "<Point>" + "<coordinates>27.551532,53.89306</coordinates>" "</Point>" "</Placemark>" "</Document>" @@ -96,7 +104,7 @@ char const * kmlString = void CheckBookmarks(BookmarkCategory const & cat) { - TEST_EQUAL(cat.GetBookmarksCount(), 3, ()); + TEST_EQUAL(cat.GetBookmarksCount(), 4, ()); Bookmark const * bm = cat.GetBookmark(0); TEST_EQUAL(bm->GetName(), "Nebraska", ()); @@ -107,10 +115,18 @@ char const * kmlString = TEST_EQUAL(bm->GetType(), "placemark-pink", ()); bm = cat.GetBookmark(2); - m2::PointD const org = bm->GetOrg(); + m2::PointD org = bm->GetOrg(); TEST_ALMOST_EQUAL(MercatorBounds::XToLon(org.x), 27.566765, ()); TEST_ALMOST_EQUAL(MercatorBounds::YToLat(org.y), 53.900047, ()); + TEST_EQUAL(bm->GetName(), "From: Минск, Минская область, Беларусь", ()); TEST_EQUAL(bm->GetType(), "placemark-blue", ()); + + bm = cat.GetBookmark(3); + org = bm->GetOrg(); + TEST_ALMOST_EQUAL(MercatorBounds::XToLon(org.x), 27.551532, ()); + TEST_ALMOST_EQUAL(MercatorBounds::YToLat(org.y), 53.89306, ()); + TEST_EQUAL(bm->GetName(), "<MWM & Sons>", ()); + } } |