X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/44cc96a80c09c8572e1315be66d29f6d610cbf78..bf2c43c76e2819be443ab1d830ab68d9569d66b1:/src/richtext/richtexthtml.cpp?ds=sidebyside diff --git a/src/richtext/richtexthtml.cpp b/src/richtext/richtexthtml.cpp index 2ec15138eb..c21b00d2d4 100644 --- a/src/richtext/richtexthtml.cpp +++ b/src/richtext/richtexthtml.cpp @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 2005-09-30 -// RCS-ID: $Id$ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -53,7 +52,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")); } @@ -75,92 +74,117 @@ bool wxRichTextHTMLHandler::DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream& ClearTemporaryImageLocations(); - buffer->Defragment(); + wxRichTextDrawingContext context(buffer); + buffer->Defragment(context); - 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()) + { + wxDELETE(customEncoding); + } + } + 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("");
+ wxRichTextAttr currentParaStyle = buffer->GetAttributes();
+ wxRichTextAttr 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())
+ wxRichTextAttr 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())
+ {
+ wxRichTextAttr 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;
return true;
}
-void wxRichTextHTMLHandler::BeginCharacterFormatting(const wxTextAttr& currentStyle, const wxTextAttr& thisStyle, const wxTextAttr& WXUNUSED(paraStyle), wxTextOutputStream& str)
+void wxRichTextHTMLHandler::BeginCharacterFormatting(const wxRichTextAttr& currentStyle, const wxRichTextAttr& thisStyle, const wxRichTextAttr& WXUNUSED(paraStyle), wxTextOutputStream& str)
{
wxString style;
@@ -172,10 +196,27 @@ void wxRichTextHTMLHandler::BeginCharacterFormatting(const wxTextAttr& currentSt
}
if (thisStyle.GetFontSize() != currentStyle.GetFontSize())
style += wxString::Format(wxT(" size=\"%ld\""), PtToSize(thisStyle.GetFontSize()));
- if (thisStyle.GetTextColour() != currentStyle.GetTextColour() )
+
+ bool bTextColourChanged = (thisStyle.GetTextColour() != currentStyle.GetTextColour());
+ bool bBackgroundColourChanged = (thisStyle.GetBackgroundColour() != currentStyle.GetBackgroundColour());
+ if (bTextColourChanged || bBackgroundColourChanged)
{
- wxString color(thisStyle.GetTextColour().GetAsString(wxC2S_HTML_SYNTAX));
- style += wxString::Format(wxT(" color=\"%s\""), color.c_str());
+ style += wxT(" style=\"");
+
+ if (bTextColourChanged)
+ {
+ wxString color(thisStyle.GetTextColour().GetAsString(wxC2S_HTML_SYNTAX));
+ style += wxString::Format(wxT("color: %s"), color.c_str());
+ }
+ if (bTextColourChanged && bBackgroundColourChanged)
+ style += wxT(";");
+ if (bBackgroundColourChanged)
+ {
+ wxString color(thisStyle.GetBackgroundColour().GetAsString(wxC2S_HTML_SYNTAX));
+ style += wxString::Format(wxT("background-color: %s"), color.c_str());
+ }
+
+ style += wxT("\"");
}
if (style.size())
@@ -184,29 +225,49 @@ void wxRichTextHTMLHandler::BeginCharacterFormatting(const wxTextAttr& currentSt
m_font = true;
}
- if (thisStyle.GetFontWeight() == wxBOLD)
+ if (thisStyle.GetFontWeight() == wxFONTWEIGHT_BOLD)
str << wxT("");
- if (thisStyle.GetFontStyle() == wxITALIC)
+ if (thisStyle.GetFontStyle() == wxFONTSTYLE_ITALIC)
str << wxT("");
if (thisStyle.GetFontUnderlined())
str << wxT("");
if (thisStyle.HasURL())
str << wxT("");
+
+ if (thisStyle.HasTextEffects())
+ {
+ if (thisStyle.GetTextEffects() & wxTEXT_ATTR_EFFECT_STRIKETHROUGH)
+ str << wxT("");
+ if (thisStyle.GetTextEffects() & wxTEXT_ATTR_EFFECT_SUPERSCRIPT)
+ str << wxT("");
+ if (thisStyle.GetTextEffects() & wxTEXT_ATTR_EFFECT_SUBSCRIPT)
+ str << wxT("");
+ }
}
-void wxRichTextHTMLHandler::EndCharacterFormatting(const wxTextAttr& WXUNUSED(currentStyle), const wxTextAttr& thisStyle, const wxTextAttr& WXUNUSED(paraStyle), wxTextOutputStream& stream)
+void wxRichTextHTMLHandler::EndCharacterFormatting(const wxRichTextAttr& WXUNUSED(currentStyle), const wxRichTextAttr& thisStyle, const wxRichTextAttr& WXUNUSED(paraStyle), wxTextOutputStream& stream)
{
if (thisStyle.HasURL())
stream << wxT("");
if (thisStyle.GetFontUnderlined())
stream << wxT("");
- if (thisStyle.GetFontStyle() == wxITALIC)
+ if (thisStyle.GetFontStyle() == wxFONTSTYLE_ITALIC)
stream << wxT("");
- if (thisStyle.GetFontWeight() == wxBOLD)
+ if (thisStyle.GetFontWeight() == wxFONTWEIGHT_BOLD)
stream << wxT("");
+ if (thisStyle.HasTextEffects())
+ {
+ if (thisStyle.GetTextEffects() & wxTEXT_ATTR_EFFECT_STRIKETHROUGH)
+ stream << wxT("");
+ if (thisStyle.GetTextEffects() & wxTEXT_ATTR_EFFECT_SUPERSCRIPT)
+ stream << wxT("");
+ if (thisStyle.GetTextEffects() & wxTEXT_ATTR_EFFECT_SUBSCRIPT)
+ stream << wxT("");
+ }
+
if (m_font)
{
m_font = false;
@@ -215,13 +276,11 @@ void wxRichTextHTMLHandler::EndCharacterFormatting(const wxTextAttr& WXUNUSED(cu
}
/// Begin paragraph formatting
-void wxRichTextHTMLHandler::BeginParagraphFormatting(const wxTextAttr& WXUNUSED(currentStyle), const wxTextAttr& thisStyle, wxTextOutputStream& str)
+void wxRichTextHTMLHandler::BeginParagraphFormatting(const wxRichTextAttr& WXUNUSED(currentStyle), const wxRichTextAttr& thisStyle, wxTextOutputStream& str)
{
if (thisStyle.HasPageBreak())
{
- str << wxT("");
str << wxT("
");
}
if (thisStyle.HasLeftIndent() && thisStyle.GetLeftIndent() != 0)
@@ -245,8 +304,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 +318,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("
|