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("
|