00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "CMSWindowsClipboardHTMLConverter.h"
00016 #include "CStringUtil.h"
00017
00018
00019
00020
00021
00022 CMSWindowsClipboardHTMLConverter::CMSWindowsClipboardHTMLConverter()
00023 {
00024 m_format = RegisterClipboardFormat("HTML Format");
00025 }
00026
00027 CMSWindowsClipboardHTMLConverter::~CMSWindowsClipboardHTMLConverter()
00028 {
00029
00030 }
00031
00032 IClipboard::EFormat
00033 CMSWindowsClipboardHTMLConverter::getFormat() const
00034 {
00035 return IClipboard::kHTML;
00036 }
00037
00038 UINT
00039 CMSWindowsClipboardHTMLConverter::getWin32Format() const
00040 {
00041 return m_format;
00042 }
00043
00044 CString
00045 CMSWindowsClipboardHTMLConverter::doFromIClipboard(const CString& data) const
00046 {
00047
00048 CString prefix("Version:0.9\nStartHTML:-1\nEndHTML:-1\n"
00049 "StartFragment:XXXXXXXXXX\nEndFragment:YYYYYYYYYY\n"
00050 "<!DOCTYPE><HTML><BODY><!--StartFragment-->");
00051 CString suffix("<!--EndFragment--></BODY></HTML>\n");
00052 UInt32 start = prefix.size();
00053 UInt32 end = start + data.size();
00054 prefix.replace(prefix.find("XXXXXXXXXX"), 10,
00055 CStringUtil::print("%010u", start));
00056 prefix.replace(prefix.find("YYYYYYYYYY"), 10,
00057 CStringUtil::print("%010u", end));
00058
00059
00060 prefix += data;
00061 prefix += suffix;
00062 return prefix;
00063 }
00064
00065 CString
00066 CMSWindowsClipboardHTMLConverter::doToIClipboard(const CString& data) const
00067 {
00068
00069 CString startArg = findArg(data, "StartFragment");
00070 CString endArg = findArg(data, "EndFragment");
00071 if (startArg.empty() || endArg.empty()) {
00072 return CString();
00073 }
00074
00075
00076 SInt32 start = (SInt32)atoi(startArg.c_str());
00077 SInt32 end = (SInt32)atoi(endArg.c_str());
00078 if (start <= 0 || end <= 0 || start >= end) {
00079 return CString();
00080 }
00081
00082
00083 return data.substr(start, end - start);
00084 }
00085
00086 CString
00087 CMSWindowsClipboardHTMLConverter::findArg(
00088 const CString& data, const CString& name) const
00089 {
00090 CString::size_type i = data.find(name);
00091 if (i == CString::npos) {
00092 return CString();
00093 }
00094 i = data.find_first_of(":\r\n", i);
00095 if (i == CString::npos || data[i] != ':') {
00096 return CString();
00097 }
00098 i = data.find_first_of("0123456789\r\n", i + 1);
00099 if (i == CString::npos || data[i] == '\r' || data[i] == '\n') {
00100 return CString();
00101 }
00102 CString::size_type j = data.find_first_not_of("0123456789", i);
00103 if (j == CString::npos) {
00104 j = data.size();
00105 }
00106 return data.substr(i, j - i);
00107 }