From 9a8930b54ec9bf408279d91cc28bc3084aa5f2d1 Mon Sep 17 00:00:00 2001 From: Svetlana Kulikova Date: Wed, 20 Sep 2023 13:26:55 +0300 Subject: [PATCH] Fix spaces replaced with tabs for Fb2File --- Fb2File/Fb2File.cpp | 3774 ++++++++++++++++++++--------------------- Fb2File/test/main.cpp | 184 +- 2 files changed, 1979 insertions(+), 1979 deletions(-) diff --git a/Fb2File/Fb2File.cpp b/Fb2File/Fb2File.cpp index 5a58bab1bb..7517750a01 100644 --- a/Fb2File/Fb2File.cpp +++ b/Fb2File/Fb2File.cpp @@ -27,67 +27,67 @@ // Ячейка таблицы struct CTc { - int i; - int j; - std::wstring sGridSpan = L"1"; + int i; + int j; + std::wstring sGridSpan = L"1"; - CTc(int _i, int _j, const std::wstring& sColspan) : i(_i), j(_j), sGridSpan(sColspan) {} + CTc(int _i, int _j, const std::wstring& sColspan) : i(_i), j(_j), sGridSpan(sColspan) {} - bool operator==(const CTc& c2) - { - return (i == c2.i && j == c2.j && sGridSpan == c2.sGridSpan); - } + bool operator==(const CTc& c2) + { + return (i == c2.i && j == c2.j && sGridSpan == c2.sGridSpan); + } }; // Описание информации о произведении. Тэг title-info, src-title-info struct STitleInfo { - std::wstring m_sGenres; // Жанры - std::wstring m_sAuthors; // Авторы - std::wstring m_sBookTitle; // Название - std::wstring m_sKeywords; // Ключевые слова - std::wstring m_sAnnotation;// Аннотация - /* - std::vector m_arTranslator; // Переводчики - std::wstring m_sLang; // Язык после перевода + std::wstring m_sGenres; // Жанры + std::wstring m_sAuthors; // Авторы + std::wstring m_sBookTitle; // Название + std::wstring m_sKeywords; // Ключевые слова + std::wstring m_sAnnotation;// Аннотация + /* + std::vector m_arTranslator; // Переводчики + std::wstring m_sLang; // Язык после перевода - std::pair* m_pDate; // Дата - std::wstring* m_pSrcLang; // Язык до перевода - std::map m_mSequence; // Серии книг - */ + std::pair* m_pDate; // Дата + std::wstring* m_pSrcLang; // Язык до перевода + std::map m_mSequence; // Серии книг + */ }; // Описание информации о fb2-документе. Тэг document-info /* struct SDocumentInfo { - std::vector m_arAuthors; // Авторы - std::vector m_arSrcUrl; // URL страницы + std::vector m_arAuthors; // Авторы + std::vector m_arSrcUrl; // URL страницы - std::wstring m_pDate; // Дата - std::wstring m_sId; // Идентификатор - std::wstring m_sVersion; // Версия документа + std::wstring m_pDate; // Дата + std::wstring m_sId; // Идентификатор + std::wstring m_sVersion; // Версия документа - std::wstring* m_pProgramUsed; // Использованные программы - std::wstring* m_pSrcOcr; // Автор текста - std::wstring* m_pHistory; // История + std::wstring* m_pProgramUsed; // Использованные программы + std::wstring* m_pSrcOcr; // Автор текста + std::wstring* m_pHistory; // История - SDocumentInfo() - { - m_pProgramUsed = NULL; - m_pSrcOcr = NULL; - m_pHistory = NULL; - } + SDocumentInfo() + { + m_pProgramUsed = NULL; + m_pSrcOcr = NULL; + m_pHistory = NULL; + } - ~SDocumentInfo() - { - m_arAuthors.clear(); - m_arSrcUrl.clear(); + ~SDocumentInfo() + { + m_arAuthors.clear(); + m_arSrcUrl.clear(); - RELEASEARRAYOBJECTS(m_pProgramUsed); - RELEASEARRAYOBJECTS(m_pSrcOcr); - RELEASEARRAYOBJECTS(m_pHistory); - } + RELEASEARRAYOBJECTS(m_pProgramUsed); + RELEASEARRAYOBJECTS(m_pSrcOcr); + RELEASEARRAYOBJECTS(m_pHistory); + } }; */ @@ -95,361 +95,361 @@ struct SDocumentInfo /* struct SPublishInfo { - std::wstring* m_pBookName; // Название - std::wstring* m_pPublisher; // Издательство - std::wstring* m_pCity; // Место - std::wstring* m_pYear; // Год - std::wstring* m_pIsbn; // ISBN + std::wstring* m_pBookName; // Название + std::wstring* m_pPublisher; // Издательство + std::wstring* m_pCity; // Место + std::wstring* m_pYear; // Год + std::wstring* m_pIsbn; // ISBN - std::map m_mSequence; // Серии книг + std::map m_mSequence; // Серии книг - SPublishInfo() - { - m_pBookName = NULL; - m_pPublisher = NULL; - m_pCity = NULL; - m_pYear = NULL; - m_pIsbn = NULL; - } + SPublishInfo() + { + m_pBookName = NULL; + m_pPublisher = NULL; + m_pCity = NULL; + m_pYear = NULL; + m_pIsbn = NULL; + } - ~SPublishInfo() - { - m_mSequence.clear(); + ~SPublishInfo() + { + m_mSequence.clear(); - RELEASEARRAYOBJECTS(m_pBookName); - RELEASEARRAYOBJECTS(m_pPublisher); - RELEASEARRAYOBJECTS(m_pCity); - RELEASEARRAYOBJECTS(m_pYear); - RELEASEARRAYOBJECTS(m_pIsbn); - } + RELEASEARRAYOBJECTS(m_pBookName); + RELEASEARRAYOBJECTS(m_pPublisher); + RELEASEARRAYOBJECTS(m_pCity); + RELEASEARRAYOBJECTS(m_pYear); + RELEASEARRAYOBJECTS(m_pIsbn); + } }; */ void replace_all(std::wstring& s, const std::wstring& s1, const std::wstring& s2) { - size_t pos = s.find(s1); - size_t l = s2.length(); - while (pos != std::string::npos) - { - if (!(s1 == L"&" && s2 == L"&" && s.length() > pos + 4 && s[pos] == L'&' && s[pos + 1] == L'a' && s[pos + 2] == L'm' && s[pos + 3] == L'p' && s[pos + 4] == L';')) - s.replace(pos, s1.length(), s2); - pos = s.find(s1, pos + l); - } + size_t pos = s.find(s1); + size_t l = s2.length(); + while (pos != std::string::npos) + { + if (!(s1 == L"&" && s2 == L"&" && s.length() > pos + 4 && s[pos] == L'&' && s[pos + 1] == L'a' && s[pos + 2] == L'm' && s[pos + 3] == L'p' && s[pos + 4] == L';')) + s.replace(pos, s1.length(), s2); + pos = s.find(s1, pos + l); + } } std::wstring EncodeXmlString(const std::wstring& s) { - std::wstring sRes = s; + std::wstring sRes = s; - replace_all(sRes, L"&", L"&"); - replace_all(sRes, L"<", L"<"); - replace_all(sRes, L">", L">"); - replace_all(sRes, L"\"", L"""); - replace_all(sRes, L"\'", L"'"); + replace_all(sRes, L"&", L"&"); + replace_all(sRes, L"<", L"<"); + replace_all(sRes, L">", L">"); + replace_all(sRes, L"\"", L"""); + replace_all(sRes, L"\'", L"'"); replace_all(sRes, L"\n", L" "); replace_all(sRes, L"\r", L" "); replace_all(sRes, L"\t", L" "); - return sRes; + return sRes; } class CFb2File_Private { public: - XmlUtils::CXmlLiteReader m_oLightReader; // SAX Reader - STitleInfo m_oTitleInfo; // Данные о книге - // SDocumentInfo m_oDocumentInfo; // Информация об fb2-документе - // std::wstring m_sTmpFolder; // Рабочая папка - std::map> m_mImages; // Картинки - std::map m_mFootnotes; // Сноски + XmlUtils::CXmlLiteReader m_oLightReader; // SAX Reader + STitleInfo m_oTitleInfo; // Данные о книге + // SDocumentInfo m_oDocumentInfo; // Информация об fb2-документе + // std::wstring m_sTmpFolder; // Рабочая папка + std::map> m_mImages; // Картинки + std::map m_mFootnotes; // Сноски NSStringUtils::CStringBuilder m_oDocXmlRels; // document.xml.rels NSStringUtils::CStringBuilder m_oNoteXmlRels; // footnotes.xml.rels private: - int m_nContentsId; // ID содержания - int m_nCrossReferenceId; // ID перекрестной ссылки - int m_nHyperlinkId; // ID внешней ссылки - bool m_bFootnote; // Чтение Footnote из html - bool m_bInP; + int m_nContentsId; // ID содержания + int m_nCrossReferenceId; // ID перекрестной ссылки + int m_nHyperlinkId; // ID внешней ссылки + bool m_bFootnote; // Чтение Footnote из html + bool m_bInP; bool m_bInNote; - bool m_bInTable; + bool m_bInTable; - // STitleInfo* m_pSrcTitleInfo; // Данные об исходнике книги - // SPublishInfo* m_pPublishInfo; // Сведения об издании книги - // std::map m_mCustomInfo; // Произвольная информация + // STitleInfo* m_pSrcTitleInfo; // Данные об исходнике книги + // SPublishInfo* m_pPublishInfo; // Сведения об издании книги + // std::map m_mCustomInfo; // Произвольная информация public: - CFb2File_Private() - { - // m_pSrcTitleInfo = NULL; - // m_pPublishInfo = NULL; - m_nContentsId = 1; - m_nCrossReferenceId = 1; - m_nHyperlinkId = 1; - m_bFootnote = false; - m_bInP = false; + CFb2File_Private() + { + // m_pSrcTitleInfo = NULL; + // m_pPublishInfo = NULL; + m_nContentsId = 1; + m_nCrossReferenceId = 1; + m_nHyperlinkId = 1; + m_bFootnote = false; + m_bInP = false; m_bInNote = false; - m_bInTable = false; - } + m_bInTable = false; + } - ~CFb2File_Private() - { - m_oLightReader.Clear(); - m_mFootnotes.clear(); - m_mImages.clear(); - /* - m_mCustomInfo.clear(); - if(m_pSrcTitleInfo) - delete m_pSrcTitleInfo; - if(m_pPublishInfo) - delete m_pPublishInfo; - */ - } + ~CFb2File_Private() + { + m_oLightReader.Clear(); + m_mFootnotes.clear(); + m_mImages.clear(); + /* + m_mCustomInfo.clear(); + if(m_pSrcTitleInfo) + delete m_pSrcTitleInfo; + if(m_pPublishInfo) + delete m_pPublishInfo; + */ + } - // wrapper для чтения из файла - bool OpenFromFile(const std::wstring& sFile) - { - // считаем, что это хмл, так как проверка на формат будет раньше (x2t) - std::string sFileContentUtf8 = XmlUtils::GetXmlContentAsUTF8(sFile); - return m_oLightReader.FromStringA(sFileContentUtf8); - } + // wrapper для чтения из файла + bool OpenFromFile(const std::wstring& sFile) + { + // считаем, что это хмл, так как проверка на формат будет раньше (x2t) + std::string sFileContentUtf8 = XmlUtils::GetXmlContentAsUTF8(sFile); + return m_oLightReader.FromStringA(sFileContentUtf8); + } - // Проверяет наличие тэга FictionBook - bool isFictionBook() - { - return m_oLightReader.ReadNextNode() && m_oLightReader.GetName() == L"FictionBook"; - } + // Проверяет наличие тэга FictionBook + bool isFictionBook() + { + return m_oLightReader.ReadNextNode() && m_oLightReader.GetName() == L"FictionBook"; + } - // Читает image - // НЕ имеет право писать p - void readImage(NSStringUtils::CStringBuilder& oBuilder) - { - // Читаем href - std::wstring sImageName; - while (m_oLightReader.MoveToNextAttribute()) - { - std::wstring sName = m_oLightReader.GetName(); - size_t nLen = (sName.length() > 4 ? sName.length() - 4 : 0); - if (sName.substr(nLen) == L"href") - { - std::wstring sText = m_oLightReader.GetText(); - if (sText.length() > 1) - { - sImageName = sText.substr(1); - break; - } - } - } - m_oLightReader.MoveToElement(); + // Читает image + // НЕ имеет право писать p + void readImage(NSStringUtils::CStringBuilder& oBuilder) + { + // Читаем href + std::wstring sImageName; + while (m_oLightReader.MoveToNextAttribute()) + { + std::wstring sName = m_oLightReader.GetName(); + size_t nLen = (sName.length() > 4 ? sName.length() - 4 : 0); + if (sName.substr(nLen) == L"href") + { + std::wstring sText = m_oLightReader.GetText(); + if (sText.length() > 1) + { + sImageName = sText.substr(1); + break; + } + } + } + m_oLightReader.MoveToElement(); - readCrossReference(oBuilder); + readCrossReference(oBuilder); - std::map>::iterator it = m_mImages.find(sImageName); - if (it != m_mImages.end()) - { - // Пишем картинку в файл - // extent - oBuilder += L"second[1]; - oBuilder += L"\" cy=\""; - oBuilder += it->second[2]; - // docPr - oBuilder += L"\"/>second[0]; - // graphic - // pic:nvPicPr - oBuilder += L"\" name=\"\"/>second[0]; - // pic:blipFill - // рельсы rPic + id - oBuilder += L"\" name=\"\"/>second[0]; - // pic:spPr - oBuilder += L"\"/>second[1]; - oBuilder += L"\" cy=\""; - oBuilder += it->second[2]; - // Конец записи - oBuilder += L"\"/>"; - } - } + std::map>::iterator it = m_mImages.find(sImageName); + if (it != m_mImages.end()) + { + // Пишем картинку в файл + // extent + oBuilder += L"second[1]; + oBuilder += L"\" cy=\""; + oBuilder += it->second[2]; + // docPr + oBuilder += L"\"/>second[0]; + // graphic + // pic:nvPicPr + oBuilder += L"\" name=\"\"/>second[0]; + // pic:blipFill + // рельсы rPic + id + oBuilder += L"\" name=\"\"/>second[0]; + // pic:spPr + oBuilder += L"\"/>second[1]; + oBuilder += L"\" cy=\""; + oBuilder += it->second[2]; + // Конец записи + oBuilder += L"\"/>"; + } + } - // Читает title - void readTitle(const std::wstring& sLevel, NSStringUtils::CStringBuilder& oBuilder) - { - if (m_oLightReader.IsEmptyNode()) - return; + // Читает title + void readTitle(const std::wstring& sLevel, NSStringUtils::CStringBuilder& oBuilder) + { + if (m_oLightReader.IsEmptyNode()) + return; - bool bFirstP = true; - int nDeath = m_oLightReader.GetDepth(); - while (m_oLightReader.ReadNextSiblingNode(nDeath)) - { - // Пишем заголовок - if (m_oLightReader.GetName() == L"p") - { - // Пишем title + sLevel - oBuilder += L""; - // Заголовок книги с новой страницы - if (sLevel == L"title" && bFirstP) - { - oBuilder += L""; - bFirstP = false; - } - oBuilder += L""; - // Пишем ссылку от оглавления - std::wstring sContentsId; - if (sLevel == L"title1") - { - sContentsId = std::to_wstring(m_nContentsId++); - oBuilder += L""; - } - readP(L"", oBuilder); - // Пишем ссылку от оглавления - if (sLevel == L"title1") - { - oBuilder += L""; - } - oBuilder += L""; - } - } - } + bool bFirstP = true; + int nDeath = m_oLightReader.GetDepth(); + while (m_oLightReader.ReadNextSiblingNode(nDeath)) + { + // Пишем заголовок + if (m_oLightReader.GetName() == L"p") + { + // Пишем title + sLevel + oBuilder += L""; + // Заголовок книги с новой страницы + if (sLevel == L"title" && bFirstP) + { + oBuilder += L""; + bFirstP = false; + } + oBuilder += L""; + // Пишем ссылку от оглавления + std::wstring sContentsId; + if (sLevel == L"title1") + { + sContentsId = std::to_wstring(m_nContentsId++); + oBuilder += L""; + } + readP(L"", oBuilder); + // Пишем ссылку от оглавления + if (sLevel == L"title1") + { + oBuilder += L""; + } + oBuilder += L""; + } + } + } - // Читает epigraph - void readEpigraph(NSStringUtils::CStringBuilder& oBuilder) - { - readCrossReference(oBuilder); + // Читает epigraph + void readEpigraph(NSStringUtils::CStringBuilder& oBuilder) + { + readCrossReference(oBuilder); - if (m_oLightReader.IsEmptyNode()) - return; + if (m_oLightReader.IsEmptyNode()) + return; - int nDeath = m_oLightReader.GetDepth(); - while (m_oLightReader.ReadNextSiblingNode(nDeath)) - { - std::wstring sName = m_oLightReader.GetName(); - if (sName == L"p") - { - oBuilder += L""; - readP(L"", oBuilder); - oBuilder += L""; - } - else if (sName == L"poem") - readPoem(oBuilder); - else if (sName == L"cite") - readCite(oBuilder); - else if (sName == L"empty-line") - oBuilder += L""; - // Автор эпиграфа выделяется полужирным - else if (sName == L"text-author") - { - oBuilder += L""; - readP(L"", oBuilder); - oBuilder += L""; - } - } - } + int nDeath = m_oLightReader.GetDepth(); + while (m_oLightReader.ReadNextSiblingNode(nDeath)) + { + std::wstring sName = m_oLightReader.GetName(); + if (sName == L"p") + { + oBuilder += L""; + readP(L"", oBuilder); + oBuilder += L""; + } + else if (sName == L"poem") + readPoem(oBuilder); + else if (sName == L"cite") + readCite(oBuilder); + else if (sName == L"empty-line") + oBuilder += L""; + // Автор эпиграфа выделяется полужирным + else if (sName == L"text-author") + { + oBuilder += L""; + readP(L"", oBuilder); + oBuilder += L""; + } + } + } - // Читает p - // НЕ имеет право писать p - // sRStyle - накопленный стиль - void readP(const std::wstring& sRStyle, NSStringUtils::CStringBuilder& oBuilder) - { - readCrossReference(oBuilder); + // Читает p + // НЕ имеет право писать p + // sRStyle - накопленный стиль + void readP(const std::wstring& sRStyle, NSStringUtils::CStringBuilder& oBuilder) + { + readCrossReference(oBuilder); - if (m_oLightReader.IsEmptyNode()) - return; + if (m_oLightReader.IsEmptyNode()) + return; - int nDepth = m_oLightReader.GetDepth(); - while (m_oLightReader.ReadNextSiblingNode2(nDepth)) - { - std::wstring sName = m_oLightReader.GetName(); - // Читаем обычный текст - if (sName == L"#text") - { - // Стиль текста - oBuilder += L""; - oBuilder += sRStyle; - // Сам текст - oBuilder += L""; - oBuilder.WriteEncodeXmlString(m_oLightReader.GetText()); - oBuilder += L""; + int nDepth = m_oLightReader.GetDepth(); + while (m_oLightReader.ReadNextSiblingNode2(nDepth)) + { + std::wstring sName = m_oLightReader.GetName(); + // Читаем обычный текст + if (sName == L"#text") + { + // Стиль текста + oBuilder += L""; + oBuilder += sRStyle; + // Сам текст + oBuilder += L""; + oBuilder.WriteEncodeXmlString(m_oLightReader.GetText()); + oBuilder += L""; - } - // Читаем полужирный текст - else if (sName == L"strong") - readP(sRStyle + L"", oBuilder); - // Читаем курсивный текст - else if (sName == L"emphasis") - readP(sRStyle + L"", oBuilder); - // Читаем стилизованный текст - else if (sName == L"style") - readP(sRStyle, oBuilder); - // Читаем ссылку - else if (sName == L"a") - { + } + // Читаем полужирный текст + else if (sName == L"strong") + readP(sRStyle + L"", oBuilder); + // Читаем курсивный текст + else if (sName == L"emphasis") + readP(sRStyle + L"", oBuilder); + // Читаем стилизованный текст + else if (sName == L"style") + readP(sRStyle, oBuilder); + // Читаем ссылку + else if (sName == L"a") + { bool bCross = true, bMsoFootnote = false; - // Читаем href - std::wstring sRef; - while (m_oLightReader.MoveToNextAttribute()) - { - std::wstring sTName = m_oLightReader.GetName(); + // Читаем href + std::wstring sRef; + while (m_oLightReader.MoveToNextAttribute()) + { + std::wstring sTName = m_oLightReader.GetName(); std::wstring sTText = m_oLightReader.GetText(); - size_t nLen = (sTName.length() > 4 ? sTName.length() - 4 : 0); - if (sTName.substr(nLen) == L"href") - { + size_t nLen = (sTName.length() > 4 ? sTName.length() - 4 : 0); + if (sTName.substr(nLen) == L"href") + { size_t nRef = sTText.find('#'); - if (nRef != 0) - { - bCross = false; + if (nRef != 0) + { + bCross = false; sRef = sTText; - } + } else if (sTText.length() > 1) sRef = sTText.substr(1); - break; - } + break; + } if (sTName == L"style" && sTText.find(L"mso-footnote-id") != std::wstring::npos) bMsoFootnote = true; - } - m_oLightReader.MoveToElement(); + } + m_oLightReader.MoveToElement(); if (m_bFootnote && bMsoFootnote) continue; - if (bCross) - { - std::map::iterator it = m_mFootnotes.find(sRef); - if (it != m_mFootnotes.end()) - { - // Читаем текст внутри сноски + if (bCross) + { + std::map::iterator it = m_mFootnotes.find(sRef); + if (it != m_mFootnotes.end()) + { + // Читаем текст внутри сноски if (!bMsoFootnote) readP(sRStyle, oBuilder); - // Стиль сноски - oBuilder += L"second; - oBuilder += L"\"/>"; - } - // Перекрестная ссылка - else - { - oBuilder += L""; - // Читаем текст внутри ссылки - readP(sRStyle + L"", oBuilder); - oBuilder += L""; - } - } - else - { - // Пишем рельсы + // Стиль сноски + oBuilder += L"second; + oBuilder += L"\"/>"; + } + // Перекрестная ссылка + else + { + oBuilder += L""; + // Читаем текст внутри ссылки + readP(sRStyle + L"", oBuilder); + oBuilder += L""; + } + } + else + { + // Пишем рельсы NSStringUtils::CStringBuilder* oRelationshipXml = &m_oDocXmlRels; if (m_bInNote) oRelationshipXml = &m_oNoteXmlRels; @@ -459,1406 +459,1406 @@ public: oRelationshipXml->WriteEncodeXmlString(sRef); oRelationshipXml->WriteString(L"\" TargetMode=\"External\"/>"); - // Пишем в document.xml - oBuilder.WriteString(L""); + // Пишем в document.xml + oBuilder.WriteString(L""); - // Читаем текст внутри ссылки - readP(sRStyle, oBuilder); - oBuilder += L""; - } - } - // Читаем вычеркнутый текст - else if (sName == L"strikethrough") - readP(sRStyle + L"", oBuilder); - // Читает нижний текст - else if (sName == L"sub") - readP(sRStyle + L"", oBuilder); - // Читает верхний текст - else if (sName == L"sup") - readP(sRStyle + L"", oBuilder); - // Читает код - else if (sName == L"code") - readP(sRStyle + L"", oBuilder); - // Читает картинку в тексте - else if (sName == L"image") - readImage(oBuilder); - } - } + // Читаем текст внутри ссылки + readP(sRStyle, oBuilder); + oBuilder += L""; + } + } + // Читаем вычеркнутый текст + else if (sName == L"strikethrough") + readP(sRStyle + L"", oBuilder); + // Читает нижний текст + else if (sName == L"sub") + readP(sRStyle + L"", oBuilder); + // Читает верхний текст + else if (sName == L"sup") + readP(sRStyle + L"", oBuilder); + // Читает код + else if (sName == L"code") + readP(sRStyle + L"", oBuilder); + // Читает картинку в тексте + else if (sName == L"image") + readImage(oBuilder); + } + } - // Читает poem - void readPoem(NSStringUtils::CStringBuilder& oBuilder) - { - readCrossReference(oBuilder); + // Читает poem + void readPoem(NSStringUtils::CStringBuilder& oBuilder) + { + readCrossReference(oBuilder); - if (m_oLightReader.IsEmptyNode()) - return; + if (m_oLightReader.IsEmptyNode()) + return; - int nDeath = m_oLightReader.GetDepth(); - while (m_oLightReader.ReadNextSiblingNode(nDeath)) - { - std::wstring sName = m_oLightReader.GetName(); - if (sName == L"title") - readTitle(L"title4", oBuilder); - else if (sName == L"epigraph") - readEpigraph(oBuilder); - else if (sName == L"stanza") - { - if (m_oLightReader.IsEmptyNode()) - continue; + int nDeath = m_oLightReader.GetDepth(); + while (m_oLightReader.ReadNextSiblingNode(nDeath)) + { + std::wstring sName = m_oLightReader.GetName(); + if (sName == L"title") + readTitle(L"title4", oBuilder); + else if (sName == L"epigraph") + readEpigraph(oBuilder); + else if (sName == L"stanza") + { + if (m_oLightReader.IsEmptyNode()) + continue; - int nSDeath = m_oLightReader.GetDepth(); - while (m_oLightReader.ReadNextSiblingNode(nSDeath)) - { - std::wstring sSName = m_oLightReader.GetName(); - if (sSName == L"title") - readTitle(L"title5", oBuilder); - else if (sSName == L"v" || sSName == L"subtitle") - { - oBuilder += L""; - readP(L"", oBuilder); - oBuilder += L""; - } - } - } - // Автор поэмы выделяется полужирным - else if (sName == L"text-author") - { - oBuilder += L""; - readP(L"", oBuilder); - oBuilder += L""; - } - else if (sName == L"date") - { - oBuilder += L""; - oBuilder.WriteEncodeXmlString(content()); - oBuilder += L""; - } - } - } + int nSDeath = m_oLightReader.GetDepth(); + while (m_oLightReader.ReadNextSiblingNode(nSDeath)) + { + std::wstring sSName = m_oLightReader.GetName(); + if (sSName == L"title") + readTitle(L"title5", oBuilder); + else if (sSName == L"v" || sSName == L"subtitle") + { + oBuilder += L""; + readP(L"", oBuilder); + oBuilder += L""; + } + } + } + // Автор поэмы выделяется полужирным + else if (sName == L"text-author") + { + oBuilder += L""; + readP(L"", oBuilder); + oBuilder += L""; + } + else if (sName == L"date") + { + oBuilder += L""; + oBuilder.WriteEncodeXmlString(content()); + oBuilder += L""; + } + } + } - // Читает cite - void readCite(NSStringUtils::CStringBuilder& oBuilder) - { - readCrossReference(oBuilder); + // Читает cite + void readCite(NSStringUtils::CStringBuilder& oBuilder) + { + readCrossReference(oBuilder); - if (m_oLightReader.IsEmptyNode()) - return; + if (m_oLightReader.IsEmptyNode()) + return; - int nDeath = m_oLightReader.GetDepth(); - while (m_oLightReader.ReadNextSiblingNode(nDeath)) - { - std::wstring sName = m_oLightReader.GetName(); - if (sName == L"p" || sName == L"subtitle") - { - oBuilder += L""; - readP(L"", oBuilder); - oBuilder += L""; - } - else if (sName == L"empty-line") - oBuilder += L""; - else if (sName == L"poem") - readPoem(oBuilder); - else if (sName == L"table") - readTable(oBuilder); - // Автор цитаты выделяется полужирным - else if (sName == L"text-author") - { - oBuilder += L""; - readP(L"", oBuilder); - oBuilder += L""; - } - } - } + int nDeath = m_oLightReader.GetDepth(); + while (m_oLightReader.ReadNextSiblingNode(nDeath)) + { + std::wstring sName = m_oLightReader.GetName(); + if (sName == L"p" || sName == L"subtitle") + { + oBuilder += L""; + readP(L"", oBuilder); + oBuilder += L""; + } + else if (sName == L"empty-line") + oBuilder += L""; + else if (sName == L"poem") + readPoem(oBuilder); + else if (sName == L"table") + readTable(oBuilder); + // Автор цитаты выделяется полужирным + else if (sName == L"text-author") + { + oBuilder += L""; + readP(L"", oBuilder); + oBuilder += L""; + } + } + } - // Читает table - void readTable(NSStringUtils::CStringBuilder& oBuilder) - { - readCrossReference(oBuilder); + // Читает table + void readTable(NSStringUtils::CStringBuilder& oBuilder) + { + readCrossReference(oBuilder); - if (m_oLightReader.IsEmptyNode()) - return; + if (m_oLightReader.IsEmptyNode()) + return; - // Стиль таблицы - oBuilder += L""; + // Стиль таблицы + oBuilder += L""; - NSStringUtils::CStringBuilder oTmpBuilder; - std::vector mTable; - int nGridCol = 0; - int i = 1; // Строка - int nDeath = m_oLightReader.GetDepth(); - while (m_oLightReader.ReadNextSiblingNode(nDeath)) - { - // tr - строки в таблице - if (m_oLightReader.GetName() != L"tr" || m_oLightReader.IsEmptyNode()) - continue; - int nTCol = 0; - int j = 1; // Столбец - oTmpBuilder += L""; - int nTrDeath = m_oLightReader.GetDepth(); - while (m_oLightReader.ReadNextSiblingNode(nTrDeath)) - { - int nColspan = 1; - int nRowspan = 1; - while(m_oLightReader.MoveToNextAttribute()) - { - if(m_oLightReader.GetName() == L"colspan") - nColspan = stoi(m_oLightReader.GetText()); - else if(m_oLightReader.GetName() == L"rowspan") - nRowspan = stoi(m_oLightReader.GetText()); - } - m_oLightReader.MoveToElement(); + NSStringUtils::CStringBuilder oTmpBuilder; + std::vector mTable; + int nGridCol = 0; + int i = 1; // Строка + int nDeath = m_oLightReader.GetDepth(); + while (m_oLightReader.ReadNextSiblingNode(nDeath)) + { + // tr - строки в таблице + if (m_oLightReader.GetName() != L"tr" || m_oLightReader.IsEmptyNode()) + continue; + int nTCol = 0; + int j = 1; // Столбец + oTmpBuilder += L""; + int nTrDeath = m_oLightReader.GetDepth(); + while (m_oLightReader.ReadNextSiblingNode(nTrDeath)) + { + int nColspan = 1; + int nRowspan = 1; + while(m_oLightReader.MoveToNextAttribute()) + { + if(m_oLightReader.GetName() == L"colspan") + nColspan = stoi(m_oLightReader.GetText()); + else if(m_oLightReader.GetName() == L"rowspan") + nRowspan = stoi(m_oLightReader.GetText()); + } + m_oLightReader.MoveToElement(); - // Вставляем ячейки до - std::vector::iterator it1 = std::find_if(mTable.begin(), mTable.end(), [i, j](const CTc& item){ return item.i == i && item.j == j; }); - std::vector::iterator it2 = std::find_if(mTable.begin(), mTable.end(), [j] (const CTc& item){ return item.i == 0 && item.j == j; }); - while(it1 != mTable.end() || it2 != mTable.end()) - { - oTmpBuilder.WriteString(L"sGridSpan : it2->sGridSpan); - oTmpBuilder.WriteString(sCol); - oTmpBuilder.WriteString(L"\"/>"); - j += stoi(sCol); - it1 = std::find_if(mTable.begin(), mTable.end(), [i, j](const CTc& item){ return item.i == i && item.j == j; }); - it2 = std::find_if(mTable.begin(), mTable.end(), [j] (const CTc& item){ return item.i == 0 && item.j == j; }); - } + // Вставляем ячейки до + std::vector::iterator it1 = std::find_if(mTable.begin(), mTable.end(), [i, j](const CTc& item){ return item.i == i && item.j == j; }); + std::vector::iterator it2 = std::find_if(mTable.begin(), mTable.end(), [j] (const CTc& item){ return item.i == 0 && item.j == j; }); + while(it1 != mTable.end() || it2 != mTable.end()) + { + oTmpBuilder.WriteString(L"sGridSpan : it2->sGridSpan); + oTmpBuilder.WriteString(sCol); + oTmpBuilder.WriteString(L"\"/>"); + j += stoi(sCol); + it1 = std::find_if(mTable.begin(), mTable.end(), [i, j](const CTc& item){ return item.i == i && item.j == j; }); + it2 = std::find_if(mTable.begin(), mTable.end(), [j] (const CTc& item){ return item.i == 0 && item.j == j; }); + } - oTmpBuilder += L""; - if (nRowspan != 1) - { - oTmpBuilder.WriteString(L""); - std::wstring sColspan = std::to_wstring(nColspan); - if (nRowspan == 0) - mTable.push_back({0, j, sColspan}); - else - for (int k = i + 1; k < i + nRowspan; k++) - mTable.push_back({k, j, sColspan}); - } - if (nColspan != 1) - { - oTmpBuilder.WriteString(L""); - j += nColspan - 1; - } - oTmpBuilder.WriteString(L""); - // Читаем th. Ячейка заголовка таблицы. Выравнивание посередине. Выделяется полужирным - if (m_oLightReader.GetName() == L"th") - { - if (++nTCol > nGridCol) - nGridCol = nTCol; - oTmpBuilder += L""; - readP(L"", oTmpBuilder); - } - // Читаем td. Ячейка таблицы. Выравнивание вправо - else if (m_oLightReader.GetName() == L"td") - { - if(++nTCol > nGridCol) - nGridCol = nTCol; - oTmpBuilder += L""; - readP(L"", oTmpBuilder); - } - oTmpBuilder += L""; - j++; + oTmpBuilder += L""; + if (nRowspan != 1) + { + oTmpBuilder.WriteString(L""); + std::wstring sColspan = std::to_wstring(nColspan); + if (nRowspan == 0) + mTable.push_back({0, j, sColspan}); + else + for (int k = i + 1; k < i + nRowspan; k++) + mTable.push_back({k, j, sColspan}); + } + if (nColspan != 1) + { + oTmpBuilder.WriteString(L""); + j += nColspan - 1; + } + oTmpBuilder.WriteString(L""); + // Читаем th. Ячейка заголовка таблицы. Выравнивание посередине. Выделяется полужирным + if (m_oLightReader.GetName() == L"th") + { + if (++nTCol > nGridCol) + nGridCol = nTCol; + oTmpBuilder += L""; + readP(L"", oTmpBuilder); + } + // Читаем td. Ячейка таблицы. Выравнивание вправо + else if (m_oLightReader.GetName() == L"td") + { + if(++nTCol > nGridCol) + nGridCol = nTCol; + oTmpBuilder += L""; + readP(L"", oTmpBuilder); + } + oTmpBuilder += L""; + j++; - // Вставляем ячейки после - it1 = std::find_if(mTable.begin(), mTable.end(), [i, j](const CTc& item){ return item.i == i && item.j == j; }); - it2 = std::find_if(mTable.begin(), mTable.end(), [j] (const CTc& item){ return item.i == 0 && item.j == j; }); - while(it1 != mTable.end() || it2 != mTable.end()) - { - oTmpBuilder.WriteString(L"sGridSpan : it2->sGridSpan); - oTmpBuilder.WriteString(sCol); - oTmpBuilder.WriteString(L"\"/>"); - j += stoi(sCol); - it1 = std::find_if(mTable.begin(), mTable.end(), [i, j](const CTc& item){ return item.i == i && item.j == j; }); - it2 = std::find_if(mTable.begin(), mTable.end(), [j] (const CTc& item){ return item.i == 0 && item.j == j; }); - } - } - oTmpBuilder += L""; - i++; - } - // Размеры таблицы - std::wstring sGridCol; - if (nGridCol != 0) - sGridCol = std::to_wstring((int)(9570.0 / (double)nGridCol)); - oBuilder += L""; - for (int i = 0; i < nGridCol; i++) - { - oBuilder += L""; - } - oBuilder += L""; - // Конец таблицы - oBuilder += oTmpBuilder.GetData(); - oBuilder += L""; - // Пустая строка после таблицы, чтобы следующий текст не приклеивался - oBuilder += L""; - } + // Вставляем ячейки после + it1 = std::find_if(mTable.begin(), mTable.end(), [i, j](const CTc& item){ return item.i == i && item.j == j; }); + it2 = std::find_if(mTable.begin(), mTable.end(), [j] (const CTc& item){ return item.i == 0 && item.j == j; }); + while(it1 != mTable.end() || it2 != mTable.end()) + { + oTmpBuilder.WriteString(L"sGridSpan : it2->sGridSpan); + oTmpBuilder.WriteString(sCol); + oTmpBuilder.WriteString(L"\"/>"); + j += stoi(sCol); + it1 = std::find_if(mTable.begin(), mTable.end(), [i, j](const CTc& item){ return item.i == i && item.j == j; }); + it2 = std::find_if(mTable.begin(), mTable.end(), [j] (const CTc& item){ return item.i == 0 && item.j == j; }); + } + } + oTmpBuilder += L""; + i++; + } + // Размеры таблицы + std::wstring sGridCol; + if (nGridCol != 0) + sGridCol = std::to_wstring((int)(9570.0 / (double)nGridCol)); + oBuilder += L""; + for (int i = 0; i < nGridCol; i++) + { + oBuilder += L""; + } + oBuilder += L""; + // Конец таблицы + oBuilder += oTmpBuilder.GetData(); + oBuilder += L""; + // Пустая строка после таблицы, чтобы следующий текст не приклеивался + oBuilder += L""; + } void readAnnotationFromDescription(NSStringUtils::CStringBuilder& oBuilder, bool bInP) - { - if (m_oLightReader.IsEmptyNode()) - return; + { + if (m_oLightReader.IsEmptyNode()) + return; - int nADeath = m_oLightReader.GetDepth(); - while (m_oLightReader.ReadNextSiblingNode2(nADeath)) - { - std::wstring sAnName = m_oLightReader.GetName(); - if (sAnName == L"#text") + int nADeath = m_oLightReader.GetDepth(); + while (m_oLightReader.ReadNextSiblingNode2(nADeath)) + { + std::wstring sAnName = m_oLightReader.GetName(); + if (sAnName == L"#text") { if (!bInP) continue; m_oTitleInfo.m_sAnnotation += ((m_oTitleInfo.m_sAnnotation.empty() ? L"" : L" ") + m_oLightReader.GetText()); } - else + else readAnnotationFromDescription(oBuilder, bInP || sAnName == L"p" || sAnName == L"poem" || sAnName == L"cite" || sAnName == L"subtitle"); - } - } + } + } - // Читает annotation - void readAnnotation(NSStringUtils::CStringBuilder& oBuilder) - { - readCrossReference(oBuilder); + // Читает annotation + void readAnnotation(NSStringUtils::CStringBuilder& oBuilder) + { + readCrossReference(oBuilder); - if (m_oLightReader.IsEmptyNode()) - return; + if (m_oLightReader.IsEmptyNode()) + return; - int nADeath = m_oLightReader.GetDepth(); - while (m_oLightReader.ReadNextSiblingNode(nADeath)) - { - std::wstring sAnName = m_oLightReader.GetName(); - if (sAnName == L"p" || sAnName == L"subtitle") - { - oBuilder += L""; - readP(L"", oBuilder); - oBuilder += L""; - } - else if (sAnName == L"poem") - readPoem(oBuilder); - else if (sAnName == L"cite") - readCite(oBuilder); - else if (sAnName == L"empty-line") - oBuilder += L""; - else if (sAnName == L"table") - readTable(oBuilder); - } - } + int nADeath = m_oLightReader.GetDepth(); + while (m_oLightReader.ReadNextSiblingNode(nADeath)) + { + std::wstring sAnName = m_oLightReader.GetName(); + if (sAnName == L"p" || sAnName == L"subtitle") + { + oBuilder += L""; + readP(L"", oBuilder); + oBuilder += L""; + } + else if (sAnName == L"poem") + readPoem(oBuilder); + else if (sAnName == L"cite") + readCite(oBuilder); + else if (sAnName == L"empty-line") + oBuilder += L""; + else if (sAnName == L"table") + readTable(oBuilder); + } + } - // Читает перекрестные ссылки - void readCrossReference(NSStringUtils::CStringBuilder& oBuilder) - { - // id для перекрестных ссылок - while (m_oLightReader.MoveToNextAttribute()) - { - if (m_oLightReader.GetName() == L"id") - { - std::wstring sCrossId = std::to_wstring(m_nCrossReferenceId++); - oBuilder += L""; - break; - } - } - m_oLightReader.MoveToElement(); - } + // Читает перекрестные ссылки + void readCrossReference(NSStringUtils::CStringBuilder& oBuilder) + { + // id для перекрестных ссылок + while (m_oLightReader.MoveToNextAttribute()) + { + if (m_oLightReader.GetName() == L"id") + { + std::wstring sCrossId = std::to_wstring(m_nCrossReferenceId++); + oBuilder += L""; + break; + } + } + m_oLightReader.MoveToElement(); + } - // Читает section - void readSection(int nLevel, NSStringUtils::CStringBuilder& oBuilder) - { - readCrossReference(oBuilder); + // Читает section + void readSection(int nLevel, NSStringUtils::CStringBuilder& oBuilder) + { + readCrossReference(oBuilder); - if (m_oLightReader.IsEmptyNode()) - return; + if (m_oLightReader.IsEmptyNode()) + return; - int nDeath = m_oLightReader.GetDepth(); - while (m_oLightReader.ReadNextSiblingNode(nDeath)) - { - std::wstring sName = m_oLightReader.GetName(); - if (sName == L"title") - { - std::wstring sTitle = L"section-p"; - if (nLevel < 10) - sTitle = L"title" + std::to_wstring(nLevel); - readTitle(sTitle, oBuilder); - } - else if (sName == L"epigraph") - readEpigraph(oBuilder); - else if (sName == L"image") - { - oBuilder += L""; - readImage(oBuilder); - oBuilder += L""; - } - else if (sName == L"annotation") - readAnnotation(oBuilder); - else if (sName == L"section") - readSection(nLevel + 1, oBuilder); - else if (sName == L"p") - { - oBuilder += L""; - readP(L"", oBuilder); - oBuilder += L""; - } - else if (sName == L"subtitle") - { - oBuilder += L""; - readP(L"", oBuilder); - oBuilder += L""; - } - else if (sName == L"poem") - readPoem(oBuilder); - else if (sName == L"cite") - readCite(oBuilder); - else if (sName == L"empty-line") - oBuilder += L""; - else if (sName == L"table") - readTable(oBuilder); - } - } + int nDeath = m_oLightReader.GetDepth(); + while (m_oLightReader.ReadNextSiblingNode(nDeath)) + { + std::wstring sName = m_oLightReader.GetName(); + if (sName == L"title") + { + std::wstring sTitle = L"section-p"; + if (nLevel < 10) + sTitle = L"title" + std::to_wstring(nLevel); + readTitle(sTitle, oBuilder); + } + else if (sName == L"epigraph") + readEpigraph(oBuilder); + else if (sName == L"image") + { + oBuilder += L""; + readImage(oBuilder); + oBuilder += L""; + } + else if (sName == L"annotation") + readAnnotation(oBuilder); + else if (sName == L"section") + readSection(nLevel + 1, oBuilder); + else if (sName == L"p") + { + oBuilder += L""; + readP(L"", oBuilder); + oBuilder += L""; + } + else if (sName == L"subtitle") + { + oBuilder += L""; + readP(L"", oBuilder); + oBuilder += L""; + } + else if (sName == L"poem") + readPoem(oBuilder); + else if (sName == L"cite") + readCite(oBuilder); + else if (sName == L"empty-line") + oBuilder += L""; + else if (sName == L"table") + readTable(oBuilder); + } + } - // Читает body - void readBody(NSStringUtils::CStringBuilder& oBuilder) - { - if (m_oLightReader.IsEmptyNode()) - return; + // Читает body + void readBody(NSStringUtils::CStringBuilder& oBuilder) + { + if (m_oLightReader.IsEmptyNode()) + return; - int nDeath = m_oLightReader.GetDepth(); - while (m_oLightReader.ReadNextSiblingNode(nDeath)) - { - std::wstring sName = m_oLightReader.GetName(); - if (sName == L"image") - { - oBuilder += L""; - readImage(oBuilder); - oBuilder += L""; - } - else if (sName == L"title") - readTitle(L"title", oBuilder); - else if (sName == L"epigraph") - readEpigraph(oBuilder); - else if (sName == L"section") - readSection(1, oBuilder); - } - } + int nDeath = m_oLightReader.GetDepth(); + while (m_oLightReader.ReadNextSiblingNode(nDeath)) + { + std::wstring sName = m_oLightReader.GetName(); + if (sName == L"image") + { + oBuilder += L""; + readImage(oBuilder); + oBuilder += L""; + } + else if (sName == L"title") + readTitle(L"title", oBuilder); + else if (sName == L"epigraph") + readEpigraph(oBuilder); + else if (sName == L"section") + readSection(1, oBuilder); + } + } - // Читает содержание, binary, body, сноски, description - bool readText(const std::wstring& sPath, const std::wstring& sMediaDirectory, NSStringUtils::CStringBuilder& oContents, NSStringUtils::CStringBuilder& oFootnotes) - { - if (!m_oLightReader.IsValid()) - { - // Открывает файл на проверку - if (!OpenFromFile(sPath)) - return false; - // Читаем FictionBook - if (!isFictionBook()) - return false; - } + // Читает содержание, binary, body, сноски, description + bool readText(const std::wstring& sPath, const std::wstring& sMediaDirectory, NSStringUtils::CStringBuilder& oContents, NSStringUtils::CStringBuilder& oFootnotes) + { + if (!m_oLightReader.IsValid()) + { + // Открывает файл на проверку + if (!OpenFromFile(sPath)) + return false; + // Читаем FictionBook + if (!isFictionBook()) + return false; + } - if (m_oLightReader.IsEmptyNode()) - return true; + if (m_oLightReader.IsEmptyNode()) + return true; - int nContentsId = 1; - int nImageId = 1; - int nFootnoteId = 1; - oContents += L""; + int nContentsId = 1; + int nImageId = 1; + int nFootnoteId = 1; + oContents += L""; - int nDeath = m_oLightReader.GetDepth(); - while (m_oLightReader.ReadNextSiblingNode(nDeath)) - { - std::wstring sName = m_oLightReader.GetName(); - // Читаем body - if (sName == L"body") - { - // Сноски - bool bNotes = false; - while(m_oLightReader.MoveToNextAttribute()) - { - if (m_oLightReader.GetName() == L"name" && - m_oLightReader.GetText() == L"notes") - bNotes = true; - } - m_oLightReader.MoveToElement(); - // Читаем сноски - if (bNotes) - readNotes(nFootnoteId, oFootnotes); - // Читаем содержание - else - readContents(nContentsId, oContents); - } - // Читаем картинки - else if (sName == L"binary") - getImage(std::to_wstring(nImageId++), sMediaDirectory); - } - oContents += L""; - return true; - } + int nDeath = m_oLightReader.GetDepth(); + while (m_oLightReader.ReadNextSiblingNode(nDeath)) + { + std::wstring sName = m_oLightReader.GetName(); + // Читаем body + if (sName == L"body") + { + // Сноски + bool bNotes = false; + while(m_oLightReader.MoveToNextAttribute()) + { + if (m_oLightReader.GetName() == L"name" && + m_oLightReader.GetText() == L"notes") + bNotes = true; + } + m_oLightReader.MoveToElement(); + // Читаем сноски + if (bNotes) + readNotes(nFootnoteId, oFootnotes); + // Читаем содержание + else + readContents(nContentsId, oContents); + } + // Читаем картинки + else if (sName == L"binary") + getImage(std::to_wstring(nImageId++), sMediaDirectory); + } + oContents += L""; + return true; + } - // Читает содержание - void readContents(int& nContentsId, NSStringUtils::CStringBuilder& oContents) - { - if (m_oLightReader.IsEmptyNode()) - return; + // Читает содержание + void readContents(int& nContentsId, NSStringUtils::CStringBuilder& oContents) + { + if (m_oLightReader.IsEmptyNode()) + return; - bool bFirstTitle = true; - int nBDeath = m_oLightReader.GetDepth(); - while (m_oLightReader.ReadNextSiblingNode(nBDeath)) - { - // Читаем section - if (m_oLightReader.GetName() != L"section" || m_oLightReader.IsEmptyNode()) - continue; - int nSDeath = m_oLightReader.GetDepth(); - while (m_oLightReader.ReadNextSiblingNode(nSDeath)) - { - // Читаем title - if (m_oLightReader.GetName() != L"title" || m_oLightReader.IsEmptyNode()) - continue; - oContents += L""; - // Абзац с новой страницы - if (bFirstTitle) - oContents += L""; - oContents += L""; - if (bFirstTitle) - { - oContents += L"TOC \\n \\h "; - bFirstTitle = false; - } - oContents += L""; + bool bFirstTitle = true; + int nBDeath = m_oLightReader.GetDepth(); + while (m_oLightReader.ReadNextSiblingNode(nBDeath)) + { + // Читаем section + if (m_oLightReader.GetName() != L"section" || m_oLightReader.IsEmptyNode()) + continue; + int nSDeath = m_oLightReader.GetDepth(); + while (m_oLightReader.ReadNextSiblingNode(nSDeath)) + { + // Читаем title + if (m_oLightReader.GetName() != L"title" || m_oLightReader.IsEmptyNode()) + continue; + oContents += L""; + // Абзац с новой страницы + if (bFirstTitle) + oContents += L""; + oContents += L""; + if (bFirstTitle) + { + oContents += L"TOC \\n \\h "; + bFirstTitle = false; + } + oContents += L""; - int nTDeath = m_oLightReader.GetDepth(); - while (m_oLightReader.ReadNextSiblingNode(nTDeath)) - { - if (m_oLightReader.GetName() == L"p") - { - readP(L"", oContents); - // Вставляем пробел между словами - oContents += L" "; - } - } - oContents += L""; - } - } - if (!bFirstTitle) - oContents += L""; - } + int nTDeath = m_oLightReader.GetDepth(); + while (m_oLightReader.ReadNextSiblingNode(nTDeath)) + { + if (m_oLightReader.GetName() == L"p") + { + readP(L"", oContents); + // Вставляем пробел между словами + oContents += L" "; + } + } + oContents += L""; + } + } + if (!bFirstTitle) + oContents += L""; + } - // Читает сноски - void readNotes(int& nFootnoteId, NSStringUtils::CStringBuilder& oFootnotes) - { - if (m_oLightReader.IsEmptyNode()) - return; + // Читает сноски + void readNotes(int& nFootnoteId, NSStringUtils::CStringBuilder& oFootnotes) + { + if (m_oLightReader.IsEmptyNode()) + return; m_bInNote = true; - int nBDepth = m_oLightReader.GetDepth(); - while (m_oLightReader.ReadNextSiblingNode(nBDepth)) - { - if (m_oLightReader.GetName() != L"section") - continue; - // Читаем id - std::wstring sFootnoteName; - while (m_oLightReader.MoveToNextAttribute()) - { - if (m_oLightReader.GetName() == L"id") - { - sFootnoteName = m_oLightReader.GetText(); - break; - } - } - m_oLightReader.MoveToElement(); - if (sFootnoteName.empty() || m_oLightReader.IsEmptyNode()) - continue; + int nBDepth = m_oLightReader.GetDepth(); + while (m_oLightReader.ReadNextSiblingNode(nBDepth)) + { + if (m_oLightReader.GetName() != L"section") + continue; + // Читаем id + std::wstring sFootnoteName; + while (m_oLightReader.MoveToNextAttribute()) + { + if (m_oLightReader.GetName() == L"id") + { + sFootnoteName = m_oLightReader.GetText(); + break; + } + } + m_oLightReader.MoveToElement(); + if (sFootnoteName.empty() || m_oLightReader.IsEmptyNode()) + continue; - std::wstring sFootnoteId = std::to_wstring(nFootnoteId++); - m_mFootnotes.insert(std::make_pair(sFootnoteName, sFootnoteId)); - // Пишем сноску - oFootnotes += L""; + std::wstring sFootnoteId = std::to_wstring(nFootnoteId++); + m_mFootnotes.insert(std::make_pair(sFootnoteName, sFootnoteId)); + // Пишем сноску + oFootnotes += L""; - // Читаем внутренность section - int nSDepth = m_oLightReader.GetDepth(); - while (m_oLightReader.ReadNextSiblingNode(nSDepth)) - { - std::wstring sName = m_oLightReader.GetName(); - if (sName == L"title") - { - if (m_oLightReader.IsEmptyNode()) - continue; + // Читаем внутренность section + int nSDepth = m_oLightReader.GetDepth(); + while (m_oLightReader.ReadNextSiblingNode(nSDepth)) + { + std::wstring sName = m_oLightReader.GetName(); + if (sName == L"title") + { + if (m_oLightReader.IsEmptyNode()) + continue; - int nTDepth = m_oLightReader.GetDepth(); - while (m_oLightReader.ReadNextSiblingNode(nTDepth)) - { - if (m_oLightReader.GetName() == L"p") + int nTDepth = m_oLightReader.GetDepth(); + while (m_oLightReader.ReadNextSiblingNode(nTDepth)) + { + if (m_oLightReader.GetName() == L"p") ReadFootnote(oFootnotes); - } - } - else if (sName == L"p" || sName == L"subtitle") + } + } + else if (sName == L"p" || sName == L"subtitle") ReadFootnote(oFootnotes); - else if (sName == L"poem") - { - if (m_oLightReader.IsEmptyNode()) - continue; + else if (sName == L"poem") + { + if (m_oLightReader.IsEmptyNode()) + continue; - int nPDepth = m_oLightReader.GetDepth(); - while (m_oLightReader.ReadNextSiblingNode(nPDepth)) - { - std::wstring sPName = m_oLightReader.GetName(); - // Читаем stanza (один или более) - if (sPName == L"stanza") - { - if (m_oLightReader.IsEmptyNode()) - continue; + int nPDepth = m_oLightReader.GetDepth(); + while (m_oLightReader.ReadNextSiblingNode(nPDepth)) + { + std::wstring sPName = m_oLightReader.GetName(); + // Читаем stanza (один или более) + if (sPName == L"stanza") + { + if (m_oLightReader.IsEmptyNode()) + continue; - int nSDeath = m_oLightReader.GetDepth(); - while (m_oLightReader.ReadNextSiblingNode(nSDeath)) - { - // Читаем v (один или более) - if (m_oLightReader.GetName() == L"v") + int nSDeath = m_oLightReader.GetDepth(); + while (m_oLightReader.ReadNextSiblingNode(nSDeath)) + { + // Читаем v (один или более) + if (m_oLightReader.GetName() == L"v") ReadFootnote(oFootnotes); - } - } - // Читаем text-author (любое) - else if (sPName == L"text-author") + } + } + // Читаем text-author (любое) + else if (sPName == L"text-author") ReadFootnote(oFootnotes); - } - } - } - oFootnotes += L""; - } + } + } + } + oFootnotes += L""; + } m_bInNote = false; - } + } - // Читает binary - void getImage(const std::wstring& sImageId, const std::wstring& sMediaDirectory) - { - std::wstring sId, sType = L".png"; - while (m_oLightReader.MoveToNextAttribute()) - { - std::wstring sName = m_oLightReader.GetName(); - // Читает id - if (sName == L"id") - sId = m_oLightReader.GetText(); - else if (sName == L"content-type") - sType = m_oLightReader.GetText().find(L"jpeg") == std::wstring::npos ? L".png" : L".jpeg"; - } - m_oLightReader.MoveToElement(); - if (sId.empty() || m_oLightReader.IsEmptyNode()) - return; + // Читает binary + void getImage(const std::wstring& sImageId, const std::wstring& sMediaDirectory) + { + std::wstring sId, sType = L".png"; + while (m_oLightReader.MoveToNextAttribute()) + { + std::wstring sName = m_oLightReader.GetName(); + // Читает id + if (sName == L"id") + sId = m_oLightReader.GetText(); + else if (sName == L"content-type") + sType = m_oLightReader.GetText().find(L"jpeg") == std::wstring::npos ? L".png" : L".jpeg"; + } + m_oLightReader.MoveToElement(); + if (sId.empty() || m_oLightReader.IsEmptyNode()) + return; - // Пишет картинку в файл - NSFile::CFileBinary oImageWriter; - std::wstring sImagePath = sMediaDirectory + L"/image" + sImageId + sType; - if (oImageWriter.CreateFileW(sImagePath)) - { - std::string sBase64 = contentA(); - 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(); + // Пишет картинку в файл + NSFile::CFileBinary oImageWriter; + std::wstring sImagePath = sMediaDirectory + L"/image" + sImageId + sType; + if (oImageWriter.CreateFileW(sImagePath)) + { + std::string sBase64 = contentA(); + 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(); - // Получаем размеры картинки - CBgraFrame oBgraFrame; - oBgraFrame.OpenFile(sImagePath); - int nHy = oBgraFrame.get_Height(); - int nWx = oBgraFrame.get_Width(); - if (nWx > nHy) - { - int nW = nWx * 9525; - nW = (nW > 7000000 ? 7000000 : nW); - nHy = (int)((double)nHy * (double)nW / (double)nWx); - nWx = nW; - } - else - { - int nH = nHy * 9525; - nH = (nH > 9000000 ? 9000000 : nH); - int nW = (int)((double)nWx * (double)nH / (double)nHy); - if (nW > 7000000) - { - nW = 7000000; - nHy = (int)((double)nHy * (double)nW / (double)nWx); - } - else - nHy = nH; - nWx = nW; - } - std::vector vImage; - vImage.push_back(sImageId); - vImage.push_back(std::to_wstring(nWx)); - vImage.push_back(std::to_wstring(nHy)); + // Получаем размеры картинки + CBgraFrame oBgraFrame; + oBgraFrame.OpenFile(sImagePath); + int nHy = oBgraFrame.get_Height(); + int nWx = oBgraFrame.get_Width(); + if (nWx > nHy) + { + int nW = nWx * 9525; + nW = (nW > 7000000 ? 7000000 : nW); + nHy = (int)((double)nHy * (double)nW / (double)nWx); + nWx = nW; + } + else + { + int nH = nHy * 9525; + nH = (nH > 9000000 ? 9000000 : nH); + int nW = (int)((double)nWx * (double)nH / (double)nHy); + if (nW > 7000000) + { + nW = 7000000; + nHy = (int)((double)nHy * (double)nW / (double)nWx); + } + else + nHy = nH; + nWx = nW; + } + std::vector vImage; + vImage.push_back(sImageId); + vImage.push_back(std::to_wstring(nWx)); + vImage.push_back(std::to_wstring(nHy)); - m_mImages.insert(std::make_pair(sId, vImage)); - // Запись картинок в рельсы - m_oDocXmlRels += L""; - } - } + m_mImages.insert(std::make_pair(sId, vImage)); + // Запись картинок в рельсы + m_oDocXmlRels += L""; + } + } - // Читает description - void readDescription(NSStringUtils::CStringBuilder& oBuilder) - { - if (m_oLightReader.IsEmptyNode()) - return; + // Читает description + void readDescription(NSStringUtils::CStringBuilder& oBuilder) + { + if (m_oLightReader.IsEmptyNode()) + return; - int nDepth = m_oLightReader.GetDepth(); - while (m_oLightReader.ReadNextSiblingNode(nDepth)) - { - // Читаем title-info - if (m_oLightReader.GetName() == L"title-info") - getTitleInfo(oBuilder); - /* - // Читаем src-title-info (ноль или один) - else if(sName == L"src-title-info") - { - m_pSrcTitleInfo = new STitleInfo(); - getTitleInfo(*m_pSrcTitleInfo); - } - // Читаем document-info - else if(sName == L"document-info") - getDocumentInfo(); - // Читаем publish-info (ноль или один) - else if(sName == L"publish-info") - { - m_pPublishInfo = new SPublishInfo(); - getPublishInfo(); - } - // Читаем custom-info (любое) - else if(sName == L"custom-info") - getCustomInfo(); - */ - } - } + int nDepth = m_oLightReader.GetDepth(); + while (m_oLightReader.ReadNextSiblingNode(nDepth)) + { + // Читаем title-info + if (m_oLightReader.GetName() == L"title-info") + getTitleInfo(oBuilder); + /* + // Читаем src-title-info (ноль или один) + else if(sName == L"src-title-info") + { + m_pSrcTitleInfo = new STitleInfo(); + getTitleInfo(*m_pSrcTitleInfo); + } + // Читаем document-info + else if(sName == L"document-info") + getDocumentInfo(); + // Читаем publish-info (ноль или один) + else if(sName == L"publish-info") + { + m_pPublishInfo = new SPublishInfo(); + getPublishInfo(); + } + // Читаем custom-info (любое) + else if(sName == L"custom-info") + getCustomInfo(); + */ + } + } - // Читает custom-info - /* - void getCustomInfo() - { - std::wstring sIntoType = L""; - if(m_oLightReader.MoveToNextAttribute()) - sIntoType = m_oLightReader.GetText(); - m_oLightReader.MoveToElement(); - std::wstring sCustomInfo = content(); - m_mCustomInfo.insert(std::make_pair(sIntoType, sCustomInfo)); - } - */ + // Читает custom-info + /* + void getCustomInfo() + { + std::wstring sIntoType = L""; + if(m_oLightReader.MoveToNextAttribute()) + sIntoType = m_oLightReader.GetText(); + m_oLightReader.MoveToElement(); + std::wstring sCustomInfo = content(); + m_mCustomInfo.insert(std::make_pair(sIntoType, sCustomInfo)); + } + */ - // Читает publish-info - /* - void getPublishInfo() - { - if(m_oLightReader.IsEmptyNode()) - return; + // Читает publish-info + /* + void getPublishInfo() + { + if(m_oLightReader.IsEmptyNode()) + return; - int nDepth = m_oLightReader.GetDepth(); - while(m_oLightReader.ReadNextSiblingNode(nDepth)) - { - std::wstring sName = m_oLightReader.GetName(); - // Читаем book-name (ноль или один) - if(sName == L"book-name") - { - if(m_pPublishInfo->m_pBookName) - delete[] m_pPublishInfo->m_pBookName; - m_pPublishInfo->m_pBookName = new std::wstring[1]; - *m_pPublishInfo->m_pBookName = content(); - } - // Читаем publisher (ноль или один) - else if(sName == L"publisher") - { - if(m_pPublishInfo->m_pPublisher) - delete[] m_pPublishInfo->m_pPublisher; - m_pPublishInfo->m_pPublisher = new std::wstring[1]; - *m_pPublishInfo->m_pPublisher = content(); - } - // Читаем city (ноль или один) - else if(sName == L"city") - { - if(m_pPublishInfo->m_pCity) - delete[] m_pPublishInfo->m_pCity; - m_pPublishInfo->m_pCity = new std::wstring[1]; - *m_pPublishInfo->m_pCity = content(); - } - // Читаем year (ноль или один) - else if(sName == L"year") - { - if(m_pPublishInfo->m_pYear) - delete[] m_pPublishInfo->m_pYear; - m_pPublishInfo->m_pYear = new std::wstring[1]; - *m_pPublishInfo->m_pYear = content(); - } - // Читаем isbn (ноль или один) - else if(sName == L"isbn") - { - if(m_pPublishInfo->m_pIsbn) - delete[] m_pPublishInfo->m_pIsbn; - m_pPublishInfo->m_pIsbn = new std::wstring[1]; - *m_pPublishInfo->m_pIsbn = content(); - } - // Читаем sequence (любое) - else if(sName == L"sequence") - { - std::wstring sSName = L""; - std::wstring sSNumber = L""; - while(m_oLightReader.MoveToNextAttribute()) - { - if(m_oLightReader.GetName() == L"name") - sSName = m_oLightReader.GetText(); - else if(m_oLightReader.GetName() == L"number") - sSNumber = m_oLightReader.GetText(); - } - m_oLightReader.MoveToElement(); - m_pPublishInfo->m_mSequence.insert(std::make_pair(sSName, sSNumber)); - } - } - } - */ + int nDepth = m_oLightReader.GetDepth(); + while(m_oLightReader.ReadNextSiblingNode(nDepth)) + { + std::wstring sName = m_oLightReader.GetName(); + // Читаем book-name (ноль или один) + if(sName == L"book-name") + { + if(m_pPublishInfo->m_pBookName) + delete[] m_pPublishInfo->m_pBookName; + m_pPublishInfo->m_pBookName = new std::wstring[1]; + *m_pPublishInfo->m_pBookName = content(); + } + // Читаем publisher (ноль или один) + else if(sName == L"publisher") + { + if(m_pPublishInfo->m_pPublisher) + delete[] m_pPublishInfo->m_pPublisher; + m_pPublishInfo->m_pPublisher = new std::wstring[1]; + *m_pPublishInfo->m_pPublisher = content(); + } + // Читаем city (ноль или один) + else if(sName == L"city") + { + if(m_pPublishInfo->m_pCity) + delete[] m_pPublishInfo->m_pCity; + m_pPublishInfo->m_pCity = new std::wstring[1]; + *m_pPublishInfo->m_pCity = content(); + } + // Читаем year (ноль или один) + else if(sName == L"year") + { + if(m_pPublishInfo->m_pYear) + delete[] m_pPublishInfo->m_pYear; + m_pPublishInfo->m_pYear = new std::wstring[1]; + *m_pPublishInfo->m_pYear = content(); + } + // Читаем isbn (ноль или один) + else if(sName == L"isbn") + { + if(m_pPublishInfo->m_pIsbn) + delete[] m_pPublishInfo->m_pIsbn; + m_pPublishInfo->m_pIsbn = new std::wstring[1]; + *m_pPublishInfo->m_pIsbn = content(); + } + // Читаем sequence (любое) + else if(sName == L"sequence") + { + std::wstring sSName = L""; + std::wstring sSNumber = L""; + while(m_oLightReader.MoveToNextAttribute()) + { + if(m_oLightReader.GetName() == L"name") + sSName = m_oLightReader.GetText(); + else if(m_oLightReader.GetName() == L"number") + sSNumber = m_oLightReader.GetText(); + } + m_oLightReader.MoveToElement(); + m_pPublishInfo->m_mSequence.insert(std::make_pair(sSName, sSNumber)); + } + } + } + */ - // Читает document-info - /* - void getDocumentInfo() - { - if(m_oLightReader.IsEmptyNode()) - return; + // Читает document-info + /* + void getDocumentInfo() + { + if(m_oLightReader.IsEmptyNode()) + return; - int nDepth = m_oLightReader.GetDepth(); - while(m_oLightReader.ReadNextSiblingNode(nDepth)) - { - std::wstring sName = m_oLightReader.GetName(); - // Читаем author (один или более) - if(sName == L"author") - getAuthor(m_oDocumentInfo.m_arAuthors); - // Читаем program-used (ноль или один) - else if(sName == L"program-used") - { - if(m_oDocumentInfo.m_pProgramUsed) - delete[] m_oDocumentInfo.m_pProgramUsed; - m_oDocumentInfo.m_pProgramUsed = new std::wstring[1]; - *m_oDocumentInfo.m_pProgramUsed = content(); - } - // Читаем date - else if(sName == L"date") - m_oDocumentInfo.m_pDate = content(); - // Читаем src-url (любое) - else if(sName == L"src-url") - m_oDocumentInfo.m_arSrcUrl.push_back(content()); - // Читаем src-ocr (ноль или один) - else if(sName == L"src-ocr") - { - if(m_oDocumentInfo.m_pSrcOcr) - delete[] m_oDocumentInfo.m_pSrcOcr; - m_oDocumentInfo.m_pSrcOcr = new std::wstring[1]; - *m_oDocumentInfo.m_pSrcOcr = content(); - } - // Читаем id - else if(sName == L"id") - m_oDocumentInfo.m_sId = content(); - // Читаем version - else if(sName == L"version") - m_oDocumentInfo.m_sVersion = content(); - // Читаем history (ноль или один) - else if(sName == L"history") - { - if(m_oDocumentInfo.m_pHistory) - delete[] m_oDocumentInfo.m_pHistory; - m_oDocumentInfo.m_pHistory = new std::wstring[1]; - *m_oDocumentInfo.m_pHistory = L""; - } - } - } - */ + int nDepth = m_oLightReader.GetDepth(); + while(m_oLightReader.ReadNextSiblingNode(nDepth)) + { + std::wstring sName = m_oLightReader.GetName(); + // Читаем author (один или более) + if(sName == L"author") + getAuthor(m_oDocumentInfo.m_arAuthors); + // Читаем program-used (ноль или один) + else if(sName == L"program-used") + { + if(m_oDocumentInfo.m_pProgramUsed) + delete[] m_oDocumentInfo.m_pProgramUsed; + m_oDocumentInfo.m_pProgramUsed = new std::wstring[1]; + *m_oDocumentInfo.m_pProgramUsed = content(); + } + // Читаем date + else if(sName == L"date") + m_oDocumentInfo.m_pDate = content(); + // Читаем src-url (любое) + else if(sName == L"src-url") + m_oDocumentInfo.m_arSrcUrl.push_back(content()); + // Читаем src-ocr (ноль или один) + else if(sName == L"src-ocr") + { + if(m_oDocumentInfo.m_pSrcOcr) + delete[] m_oDocumentInfo.m_pSrcOcr; + m_oDocumentInfo.m_pSrcOcr = new std::wstring[1]; + *m_oDocumentInfo.m_pSrcOcr = content(); + } + // Читаем id + else if(sName == L"id") + m_oDocumentInfo.m_sId = content(); + // Читаем version + else if(sName == L"version") + m_oDocumentInfo.m_sVersion = content(); + // Читаем history (ноль или один) + else if(sName == L"history") + { + if(m_oDocumentInfo.m_pHistory) + delete[] m_oDocumentInfo.m_pHistory; + m_oDocumentInfo.m_pHistory = new std::wstring[1]; + *m_oDocumentInfo.m_pHistory = L""; + } + } + } + */ - // Читает title-info и src-title-info - void getTitleInfo(NSStringUtils::CStringBuilder& oBuilder) - { - if (m_oLightReader.IsEmptyNode()) - return; + // Читает title-info и src-title-info + void getTitleInfo(NSStringUtils::CStringBuilder& oBuilder) + { + if (m_oLightReader.IsEmptyNode()) + return; - int nDepth = m_oLightReader.GetDepth(); - while (m_oLightReader.ReadNextSiblingNode(nDepth)) - { - std::wstring sName = m_oLightReader.GetName(); - if (sName == L"annotation") + int nDepth = m_oLightReader.GetDepth(); + while (m_oLightReader.ReadNextSiblingNode(nDepth)) + { + std::wstring sName = m_oLightReader.GetName(); + if (sName == L"annotation") readAnnotationFromDescription(oBuilder, false); - else if (sName == L"coverpage") - { - if (m_oLightReader.IsEmptyNode()) - continue; + else if (sName == L"coverpage") + { + if (m_oLightReader.IsEmptyNode()) + continue; - int nCDepth = m_oLightReader.GetDepth(); - while (m_oLightReader.ReadNextSiblingNode(nCDepth)) - { - if (m_oLightReader.GetName() == L"image") - { - oBuilder += L""; - readImage(oBuilder); - oBuilder += L""; - } - } - } - else if (sName == L"genre") - { - std::wstring sGenre = content(); - m_oTitleInfo.m_sGenres += ((m_oTitleInfo.m_sGenres.empty() ? L"" : L", ") + sGenre); - } - // Читает поля автора - else if (sName == L"author") - { - std::wstring sFirstName, sMiddleName, sLastName, sNickname; - int nDepth = m_oLightReader.GetDepth(); - while (m_oLightReader.ReadNextSiblingNode(nDepth)) - { - std::wstring sName = m_oLightReader.GetName(); - if (sName == L"first-name") - sFirstName = content(); - else if (sName == L"middle-name") - sMiddleName = content(); - else if (sName == L"last-name") - sLastName = content(); - else if (sName == L"nickname") - sNickname = content(); - /* - else if(sName == L"home-page") - oAuthor.home_page.push_back(content()); - else if(sName == L"email") - oAuthor.email.push_back(content()); - else if(sName == L"id") - oAuthor.id = content(); - */ - } + int nCDepth = m_oLightReader.GetDepth(); + while (m_oLightReader.ReadNextSiblingNode(nCDepth)) + { + if (m_oLightReader.GetName() == L"image") + { + oBuilder += L""; + readImage(oBuilder); + oBuilder += L""; + } + } + } + else if (sName == L"genre") + { + std::wstring sGenre = content(); + m_oTitleInfo.m_sGenres += ((m_oTitleInfo.m_sGenres.empty() ? L"" : L", ") + sGenre); + } + // Читает поля автора + else if (sName == L"author") + { + std::wstring sFirstName, sMiddleName, sLastName, sNickname; + int nDepth = m_oLightReader.GetDepth(); + while (m_oLightReader.ReadNextSiblingNode(nDepth)) + { + std::wstring sName = m_oLightReader.GetName(); + if (sName == L"first-name") + sFirstName = content(); + else if (sName == L"middle-name") + sMiddleName = content(); + else if (sName == L"last-name") + sLastName = content(); + else if (sName == L"nickname") + sNickname = content(); + /* + else if(sName == L"home-page") + oAuthor.home_page.push_back(content()); + else if(sName == L"email") + oAuthor.email.push_back(content()); + else if(sName == L"id") + oAuthor.id = content(); + */ + } - m_oTitleInfo.m_sAuthors += - ((m_oTitleInfo.m_sAuthors.empty() ? L"" : L";") + - (sLastName.empty() ? L"" : (sLastName + L' ')) + - (sFirstName.empty() ? L"" : (sFirstName + L' ')) + - (sMiddleName.empty() ? L"" : (sMiddleName + L' ')) + - sNickname); - } - else if (sName == L"book-title") - m_oTitleInfo.m_sBookTitle = content(); - // Читаем keywords (ноль или один) - else if(sName == L"keywords") - m_oTitleInfo.m_sKeywords = content(); - /* - // Читаем date (ноль или один) - else if(sName == L"date") - { - if(oTitleInfo.m_pDate) - delete[] oTitleInfo.m_pDate; - oTitleInfo.m_pDate = new std::pair[1]; - std::wstring sDate = L""; - while(m_oLightReader.MoveToNextAttribute()) - { - if(m_oLightReader.GetName() == L"name") - sDate = m_oLightReader.GetText(); - } - m_oLightReader.MoveToElement(); - *oTitleInfo.m_pDate = make_pair(sDate, content()); - } - // Читаем lang - else if(sName == L"lang") - oTitleInfo.m_sLang = content(); - // Читаем src-lang (ноль или один) - else if(sName == L"src-lang") - { - if(oTitleInfo.m_pSrcLang) - delete[] oTitleInfo.m_pSrcLang; - oTitleInfo.m_pSrcLang = new std::wstring[1]; - *oTitleInfo.m_pSrcLang = content(); - } - // Читаем translator (любое) - else if(sName == L"translator") - getAuthor(oTitleInfo.m_arTranslator); - // Читаем sequence (любое) - else if(sName == L"sequence") - { - std::wstring sSName = L""; - std::wstring sSNumber = L""; - while(m_oLightReader.MoveToNextAttribute()) - { - if(m_oLightReader.GetName() == L"name") - sSName = m_oLightReader.GetText(); - else if(m_oLightReader.GetName() == L"number") - sSNumber = m_oLightReader.GetText(); - } - m_oLightReader.MoveToElement(); - oTitleInfo.m_mSequence.insert(std::make_pair(sSName, sSNumber)); - } - */ - } - } + m_oTitleInfo.m_sAuthors += + ((m_oTitleInfo.m_sAuthors.empty() ? L"" : L";") + + (sLastName.empty() ? L"" : (sLastName + L' ')) + + (sFirstName.empty() ? L"" : (sFirstName + L' ')) + + (sMiddleName.empty() ? L"" : (sMiddleName + L' ')) + + sNickname); + } + else if (sName == L"book-title") + m_oTitleInfo.m_sBookTitle = content(); + // Читаем keywords (ноль или один) + else if(sName == L"keywords") + m_oTitleInfo.m_sKeywords = content(); + /* + // Читаем date (ноль или один) + else if(sName == L"date") + { + if(oTitleInfo.m_pDate) + delete[] oTitleInfo.m_pDate; + oTitleInfo.m_pDate = new std::pair[1]; + std::wstring sDate = L""; + while(m_oLightReader.MoveToNextAttribute()) + { + if(m_oLightReader.GetName() == L"name") + sDate = m_oLightReader.GetText(); + } + m_oLightReader.MoveToElement(); + *oTitleInfo.m_pDate = make_pair(sDate, content()); + } + // Читаем lang + else if(sName == L"lang") + oTitleInfo.m_sLang = content(); + // Читаем src-lang (ноль или один) + else if(sName == L"src-lang") + { + if(oTitleInfo.m_pSrcLang) + delete[] oTitleInfo.m_pSrcLang; + oTitleInfo.m_pSrcLang = new std::wstring[1]; + *oTitleInfo.m_pSrcLang = content(); + } + // Читаем translator (любое) + else if(sName == L"translator") + getAuthor(oTitleInfo.m_arTranslator); + // Читаем sequence (любое) + else if(sName == L"sequence") + { + std::wstring sSName = L""; + std::wstring sSNumber = L""; + while(m_oLightReader.MoveToNextAttribute()) + { + if(m_oLightReader.GetName() == L"name") + sSName = m_oLightReader.GetText(); + else if(m_oLightReader.GetName() == L"number") + sSNumber = m_oLightReader.GetText(); + } + m_oLightReader.MoveToElement(); + oTitleInfo.m_mSequence.insert(std::make_pair(sSName, sSNumber)); + } + */ + } + } - // Возвращает содержание узла - std::wstring content() - { - if (!m_oLightReader.IsEmptyNode() && m_oLightReader.ReadNextSiblingNode2(m_oLightReader.GetDepth())) - return m_oLightReader.GetText(); - return L""; - } + // Возвращает содержание узла + std::wstring content() + { + if (!m_oLightReader.IsEmptyNode() && m_oLightReader.ReadNextSiblingNode2(m_oLightReader.GetDepth())) + return m_oLightReader.GetText(); + return L""; + } - std::string contentA() - { - if(!m_oLightReader.IsEmptyNode() && m_oLightReader.ReadNextSiblingNode2(m_oLightReader.GetDepth())) - return m_oLightReader.GetTextA(); - return ""; - } + std::string contentA() + { + if(!m_oLightReader.IsEmptyNode() && m_oLightReader.ReadNextSiblingNode2(m_oLightReader.GetDepth())) + return m_oLightReader.GetTextA(); + return ""; + } - std::wstring GenerateUUID() - { - std::mt19937 oRand(time(0)); - std::wstringstream sstream; - sstream << std::setfill(L'0') << std::hex << std::setw(8) << (oRand() & 0xffffffff); - sstream << L'-'; - sstream << std::setfill(L'0') << std::hex << std::setw(4) << (oRand() & 0xffff); - sstream << L'-'; - sstream << std::setfill(L'0') << std::hex << std::setw(4) << (oRand() & 0xffff); - sstream << L'-'; - sstream << std::setfill(L'0') << std::hex << std::setw(4) << (oRand() & 0xffff); - sstream << L'-'; - sstream << std::setfill(L'0') << std::hex << std::setw(8) << (oRand() & 0xffffffff); - return sstream.str(); - } + std::wstring GenerateUUID() + { + std::mt19937 oRand(time(0)); + std::wstringstream sstream; + sstream << std::setfill(L'0') << std::hex << std::setw(8) << (oRand() & 0xffffffff); + sstream << L'-'; + sstream << std::setfill(L'0') << std::hex << std::setw(4) << (oRand() & 0xffff); + sstream << L'-'; + sstream << std::setfill(L'0') << std::hex << std::setw(4) << (oRand() & 0xffff); + sstream << L'-'; + sstream << std::setfill(L'0') << std::hex << std::setw(4) << (oRand() & 0xffff); + sstream << L'-'; + sstream << std::setfill(L'0') << std::hex << std::setw(8) << (oRand() & 0xffffffff); + return sstream.str(); + } - // html -> fb2 + // html -> fb2 - void readStream(NSStringUtils::CStringBuilder& oXml) - { - int nDepth = m_oLightReader.GetDepth(); - if (m_oLightReader.IsEmptyNode() || !m_oLightReader.ReadNextSiblingNode2(nDepth)) - return; - do - { - std::wstring sName = m_oLightReader.GetName(); - if (sName == L"#text") - oXml.WriteEncodeXmlString(m_oLightReader.GetText()); - else if (sName == L"br" && !m_bInTable) - { - if (m_bInP) - oXml.WriteString(L"

