X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bd365871aadca528e03f3b6bb8382a1fdf5f1817..d89b7c194d77ae14dcdb113ac4ffe79f5515b4ca:/src/richtext/richtexthtml.cpp diff --git a/src/richtext/richtexthtml.cpp b/src/richtext/richtexthtml.cpp index 301065a91e..c5df308797 100644 --- a/src/richtext/richtexthtml.cpp +++ b/src/richtext/richtexthtml.cpp @@ -77,79 +77,107 @@ bool wxRichTextHTMLHandler::DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream& buffer->Defragment(); - wxTextOutputStream str(stream); +#if wxUSE_UNICODE + wxCSConv* customEncoding = NULL; + wxMBConv* conv = NULL; + if (!GetEncoding().IsEmpty()) + { + customEncoding = new wxCSConv(GetEncoding()); + if (!customEncoding->IsOk()) + { + wxDELETE(customEncoding); + } + } + if (customEncoding) + conv = customEncoding; + else + conv = & wxConvUTF8; +#endif - wxTextAttr currentParaStyle = buffer->GetAttributes(); - wxTextAttr currentCharStyle = buffer->GetAttributes(); + { +#if wxUSE_UNICODE + wxTextOutputStream str(stream, wxEOL_NATIVE, *conv); +#else + wxTextOutputStream str(stream, wxEOL_NATIVE); +#endif - if ((GetFlags() & wxRICHTEXT_HANDLER_NO_HEADER_FOOTER) == 0) - str << wxT("\n"); + wxTextAttr currentParaStyle = buffer->GetAttributes(); + wxTextAttr currentCharStyle = buffer->GetAttributes(); - OutputFont(currentParaStyle, str); + if ((GetFlags() & wxRICHTEXT_HANDLER_NO_HEADER_FOOTER) == 0) + str << wxT("\n"); - m_font = false; - m_inTable = false; + OutputFont(currentParaStyle, str); - m_indents.Clear(); - m_listTypes.Clear(); + m_font = false; + m_inTable = false; - wxRichTextObjectList::compatibility_iterator node = buffer->GetChildren().GetFirst(); - while (node) - { - wxRichTextParagraph* para = wxDynamicCast(node->GetData(), wxRichTextParagraph); - wxASSERT (para != NULL); + m_indents.Clear(); + m_listTypes.Clear(); - if (para) + wxRichTextObjectList::compatibility_iterator node = buffer->GetChildren().GetFirst(); + while (node) { - wxTextAttr paraStyle(para->GetCombinedAttributes()); + wxRichTextParagraph* para = wxDynamicCast(node->GetData(), wxRichTextParagraph); + wxASSERT (para != NULL); - BeginParagraphFormatting(currentParaStyle, paraStyle, str); - - wxRichTextObjectList::compatibility_iterator node2 = para->GetChildren().GetFirst(); - while (node2) + if (para) { - wxRichTextObject* obj = node2->GetData(); - wxRichTextPlainText* textObj = wxDynamicCast(obj, wxRichTextPlainText); - if (textObj && !textObj->IsEmpty()) + wxTextAttr paraStyle(para->GetCombinedAttributes()); + + BeginParagraphFormatting(currentParaStyle, paraStyle, str); + + wxRichTextObjectList::compatibility_iterator node2 = para->GetChildren().GetFirst(); + while (node2) { - wxTextAttr charStyle(para->GetCombinedAttributes(obj->GetAttributes())); - BeginCharacterFormatting(currentCharStyle, charStyle, paraStyle, str); + wxRichTextObject* obj = node2->GetData(); + wxRichTextPlainText* textObj = wxDynamicCast(obj, wxRichTextPlainText); + if (textObj && !textObj->IsEmpty()) + { + wxTextAttr charStyle(para->GetCombinedAttributes(obj->GetAttributes())); + BeginCharacterFormatting(currentCharStyle, charStyle, paraStyle, str); - wxString text = textObj->GetText(); + wxString text = textObj->GetText(); - if (charStyle.HasTextEffects() && (charStyle.GetTextEffects() & wxTEXT_ATTR_EFFECT_CAPITALS)) - text.MakeUpper(); + if (charStyle.HasTextEffects() && (charStyle.GetTextEffects() & wxTEXT_ATTR_EFFECT_CAPITALS)) + text.MakeUpper(); - wxString toReplace = wxRichTextLineBreakChar; - text.Replace(toReplace, wxT("
")); + wxString toReplace = wxRichTextLineBreakChar; + text.Replace(toReplace, wxT("
")); - str << text; + str << text; - EndCharacterFormatting(currentCharStyle, charStyle, paraStyle, str); - } + EndCharacterFormatting(currentCharStyle, charStyle, paraStyle, str); + } - wxRichTextImage* image = wxDynamicCast(obj, wxRichTextImage); - if( image && (!image->IsEmpty() || image->GetImageBlock().GetData())) - WriteImage( image, stream ); + wxRichTextImage* image = wxDynamicCast(obj, wxRichTextImage); + if( image && (!image->IsEmpty() || image->GetImageBlock().GetData())) + WriteImage( image, stream ); - node2 = node2->GetNext(); - } + node2 = node2->GetNext(); + } - EndParagraphFormatting(currentParaStyle, paraStyle, str); + EndParagraphFormatting(currentParaStyle, paraStyle, str); - str << wxT("\n"); + str << wxT("\n"); + } + node = node->GetNext(); } - node = node->GetNext(); - } - CloseLists(-1, str); + CloseLists(-1, str); + + str << wxT(""); - str << wxT(""); + if ((GetFlags() & wxRICHTEXT_HANDLER_NO_HEADER_FOOTER) == 0) + str << wxT(""); - if ((GetFlags() & wxRICHTEXT_HANDLER_NO_HEADER_FOOTER) == 0) - str << wxT(""); + str << wxT("\n"); + } - str << wxT("\n"); +#if wxUSE_UNICODE + if (customEncoding) + delete customEncoding; +#endif m_buffer = NULL; @@ -253,22 +281,59 @@ void wxRichTextHTMLHandler::BeginParagraphFormatting(const wxTextAttr& WXUNUSED( CloseLists(-1, str); wxString align = GetAlignment(thisStyle); - str << wxString::Format(wxT("

