From da2df6358e6bbfb00d3b439ed83596b01cc71530 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=9A=D1=83=D0=BB=D0=B8=D0=BA=D0=BE=D0=B2=D0=B0=20=D0=A1?=
=?UTF-8?q?=D0=B2=D0=B5=D1=82=D0=BB=D0=B0=D0=BD=D0=B0=20=D0=90=D0=BB=D0=B5?=
=?UTF-8?q?=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=D0=BE=D0=B2=D0=BD=D0=B0?=
<37101627+SylaiseElvenan@users.noreply.github.com>
Date: Thu, 9 Jul 2020 12:20:25 +0300
Subject: [PATCH] made rels
---
Fb2File/Fb2File.cpp | 51 +++++++++++++++++++++++++++++++++++++------
Fb2File/test/main.cpp | 6 ++++-
2 files changed, 49 insertions(+), 8 deletions(-)
diff --git a/Fb2File/Fb2File.cpp b/Fb2File/Fb2File.cpp
index 4c0a8ed5fc..5f88b1d7f9 100644
--- a/Fb2File/Fb2File.cpp
+++ b/Fb2File/Fb2File.cpp
@@ -133,7 +133,6 @@ public:
XmlUtils::CXmlLiteReader m_oLightReader; // SAX Reader
std::wstring m_sFile; // Имя файла
std::wstring m_sDstFolder; // Путь к результату
- // std::wstring m_sBody; // Текст
STitleInfo m_oTitleInfo; // Данные о книге
SDocumentInfo m_oDocumentInfo; // Информация об fb2-документе
NSStringUtils::CStringBuilder m_oBuilder; // Текст
@@ -258,6 +257,7 @@ public:
// Конец записи
m_oBuilder += L"";
+ m_mImage.insert(std::make_pair(sImageName, L"rPic" + sImageId));
m_nImageId++;
return true;
}
@@ -1287,6 +1287,7 @@ int CFb2File::Convert(const std::wstring& sPath, const std::wstring& sDirectory)
// Начало файла
m_internal->m_oBuilder += L"";
+
// Читаем body
if(m_internal->m_oLightReader.GetName() != L"body")
return false;
@@ -1299,11 +1300,22 @@ int CFb2File::Convert(const std::wstring& sPath, const std::wstring& sDirectory)
// Конец файла
m_internal->m_oBuilder += L"";
+ // Создаем РЕЛЬСЫ
+ NSStringUtils::CStringBuilder oRels;
+ // Начало файла
+ oRels += L"";
+ oRels += L"";
+ oRels += L"";
+ oRels += L"";
+ oRels += L"";
+ oRels += L"";
+ oRels += L"";
+
+ // Читает картинки
std::wstring sMediaDirectory = sDirectory + L"/media";
NSDirectory::CreateDirectory(sMediaDirectory);
- while(m_internal->m_oLightReader.ReadNextNode())
+ do
{
- // Читает картинки
if(m_internal->m_oLightReader.GetName() == L"binary")
{
std::wstring sId = L"";
@@ -1325,7 +1337,6 @@ int CFb2File::Convert(const std::wstring& sPath, const std::wstring& sDirectory)
m_internal->m_oLightReader.MoveToElement();
if(sId == L"")
return false;
- m_internal->m_mImage.insert(std::make_pair(sId, sContentType));
// Пишет картинку в файл
NSFile::CFileBinary oImageWriter;
@@ -1339,8 +1350,36 @@ int CFb2File::Convert(const std::wstring& sPath, const std::wstring& sDirectory)
oImageWriter.WriteFile(pImageData, (DWORD)nDecodeLen);
RELEASEARRAYOBJECTS(pImageData);
oImageWriter.CloseFile();
+
+ // Ищем картинку в списке требующихся
+ // Если есть картинка на которую нет ссылки, то просто пишем ее
+ std::map::iterator it = m_internal->m_mImage.find(sId);
+ if(it != m_internal->m_mImage.end())
+ {
+ // Запись картинок в рельсы
+ oRels += L"second;
+ oRels += L"\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\" Target=\"media/";
+ oRels += it->first;
+ oRels += L"\"/>";
+ // Удаляем картинку из списка требующихся
+ m_internal->m_mImage.erase(it);
+ }
}
- }
+ } while(m_internal->m_oLightReader.ReadNextNode());
+
+ // Если остались неразрешенные ссылки на картинки в тексте
+ if(!m_internal->m_mImage.empty())
+ return false;
+ // Конец файла рельсов
+ oRels += L"";
+ // Пишем рельсы в файл
+ std::wstring sRelsDirectory = sDirectory + L"/_rels";
+ NSFile::CFileBinary oRelsWriter;
+ if (!oRelsWriter.CreateFileW(sRelsDirectory + L"/document.xml.rels"))
+ return false;
+ oRelsWriter.WriteStringUTF8(oRels.GetData());
+ oRelsWriter.CloseFile();
// Создаем файл для записи
NSFile::CFileBinary oDocumentXmlWriter;
@@ -1349,7 +1388,5 @@ int CFb2File::Convert(const std::wstring& sPath, const std::wstring& sDirectory)
oDocumentXmlWriter.WriteStringUTF8(m_internal->m_oBuilder.GetData());
oDocumentXmlWriter.CloseFile();
- // Создаем РЕЛЬСЫ
-
return TRUE;
}
diff --git a/Fb2File/test/main.cpp b/Fb2File/test/main.cpp
index 5179a9230f..afa2cab6d5 100644
--- a/Fb2File/test/main.cpp
+++ b/Fb2File/test/main.cpp
@@ -15,7 +15,7 @@ int main()
std::wstring sFile = NSFile::GetProcessDirectory() + L"/../../../examples/1-posledneye-zhelaniye.fb2";
// директория, где будем создавать docx
- std::wstring sOutputDirectory = NSFile::GetProcessDirectory() + L"/output";
+ std::wstring sOutputDirectory = NSFile::GetProcessDirectory() + L"/word";
if (!NSDirectory::Exists(sOutputDirectory))
NSDirectory::CreateDirectory(sOutputDirectory);
@@ -27,5 +27,9 @@ int main()
}
int nResConvert = oFile.Convert(sFile, sOutputDirectory);
+ if(nResConvert)
+ std::cout << "Success" << std::endl;
+ else
+ std::cout << "Failure" << std::endl;
return 0;
}