From 11affc304c8954c1fa143ebe6a5121da4cc4e8a5 Mon Sep 17 00:00:00 2001 From: Svetlana Kulikova Date: Tue, 8 Sep 2020 15:15:20 +0300 Subject: [PATCH] changes --- Common/3dParty/html/htmltoxhtml.h | 64 +++++++++++++++---------------- HtmlFile2/htmlfile2.cpp | 44 ++++++--------------- 2 files changed, 42 insertions(+), 66 deletions(-) diff --git a/Common/3dParty/html/htmltoxhtml.h b/Common/3dParty/html/htmltoxhtml.h index 94c14933b2..e1c9767bf9 100644 --- a/Common/3dParty/html/htmltoxhtml.h +++ b/Common/3dParty/html/htmltoxhtml.h @@ -25,7 +25,7 @@ static void replace_all(std::string& s, std::string s1, std::string s2) { size_t len = s1.length(); size_t pos = s.find(s1); - while (pos != std::string::npos) + while(pos != std::string::npos) { s.replace(pos, len, s2); pos = s.find(s1, pos + len); @@ -40,9 +40,9 @@ static std::wstring htmlToXhtml(const std::wstring& sFile) // Распознование кодировки size_t posEncoding = sFileContent.find("charset="); - if (std::string::npos == posEncoding) + if (posEncoding == std::string::npos) posEncoding = sFileContent.find("encoding="); - if (std::string::npos != posEncoding) + if (posEncoding != std::string::npos) { posEncoding = sFileContent.find("=", posEncoding) + 1; if(sFileContent[posEncoding] == '\"') @@ -54,10 +54,9 @@ static std::wstring htmlToXhtml(const std::wstring& sFile) std::string sEncoding = sFileContent.substr(posEncoding, posEnd - posEncoding); if (sEncoding != "utf-8" && sEncoding != "UTF-8") { - sFileContent.replace(posEncoding, posEnd - posEncoding, "UTF-8"); + // sFileContent.replace(posEncoding, posEnd - posEncoding, "UTF-8"); NSUnicodeConverter::CUnicodeConverter oConverter; - std::wstring sRes = oConverter.toUnicode(sFileContent, sEncoding.c_str()); - sFileContent = U_TO_UTF8(sRes); + sFileContent = U_TO_UTF8(oConverter.toUnicode(sFileContent, sEncoding.c_str())); } } } @@ -72,12 +71,14 @@ static std::wstring htmlToXhtml(const std::wstring& sFile) std::string sR = oBuilder.GetData(); // Вставка кодировки в файл + /* if(sR.length() > 5) { std::string sSub = sR.substr(0, 5); if(sSub != "" + sR; } + */ // Конвертирование из string utf8 в wstring return UTF8_TO_U(sR); @@ -92,18 +93,12 @@ static std::string Base64ToString(const std::string& sContent, const std::string if (TRUE == NSBase64::Base64Decode(sContent.c_str(), nSrcLen, pData, &nDecodeLen)) { std::wstring sConvert; - if(!sCharset.empty()) + if(!sCharset.empty() && sCharset != "utf-8" && sCharset != "UTF-8") { - if(sCharset != "utf-8" && sCharset != "UTF-8") - { - NSUnicodeConverter::CUnicodeConverter oConverter; - sConvert = oConverter.toUnicode(reinterpret_cast(pData), (unsigned)nDecodeLen, sCharset.data()); - } + NSUnicodeConverter::CUnicodeConverter oConverter; + sConvert = oConverter.toUnicode(reinterpret_cast(pData), (unsigned)nDecodeLen, sCharset.data()); } - if(sConvert.empty()) - sRes = std::string(reinterpret_cast(pData), nDecodeLen); - else - sRes = U_TO_UTF8(sConvert); + sRes = sConvert.empty() ? std::string(reinterpret_cast(pData), nDecodeLen) : U_TO_UTF8(sConvert); } RELEASEARRAYOBJECTS(pData); return sRes; @@ -112,24 +107,26 @@ static std::string Base64ToString(const std::string& sContent, const std::string static std::string QuotedPrintableDecode(const std::string& sContent) { NSStringUtils::CStringBuilderA sRes; - for(size_t i = 0; i < sContent.length(); i++) + size_t ip = 0; + size_t i = sContent.find('='); + size_t nLength = sContent.length(); + while(i != std::string::npos && i + 2 < nLength) { - if(sContent[i] == '=' && i + 2 < sContent.length()) + sRes.WriteString(sContent.substr(ip, i - ip)); + std::string str = sContent.substr(i + 1, 2); + char * err; + char ch = (int)strtol(str.data(), &err, 16); + if(*err) { - std::string str = sContent.substr((++i)++, 2); - char * err; - char ch = (int)strtol(str.data(), &err, 16); - if(*err) - { - if(str != "\r\n") - sRes.WriteString('=' + str); - } - else - sRes.WriteString(&ch, 1); + if(str != "\r\n") + sRes.WriteString(sContent.substr(i, 3)); } else - sRes.WriteString(&sContent[i], 1); + sRes.WriteString(&ch, 1); + ip = i + 3; + i = sContent.find('=', ip); } + sRes.WriteString(sContent.substr(ip)); return sRes.GetData(); } @@ -395,12 +392,14 @@ static std::wstring mhtToXhtml(const std::wstring& sFile, const std::wstring& sT std::string sR = oBuilder.GetData(); // Вставка кодировки в файл + /* if(sR.length() > 5) { std::string sSub = sR.substr(0, 5); if(sSub != "" + sR; } + */ // Конвертирование из string utf8 в wstring return UTF8_TO_U(sR); @@ -415,7 +414,7 @@ static void substitute_xml_entities_into_text(std::string &text) replace_all(text, ">", ">"); } -// Заменяет сущности ",' в text +// Заменяет сущности " в text static void substitute_xml_entities_into_attributes(std::string &text) { substitute_xml_entities_into_text(text); @@ -508,7 +507,7 @@ static void prettyprint_contents(GumboNode* node, NSStringUtils::CStringBuilderA GumboVector* children = &node->v.element.children; - for (unsigned int i = 0; i < children->length; ++i) + for (size_t i = 0; i < children->length; i++) { GumboNode* child = static_cast (children->data[i]); @@ -518,6 +517,7 @@ static void prettyprint_contents(GumboNode* node, NSStringUtils::CStringBuilderA if(!no_entity_substitution) substitute_xml_entities_into_text(val); + // Избавление от FF size_t found = val.find_first_of("\014"); while(found != std::string::npos) { @@ -528,9 +528,7 @@ static void prettyprint_contents(GumboNode* node, NSStringUtils::CStringBuilderA contents.WriteString(val); } else if ((child->type == GUMBO_NODE_ELEMENT) || (child->type == GUMBO_NODE_TEMPLATE)) - { prettyprint(child, contents); - } else if (child->type == GUMBO_NODE_WHITESPACE) { if (keep_whitespace || is_inline) diff --git a/HtmlFile2/htmlfile2.cpp b/HtmlFile2/htmlfile2.cpp index 48853149ab..6735d45bd5 100644 --- a/HtmlFile2/htmlfile2.cpp +++ b/HtmlFile2/htmlfile2.cpp @@ -363,31 +363,13 @@ public: // Конвертирует html в xhtml bool htmlXhtml(const std::wstring& sSrc) { - std::wstring sExtention = NSFile::GetFileExtention(sSrc); - std::transform(sExtention.begin(), sExtention.end(), sExtention.begin(), tolower); - if(sExtention != L"html" && sExtention != L"xhtml" && sExtention != L"htm" ) - return false; - - NSFile::CFileBinary oXhtmlWriter; - if (oXhtmlWriter.CreateFileW(m_sTmp + L"/res.xhtml")) - { - // htmlToXhtml возвращает текст файла в кодировке UTF-8 - oXhtmlWriter.WriteStringUTF8(htmlToXhtml(sSrc)); - oXhtmlWriter.CloseFile(); - } - else - return false; - return true; + return m_oLightReader.FromString(htmlToXhtml(sSrc)); } // Конвертирует mht в xhtml bool mhtXhtml(const std::wstring& sSrc) { - std::wstring sExtention = NSFile::GetFileExtention(sSrc); - std::transform(sExtention.begin(), sExtention.end(), sExtention.begin(), tolower); - if(sExtention != L"mht" && sExtention != L"mhtml") - return false; - + /* NSFile::CFileBinary oXhtmlWriter; if (oXhtmlWriter.CreateFileW(m_sTmp + L"/res.xhtml")) { @@ -398,6 +380,8 @@ public: else return false; return true; + */ + return m_oLightReader.FromString(mhtToXhtml(sSrc, m_sTmp)); } // Читает стили @@ -1481,12 +1465,9 @@ bool CHtmlFile2::IsHtmlFile(const std::wstring& sFile) if(!m_internal->htmlXhtml(sFile)) return false; // Открывает файл на проверку - if (!m_internal->m_oLightReader.FromFile(m_internal->m_sTmp + L"/res.xhtml")) - return false; + // m_internal->m_oLightReader.FromFile(m_internal->m_sTmp + L"/res.xhtml"); // Читаем html - if(!m_internal->isHtml()) - return false; - return true; + return m_internal->isHtml(); } bool CHtmlFile2::IsMhtFile(const std::wstring& sFile) @@ -1495,12 +1476,9 @@ bool CHtmlFile2::IsMhtFile(const std::wstring& sFile) if(!m_internal->mhtXhtml(sFile)) return false; // Открывает файл на проверку - if (!m_internal->m_oLightReader.FromFile(m_internal->m_sTmp + L"/res.xhtml")) - return false; + // m_internal->m_oLightReader.FromFile(m_internal->m_sTmp + L"/res.xhtml"); // Читаем html - if(!m_internal->isHtml()) - return false; - return true; + return m_internal->isHtml(); } void CHtmlFile2::SetTmpDirectory(const std::wstring& sFolder) @@ -1525,7 +1503,7 @@ HRESULT CHtmlFile2::OpenHtml(const std::wstring& sSrc, const std::wstring& sDst, m_internal->readSrc(NSFile::GetFileName(sSrc)); m_internal->write(); - NSFile::CFileBinary::Remove(m_internal->m_sTmp + L"/res.xhtml"); + // NSFile::CFileBinary::Remove(m_internal->m_sTmp + L"/res.xhtml"); return S_OK; } @@ -1546,7 +1524,7 @@ HRESULT CHtmlFile2::OpenMht(const std::wstring& sSrc, const std::wstring& sDst, m_internal->readSrc(NSFile::GetFileName(sSrc)); m_internal->write(); - NSFile::CFileBinary::Remove(m_internal->m_sTmp + L"/res.xhtml"); + // NSFile::CFileBinary::Remove(m_internal->m_sTmp + L"/res.xhtml"); return S_OK; } @@ -1574,7 +1552,7 @@ HRESULT CHtmlFile2::OpenBatchHtml(const std::vector& sSrc, const s return S_FALSE; m_internal->readSrc(NSFile::GetFileName(sS)); - NSFile::CFileBinary::Remove(m_internal->m_sTmp + L"/res.xhtml"); + // NSFile::CFileBinary::Remove(m_internal->m_sTmp + L"/res.xhtml"); m_internal->m_oLightReader.Clear(); m_internal->m_oStylesCalculator.Clear(); m_internal->m_sBase = L"";