"), align.c_str()); + str << wxString::Format(wxT("

0.0)) + { + styleStr += wxString::Format(wxT("margin-left: %.2fmm; "), indentLeftMM); + } + float indentRightMM = thisStyle.GetRightIndent()/10.0; + if ((GetFlags() & wxRICHTEXT_HANDLER_USE_CSS) && thisStyle.HasRightIndent() && (indentRightMM > 0.0)) + { + styleStr += wxString::Format(wxT("margin-right: %.2fmm; "), indentRightMM); + } + // First line indentation + float firstLineIndentMM = - thisStyle.GetLeftSubIndent() / 10.0; + if ((GetFlags() & wxRICHTEXT_HANDLER_USE_CSS) && (firstLineIndentMM > 0.0)) + { + styleStr += wxString::Format(wxT("text-indent: %.2fmm; "), firstLineIndentMM); + } + + if (!styleStr.IsEmpty()) + str << wxT(" style=\"") << styleStr << wxT("\""); + + str << wxT(">"); - // Use a table - int indentTenthsMM = thisStyle.GetLeftIndent() + thisStyle.GetLeftSubIndent(); // TODO: convert to pixels - int indentPixels = indentTenthsMM/4; - str << wxString::Format(wxT("
"), indentPixels); + int indentPixels = static_cast(indentLeftMM*10/4); - OutputFont(thisStyle, str); + if ((GetFlags() & wxRICHTEXT_HANDLER_USE_CSS) == 0) + { + // Use a table to do indenting if we don't have CSS + str << wxString::Format(wxT("
"), indentPixels); + m_inTable = true; + } - if (thisStyle.GetLeftSubIndent() < 0) + if (((GetFlags() & wxRICHTEXT_HANDLER_USE_CSS) == 0) && (thisStyle.GetLeftSubIndent() < 0)) { str << SymbolicIndent( - thisStyle.GetLeftSubIndent()); } - - m_inTable = true; } } else @@ -276,18 +341,39 @@ void wxRichTextHTMLHandler::BeginParagraphFormatting(const wxTextAttr& WXUNUSED( CloseLists(-1, str); wxString align = GetAlignment(thisStyle); - str << wxString::Format(wxT("

"), align.c_str()); + str << wxString::Format(wxT("

"); } + OutputFont(thisStyle, str); } /// End paragraph formatting void wxRichTextHTMLHandler::EndParagraphFormatting(const wxTextAttr& WXUNUSED(currentStyle), const wxTextAttr& thisStyle, wxTextOutputStream& stream) { + if (thisStyle.HasFont()) + stream << wxT(""); + if (m_inTable) { - if (thisStyle.HasFont()) - stream << wxT(""); - stream << wxT("

\n"); m_inTable = false; }