Fixed an XML parsing error for complex URLs
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51836 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -491,6 +491,59 @@ static void OutputStringEnt(wxOutputStream& stream, const wxString& str,
|
|||||||
OutputString(stream, str.Mid(last, i - last), convMem, convFile);
|
OutputString(stream, str.Mid(last, i - last), convMem, convFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static wxString AttributeToXML(const wxString& str)
|
||||||
|
{
|
||||||
|
wxString str1;
|
||||||
|
size_t i, last, len;
|
||||||
|
wxChar c;
|
||||||
|
|
||||||
|
len = str.Len();
|
||||||
|
last = 0;
|
||||||
|
for (i = 0; i < len; i++)
|
||||||
|
{
|
||||||
|
c = str.GetChar(i);
|
||||||
|
|
||||||
|
// Original code excluded "&" but we _do_ want to convert
|
||||||
|
// the ampersand beginning & because otherwise when read in,
|
||||||
|
// the original "&" becomes "&".
|
||||||
|
|
||||||
|
if (c == wxT('<') || c == wxT('>') || c == wxT('"') ||
|
||||||
|
(c == wxT('&') /* && (str.Mid(i+1, 4) != wxT("amp;")) */ ))
|
||||||
|
{
|
||||||
|
str1 += str.Mid(last, i - last);
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
case wxT('<'):
|
||||||
|
str1 += wxT("<");
|
||||||
|
break;
|
||||||
|
case wxT('>'):
|
||||||
|
str1 += wxT(">");
|
||||||
|
break;
|
||||||
|
case wxT('&'):
|
||||||
|
str1 += wxT("&");
|
||||||
|
break;
|
||||||
|
case wxT('"'):
|
||||||
|
str1 += wxT(""");
|
||||||
|
break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
last = i + 1;
|
||||||
|
}
|
||||||
|
else if (wxUChar(c) > 127)
|
||||||
|
{
|
||||||
|
str1 += str.Mid(last, i - last);
|
||||||
|
|
||||||
|
wxString s(wxT("&#"));
|
||||||
|
s << (int) c;
|
||||||
|
s << wxT(";");
|
||||||
|
str1 += s;
|
||||||
|
last = i + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
str1 += str.Mid(last, i - last);
|
||||||
|
return str1;
|
||||||
|
}
|
||||||
|
|
||||||
inline static void OutputIndentation(wxOutputStream& stream, int indent)
|
inline static void OutputIndentation(wxOutputStream& stream, int indent)
|
||||||
{
|
{
|
||||||
wxString str = wxT("\n");
|
wxString str = wxT("\n");
|
||||||
@@ -930,7 +983,7 @@ wxString wxRichTextXMLHandler::CreateStyle(const wxTextAttr& attr, bool isPara)
|
|||||||
str << wxT(" characterstyle=\"") << wxString(attr.GetCharacterStyleName()) << wxT("\"");
|
str << wxT(" characterstyle=\"") << wxString(attr.GetCharacterStyleName()) << wxT("\"");
|
||||||
|
|
||||||
if (attr.HasURL())
|
if (attr.HasURL())
|
||||||
str << wxT(" url=\"") << attr.GetURL() << wxT("\"");
|
str << wxT(" url=\"") << AttributeToXML(attr.GetURL()) << wxT("\"");
|
||||||
|
|
||||||
if (isPara)
|
if (isPara)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user