X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/44cc96a80c09c8572e1315be66d29f6d610cbf78..2028c33ab5a39a12bd410ac953731a56ad6377ba:/src/richtext/richtexthtml.cpp diff --git a/src/richtext/richtexthtml.cpp b/src/richtext/richtexthtml.cpp index 2ec15138eb..6af5ab0ae5 100644 --- a/src/richtext/richtexthtml.cpp +++ b/src/richtext/richtexthtml.cpp @@ -53,7 +53,7 @@ wxRichTextHTMLHandler::wxRichTextHTMLHandler(const wxString& name, const wxStrin bool wxRichTextHTMLHandler::CanHandle(const wxString& filename) const { wxString path, file, ext; - wxSplitPath(filename, & path, & file, & ext); + wxFileName::SplitPath(filename, & path, & file, & ext); return (ext.Lower() == wxT("html") || ext.Lower() == wxT("htm")); } @@ -77,83 +77,108 @@ bool wxRichTextHTMLHandler::DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream& buffer->Defragment(); - wxTextOutputStream str(stream); - - wxTextAttr currentParaStyle = buffer->GetAttributes(); - wxTextAttr currentCharStyle = buffer->GetAttributes(); +#if wxUSE_UNICODE + wxCSConv* customEncoding = NULL; + wxMBConv* conv = NULL; + if (!GetEncoding().IsEmpty()) + { + customEncoding = new wxCSConv(GetEncoding()); + if (!customEncoding->IsOk()) + { + delete customEncoding; + customEncoding = NULL; + } + } + if (customEncoding) + conv = customEncoding; + else + conv = & wxConvUTF8; +#endif - if ((GetFlags() & wxRICHTEXT_HANDLER_NO_HEADER_FOOTER) == 0) - str << wxT("\n"); + { +#if wxUSE_UNICODE + wxTextOutputStream str(stream, wxEOL_NATIVE, *conv); +#else + wxTextOutputStream str(stream, wxEOL_NATIVE); +#endif - str << wxT("
"); + 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()); - - BeginParagraphFormatting(currentParaStyle, paraStyle, str); + wxRichTextParagraph* para = wxDynamicCast(node->GetData(), wxRichTextParagraph); + wxASSERT (para != NULL); - 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()) - 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(""); - 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; @@ -219,9 +244,7 @@ void wxRichTextHTMLHandler::BeginParagraphFormatting(const wxTextAttr& WXUNUSED( { if (thisStyle.HasPageBreak()) { - str << wxT(""); str << wxT("

\n"); - str << wxT("
"); } if (thisStyle.HasLeftIndent() && thisStyle.GetLeftIndent() != 0) @@ -245,8 +268,9 @@ void wxRichTextHTMLHandler::BeginParagraphFormatting(const wxTextAttr& WXUNUSED( int listType = TypeOfList(thisStyle, tag); m_listTypes.Add(listType); - wxString align = GetAlignment(thisStyle); - str << wxString::Format(wxT("

"), align.c_str()); + // wxHTML needs an extra

before a list when using

...

in previous paragraphs. + // TODO: pass a flag that indicates we're using wxHTML. + str << wxT("

\n"); str << tag; } @@ -258,22 +282,61 @@ 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); + + 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; + } OutputFont(thisStyle, str); - if (thisStyle.GetLeftSubIndent() < 0) + if (((GetFlags() & wxRICHTEXT_HANDLER_USE_CSS) == 0) && (thisStyle.GetLeftSubIndent() < 0)) { str << SymbolicIndent( - thisStyle.GetLeftSubIndent()); } - - m_inTable = true; } } else @@ -281,7 +344,27 @@ void wxRichTextHTMLHandler::BeginParagraphFormatting(const wxTextAttr& WXUNUSED( CloseLists(-1, str); wxString align = GetAlignment(thisStyle); - str << wxString::Format(wxT("

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

"); } } @@ -293,9 +376,11 @@ void wxRichTextHTMLHandler::EndParagraphFormatting(const wxTextAttr& WXUNUSED(cu if (thisStyle.HasFont()) stream << wxT(""); - stream << wxT("

\n"); + stream << wxT("

\n"); m_inTable = false; } + else if (!thisStyle.HasBulletStyle()) + stream << wxT("

\n"); } /// Closes lists to level (-1 means close all)