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; }