"); - else - oXml.WriteString(L"

"); - } - else if (sName == L"div") - { - std::wstring sFootnoteName; - NSStringUtils::CStringBuilder oFootnote; - while (m_oLightReader.MoveToNextAttribute()) - { - std::wstring sAtrName = m_oLightReader.GetName(); - std::wstring sAtrText = m_oLightReader.GetText(); - if (sAtrName == L"style" && sAtrText == L"mso-element:footnote") - m_bFootnote = true; - else if (sAtrName == L"id") - sFootnoteName = sAtrText; - } - m_oLightReader.MoveToElement(); - if (m_bFootnote && !sFootnoteName.empty()) - { - readStream(oFootnote); - m_mFootnotes.insert(std::make_pair(sFootnoteName, oFootnote.GetData())); - m_bFootnote = false; - } - else - readStream(oXml); - } - else if (sName == L"p") - { - if (!m_bInTable && !m_bInP) - { - oXml.WriteString(L"

"); - m_bInP = true; - } - readStream(oXml); - if (!m_bInTable && m_bInP) - { - oXml.WriteString(L"

"); - m_bInP = false; - } - } - else if (sName == L"title") - { - m_oTitleInfo.m_sBookTitle = EncodeXmlString(m_oLightReader.GetText2()); - } - else if (sName == L"meta") - { - std::wstring sAtrName, sAtrContent; - while (m_oLightReader.MoveToNextAttribute()) - { - std::wstring sAtr = m_oLightReader.GetName(); - if (sAtr == L"name") - sAtrName = m_oLightReader.GetText(); - else if (sAtr == L"content") - sAtrContent = m_oLightReader.GetText(); - } - m_oLightReader.MoveToElement(); + void readStream(NSStringUtils::CStringBuilder& oXml) + { + int nDepth = m_oLightReader.GetDepth(); + if (m_oLightReader.IsEmptyNode() || !m_oLightReader.ReadNextSiblingNode2(nDepth)) + return; + do + { + std::wstring sName = m_oLightReader.GetName(); + if (sName == L"#text") + oXml.WriteEncodeXmlString(m_oLightReader.GetText()); + else if (sName == L"br" && !m_bInTable) + { + if (m_bInP) + oXml.WriteString(L"

