diff --git a/HtmlFile2/htmlfile2.cpp b/HtmlFile2/htmlfile2.cpp
index 019d45eea7..36759cbe4c 100644
--- a/HtmlFile2/htmlfile2.cpp
+++ b/HtmlFile2/htmlfile2.cpp
@@ -19,18 +19,20 @@ public:
XmlUtils::CXmlLiteReader m_oLightReader; // SAX Reader
std::wstring m_sTmp; // Temp папка для конфертации html в xhtml
std::map m_mStyles; // Стили в document.xml. Хранятся как (имя тэга, его стиль)
- NSStringUtils::CStringBuilder oStylesXml; // Внутренность styles.xml
+ NSStringUtils::CStringBuilder m_oStylesXml; // Внутренность styles.xml
+
+ int m_nBase64Id; // ID Base64 картинки, т.к. имени у них нет
public:
CHtmlFile2_Private()
{
-
+ m_nBase64Id = 1;
}
~CHtmlFile2_Private()
{
m_oLightReader.Clear();
m_mStyles.clear();
- oStylesXml.Clear();
+ m_oStylesXml.Clear();
}
// Проверяет наличие тэга html
@@ -116,6 +118,7 @@ public:
}
// Предварительное чтение стилей и картинок
+ // sPath - файл после конвертации в xhtml
bool readSrc(const std::wstring& sPath, const std::wstring& sSrc, const std::wstring& sMedia)
{
if(!m_oLightReader.IsValid())
@@ -134,6 +137,8 @@ public:
}
// Читает стили
+ // sSrc - директория с исходником до конвертации, относительно которой указываются пути до картинок
+ // sMedia - директория word/media, куда отправляются картинки
void readStyle(const std::wstring& sSrc, const std::wstring& sMedia)
{
std::wstring sName = m_oLightReader.GetName();
@@ -143,7 +148,7 @@ public:
// Получаем наборы стилей как ......
std::wstring sStyle = L""; // oCSS.GetStyleXml(content());
// Дописываем в styles.xml
- oStylesXml += sStyle;
+ m_oStylesXml += sStyle;
}
// Стиль по ссылке
else if(sName == L"link")
@@ -160,7 +165,7 @@ public:
{
// Получаем наборы стилей как ......
std::wstring sStyle = L""; // oCSS.GetStyleFromCSS(sRef);
- oStylesXml += sStyle;
+ m_oStylesXml += sStyle;
}
}
}
@@ -169,50 +174,7 @@ public:
// Картинки
else if(sName == L"img" || sName == L"image")
{
- while(m_oLightReader.MoveToNextAttribute())
- {
- std::wstring sAName = m_oLightReader.GetName();
- if(sAName == L"src" || sAName == L"href")
- {
- std::wstring sSrcM = m_oLightReader.GetText();
- size_t nLen = (sSrcM.length() > 4 ? 4 : 0);
- // Картинка в сети
- if(sSrcM.substr(0, nLen) == L"http")
- {
- CFileDownloader oDownloadImg(sSrcM);
- oDownloadImg.SetFilePath(sMedia);
- bool bRes = oDownloadImg.DownloadSync();
- }
- else if(sSrcM.substr(0, nLen) == L"data")
- {
- NSFile::CFileBinary oImageWriter;
- if(oImageWriter.CreateFileW(sMedia + L"/img.jpg"))
- {
- size_t nBase = sSrcM.find(L"base64", nLen) + 7;
- std::string sBase64 = m_oLightReader.GetTextA().substr(nBase);
- int nSrcLen = (int)sBase64.length();
- int nDecodeLen = NSBase64::Base64DecodeGetRequiredLength(nSrcLen);
- BYTE* pImageData = new BYTE[nDecodeLen];
- if (TRUE == NSBase64::Base64Decode(sBase64.c_str(), nSrcLen, pImageData, &nDecodeLen))
- oImageWriter.WriteFile(pImageData, (DWORD)nDecodeLen);
- RELEASEARRAYOBJECTS(pImageData);
- oImageWriter.CloseFile();
- }
- }
- // Относительный путь до картинки
- else
- {
- size_t nSrcM = sSrcM.rfind(L"/");
- bool bRes = NSFile::CFileBinary::Copy(sSrc + L"/" + sSrcM, sMedia + sSrcM.substr(nSrcM));
- // Прописать рельсы
- if(bRes)
- {
- bool s = bRes;
- }
- }
- }
- }
- m_oLightReader.MoveToElement();
+ readImage(sSrc, sMedia);
}
// ищем атрибут style
else
@@ -238,25 +200,14 @@ public:
m_oLightReader.MoveToElement();
}
+ // Читаем весь файл
if(m_oLightReader.IsEmptyNode())
return;
-
- // Читаем весь файл
int nDeath = m_oLightReader.GetDepth();
while(m_oLightReader.ReadNextSiblingNode(nDeath))
readStyle(sSrc, sMedia);
}
- std::wstring content()
- {
- std::wstring sRes = L"";
- if(m_oLightReader.IsEmptyNode())
- return sRes;
- if(m_oLightReader.ReadNextSiblingNode2(m_oLightReader.GetDepth()))
- sRes = m_oLightReader.GetText();
- return sRes;
- }
-
void htmlXhtml(const std::wstring& sSrc)
{
NSFile::CFileBinary oXhtmlWriter;
@@ -268,6 +219,73 @@ public:
}
}
private:
+ void readImage(const std::wstring& sSrc, const std::wstring& sMedia)
+ {
+ while(m_oLightReader.MoveToNextAttribute())
+ {
+ std::wstring sAName = m_oLightReader.GetName();
+ if(sAName == L"src" || sAName == L"href")
+ {
+ std::wstring sSrcM = m_oLightReader.GetText();
+ size_t nLen = (sSrcM.length() > 4 ? 4 : 0);
+ // Картинка в сети
+ if(sSrcM.substr(0, nLen) == L"http")
+ {
+ CFileDownloader oDownloadImg(sSrcM, false);
+ oDownloadImg.SetFilePath(sMedia + L"/" + NSFile::GetFileName(sSrcM));
+ bool bRes = oDownloadImg.DownloadSync();
+ // Прописать рельсы
+ if(bRes)
+ {
+ bool s = bRes;
+ }
+ }
+ // Картинка Base64
+ else if(sSrcM.substr(0, nLen) == L"data")
+ {
+ size_t nBase = sSrcM.find(L"/", nLen) + 1;
+ std::wstring sType = sSrcM.substr(nBase, sSrcM.find(L";", nBase) - nBase);
+ NSFile::CFileBinary oImageWriter;
+ if(oImageWriter.CreateFileW(sMedia + L"/" + std::to_wstring(m_nBase64Id++) + L"." + sType))
+ {
+ size_t nBase = sSrcM.find(L"base64", nLen) + 7;
+ std::string sBase64 = m_oLightReader.GetTextA().substr(nBase);
+ int nSrcLen = (int)sBase64.length();
+ int nDecodeLen = NSBase64::Base64DecodeGetRequiredLength(nSrcLen);
+ BYTE* pImageData = new BYTE[nDecodeLen];
+ if (TRUE == NSBase64::Base64Decode(sBase64.c_str(), nSrcLen, pImageData, &nDecodeLen))
+ oImageWriter.WriteFile(pImageData, (DWORD)nDecodeLen);
+ RELEASEARRAYOBJECTS(pImageData);
+ oImageWriter.CloseFile();
+ // Прописать рельсы
+ }
+ }
+ // Картинка по относительному пути
+ else
+ {
+ size_t nSrcM = sSrcM.rfind(L"/");
+ bool bRes = NSFile::CFileBinary::Copy(sSrc + L"/" + sSrcM, sMedia + sSrcM.substr(nSrcM));
+ // Прописать рельсы
+ if(bRes)
+ {
+ bool s = bRes;
+ }
+ }
+ }
+ }
+ m_oLightReader.MoveToElement();
+ }
+
+ std::wstring content()
+ {
+ std::wstring sRes = L"";
+ if(m_oLightReader.IsEmptyNode())
+ return sRes;
+ if(m_oLightReader.ReadNextSiblingNode2(m_oLightReader.GetDepth()))
+ sRes = m_oLightReader.GetText();
+ return sRes;
+ }
+
};
CHtmlFile2::CHtmlFile2()
diff --git a/HtmlFile2/test/main.cpp b/HtmlFile2/test/main.cpp
index b4062c96a8..6ed43af675 100644
--- a/HtmlFile2/test/main.cpp
+++ b/HtmlFile2/test/main.cpp
@@ -16,7 +16,7 @@ int main()
CHtmlFile2 oFile;
// Файл, который открываем
- std::wstring sFile = NSFile::GetProcessDirectory() + L"/../../../examples/test4.xhtml";
+ std::wstring sFile = NSFile::GetProcessDirectory() + L"/../../../examples/test1.html";
// Директория, где будем создавать xhtml
std::wstring sOutputDirectory = NSFile::GetProcessDirectory() + L"/res";
@@ -25,15 +25,6 @@ int main()
oFile.SetTmpDirectory(sOutputDirectory);
- /*
- bool bCheck = oFile.IsHtmlFile(sFile);
- if (!bCheck)
- {
- std::cout << "This isn't a html file" << std::endl;
- return 1;
- }
- */
-
HRESULT nResConvert = oFile.Open(sFile, sOutputDirectory);
if(nResConvert == S_OK)
std::cout << "Success" << std::endl;