X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/50f65288b1760ffdfd0c274b7be6b2d09e558f58..abe0903cd4a16c6d8f50a3263d601fc718038c6d:/src/richtext/richtexthtml.cpp diff --git a/src/richtext/richtexthtml.cpp b/src/richtext/richtexthtml.cpp index a24b6f9db8..8caec2e8ca 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")); } @@ -76,106 +76,147 @@ bool wxRichTextHTMLHandler::DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream& ClearTemporaryImageLocations(); buffer->Defragment(); - - wxTextOutputStream str(stream); - wxTextAttrEx currentParaStyle = buffer->GetAttributes(); - wxTextAttrEx 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);
-
- m_font = false;
- m_inTable = false;
-
- m_indents.Clear();
- m_listTypes.Clear();
+ if ((GetFlags() & wxRICHTEXT_HANDLER_NO_HEADER_FOOTER) == 0)
+ str << wxT("\n");
- wxRichTextObjectList::compatibility_iterator node = buffer->GetChildren().GetFirst();
- while (node)
- {
- wxRichTextParagraph* para = wxDynamicCast(node->GetData(), wxRichTextParagraph);
- wxASSERT (para != NULL);
+ OutputFont(currentParaStyle, str);
+
+ m_font = false;
+ m_inTable = false;
- if (para)
+ m_indents.Clear();
+ m_listTypes.Clear();
+
+ wxRichTextObjectList::compatibility_iterator node = buffer->GetChildren().GetFirst();
+ while (node)
{
- wxTextAttrEx 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)
{
- wxTextAttrEx charStyle(para->GetCombinedAttributes(obj->GetAttributes()));
- BeginCharacterFormatting(currentCharStyle, charStyle, paraStyle, str);
-
- wxString text = textObj->GetText();
+ 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();
+
+ if (charStyle.HasTextEffects() && (charStyle.GetTextEffects() & wxTEXT_ATTR_EFFECT_CAPITALS))
+ text.MakeUpper();
+
+ wxString toReplace = wxRichTextLineBreakChar;
+ text.Replace(toReplace, wxT(" ")); - if (charStyle.HasTextEffects() && (charStyle.GetTextEffects() & wxTEXT_ATTR_EFFECT_CAPITALS)) - text.MakeUpper(); + str << text; - wxString toReplace = wxRichTextLineBreakChar; - text.Replace(toReplace, wxT(" ")); + EndCharacterFormatting(currentCharStyle, charStyle, paraStyle, str); + } - str << text; + wxRichTextImage* image = wxDynamicCast(obj, wxRichTextImage); + if( image && (!image->IsEmpty() || image->GetImageBlock().GetData())) + WriteImage( image, stream ); - EndCharacterFormatting(currentCharStyle, charStyle, paraStyle, str); + node2 = node2->GetNext(); } - wxRichTextImage* image = wxDynamicCast(obj, wxRichTextImage); - if( image && !image->IsEmpty()) - WriteImage( image, stream ); + EndParagraphFormatting(currentParaStyle, paraStyle, str); - node2 = node2->GetNext(); + str << wxT("\n"); } + node = node->GetNext(); + } - EndParagraphFormatting(currentParaStyle, paraStyle, str); + CloseLists(-1, str); - str << wxT("\n"); - } - node = node->GetNext(); - } - - CloseLists(-1, str); + str << wxT(""); + + if ((GetFlags() & wxRICHTEXT_HANDLER_NO_HEADER_FOOTER) == 0) + str << wxT(""); - str << wxT(""); - - str << wxT(" |
");
+ str << wxT("\n");
+ }
- if ((GetFlags() & wxRICHTEXT_HANDLER_NO_HEADER_FOOTER) == 0)
- str << wxT("");
-
- str << wxT("\n");
+#if wxUSE_UNICODE
+ if (customEncoding)
+ delete customEncoding;
+#endif
m_buffer = NULL;
return true;
}
-void wxRichTextHTMLHandler::BeginCharacterFormatting(const wxTextAttrEx& currentStyle, const wxTextAttrEx& thisStyle, const wxTextAttrEx& WXUNUSED(paraStyle), wxTextOutputStream& str)
+void wxRichTextHTMLHandler::BeginCharacterFormatting(const wxRichTextAttr& currentStyle, const wxRichTextAttr& thisStyle, const wxRichTextAttr& WXUNUSED(paraStyle), wxTextOutputStream& str)
{
wxString style;
// Is there any change in the font properties of the item?
- if (thisStyle.GetFont().GetFaceName() != currentStyle.GetFont().GetFaceName())
+ if (thisStyle.GetFontFaceName() != currentStyle.GetFontFaceName())
{
- wxString faceName(thisStyle.GetFont().GetFaceName());
+ wxString faceName(thisStyle.GetFontFaceName());
style += wxString::Format(wxT(" face=\"%s\""), faceName.c_str());
}
- if (thisStyle.GetFont().GetPointSize() != currentStyle.GetFont().GetPointSize())
- style += wxString::Format(wxT(" size=\"%ld\""), PtToSize(thisStyle.GetFont().GetPointSize()));
- if (thisStyle.GetTextColour() != currentStyle.GetTextColour() )
+ if (thisStyle.GetFontSize() != currentStyle.GetFontSize())
+ style += wxString::Format(wxT(" size=\"%ld\""), PtToSize(thisStyle.GetFontSize()));
+
+ 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 wxTextAttrEx& current
m_font = true;
}
- if (thisStyle.GetFont().GetWeight() == wxBOLD)
+ if (thisStyle.GetFontWeight() == wxBOLD)
str << wxT("");
- if (thisStyle.GetFont().GetStyle() == wxITALIC)
+ if (thisStyle.GetFontStyle() == wxITALIC)
str << wxT("");
- if (thisStyle.GetFont().GetUnderlined())
+ 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 wxTextAttrEx& WXUNUSED(currentStyle), const wxTextAttrEx& thisStyle, const wxTextAttrEx& 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.GetFont().GetUnderlined())
+ if (thisStyle.GetFontUnderlined())
stream << wxT("");
- if (thisStyle.GetFont().GetStyle() == wxITALIC)
+ if (thisStyle.GetFontStyle() == wxITALIC)
stream << wxT("");
- if (thisStyle.GetFont().GetWeight() == wxBOLD)
+ if (thisStyle.GetFontWeight() == wxBOLD)
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,16 +276,14 @@ void wxRichTextHTMLHandler::EndCharacterFormatting(const wxTextAttrEx& WXUNUSED(
}
/// Begin paragraph formatting
-void wxRichTextHTMLHandler::BeginParagraphFormatting(const wxTextAttrEx& WXUNUSED(currentStyle), const wxTextAttrEx& 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())
+ if (thisStyle.HasLeftIndent() && thisStyle.GetLeftIndent() != 0)
{
if (thisStyle.HasBulletStyle())
{
@@ -232,7 +291,7 @@ void wxRichTextHTMLHandler::BeginParagraphFormatting(const wxTextAttrEx& WXUNUSE
// Close levels high than this
CloseLists(indent, str);
-
+
if (m_indents.GetCount() > 0 && indent == m_indents.Last())
{
// Same level, no need to start a new list
@@ -240,40 +299,78 @@ void wxRichTextHTMLHandler::BeginParagraphFormatting(const wxTextAttrEx& WXUNUSE
else if (m_indents.GetCount() == 0 || indent > m_indents.Last())
{
m_indents.Add(indent);
-
+
wxString tag;
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; } - + str << 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("
|