X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8cc448d3087e4ef25fc66353e27315fa89e73ca2..e2cf30aa1c330e5f2f7954c3938a58a1a95f221e:/src/richtext/richtextxml.cpp diff --git a/src/richtext/richtextxml.cpp b/src/richtext/richtextxml.cpp index e1d42d4647..c09d334297 100644 --- a/src/richtext/richtextxml.cpp +++ b/src/richtext/richtextxml.cpp @@ -491,6 +491,59 @@ static void OutputStringEnt(wxOutputStream& stream, const wxString& str, 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) { wxString str = wxT("\n"); @@ -653,7 +706,16 @@ bool wxRichTextXMLHandler::ExportXML(wxOutputStream& stream, wxMBConv* convMem, int last = 0; const wxString& text = textObj.GetText(); int len = (int) text.Length(); - for (i = 0; i < len; i++) + + if (len == 0) + { + i = 0; + OutputIndentation(stream, indent); + OutputString(stream, wxT("<") + objectName, convMem, convFile); + OutputString(stream, style + wxT(">"), convMem, convFile); + OutputString(stream, wxT(""), convMem, convFile); + } + else for (i = 0; i < len; i++) { int c = (int) text[i]; if (c < 32 && c != 9 && c != 10 && c != 13) @@ -930,7 +992,7 @@ wxString wxRichTextXMLHandler::CreateStyle(const wxTextAttr& attr, bool isPara) str << wxT(" characterstyle=\"") << wxString(attr.GetCharacterStyleName()) << wxT("\""); if (attr.HasURL()) - str << wxT(" url=\"") << attr.GetURL() << wxT("\""); + str << wxT(" url=\"") << AttributeToXML(attr.GetURL()) << wxT("\""); if (isPara) {