X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8cc448d3087e4ef25fc66353e27315fa89e73ca2..d89b7c194d77ae14dcdb113ac4ffe79f5515b4ca:/src/richtext/richtextxml.cpp diff --git a/src/richtext/richtextxml.cpp b/src/richtext/richtextxml.cpp index e1d42d4647..2bda9a8ea5 100644 --- a/src/richtext/richtextxml.cpp +++ b/src/richtext/richtextxml.cpp @@ -23,6 +23,7 @@ #ifndef WX_PRECOMP #include "wx/intl.h" #include "wx/module.h" + #include "wx/log.h" #endif #include "wx/filename.h" @@ -172,10 +173,22 @@ bool wxRichTextXMLHandler::ImportXML(wxRichTextBuffer* buffer, wxXmlNode* node) } else if (childName == wxT("image")) { - int imageType = wxBITMAP_TYPE_PNG; - wxString value = node->GetAttribute(wxT("imagetype"), wxEmptyString); + wxBitmapType imageType = wxBITMAP_TYPE_PNG; + wxString value = child->GetAttribute(wxT("imagetype"), wxEmptyString); if (!value.empty()) - imageType = wxAtoi(value); + { + int type = wxAtoi(value); + + // note: 0 == wxBITMAP_TYPE_INVALID + if (type <= 0 || type >= wxBITMAP_TYPE_MAX) + { + wxLogWarning("Invalid bitmap type specified for tag: %d", type); + } + else + { + imageType = (wxBitmapType)type; + } + } wxString data; @@ -482,7 +495,11 @@ static void OutputStringEnt(wxOutputStream& stream, const wxString& str, OutputString(stream, str.Mid(last, i - last), convMem, convFile); wxString s(wxT("&#")); +#if wxUSE_UNICODE s << (int) c; +#else + s << (int) wxUChar(c); +#endif s << wxT(";"); OutputString(stream, s, NULL, NULL); last = i + 1; @@ -491,6 +508,63 @@ 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("&#")); +#if wxUSE_UNICODE + s << (int) c; +#else + s << (int) wxUChar(c); +#endif + 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,34 +727,50 @@ 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++) { +#if wxUSE_UNICODE int c = (int) text[i]; - if (c < 32 && c != 9 && c != 10 && c != 13) +#else + int c = (int) wxUChar(text[i]); +#endif + if ((c < 32 || c == 34) && /* c != 9 && */ c != 10 && c != 13) { if (i > 0) { - OutputIndentation(stream, indent); - OutputString(stream, wxT("<") + objectName, convMem, convFile); - - OutputString(stream, style + wxT(">"), convMem, convFile); - wxString fragment(text.Mid(last, i-last)); - if (!fragment.empty() && (fragment[0] == wxT(' ') || fragment[fragment.length()-1] == wxT(' '))) + if (!fragment.IsEmpty()) { - OutputString(stream, wxT("\""), convMem, convFile); - OutputStringEnt(stream, fragment, convMem, convFile); - OutputString(stream, wxT("\""), convMem, convFile); + OutputIndentation(stream, indent); + OutputString(stream, wxT("<") + objectName, convMem, convFile); + + OutputString(stream, style + wxT(">"), convMem, convFile); + + if (!fragment.empty() && (fragment[0] == wxT(' ') || fragment[fragment.length()-1] == wxT(' '))) + { + OutputString(stream, wxT("\""), convMem, convFile); + OutputStringEnt(stream, fragment, convMem, convFile); + OutputString(stream, wxT("\""), convMem, convFile); + } + else + OutputStringEnt(stream, fragment, convMem, convFile); + + OutputString(stream, wxT(""), convMem, convFile); } - else - OutputStringEnt(stream, fragment, convMem, convFile); - - OutputString(stream, wxT(""), convMem, convFile); } // Output this character as a number in a separate tag, because XML can't cope - // with entities below 32 except for 9, 10 and 13 + // with entities below 32 except for 10 and 13 last = i + 1; OutputIndentation(stream, indent); OutputString(stream, wxT("GetAttribute(wxT("fontface"), wxEmptyString); if (!fontFacename.IsEmpty()) + { attr.SetFontFaceName(fontFacename); + if (GetFlags() & wxRICHTEXT_HANDLER_CONVERT_FACENAMES) + wxRichTextFixFaceName(fontFacename); + } wxString value; - //value = node->GetAttribute(wxT("fontfamily"), wxEmptyString); - //if (!value.empty()) - // fontFamily = wxAtoi(value); + value = node->GetAttribute(wxT("fontfamily"), wxEmptyString); + if (!value.empty()) + { + fontFamily = (wxFontFamily)wxAtoi(value); + attr.SetFontFamily(fontFamily); + } value = node->GetAttribute(wxT("fontstyle"), wxEmptyString); if (!value.empty()) { - fontStyle = wxAtoi(value); + fontStyle = (wxFontStyle)wxAtoi(value); attr.SetFontStyle(fontStyle); } @@ -1046,7 +1190,7 @@ bool wxRichTextXMLHandler::GetStyle(wxTextAttr& attr, wxXmlNode* node, bool isPa value = node->GetAttribute(wxT("fontweight"), wxEmptyString); if (!value.empty()) { - fontWeight = wxAtoi(value); + fontWeight = (wxFontWeight)wxAtoi(value); attr.SetFontWeight(fontWeight); }