diff --git a/HtmlFile2/examples/test4.xhtml b/HtmlFile2/examples/test4.xhtml index e228baf5f0..7dc7dc057a 100644 --- a/HtmlFile2/examples/test4.xhtml +++ b/HtmlFile2/examples/test4.xhtml @@ -26,5 +26,6 @@ height="14" alt="внедренная иконка папки"/>
1.png
+

You can use CSS to style your HTML.

diff --git a/HtmlFile2/htmlfile2.cpp b/HtmlFile2/htmlfile2.cpp index 8bf678677e..deb82a1bb2 100644 --- a/HtmlFile2/htmlfile2.cpp +++ b/HtmlFile2/htmlfile2.cpp @@ -21,11 +21,13 @@ public: std::wstring m_sBase; // Полный базовый адрес std::map m_mStyles; // Стили в document.xml. Хранятся как (имя тэга, его стиль) - int m_nImageId; // ID картинки + int m_nImageId; // ID картинки + int m_nFootnoteId; // ID сноски public: CHtmlFile2_Private() { m_nImageId = 1; + m_nFootnoteId = 1; m_sBase = L""; } @@ -103,7 +105,6 @@ public: pDocxWriter->m_oFontTableWriter.Write(); pDocxWriter->m_oSettingWriter.Write(); pDocxWriter->m_oWebSettingsWriter.Write(); - pDocxWriter->m_oDocumentWriter.Write(); pDocxWriter->m_oDocumentRelsWriter.Write(); oContentTypes.Registration(L"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml", OOX::CPath(L"/word"), OOX::CPath(L"document.xml")); @@ -119,7 +120,7 @@ public: // Предварительное чтение стилей и картинок // sPath - файл после конвертации в xhtml - bool readSrc(const std::wstring& sPath, const std::wstring& sSrc, const std::wstring& sDst, NSStringUtils::CStringBuilder& oStylesXml, NSStringUtils::CStringBuilder& oDocXmlRels) + bool readSrc(const std::wstring& sPath, const std::wstring& sSrc, const std::wstring& sDst, NSStringUtils::CStringBuilder& oStylesXml, NSStringUtils::CStringBuilder& oDocXmlRels, NSStringUtils::CStringBuilder& oDocXml, NSStringUtils::CStringBuilder& oNoteXml) { if(!m_oLightReader.IsValid()) { @@ -131,66 +132,19 @@ public: return false; } - readFile(sSrc, sDst, oStylesXml, oDocXmlRels); + readFile(sSrc, sDst, oStylesXml, oDocXmlRels, oDocXml, oNoteXml); return true; } - // Читает стили - // sSrc - директория с исходником до конвертации, относительно которой указываются пути до картинок - void readFile(const std::wstring& sSrc, const std::wstring& sDst, NSStringUtils::CStringBuilder& oStylesXml, NSStringUtils::CStringBuilder& oDocXmlRels) + // Читает файл + // sSrc - директория с исходником до конвертации, относительно которой указываются пути + void readFile(const std::wstring& sSrc, const std::wstring& sDst, NSStringUtils::CStringBuilder& oStylesXml, NSStringUtils::CStringBuilder& oDocXmlRels, NSStringUtils::CStringBuilder& oDocXml, NSStringUtils::CStringBuilder& oNoteXml) { + if(readStyle(oStylesXml)) + return; + std::wstring sName = m_oLightReader.GetName(); - // тэг style содержит стили для styles.xml - if(sName == L"style") - { - // Получаем наборы стилей как ...... - std::wstring sStyle = L""; // oCSS.GetStyleXml(content()); - // Дописываем в styles.xml - oStylesXml += sStyle; - } - // Стиль по ссылке - else if(sName == L"link") - { - while(m_oLightReader.MoveToNextAttribute()) - { - if(m_oLightReader.GetName() == L"href") - { - std::wstring sRef = m_oLightReader.GetText(); - // Если это css файл, то поведение аналогично тэгу style - // Кроме функции получения стилей - sRef = NSFile::GetFileExtention(sRef); - if(sRef == L"css") - { - // Получаем наборы стилей как ...... - std::wstring sStyle = L""; // oCSS.GetStyleFromCSS(sRef); - oStylesXml += sStyle; - } - } - } - m_oLightReader.MoveToElement(); - } - // Стиль по атрибуту - while(m_oLightReader.MoveToNextAttribute()) - { - if(m_oLightReader.GetName() == L"style") - { - // Получаем стиль как ... для записи в document.xml - std::wstring sStyle = L""; // oCSS.GetStyleDoc(m_oLightReader.GetText()); - - std::map::iterator it = m_mStyles.find(sName); - // Если для тэга уже есть стиль, то получаем среднее - if(it != m_mStyles.end()) - { - it->second = L""; // oCSS.GetStyleCompromise(it->second, sStyle); - } - // Если впервые, то сохраняем как - имя тэга в файле и его стиль - else - m_mStyles.insert(std::make_pair(sName, sStyle)); - } - } - m_oLightReader.MoveToElement(); - // Картинки if(sName == L"img" || sName == L"image") readImage(sSrc, sDst + L"/word/media/", oDocXmlRels); @@ -201,12 +155,8 @@ public: else if(sName == L"base") { while(m_oLightReader.MoveToNextAttribute()) - { if(m_oLightReader.GetName() == L"href") - { m_sBase = m_oLightReader.GetText(); - } - } m_oLightReader.MoveToElement(); } // Ссылки @@ -235,7 +185,9 @@ public: // Абзац текста. Содержит фразовый контент else if(sName == L"p") { - readP(); + oDocXml += L""; + readP(sName, oDocXml, oNoteXml); + oDocXml += L""; return; } @@ -244,7 +196,7 @@ public: return; int nDeath = m_oLightReader.GetDepth(); while(m_oLightReader.ReadNextSiblingNode(nDeath)) - readFile(sSrc, sDst, oStylesXml, oDocXmlRels); + readFile(sSrc, sDst, oStylesXml, oDocXmlRels, oDocXml, oNoteXml); } void htmlXhtml(const std::wstring& sSrc) @@ -257,7 +209,66 @@ public: oXhtmlWriter.CloseFile(); } } + private: + bool readStyle(NSStringUtils::CStringBuilder& oStylesXml) + { + bool isStyle = false; + std::wstring sName = m_oLightReader.GetName(); + // тэг style содержит стили для styles.xml + if(sName == L"style") + { + isStyle = true; + // Получаем наборы стилей как ...... + std::wstring sStyle = L""; // oCSS.GetStyleXml(content()); + // Дописываем в styles.xml + oStylesXml += sStyle; + } + // Стиль по ссылке + else if(sName == L"link") + { + while(m_oLightReader.MoveToNextAttribute()) + { + if(m_oLightReader.GetName() == L"href") + { + std::wstring sRef = m_oLightReader.GetText(); + // Если это css файл, то поведение аналогично тэгу style + // Кроме функции получения стилей + sRef = NSFile::GetFileExtention(sRef); + if(sRef == L"css") + { + isStyle = true; + // Получаем наборы стилей как ...... + std::wstring sStyle = L""; // oCSS.GetStyleFromCSS(sRef); + oStylesXml += sStyle; + } + } + } + m_oLightReader.MoveToElement(); + } + // Стиль по атрибуту + while(m_oLightReader.MoveToNextAttribute()) + { + if(m_oLightReader.GetName() == L"style") + { + // Получаем стиль как внутренность ... или внутренность ... для записи в document.xml + std::wstring sStyle = L""; // oCSS.GetStyleDoc(m_oLightReader.GetText()); + + std::map::iterator it = m_mStyles.find(sName); + // Если для тэга уже есть стиль, то получаем среднее + if(it != m_mStyles.end()) + { + it->second = L""; // oCSS.GetStyleCompromise(it->second, sStyle); + } + // Если впервые, то сохраняем как - имя тэга в файле и его стиль + else + m_mStyles.insert(std::make_pair(sName, sStyle)); + } + } + m_oLightReader.MoveToElement(); + return isStyle; + } + void readImage(const std::wstring& sSrc, const std::wstring& sMedia, NSStringUtils::CStringBuilder& oDocXmlRels) { while(m_oLightReader.MoveToNextAttribute()) @@ -343,14 +354,47 @@ private: } } - void readP() + void readP(std::wstring sPName, NSStringUtils::CStringBuilder& oDocXml, NSStringUtils::CStringBuilder& oNoteXml) { if(m_oLightReader.IsEmptyNode()) return; - int nDeath = m_oLightReader.GetDepth(); - while(m_oLightReader.ReadNextSiblingNode(nDeath)) - readP(); + int nDepth = m_oLightReader.GetDepth(); + while(m_oLightReader.ReadNextSiblingNode2(nDepth)) + { + std::wstring sName = m_oLightReader.GetName(); + if(sName == L"#text") + { + oDocXml += L""; + //oDocXml += sRStyle; + oDocXml += L""; + oDocXml.WriteEncodeXmlString(m_oLightReader.GetText()); + oDocXml += L""; + + } + // Абревиатура, реализована как сноски + else if(sName == L"abbr") + { + std::wstring sNote = L""; + while(m_oLightReader.MoveToNextAttribute()) + if(m_oLightReader.GetName() == L"title") + sNote = m_oLightReader.GetText(); + m_oLightReader.MoveToElement(); + + readP(sPName, oDocXml, oNoteXml); + + oDocXml += L""; + + oNoteXml += L""; + oNoteXml += sNote; + oNoteXml += L""; + } + // readP(sPName, oDocXml); + } } std::wstring content() @@ -405,15 +449,24 @@ HRESULT CHtmlFile2::Open(const std::wstring& sSrc, const std::wstring& sDst, CHt NSStringUtils::CStringBuilder oStylesXml; // styles.xml NSStringUtils::CStringBuilder oDocXmlRels; // document.xml.rels + NSStringUtils::CStringBuilder oDocXml; // document.xml + NSStringUtils::CStringBuilder oNoteXml; // footnotes.xml + oDocXmlRels += L""; oDocXmlRels += L""; oDocXmlRels += L""; oDocXmlRels += L""; oDocXmlRels += L""; oDocXmlRels += L""; + oDocXmlRels += L""; + + oDocXml += L""; + + oNoteXml += L""; + oNoteXml += L""; std::wstring sSrcFolder = NSSystemPath::GetDirectoryName(sSrc); - if(!m_internal->readSrc(sSource, sSrcFolder, sDst, oStylesXml, oDocXmlRels)) + if(!m_internal->readSrc(sSource, sSrcFolder, sDst, oStylesXml, oDocXmlRels, oDocXml, oNoteXml)) return S_FALSE; oDocXmlRels += L""; @@ -424,5 +477,21 @@ HRESULT CHtmlFile2::Open(const std::wstring& sSrc, const std::wstring& sDst, CHt oRelsWriter.CloseFile(); } + oDocXml += L""; + NSFile::CFileBinary oDocumentWriter; + if (oDocumentWriter.CreateFileW(sDst + L"/word/document.xml")) + { + oDocumentWriter.WriteStringUTF8(oDocXml.GetData()); + oDocumentWriter.CloseFile(); + } + + oNoteXml += L""; + NSFile::CFileBinary oFootnotesWriter; + if (oFootnotesWriter.CreateFileW(sDst + L"/word/footnotes.xml")) + { + oFootnotesWriter.WriteStringUTF8(oNoteXml.GetData()); + oFootnotesWriter.CloseFile(); + } + return S_OK; } diff --git a/HtmlFile2/test/main.cpp b/HtmlFile2/test/main.cpp index 9a6e93088b..694c395a00 100644 --- a/HtmlFile2/test/main.cpp +++ b/HtmlFile2/test/main.cpp @@ -16,7 +16,7 @@ int main() CHtmlFile2 oFile; // Файл, который открываем - std::wstring sFile = NSFile::GetProcessDirectory() + L"/../../../examples/test2.xhtml"; + std::wstring sFile = NSFile::GetProcessDirectory() + L"/../../../examples/test4.xhtml"; // Директория, где будем создавать xhtml std::wstring sOutputDirectory = NSFile::GetProcessDirectory() + L"/res";