1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #include "nsHTMLFormatConverter.h"
10 #include "nsIComponentManager.h"
13 #include "nsISupportsPrimitives.h"
15 #include "nsITransferable.h" // for mime defs, this is BAD
17 // HTML convertor stuff
18 #include "nsPrimitiveHelpers.h"
19 #include "nsIDocumentEncoder.h"
20 #include "nsContentUtils.h"
22 nsHTMLFormatConverter::nsHTMLFormatConverter() {}
24 nsHTMLFormatConverter::~nsHTMLFormatConverter() {}
26 NS_IMPL_ISUPPORTS(nsHTMLFormatConverter
, nsIFormatConverter
)
29 // GetInputDataFlavors
31 // Creates a new list and returns the list of all the flavors this converter
32 // knows how to import. In this case, it's just HTML.
35 nsHTMLFormatConverter::GetInputDataFlavors(nsTArray
<nsCString
> &aFlavors
) {
36 aFlavors
.AppendElement(NS_LITERAL_CSTRING(kHTMLMime
));
41 // GetOutputDataFlavors
43 // Creates a new list and returns the list of all the flavors this converter
44 // knows how to export (convert). In this case, it's all sorts of things that
45 // HTML can be converted to.
48 nsHTMLFormatConverter::GetOutputDataFlavors(nsTArray
<nsCString
> &aFlavors
) {
49 aFlavors
.AppendElement(NS_LITERAL_CSTRING(kHTMLMime
));
50 aFlavors
.AppendElement(NS_LITERAL_CSTRING(kUnicodeMime
));
57 // Determines if we support the given conversion. Currently, this method only
58 // converts from HTML to others.
61 nsHTMLFormatConverter::CanConvert(const char *aFromDataFlavor
,
62 const char *aToDataFlavor
, bool *_retval
) {
63 if (!_retval
) return NS_ERROR_INVALID_ARG
;
66 if (!nsCRT::strcmp(aFromDataFlavor
, kHTMLMime
)) {
67 if (!nsCRT::strcmp(aToDataFlavor
, kHTMLMime
))
69 else if (!nsCRT::strcmp(aToDataFlavor
, kUnicodeMime
))
73 // no one uses this flavor right now, so it's just slowing things down. If
74 // anyone cares I can put it back in.
75 else if (toFlavor
.Equals(kAOLMailMime
))
86 // Convert data from one flavor to another. The data is wrapped in primitive
87 // objects so that it is accessible from JS. Currently, this only accepts HTML
88 // input, so anything else is invalid.
90 // XXX This method copies the data WAAAAY too many time for my liking. Grrrrrr.
91 // Mostly it's because
92 // XXX we _must_ put things into nsStrings so that the parser will accept it.
93 // Lame lame lame lame. We
94 // XXX also can't just get raw unicode out of the nsString, so we have to
95 // allocate heap to get
96 // XXX unicode out of the string. Lame lame lame.
99 nsHTMLFormatConverter::Convert(const char *aFromDataFlavor
,
100 nsISupports
*aFromData
,
101 const char *aToDataFlavor
,
102 nsISupports
**aToData
) {
103 if (!aToData
) return NS_ERROR_INVALID_ARG
;
108 if (!nsCRT::strcmp(aFromDataFlavor
, kHTMLMime
)) {
109 nsAutoCString
toFlavor(aToDataFlavor
);
111 // HTML on clipboard is going to always be double byte so it will be in a
112 // primitive class of nsISupportsString. Also, since the data is in two byte
113 // chunks the length represents the length in 1-byte chars, so we need to
115 nsCOMPtr
<nsISupportsString
> dataWrapper0(do_QueryInterface(aFromData
));
117 return NS_ERROR_INVALID_ARG
;
120 nsAutoString dataStr
;
121 dataWrapper0
->GetData(dataStr
); // COPY #1
122 // note: conversion to text/plain is done inside the clipboard. we do not
123 // need to worry about it here.
124 if (toFlavor
.Equals(kHTMLMime
) || toFlavor
.Equals(kUnicodeMime
)) {
126 if (toFlavor
.Equals(kHTMLMime
)) {
127 int32_t dataLen
= dataStr
.Length() * 2;
128 nsPrimitiveHelpers::CreatePrimitiveForData(toFlavor
, dataStr
.get(),
132 res
= ConvertFromHTMLToUnicode(dataStr
, outStr
);
133 if (NS_SUCCEEDED(res
)) {
134 int32_t dataLen
= outStr
.Length() * 2;
135 nsPrimitiveHelpers::CreatePrimitiveForData(toFlavor
, outStr
.get(),
139 } // else if HTML or Unicode
140 else if (toFlavor
.Equals(kAOLMailMime
)) {
142 if (NS_SUCCEEDED(ConvertFromHTMLToAOLMail(dataStr
, outStr
))) {
143 int32_t dataLen
= outStr
.Length() * 2;
144 nsPrimitiveHelpers::CreatePrimitiveForData(toFlavor
, outStr
.get(),
147 } // else if AOL mail
149 rv
= NS_ERROR_FAILURE
;
151 } // if we got html mime
153 rv
= NS_ERROR_FAILURE
;
160 // ConvertFromHTMLToUnicode
162 // Takes HTML and converts it to plain text but in unicode.
165 nsHTMLFormatConverter::ConvertFromHTMLToUnicode(const nsAutoString
&aFromStr
,
166 nsAutoString
&aToStr
) {
167 return nsContentUtils::ConvertToPlainText(
169 nsIDocumentEncoder::OutputSelectionOnly
|
170 nsIDocumentEncoder::OutputAbsoluteLinks
|
171 nsIDocumentEncoder::OutputNoScriptContent
|
172 nsIDocumentEncoder::OutputNoFramesContent
,
174 } // ConvertFromHTMLToUnicode
177 nsHTMLFormatConverter::ConvertFromHTMLToAOLMail(const nsAutoString
&aFromStr
,
178 nsAutoString
&aToStr
) {
179 aToStr
.AssignLiteral("<HTML>");
180 aToStr
.Append(aFromStr
);
181 aToStr
.AppendLiteral("</HTML>");