"); + else + oXml.WriteString(L"

"); + } + else if (sName == L"div") + { + std::wstring sFootnoteName; + NSStringUtils::CStringBuilder oFootnote; + while (m_oLightReader.MoveToNextAttribute()) + { + std::wstring sAtrName = m_oLightReader.GetName(); + std::wstring sAtrText = m_oLightReader.GetText(); + if (sAtrName == L"style" && sAtrText == L"mso-element:footnote") + m_bFootnote = true; + else if (sAtrName == L"id") + sFootnoteName = sAtrText; + } + m_oLightReader.MoveToElement(); + if (m_bFootnote && !sFootnoteName.empty()) + { + readStream(oFootnote); + m_mFootnotes.insert(std::make_pair(sFootnoteName, oFootnote.GetData())); + m_bFootnote = false; + } + else + readStream(oXml); + } + else if (sName == L"p") + { + if (!m_bInTable && !m_bInP) + { + oXml.WriteString(L"

"); + m_bInP = true; + } + readStream(oXml); + if (!m_bInTable && m_bInP) + { + oXml.WriteString(L"

"); + m_bInP = false; + } + } + else if (sName == L"title") + { + m_oTitleInfo.m_sBookTitle = EncodeXmlString(m_oLightReader.GetText2()); + } + else if (sName == L"meta") + { + std::wstring sAtrName, sAtrContent; + while (m_oLightReader.MoveToNextAttribute()) + { + std::wstring sAtr = m_oLightReader.GetName(); + if (sAtr == L"name") + sAtrName = m_oLightReader.GetText(); + else if (sAtr == L"content") + sAtrContent = m_oLightReader.GetText(); + } + m_oLightReader.MoveToElement(); - if (!sAtrName.empty()) - { - if (sAtrName == L"creator") - m_oTitleInfo.m_sAuthors = EncodeXmlString(sAtrContent); - else if (sAtrName == L"description") - m_oTitleInfo.m_sAnnotation = EncodeXmlString(sAtrContent); - else if (sAtrName == L"subject") - m_oTitleInfo.m_sGenres = EncodeXmlString(sAtrContent); - else if (sAtrName == L"keywords") - m_oTitleInfo.m_sKeywords = EncodeXmlString(sAtrContent); - } - } - else if (sName == L"h1") - { - if (!m_bInTable) - oXml.WriteString(L"
<p>"); - m_bInP = true; - readStream(oXml); - m_bInP = false; - if (!m_bInTable) - oXml.WriteString(L"</p>
"); - } - else if (sName == L"h2") - { - if (!m_bInTable) - oXml.WriteString(L"
<p>"); - m_bInP = true; - readStream(oXml); - m_bInP = false; - if (!m_bInTable) - oXml.WriteString(L"</p>
"); - } - else if (sName == L"h3") - { - if (!m_bInTable) - oXml.WriteString(L"
<p>"); - m_bInP = true; - readStream(oXml); - m_bInP = false; - if (!m_bInTable) - oXml.WriteString(L"</p>
"); - } - else if (sName == L"h4") - { - if (!m_bInTable) - oXml.WriteString(L"
<p>"); - m_bInP = true; - readStream(oXml); - m_bInP = false; - if (!m_bInTable) - oXml.WriteString(L"</p>
"); - } - else if (sName == L"h5") - { - if (!m_bInTable) - oXml.WriteString(L"
<p>"); - m_bInP = true; - readStream(oXml); - m_bInP = false; - if (!m_bInTable) - oXml.WriteString(L"</p>
"); - } - else if (sName == L"h6") - { - if (!m_bInTable) - oXml.WriteString(L"
<p>"); - m_bInP = true; - readStream(oXml); - m_bInP = false; - if (!m_bInTable) - oXml.WriteString(L"</p>
"); - } - else if (sName == L"span") - { - std::wstring sStyle; - while (m_oLightReader.MoveToNextAttribute()) - if (m_oLightReader.GetName() == L"style") - sStyle = m_oLightReader.GetText(); - m_oLightReader.MoveToElement(); + if (!sAtrName.empty()) + { + if (sAtrName == L"creator") + m_oTitleInfo.m_sAuthors = EncodeXmlString(sAtrContent); + else if (sAtrName == L"description") + m_oTitleInfo.m_sAnnotation = EncodeXmlString(sAtrContent); + else if (sAtrName == L"subject") + m_oTitleInfo.m_sGenres = EncodeXmlString(sAtrContent); + else if (sAtrName == L"keywords") + m_oTitleInfo.m_sKeywords = EncodeXmlString(sAtrContent); + } + } + else if (sName == L"h1") + { + if (!m_bInTable) + oXml.WriteString(L"
<p>"); + m_bInP = true; + readStream(oXml); + m_bInP = false; + if (!m_bInTable) + oXml.WriteString(L"</p>
"); + } + else if (sName == L"h2") + { + if (!m_bInTable) + oXml.WriteString(L"
<p>"); + m_bInP = true; + readStream(oXml); + m_bInP = false; + if (!m_bInTable) + oXml.WriteString(L"</p>
"); + } + else if (sName == L"h3") + { + if (!m_bInTable) + oXml.WriteString(L"
<p>"); + m_bInP = true; + readStream(oXml); + m_bInP = false; + if (!m_bInTable) + oXml.WriteString(L"</p>
"); + } + else if (sName == L"h4") + { + if (!m_bInTable) + oXml.WriteString(L"
<p>"); + m_bInP = true; + readStream(oXml); + m_bInP = false; + if (!m_bInTable) + oXml.WriteString(L"</p>
"); + } + else if (sName == L"h5") + { + if (!m_bInTable) + oXml.WriteString(L"
<p>"); + m_bInP = true; + readStream(oXml); + m_bInP = false; + if (!m_bInTable) + oXml.WriteString(L"</p>
"); + } + else if (sName == L"h6") + { + if (!m_bInTable) + oXml.WriteString(L"
<p>"); + m_bInP = true; + readStream(oXml); + m_bInP = false; + if (!m_bInTable) + oXml.WriteString(L"</p>
"); + } + else if (sName == L"span") + { + std::wstring sStyle; + while (m_oLightReader.MoveToNextAttribute()) + if (m_oLightReader.GetName() == L"style") + sStyle = m_oLightReader.GetText(); + m_oLightReader.MoveToElement(); - std::wstring sAlign; - size_t nAlign = sStyle.find(L"vertical-align"); - if (nAlign != std::wstring::npos) - { - nAlign = sStyle.find(L':', nAlign); - size_t nAlignEnd = sStyle.find(L';', nAlign); - sAlign = sStyle.substr(nAlign + 1, (nAlignEnd < sStyle.length() ? nAlignEnd : sStyle.length()) - nAlign); - if (sAlign == L"super") - { - oXml.WriteString(L""); - readStream(oXml); - oXml.WriteString(L""); - } - else if (sAlign == L"sub") - { - oXml.WriteString(L""); - readStream(oXml); - oXml.WriteString(L""); - } - else - readStream(oXml); - } - else - readStream(oXml); - } - else if (sName == L"s") - { - oXml.WriteString(L""); - readStream(oXml); - oXml.WriteString(L""); - } - else if (sName == L"i") - { - oXml.WriteString(L""); - readStream(oXml); - oXml.WriteString(L""); - } - else if (sName == L"b") - { - oXml.WriteString(L""); - readStream(oXml); - oXml.WriteString(L""); - } - else if (sName == L"table") - { - oXml.WriteString(L""); - m_bInTable = true; - readStream(oXml); - oXml.WriteString(L"
"); - m_bInTable = false; - } - else if (sName == L"tr") - { - oXml.WriteString(L""); - readStream(oXml); - oXml.WriteString(L""); - } - else if (sName == L"td" || sName == L"th") - { - oXml.WriteString(L""); - readStream(oXml); - oXml.WriteString(L""); - } - else if (sName == L"a") - { - bool bFootnote = false; - oXml.WriteString(L""); + readStream(oXml); + oXml.WriteString(L""); + } + else if (sAlign == L"sub") + { + oXml.WriteString(L""); + readStream(oXml); + oXml.WriteString(L""); + } + else + readStream(oXml); + } + else + readStream(oXml); + } + else if (sName == L"s") + { + oXml.WriteString(L""); + readStream(oXml); + oXml.WriteString(L""); + } + else if (sName == L"i") + { + oXml.WriteString(L""); + readStream(oXml); + oXml.WriteString(L""); + } + else if (sName == L"b") + { + oXml.WriteString(L""); + readStream(oXml); + oXml.WriteString(L""); + } + else if (sName == L"table") + { + oXml.WriteString(L""); + m_bInTable = true; + readStream(oXml); + oXml.WriteString(L"
"); + m_bInTable = false; + } + else if (sName == L"tr") + { + oXml.WriteString(L""); + readStream(oXml); + oXml.WriteString(L""); + } + else if (sName == L"td" || sName == L"th") + { + oXml.WriteString(L""); + readStream(oXml); + oXml.WriteString(L""); + } + else if (sName == L"a") + { + bool bFootnote = false; + oXml.WriteString(L"
"); + sAtrText = sAtrText.substr(sAtrText.rfind(L':') + 1); + oXml.WriteString(L"href=\"#"); + oXml.WriteString(sAtrText); + oXml.WriteString(L"\" type=\"note\" "); + bFootnote = true; + } + else + { + if (bFootnote && (sAtrName == L"href" || sAtrName == L"type")) + continue; + if (sAtrName == L"name") + sAtrName = L"id"; + oXml.WriteString(sAtrName + L"=\""); + oXml.WriteEncodeXmlString(sAtrText); + oXml.WriteString(L"\" "); + } + } + } + m_oLightReader.MoveToElement(); + oXml.WriteString(L">"); - readStream(oXml); - oXml.WriteString(L""); - } - else if (sName == L"ul") - readLi(oXml, true); - else if (sName == L"ol") - readLi(oXml, false); - else if (sName == L"img") - { - std::wstring sId, sBinary; - while (m_oLightReader.MoveToNextAttribute()) - { - if (m_oLightReader.GetName() == L"src") - { - sBinary = m_oLightReader.GetText(); - sBinary.erase(0, sBinary.find(L',') + 1); - std::vector vImage; - vImage.push_back(sBinary); - sId = std::to_wstring(m_mImages.size() + 1); - m_mImages.insert(std::make_pair(sId, vImage)); - } - } - m_oLightReader.MoveToElement(); - oXml.WriteString(L""); - } - else - readStream(oXml); - } while (m_oLightReader.ReadNextSiblingNode2(nDepth)); - } + readStream(oXml); + oXml.WriteString(L""); + } + else if (sName == L"ul") + readLi(oXml, true); + else if (sName == L"ol") + readLi(oXml, false); + else if (sName == L"img") + { + std::wstring sId, sBinary; + while (m_oLightReader.MoveToNextAttribute()) + { + if (m_oLightReader.GetName() == L"src") + { + sBinary = m_oLightReader.GetText(); + sBinary.erase(0, sBinary.find(L',') + 1); + std::vector vImage; + vImage.push_back(sBinary); + sId = std::to_wstring(m_mImages.size() + 1); + m_mImages.insert(std::make_pair(sId, vImage)); + } + } + m_oLightReader.MoveToElement(); + oXml.WriteString(L""); + } + else + readStream(oXml); + } while (m_oLightReader.ReadNextSiblingNode2(nDepth)); + } - void readLi(NSStringUtils::CStringBuilder& oXml, bool bUl) - { - int nNum = 1; - while (m_oLightReader.MoveToNextAttribute()) - if (m_oLightReader.GetName() == L"start") - nNum = std::stoi(m_oLightReader.GetText()); - m_oLightReader.MoveToElement(); - int nDeath = m_oLightReader.GetDepth(); - if (m_oLightReader.IsEmptyNode() || !m_oLightReader.ReadNextSiblingNode2(nDeath)) - return; - do - { - if (m_oLightReader.GetName() == L"li") - { - if (!m_bInP) - oXml.WriteString(L"

"); - m_bInP = true; - if (bUl) - oXml.AddCharSafe(183); - else - { - std::wstring sPoint = std::to_wstring(nNum) + L'.'; - while (m_oLightReader.MoveToNextAttribute()) - { - if (m_oLightReader.GetName() == L"style") - { - std::wstring sText = m_oLightReader.GetText(); - size_t nListType = sText.find(L"list-style-type: "); - if (nListType != std::wstring::npos) - { - nListType += 17; - size_t nListTypeEnd = sText.find(L';', nListType); - std::wstring sListType = sText.substr(nListType, nListTypeEnd - nListType); - if (sListType == L"decimal") - break; - else if (sListType == L"upper-alpha") - sPoint = std::wstring((nNum - 1) / 26 + 1, L'A' + (nNum - 1) % 26); - else if (sListType == L"lower-alpha") - sPoint = std::wstring((nNum - 1) / 26 + 1, L'a' + (nNum - 1) % 26); - else if (sListType == L"lower-roman") - sPoint = ToLowerRoman(nNum); - else if (sListType == L"upper-roman") - sPoint = ToUpperRoman(nNum); - sPoint += L'.'; - } - } - } - m_oLightReader.MoveToElement(); + void readLi(NSStringUtils::CStringBuilder& oXml, bool bUl) + { + int nNum = 1; + while (m_oLightReader.MoveToNextAttribute()) + if (m_oLightReader.GetName() == L"start") + nNum = std::stoi(m_oLightReader.GetText()); + m_oLightReader.MoveToElement(); + int nDeath = m_oLightReader.GetDepth(); + if (m_oLightReader.IsEmptyNode() || !m_oLightReader.ReadNextSiblingNode2(nDeath)) + return; + do + { + if (m_oLightReader.GetName() == L"li") + { + if (!m_bInP) + oXml.WriteString(L"

"); + m_bInP = true; + if (bUl) + oXml.AddCharSafe(183); + else + { + std::wstring sPoint = std::to_wstring(nNum) + L'.'; + while (m_oLightReader.MoveToNextAttribute()) + { + if (m_oLightReader.GetName() == L"style") + { + std::wstring sText = m_oLightReader.GetText(); + size_t nListType = sText.find(L"list-style-type: "); + if (nListType != std::wstring::npos) + { + nListType += 17; + size_t nListTypeEnd = sText.find(L';', nListType); + std::wstring sListType = sText.substr(nListType, nListTypeEnd - nListType); + if (sListType == L"decimal") + break; + else if (sListType == L"upper-alpha") + sPoint = std::wstring((nNum - 1) / 26 + 1, L'A' + (nNum - 1) % 26); + else if (sListType == L"lower-alpha") + sPoint = std::wstring((nNum - 1) / 26 + 1, L'a' + (nNum - 1) % 26); + else if (sListType == L"lower-roman") + sPoint = ToLowerRoman(nNum); + else if (sListType == L"upper-roman") + sPoint = ToUpperRoman(nNum); + sPoint += L'.'; + } + } + } + m_oLightReader.MoveToElement(); - nNum++; - oXml.WriteString(sPoint); - } - oXml.WriteString(L" "); - readStream(oXml); - if (m_bInP) - oXml.WriteString(L"

"); - m_bInP = false; - } - } while (m_oLightReader.ReadNextSiblingNode2(nDeath)); - } + nNum++; + oXml.WriteString(sPoint); + } + oXml.WriteString(L" "); + readStream(oXml); + if (m_bInP) + oXml.WriteString(L"

"); + m_bInP = false; + } + } while (m_oLightReader.ReadNextSiblingNode2(nDeath)); + } - void readTitleInfo(NSStringUtils::CStringBuilder& oTitleInfo) - { - if (!m_oTitleInfo.m_sBookTitle.empty()) - { - oTitleInfo.WriteString(L""); - oTitleInfo.WriteString(m_oTitleInfo.m_sBookTitle); - oTitleInfo.WriteString(L""); - } - if (!m_oTitleInfo.m_sAuthors.empty()) - { - oTitleInfo.WriteString(L""); - oTitleInfo.WriteString(m_oTitleInfo.m_sAuthors); - oTitleInfo.WriteString(L""); - } - if (!m_oTitleInfo.m_sGenres.empty()) - { - oTitleInfo.WriteString(L""); - oTitleInfo.WriteString(m_oTitleInfo.m_sGenres); - oTitleInfo.WriteString(L""); - } - if (!m_oTitleInfo.m_sKeywords.empty()) - { - oTitleInfo.WriteString(L""); - oTitleInfo.WriteString(m_oTitleInfo.m_sKeywords); - oTitleInfo.WriteString(L""); - } - if (!m_oTitleInfo.m_sAnnotation.empty()) - { - oTitleInfo.WriteString(L"

"); - oTitleInfo.WriteString(m_oTitleInfo.m_sAnnotation); - oTitleInfo.WriteString(L"

"); - } - } + void readTitleInfo(NSStringUtils::CStringBuilder& oTitleInfo) + { + if (!m_oTitleInfo.m_sBookTitle.empty()) + { + oTitleInfo.WriteString(L""); + oTitleInfo.WriteString(m_oTitleInfo.m_sBookTitle); + oTitleInfo.WriteString(L""); + } + if (!m_oTitleInfo.m_sAuthors.empty()) + { + oTitleInfo.WriteString(L""); + oTitleInfo.WriteString(m_oTitleInfo.m_sAuthors); + oTitleInfo.WriteString(L""); + } + if (!m_oTitleInfo.m_sGenres.empty()) + { + oTitleInfo.WriteString(L""); + oTitleInfo.WriteString(m_oTitleInfo.m_sGenres); + oTitleInfo.WriteString(L""); + } + if (!m_oTitleInfo.m_sKeywords.empty()) + { + oTitleInfo.WriteString(L""); + oTitleInfo.WriteString(m_oTitleInfo.m_sKeywords); + oTitleInfo.WriteString(L""); + } + if (!m_oTitleInfo.m_sAnnotation.empty()) + { + oTitleInfo.WriteString(L"

"); + oTitleInfo.WriteString(m_oTitleInfo.m_sAnnotation); + oTitleInfo.WriteString(L"

"); + } + } - std::wstring ToUpperRoman(int number) - { - if (number < 0 || number > 3999) return L""; - if (number < 1) return L""; - if (number >= 1000) return L"M" + ToUpperRoman(number - 1000); - if (number >= 900) return L"CM" + ToUpperRoman(number - 900); - if (number >= 500) return L"D" + ToUpperRoman(number - 500); - if (number >= 400) return L"CD" + ToUpperRoman(number - 400); - if (number >= 100) return L"C" + ToUpperRoman(number - 100); - if (number >= 90) return L"XC" + ToUpperRoman(number - 90); - if (number >= 50) return L"L" + ToUpperRoman(number - 50); - if (number >= 40) return L"XL" + ToUpperRoman(number - 40); - if (number >= 10) return L"X" + ToUpperRoman(number - 10); - if (number >= 9) return L"IX" + ToUpperRoman(number - 9); - if (number >= 5) return L"V" + ToUpperRoman(number - 5); - if (number >= 4) return L"IV" + ToUpperRoman(number - 4); - if (number >= 1) return L"I" + ToUpperRoman(number - 1); - return L""; - } + std::wstring ToUpperRoman(int number) + { + if (number < 0 || number > 3999) return L""; + if (number < 1) return L""; + if (number >= 1000) return L"M" + ToUpperRoman(number - 1000); + if (number >= 900) return L"CM" + ToUpperRoman(number - 900); + if (number >= 500) return L"D" + ToUpperRoman(number - 500); + if (number >= 400) return L"CD" + ToUpperRoman(number - 400); + if (number >= 100) return L"C" + ToUpperRoman(number - 100); + if (number >= 90) return L"XC" + ToUpperRoman(number - 90); + if (number >= 50) return L"L" + ToUpperRoman(number - 50); + if (number >= 40) return L"XL" + ToUpperRoman(number - 40); + if (number >= 10) return L"X" + ToUpperRoman(number - 10); + if (number >= 9) return L"IX" + ToUpperRoman(number - 9); + if (number >= 5) return L"V" + ToUpperRoman(number - 5); + if (number >= 4) return L"IV" + ToUpperRoman(number - 4); + if (number >= 1) return L"I" + ToUpperRoman(number - 1); + return L""; + } - std::wstring ToLowerRoman(int number) - { - if (number < 0 || number > 3999) return L""; - if (number < 1) return L""; - if (number >= 1000) return L"m" + ToLowerRoman(number - 1000); - if (number >= 900) return L"cm" + ToLowerRoman(number - 900); - if (number >= 500) return L"d" + ToLowerRoman(number - 500); - if (number >= 400) return L"cd" + ToLowerRoman(number - 400); - if (number >= 100) return L"c" + ToLowerRoman(number - 100); - if (number >= 90) return L"xc" + ToLowerRoman(number - 90); - if (number >= 50) return L"l" + ToLowerRoman(number - 50); - if (number >= 40) return L"xl" + ToLowerRoman(number - 40); - if (number >= 10) return L"x" + ToLowerRoman(number - 10); - if (number >= 9) return L"ix" + ToLowerRoman(number - 9); - if (number >= 5) return L"v" + ToLowerRoman(number - 5); - if (number >= 4) return L"iv" + ToLowerRoman(number - 4); - if (number >= 1) return L"i" + ToLowerRoman(number - 1); - return L""; - } + std::wstring ToLowerRoman(int number) + { + if (number < 0 || number > 3999) return L""; + if (number < 1) return L""; + if (number >= 1000) return L"m" + ToLowerRoman(number - 1000); + if (number >= 900) return L"cm" + ToLowerRoman(number - 900); + if (number >= 500) return L"d" + ToLowerRoman(number - 500); + if (number >= 400) return L"cd" + ToLowerRoman(number - 400); + if (number >= 100) return L"c" + ToLowerRoman(number - 100); + if (number >= 90) return L"xc" + ToLowerRoman(number - 90); + if (number >= 50) return L"l" + ToLowerRoman(number - 50); + if (number >= 40) return L"xl" + ToLowerRoman(number - 40); + if (number >= 10) return L"x" + ToLowerRoman(number - 10); + if (number >= 9) return L"ix" + ToLowerRoman(number - 9); + if (number >= 5) return L"v" + ToLowerRoman(number - 5); + if (number >= 4) return L"iv" + ToLowerRoman(number - 4); + if (number >= 1) return L"i" + ToLowerRoman(number - 1); + return L""; + } private: void ReadFootnote(NSStringUtils::CStringBuilder& oFootnotes) @@ -1873,47 +1873,47 @@ private: CFb2File::CFb2File() { - m_internal = new CFb2File_Private(); + m_internal = new CFb2File_Private(); } CFb2File::~CFb2File() { - RELEASEOBJECT(m_internal); + RELEASEOBJECT(m_internal); } // Проверяет, соответствует ли fb2 файл формату bool CFb2File::IsFb2File(const std::wstring& sFile) { - // Открывает файл на проверку - if (!m_internal->OpenFromFile(sFile)) - return false; - // Читаем FictionBook - return m_internal->isFictionBook(); + // Открывает файл на проверку + if (!m_internal->OpenFromFile(sFile)) + return false; + // Читаем FictionBook + return m_internal->isFictionBook(); } // Выставление рабочей папки void CFb2File::SetTmpDirectory(const std::wstring& sFolder) { - // m_internal->m_sTmpFolder = sFolder; + // m_internal->m_sTmpFolder = sFolder; } // sPath - путь к файлу fb2, sDirectory - директория, где формируется и создается docx HRESULT CFb2File::Open(const std::wstring& sPath, const std::wstring& sDirectory, CFb2Params* oParams) { - // Копирование шаблона - if (!ExtractTemplate(sDirectory)) - return S_FALSE; + // Копирование шаблона + if (!ExtractTemplate(sDirectory)) + return S_FALSE; - // Начало файла - NSStringUtils::CStringBuilder oDocument; - oDocument += L""; + // Начало файла + NSStringUtils::CStringBuilder oDocument; + oDocument += L""; - // Создаем сноски - NSStringUtils::CStringBuilder oFootnotes; - oFootnotes += L""; - oFootnotes += L""; + // Создаем сноски + NSStringUtils::CStringBuilder oFootnotes; + oFootnotes += L""; + oFootnotes += L""; - // Создаем рельсы + // Создаем рельсы m_internal->m_oDocXmlRels += L""; m_internal->m_oDocXmlRels += L""; m_internal->m_oDocXmlRels += L""; @@ -1923,152 +1923,152 @@ HRESULT CFb2File::Open(const std::wstring& sPath, const std::wstring& sDirectory m_internal->m_oDocXmlRels += L""; m_internal->m_oNoteXmlRels += L""; - // Директория картинок - std::wstring sMediaDirectory = sDirectory + L"/word/media"; - NSDirectory::CreateDirectory(sMediaDirectory); + // Директория картинок + std::wstring sMediaDirectory = sDirectory + L"/word/media"; + NSDirectory::CreateDirectory(sMediaDirectory); - NSStringUtils::CStringBuilder oBuilder; - NSStringUtils::CStringBuilder oDescription; - NSStringUtils::CStringBuilder oContents; + NSStringUtils::CStringBuilder oBuilder; + NSStringUtils::CStringBuilder oDescription; + NSStringUtils::CStringBuilder oContents; - // Читаем содержание, картинки, сноски - bool bNeedContents = false; - if (oParams) - bNeedContents = oParams->bNeedContents; - if (!m_internal->readText(sPath, sMediaDirectory, oContents, oFootnotes)) - return S_FALSE; + // Читаем содержание, картинки, сноски + bool bNeedContents = false; + if (oParams) + bNeedContents = oParams->bNeedContents; + if (!m_internal->readText(sPath, sMediaDirectory, oContents, oFootnotes)) + return S_FALSE; - // Переходим в начало - if (!m_internal->m_oLightReader.MoveToStart()) - return S_FALSE; + // Переходим в начало + if (!m_internal->m_oLightReader.MoveToStart()) + return S_FALSE; - int nDeath = m_internal->m_oLightReader.GetDepth(); - while (m_internal->m_oLightReader.ReadNextSiblingNode(nDeath)) - { - std::wstring sName = m_internal->m_oLightReader.GetName(); - if (sName == L"description") - m_internal->readDescription(oDescription); - else if (sName == L"body") - { - bool bNotes = false; - while (m_internal->m_oLightReader.MoveToNextAttribute()) - { - if (m_internal->m_oLightReader.GetName() == L"name" && - m_internal->m_oLightReader.GetText() == L"notes") - bNotes = true; - } - m_internal->m_oLightReader.MoveToElement(); - if (bNotes) - continue; - m_internal->readBody(oBuilder); - } - } + int nDeath = m_internal->m_oLightReader.GetDepth(); + while (m_internal->m_oLightReader.ReadNextSiblingNode(nDeath)) + { + std::wstring sName = m_internal->m_oLightReader.GetName(); + if (sName == L"description") + m_internal->readDescription(oDescription); + else if (sName == L"body") + { + bool bNotes = false; + while (m_internal->m_oLightReader.MoveToNextAttribute()) + { + if (m_internal->m_oLightReader.GetName() == L"name" && + m_internal->m_oLightReader.GetText() == L"notes") + bNotes = true; + } + m_internal->m_oLightReader.MoveToElement(); + if (bNotes) + continue; + m_internal->readBody(oBuilder); + } + } - // Конец сносок - oFootnotes += L""; - // Пишем сноски в файл - NSFile::CFileBinary oFootnotesWriter; - if (oFootnotesWriter.CreateFileW(sDirectory + L"/word/footnotes.xml")) - { - oFootnotesWriter.WriteStringUTF8(oFootnotes.GetData()); - oFootnotesWriter.CloseFile(); - } + // Конец сносок + oFootnotes += L""; + // Пишем сноски в файл + NSFile::CFileBinary oFootnotesWriter; + if (oFootnotesWriter.CreateFileW(sDirectory + L"/word/footnotes.xml")) + { + oFootnotesWriter.WriteStringUTF8(oFootnotes.GetData()); + oFootnotesWriter.CloseFile(); + } - // Вставляем description - oDocument += oDescription.GetData(); - // Вставляем содержание - if (bNeedContents) - oDocument += oContents.GetData(); - // Вставляем основное тело - oDocument += oBuilder.GetData(); - // Конец документа - oDocument += L""; - // Пишем документ в файл - NSFile::CFileBinary oDocumentXmlWriter; - if (oDocumentXmlWriter.CreateFileW(sDirectory + L"/word/document.xml")) - { - oDocumentXmlWriter.WriteStringUTF8(oDocument.GetData()); - oDocumentXmlWriter.CloseFile(); - } + // Вставляем description + oDocument += oDescription.GetData(); + // Вставляем содержание + if (bNeedContents) + oDocument += oContents.GetData(); + // Вставляем основное тело + oDocument += oBuilder.GetData(); + // Конец документа + oDocument += L""; + // Пишем документ в файл + NSFile::CFileBinary oDocumentXmlWriter; + if (oDocumentXmlWriter.CreateFileW(sDirectory + L"/word/document.xml")) + { + oDocumentXmlWriter.WriteStringUTF8(oDocument.GetData()); + oDocumentXmlWriter.CloseFile(); + } - // Директория app и core - std::wstring sDocPropsDirectory = sDirectory + L"/docProps"; - NSDirectory::CreateDirectory(sDocPropsDirectory); + // Директория app и core + std::wstring sDocPropsDirectory = sDirectory + L"/docProps"; + NSDirectory::CreateDirectory(sDocPropsDirectory); - // Создаем core.xml - NSStringUtils::CStringBuilder oCore; - // Заголовок - oCore += L""; - oCore.WriteString(EncodeXmlString(m_internal->m_oTitleInfo.m_sBookTitle)); - // Жанры - oCore.WriteString(L""); - if (!m_internal->m_oTitleInfo.m_sGenres.empty()) - { - oCore.WriteString(L""); - oCore.WriteString(EncodeXmlString(m_internal->m_oTitleInfo.m_sGenres)); - oCore.WriteString(L""); - } - // Авторы - if (!m_internal->m_oTitleInfo.m_sAuthors.empty()) - { - oCore.WriteString(L""); - oCore.WriteString(EncodeXmlString(m_internal->m_oTitleInfo.m_sAuthors)); - oCore.WriteString(L""); - } - // Ключевые слова - if (!m_internal->m_oTitleInfo.m_sKeywords.empty()) - { - oCore.WriteString(L""); - oCore.WriteString(EncodeXmlString(m_internal->m_oTitleInfo.m_sKeywords)); - oCore.WriteString(L""); - } - if (!m_internal->m_oTitleInfo.m_sAnnotation.empty()) - { - oCore.WriteString(L""); - oCore.WriteString(EncodeXmlString(m_internal->m_oTitleInfo.m_sAnnotation)); - oCore.WriteString(L""); - } - // Конец core + // Создаем core.xml + NSStringUtils::CStringBuilder oCore; + // Заголовок + oCore += L""; + oCore.WriteString(EncodeXmlString(m_internal->m_oTitleInfo.m_sBookTitle)); + // Жанры + oCore.WriteString(L""); + if (!m_internal->m_oTitleInfo.m_sGenres.empty()) + { + oCore.WriteString(L""); + oCore.WriteString(EncodeXmlString(m_internal->m_oTitleInfo.m_sGenres)); + oCore.WriteString(L""); + } + // Авторы + if (!m_internal->m_oTitleInfo.m_sAuthors.empty()) + { + oCore.WriteString(L""); + oCore.WriteString(EncodeXmlString(m_internal->m_oTitleInfo.m_sAuthors)); + oCore.WriteString(L""); + } + // Ключевые слова + if (!m_internal->m_oTitleInfo.m_sKeywords.empty()) + { + oCore.WriteString(L""); + oCore.WriteString(EncodeXmlString(m_internal->m_oTitleInfo.m_sKeywords)); + oCore.WriteString(L""); + } + if (!m_internal->m_oTitleInfo.m_sAnnotation.empty()) + { + oCore.WriteString(L""); + oCore.WriteString(EncodeXmlString(m_internal->m_oTitleInfo.m_sAnnotation)); + oCore.WriteString(L""); + } + // Конец core oCore += L""; - // Пишем core в файл - NSFile::CFileBinary oCoreWriter; - if (oCoreWriter.CreateFileW(sDocPropsDirectory + L"/core.xml")) - { - oCoreWriter.WriteStringUTF8(oCore.GetData()); - oCoreWriter.CloseFile(); - } + // Пишем core в файл + NSFile::CFileBinary oCoreWriter; + if (oCoreWriter.CreateFileW(sDocPropsDirectory + L"/core.xml")) + { + oCoreWriter.WriteStringUTF8(oCore.GetData()); + oCoreWriter.CloseFile(); + } - // Получаем версию ONLYOFFICE - std::wstring sApplication = NSSystemUtils::GetEnvVariable(NSSystemUtils::gc_EnvApplicationName); - if (sApplication.empty()) - sApplication = NSSystemUtils::gc_EnvApplicationNameDefault; - #if defined(INTVER) - std::string sVersion = VALUE2STR(INTVER); - #endif - sApplication += L"/"; - sApplication += UTF8_TO_U(sVersion); - // Создаем app.xml - NSStringUtils::CStringBuilder oApp; - oApp += L""; - oApp += sApplication; + // Получаем версию ONLYOFFICE + std::wstring sApplication = NSSystemUtils::GetEnvVariable(NSSystemUtils::gc_EnvApplicationName); + if (sApplication.empty()) + sApplication = NSSystemUtils::gc_EnvApplicationNameDefault; + #if defined(INTVER) + std::string sVersion = VALUE2STR(INTVER); + #endif + sApplication += L"/"; + sApplication += UTF8_TO_U(sVersion); + // Создаем app.xml + NSStringUtils::CStringBuilder oApp; + oApp += L""; + oApp += sApplication; oApp += L"0falsefalsefalsefalse"; - // Пишем app в файл - NSFile::CFileBinary oAppWriter; - if (oAppWriter.CreateFileW(sDocPropsDirectory + L"/app.xml")) - { - oAppWriter.WriteStringUTF8(oApp.GetData()); - oAppWriter.CloseFile(); - } + // Пишем app в файл + NSFile::CFileBinary oAppWriter; + if (oAppWriter.CreateFileW(sDocPropsDirectory + L"/app.xml")) + { + oAppWriter.WriteStringUTF8(oApp.GetData()); + oAppWriter.CloseFile(); + } - // Конец рельсов - m_internal->m_oDocXmlRels += L""; - // Пишем рельсы в файл - NSFile::CFileBinary oRelsWriter; - if (oRelsWriter.CreateFileW(sDirectory + L"/word/_rels/document.xml.rels")) - { - oRelsWriter.WriteStringUTF8(m_internal->m_oDocXmlRels.GetData()); - oRelsWriter.CloseFile(); - } + // Конец рельсов + m_internal->m_oDocXmlRels += L""; + // Пишем рельсы в файл + NSFile::CFileBinary oRelsWriter; + if (oRelsWriter.CreateFileW(sDirectory + L"/word/_rels/document.xml.rels")) + { + oRelsWriter.WriteStringUTF8(m_internal->m_oDocXmlRels.GetData()); + oRelsWriter.CloseFile(); + } m_internal->m_oNoteXmlRels += L""; if (oRelsWriter.CreateFileW(sDirectory + L"/word/_rels/footnotes.xml.rels")) { @@ -2076,102 +2076,102 @@ HRESULT CFb2File::Open(const std::wstring& sPath, const std::wstring& sDirectory oRelsWriter.CloseFile(); } - // Архивим в docx - bool bNeedDocx = false; - if (oParams) - bNeedDocx = oParams->bNeedDocx; - if (bNeedDocx) - { - COfficeUtils oZip; - return oZip.CompressFileOrDirectory(sDirectory, sDirectory + L"/" + NSFile::GetFileName(sPath) + L".docx"); - } - return S_OK; + // Архивим в docx + bool bNeedDocx = false; + if (oParams) + bNeedDocx = oParams->bNeedDocx; + if (bNeedDocx) + { + COfficeUtils oZip; + return oZip.CompressFileOrDirectory(sDirectory, sDirectory + L"/" + NSFile::GetFileName(sPath) + L".docx"); + } + return S_OK; } // sHtmlFile - путь к файлу html, sDst - путь к результирующему файлу fb2, sInpTitle - входящий заголовок файла HRESULT CFb2File::FromHtml(const std::wstring& sHtmlFile, const std::wstring& sDst, const std::wstring& sInpTitle) { - std::wstring sTitle = sInpTitle; - if (sTitle.empty()) - sTitle = NSFile::GetFileName(sDst); + std::wstring sTitle = sInpTitle; + if (sTitle.empty()) + sTitle = NSFile::GetFileName(sDst); - BYTE* pData; - DWORD nLength; - if (!NSFile::CFileBinary::ReadAllBytes(sHtmlFile, &pData, nLength)) - return S_FALSE; + BYTE* pData; + DWORD nLength; + if (!NSFile::CFileBinary::ReadAllBytes(sHtmlFile, &pData, nLength)) + return S_FALSE; - std::string sContent = XmlUtils::GetUtf8FromFileContent(pData, nLength); - bool bNeedConvert = true; - if (nLength > 4) - { - if (pData[0] == 0xFF && pData[1] == 0xFE && !(pData[2] == 0x00 && pData[3] == 0x00)) - bNeedConvert = false; - if (pData[0] == 0xFE && pData[1] == 0xFF) - bNeedConvert = false; + std::string sContent = XmlUtils::GetUtf8FromFileContent(pData, nLength); + bool bNeedConvert = true; + if (nLength > 4) + { + if (pData[0] == 0xFF && pData[1] == 0xFE && !(pData[2] == 0x00 && pData[3] == 0x00)) + bNeedConvert = false; + if (pData[0] == 0xFE && pData[1] == 0xFF) + bNeedConvert = false; - if (pData[0] == 0xFF && pData[1] == 0xFE && pData[2] == 0x00 && pData[3] == 0x00) - bNeedConvert = false; - if (pData[0] == 0 && pData[1] == 0 && pData[2] == 0xFE && pData[3] == 0xFF) - bNeedConvert = false; - } - RELEASEARRAYOBJECTS(pData); + if (pData[0] == 0xFF && pData[1] == 0xFE && pData[2] == 0x00 && pData[3] == 0x00) + bNeedConvert = false; + if (pData[0] == 0 && pData[1] == 0 && pData[2] == 0xFE && pData[3] == 0xFF) + bNeedConvert = false; + } + RELEASEARRAYOBJECTS(pData); - //XmlUtils::CXmlLiteReader oIndexHtml; - std::wstring xhtml = htmlToXhtml(sContent, bNeedConvert); - if (!m_internal->m_oLightReader.FromString(xhtml)) - return S_FALSE; + //XmlUtils::CXmlLiteReader oIndexHtml; + std::wstring xhtml = htmlToXhtml(sContent, bNeedConvert); + if (!m_internal->m_oLightReader.FromString(xhtml)) + return S_FALSE; - m_internal->m_oLightReader.ReadNextNode(); // html - int nDepth = m_internal->m_oLightReader.GetDepth(); - m_internal->m_oLightReader.ReadNextSiblingNode(nDepth); // head - m_internal->m_oLightReader.ReadNextSiblingNode(nDepth); // body + m_internal->m_oLightReader.ReadNextNode(); // html + int nDepth = m_internal->m_oLightReader.GetDepth(); + m_internal->m_oLightReader.ReadNextSiblingNode(nDepth); // head + m_internal->m_oLightReader.ReadNextSiblingNode(nDepth); // body - //std::vector arrBinary; - NSStringUtils::CStringBuilder oDocument; - m_internal->readStream(oDocument); + //std::vector arrBinary; + NSStringUtils::CStringBuilder oDocument; + m_internal->readStream(oDocument); - NSStringUtils::CStringBuilder oRes; - oRes.WriteString(L""); - // description title-info - oRes.WriteString(L""); - if (m_internal->m_oTitleInfo.m_sBookTitle.empty()) - m_internal->m_oTitleInfo.m_sBookTitle = EncodeXmlString(sTitle); - NSStringUtils::CStringBuilder oTitleInfo; - m_internal->readTitleInfo(oTitleInfo); - oRes.WriteString(oTitleInfo.GetData()); - oRes.WriteString(L""); - // body - oRes.WriteString(L"
"); - oRes.WriteString(oDocument.GetData()); - oRes.WriteString(L"
"); - // notes - if (!m_internal->m_mFootnotes.empty()) - { - oRes.WriteString(L""); - for (std::map::iterator i = m_internal->m_mFootnotes.begin(); i != m_internal->m_mFootnotes.end(); i++) - { - oRes.WriteString(L"
first + L"\">"); - oRes.WriteString(i->second); - oRes.WriteString(L"
"); - } - oRes.WriteString(L""); - } - // binary - for (std::map>::iterator i = m_internal->m_mImages.begin(); i != m_internal->m_mImages.end(); i++) - { - oRes.WriteString(L"first + L".png\" content-type=\"image/png\">"); - oRes.WriteString(i->second[0]); - oRes.WriteString(L""); - } - oRes.WriteString(L"
"); - // Запись в файл - NSFile::CFileBinary oWriter; - if (oWriter.CreateFileW(sDst)) - { - oWriter.WriteStringUTF8(oRes.GetData()); - oWriter.CloseFile(); - return S_OK; - } - return S_FALSE; + NSStringUtils::CStringBuilder oRes; + oRes.WriteString(L""); + // description title-info + oRes.WriteString(L""); + if (m_internal->m_oTitleInfo.m_sBookTitle.empty()) + m_internal->m_oTitleInfo.m_sBookTitle = EncodeXmlString(sTitle); + NSStringUtils::CStringBuilder oTitleInfo; + m_internal->readTitleInfo(oTitleInfo); + oRes.WriteString(oTitleInfo.GetData()); + oRes.WriteString(L""); + // body + oRes.WriteString(L"
"); + oRes.WriteString(oDocument.GetData()); + oRes.WriteString(L"
"); + // notes + if (!m_internal->m_mFootnotes.empty()) + { + oRes.WriteString(L""); + for (std::map::iterator i = m_internal->m_mFootnotes.begin(); i != m_internal->m_mFootnotes.end(); i++) + { + oRes.WriteString(L"
first + L"\">"); + oRes.WriteString(i->second); + oRes.WriteString(L"
"); + } + oRes.WriteString(L""); + } + // binary + for (std::map>::iterator i = m_internal->m_mImages.begin(); i != m_internal->m_mImages.end(); i++) + { + oRes.WriteString(L"first + L".png\" content-type=\"image/png\">"); + oRes.WriteString(i->second[0]); + oRes.WriteString(L""); + } + oRes.WriteString(L"
"); + // Запись в файл + NSFile::CFileBinary oWriter; + if (oWriter.CreateFileW(sDst)) + { + oWriter.WriteStringUTF8(oRes.GetData()); + oWriter.CloseFile(); + return S_OK; + } + return S_FALSE; } diff --git a/Fb2File/test/main.cpp b/Fb2File/test/main.cpp index 6ded993049..06cde940ea 100644 --- a/Fb2File/test/main.cpp +++ b/Fb2File/test/main.cpp @@ -8,115 +8,115 @@ void getDirectories(const std::wstring& sDirectory, std::vector& arrDirectory) { - arrDirectory.push_back(sDirectory); - for (const std::wstring& sT : NSDirectory::GetDirectories(sDirectory)) - getDirectories(sT, arrDirectory); + arrDirectory.push_back(sDirectory); + for (const std::wstring& sT : NSDirectory::GetDirectories(sDirectory)) + getDirectories(sT, arrDirectory); } int main() { - bool bBatchMode = false; + bool bBatchMode = false; bool bFromHtml = false; - if (bBatchMode) - { - // Директория файлов - std::wstring sDirectory = NSFile::GetProcessDirectory() + L"/../../../examples/fb2"; - // Вложенные директории - std::vector arrDirectory; - getDirectories(sDirectory, arrDirectory); + if (bBatchMode) + { + // Директория файлов + std::wstring sDirectory = NSFile::GetProcessDirectory() + L"/../../../examples/fb2"; + // Вложенные директории + std::vector arrDirectory; + getDirectories(sDirectory, arrDirectory); - // Параметры конвертации - CFb2Params oParams; - oParams.bNeedDocx = false; - oParams.bNeedContents = true; - COfficeUtils oZip; - // Выставляем временную директорию - std::wstring sTmp = NSFile::GetProcessDirectory() + L"/tmp"; - NSDirectory::DeleteDirectory(sTmp); - NSDirectory::CreateDirectory(sTmp); + // Параметры конвертации + CFb2Params oParams; + oParams.bNeedDocx = false; + oParams.bNeedContents = true; + COfficeUtils oZip; + // Выставляем временную директорию + std::wstring sTmp = NSFile::GetProcessDirectory() + L"/tmp"; + NSDirectory::DeleteDirectory(sTmp); + NSDirectory::CreateDirectory(sTmp); - int nErrorCol = 0; - std::vector arrError; + int nErrorCol = 0; + std::vector arrError; - for (std::wstring sD : arrDirectory) - { - if (bFromHtml) - { - } - else - { - std::vector arrFiles = NSDirectory::GetFiles(sD); + for (std::wstring sD : arrDirectory) + { + if (bFromHtml) + { + } + else + { + std::vector arrFiles = NSDirectory::GetFiles(sD); - // Директория, где будем создавать docx - size_t nPos = sD.find(L"/fb2"); - sD.insert(nPos + 4, L"-res"); - NSDirectory::DeleteDirectory(sD); - NSDirectory::CreateDirectory(sD); + // Директория, где будем создавать docx + size_t nPos = sD.find(L"/fb2"); + sD.insert(nPos + 4, L"-res"); + NSDirectory::DeleteDirectory(sD); + NSDirectory::CreateDirectory(sD); - for(const std::wstring& sFile : arrFiles) - { - CFb2File oFile; - std::wstring sFileName = NSFile::GetFileName(sFile); - std::wcout << sFileName << std::endl; - if(!oFile.IsFb2File(sFile)) - { - nErrorCol++; - arrError.push_back(sFileName); - std::cout << "This isn't a fb2 file" << std::endl; - continue; - } + for(const std::wstring& sFile : arrFiles) + { + CFb2File oFile; + std::wstring sFileName = NSFile::GetFileName(sFile); + std::wcout << sFileName << std::endl; + if(!oFile.IsFb2File(sFile)) + { + nErrorCol++; + arrError.push_back(sFileName); + std::cout << "This isn't a fb2 file" << std::endl; + continue; + } - if(oFile.Open(sFile, sTmp, &oParams) == S_OK) - { - std::cout << "Success" << std::endl; - oZip.CompressFileOrDirectory(sTmp, sD + L"/" + sFileName + L".docx"); - NSDirectory::DeleteDirectory(sTmp + L"/word/media"); - } - else - { - nErrorCol++; - arrError.push_back(sFileName); - std::cout << "Failure" << std::endl; - } - } - } - } + if(oFile.Open(sFile, sTmp, &oParams) == S_OK) + { + std::cout << "Success" << std::endl; + oZip.CompressFileOrDirectory(sTmp, sD + L"/" + sFileName + L".docx"); + NSDirectory::DeleteDirectory(sTmp + L"/word/media"); + } + else + { + nErrorCol++; + arrError.push_back(sFileName); + std::cout << "Failure" << std::endl; + } + } + } + } - std::cout << "ERRORS - "<< nErrorCol << std::endl; - for(const std::wstring& sError : arrError) - std::wcout << sError << std::endl; - } - else - { - CFb2File oFile; + std::cout << "ERRORS - "<< nErrorCol << std::endl; + for(const std::wstring& sError : arrError) + std::wcout << sError << std::endl; + } + else + { + CFb2File oFile; - // Файл, который открываем - std::wstring sFile = NSFile::GetProcessDirectory() + L"/res.fb2"; + // Файл, который открываем + std::wstring sFile = NSFile::GetProcessDirectory() + L"/res.fb2"; - // Директория, где будем создавать docx - std::wstring sOutputDirectory = NSFile::GetProcessDirectory() + L"/res"; - NSDirectory::DeleteDirectory(sOutputDirectory); - NSDirectory::CreateDirectory(sOutputDirectory); + // Директория, где будем создавать docx + std::wstring sOutputDirectory = NSFile::GetProcessDirectory() + L"/res"; + NSDirectory::DeleteDirectory(sOutputDirectory); + NSDirectory::CreateDirectory(sOutputDirectory); - if (bFromHtml) - { - sFile = NSFile::GetProcessDirectory() + L"/test.html"; - oFile.FromHtml(sFile, sOutputDirectory + L"/res.fb2", L"Test Title"); - return 0; - } + if (bFromHtml) + { + sFile = NSFile::GetProcessDirectory() + L"/test.html"; + oFile.FromHtml(sFile, sOutputDirectory + L"/res.fb2", L"Test Title"); + return 0; + } - if (!oFile.IsFb2File(sFile)) - { - std::cout << "This isn't a fb2 file" << std::endl; - return 1; - } + if (!oFile.IsFb2File(sFile)) + { + std::cout << "This isn't a fb2 file" << std::endl; + return 1; + } - CFb2Params oParams; - oParams.bNeedDocx = true; + CFb2Params oParams; + oParams.bNeedDocx = true; oParams.bNeedContents = false; - std::cout << (oFile.Open(sFile, sOutputDirectory, &oParams) == S_OK ? "Success" : "Failure") << std::endl; - } - std::cout << "THE END" << std::endl; - return 0; + std::cout << (oFile.Open(sFile, sOutputDirectory, &oParams) == S_OK ? "Success" : "Failure") << std::endl; + } + std::cout << "THE END" << std::endl; + return 0; }