read tags

This commit is contained in:
Kulikova Svetlana
2020-08-10 16:55:38 +03:00
parent ccac25cd47
commit 4fcf1ebd14
3 changed files with 128 additions and 44 deletions

View File

@ -9,7 +9,7 @@
body { text-align: center; padding:0pt; margin: 0pt; } body { text-align: center; padding:0pt; margin: 0pt; }
</style> </style>
</head> </head>
<body><input type="radio" id="mothman" name="monster"/><label for="kraken">Kraken</label><input type="radio" id="mothman" name="monster"/><label for="kraken">Kraken</label>надо<hr/>надо<hr/>надо<hr/>надо<h1>Beetles</h1>надо <body><option value="value1">Значение 1</option><option value="value1">Значение 1</option><input type="radio" id="mothman" name="monster"/><label for="kraken">Kraken</label><input type="radio" id="mothman" name="monster"/><label for="kraken">Kraken</label>надо<hr/>надо<hr/>надо<hr/>надо<h1>Beetles</h1>надо
<h2>External morphology</h2>надо <h2>External morphology</h2>надо
<h3>Head</h3>надо <h3>Head</h3>надо
<h4>Mouthparts</h4>надо <h4>Mouthparts</h4>надо

View File

@ -487,7 +487,7 @@ private:
} }
} }
void readStream(std::vector<std::string>& sSelectors, std::wstring sRStyle, bool bBdo, bool bNeedLi, int nLevelLi) void readStream(std::vector<std::string>& sSelectors, std::wstring sRStyle, bool bBdo, bool bNeedLi, int nLevelLi, bool& bWasP)
{ {
if(m_oLightReader.IsEmptyNode()) if(m_oLightReader.IsEmptyNode())
return; return;
@ -510,41 +510,58 @@ private:
m_oDocXml += L"</w:rPr><w:t xml:space=\"preserve\">"; m_oDocXml += L"</w:rPr><w:t xml:space=\"preserve\">";
m_oDocXml.WriteEncodeXmlString(sText); m_oDocXml.WriteEncodeXmlString(sText);
m_oDocXml += L"</w:t></w:r>"; m_oDocXml += L"</w:t></w:r>";
bWasP = false;
} }
// Ссылки // Ссылки
else if(sName == L"a") else if(sName == L"a")
readLink(sSubClass, sRStyle, bBdo, bNeedLi, nLevelLi); readLink(sSubClass, sRStyle, bBdo, bNeedLi, nLevelLi, bWasP);
// Абревиатура, реализована как сноски // Абревиатура, реализована как сноски
else if(sName == L"abbr") else if(sName == L"abbr")
readAbbr(sSubClass, sRStyle, bBdo); readAbbr(sSubClass, sRStyle, bBdo);
// Адрес // Адрес
else if(sName == L"address") else if(sName == L"address")
{ {
m_oDocXml += L"</w:p><w:p>"; if(!bWasP)
readStream(sSubClass, sRStyle + L"<w:i/>", bBdo, bNeedLi, nLevelLi); {
m_oDocXml += L"</w:p><w:p>"; m_oDocXml += L"</w:p><w:p>";
bWasP = true;
}
readStream(sSubClass, sRStyle + L"<w:i/>", bBdo, bNeedLi, nLevelLi, bWasP);
if(!bWasP)
{
m_oDocXml += L"</w:p><w:p>";
bWasP = true;
}
} }
// Статья // Статья
// Боковой блок // Боковой блок
// Выделенная цитата // Выделенная цитата
// Скрытая информация // Скрытая информация
// Контейнер // Контейнер
else if(sName == L"article" || sName == L"aside" || sName == L"blockquote" ||
sName == L"details" || sName == L"div" || sName == L"summary")
{
m_oDocXml += L"</w:p><w:p>";
readStream(sSubClass, sRStyle, bBdo, bNeedLi, nLevelLi);
}
// Заголовок скрытой информации // Заголовок скрытой информации
else if(sName == L"dl") // ...
else if(sName == L"article" || sName == L"aside" || sName == L"blockquote" || sName == L"details" || sName == L"div" ||
sName == L"summary" || sName == L"dl" || sName == L"filedset" || sName == L"figure" || sName == L"figcaption" ||
sName == L"footer" || sName == L"form" || sName == L"header")
{ {
m_oDocXml += L"</w:p><w:p>"; if(!bWasP)
readStream(sSubClass, sRStyle, bBdo, bNeedLi, nLevelLi); {
m_oDocXml += L"</w:p><w:p>"; m_oDocXml += L"</w:p><w:p>";
bWasP = true;
}
readStream(sSubClass, sRStyle, bBdo, bNeedLi, nLevelLi, bWasP);
if(!bWasP)
{
m_oDocXml += L"</w:p><w:p>";
bWasP = true;
}
} }
// Полужирный текст // Полужирный текст
else if(sName == L"b") else if(sName == L"b")
{
readP(sSubClass, sRStyle + L"<w:b/>", bBdo); readP(sSubClass, sRStyle + L"<w:b/>", bBdo);
bWasP = false;
}
// Направление текста // Направление текста
else if(sName == L"bdo") else if(sName == L"bdo")
{ {
@ -558,65 +575,115 @@ private:
readP(sSubClass, sRStyle, true); readP(sSubClass, sRStyle, true);
else else
readP(sSubClass, sRStyle, false); readP(sSubClass, sRStyle, false);
bWasP = false;
} }
// Отмена направления текста // Отмена направления текста
else if(sName == L"bdi") else if(sName == L"bdi")
{
readP(sSubClass, sRStyle, false); readP(sSubClass, sRStyle, false);
bWasP = false;
}
// Перенос строки // Перенос строки
else if(sName == L"br") else if(sName == L"br")
{
m_oDocXml += L"<w:r><w:br/></w:r>"; m_oDocXml += L"<w:r><w:br/></w:r>";
bWasP = false;
}
// Кнопка // Кнопка
// Данные // Данные
// Подпись // Подпись
else if(sName == L"button" || sName == L"data" || sName == L"label") else if(sName == L"button" || sName == L"data" || sName == L"label")
{
readP(sSubClass, sRStyle, bBdo); readP(sSubClass, sRStyle, bBdo);
bWasP = false;
}
// Цитата, обычно выделяется курсивом // Цитата, обычно выделяется курсивом
// Новый термин, обычно выделяется курсивом // Новый термин, обычно выделяется курсивом
else if(sName == L"cite" || sName == L"dfn") else if(sName == L"cite" || sName == L"dfn")
{
readP(sSubClass, sRStyle + L"<w:i/>", bBdo); readP(sSubClass, sRStyle + L"<w:i/>", bBdo);
bWasP = false;
}
// Код // Код
else if(sName == L"code") else if(sName == L"code")
{
readP(sSubClass, sRStyle + L"<w:rFonts w:ascii=\"Consolas\" w:hAnsi=\"Consolas\"/>", bBdo); readP(sSubClass, sRStyle + L"<w:rFonts w:ascii=\"Consolas\" w:hAnsi=\"Consolas\"/>", bBdo);
bWasP = false;
}
// Зачеркнутый текст // Зачеркнутый текст
else if(sName == L"del") else if(sName == L"del")
readP(sSubClass, sRStyle + L"<w:strike/>", bBdo); readStream(sSubClass, sRStyle + L"<w:strike/>", bBdo, bNeedLi, nLevelLi, bWasP);
// Акцентированный текст // Акцентированный текст
else if(sName == L"em") else if(sName == L"em")
readStream(sSubClass, sRStyle + L"<w:i/>", bBdo, bNeedLi, nLevelLi); readStream(sSubClass, sRStyle + L"<w:i/>", bBdo, bNeedLi, nLevelLi, bWasP);
// Абзац текста. Содержит фразовый контент
else if(sName == L"p")
{
m_oDocXml += L"</w:p><w:p>";
readP(sSubClass, sRStyle, bBdo);
m_oDocXml += L"</w:p><w:p>";
}
// Заголовок // Заголовок
else if(sName == L"h1" || sName == L"h2" || sName == L"h3" || sName == L"h4" || sName == L"h5" || sName == L"h6") else if(sName == L"h1" || sName == L"h2" || sName == L"h3" || sName == L"h4" || sName == L"h5" || sName == L"h6")
{ {
m_oDocXml += L"</w:p><w:p><w:pPr><w:pStyle w:val=\""; if(!bWasP)
{
m_oDocXml += L"</w:p><w:p>";
bWasP = true;
}
m_oDocXml += L"<w:pPr><w:pStyle w:val=\"";
m_oDocXml += sName; m_oDocXml += sName;
m_oDocXml += L"\"/></w:pPr>"; m_oDocXml += L"\"/></w:pPr>";
readStream(sSubClass, sRStyle, bBdo, bNeedLi, nLevelLi); readStream(sSubClass, sRStyle, bBdo, bNeedLi, nLevelLi, bWasP);
m_oDocXml += L"</w:p><w:p>"; if(!bWasP)
{
m_oDocXml += L"</w:p><w:p>";
bWasP = true;
}
} }
// Горизонтальная линия // Горизонтальная линия
else if(sName == L"hr") else if(sName == L"hr")
m_oDocXml += L"</w:p><w:p><w:pPr><w:pBdr><w:bottom w:val=\"single\" w:color=\"000000\" w:sz=\"8\" w:space=\"0\"/></w:pBdr></w:pPr></w:p><w:p>"; {
if(!bWasP)
{
m_oDocXml += L"</w:p><w:p>";
bWasP = true;
}
m_oDocXml += L"<w:pPr><w:pBdr><w:bottom w:val=\"single\" w:color=\"000000\" w:sz=\"8\" w:space=\"0\"/></w:pBdr></w:pPr></w:p><w:p>";
bWasP = true;
}
// Картинки // Картинки
else if(sName == L"img" || sName == L"image") else if(sName == L"img" || sName == L"image")
{
readImage(); readImage();
bWasP = false;
}
// Абзац текста. Содержит фразовый контент
else if(sName == L"p")
{
if(!bWasP)
{
m_oDocXml += L"</w:p><w:p>";
bWasP = true;
}
readP(sSubClass, sRStyle, bBdo);
m_oDocXml += L"</w:p><w:p>";
bWasP = true;
}
// Маркированный список // Маркированный список
else if(sName == L"ul") else if(sName == L"ul")
readUl(sSubClass, sRStyle, bBdo, nLevelLi); readUl(sSubClass, sRStyle, bBdo, nLevelLi, bWasP);
// Игнорируемые, но с отступом // Игнорируемые
else if(sName == L"dd" ||sName == L"dt" ||sName == L"fieldset" || sName == L"legend") else if(sName == L"audio" || sName == L"canvas" || sName == L"command" || sName == L"datalist" || sName == L"embed" ||
{ sName == L"input" )
m_oDocXml += L"</w:p><w:p>"; readStream(sSubClass, sRStyle, bBdo, bNeedLi, nLevelLi, bWasP);
readStream(sSubClass, sRStyle, bBdo, bNeedLi, nLevelLi);
m_oDocXml += L"</w:p><w:p>";
}
else else
readStream(sSubClass, sRStyle, bBdo, bNeedLi, nLevelLi); {
if(!bWasP)
{
m_oDocXml += L"</w:p><w:p>";
bWasP = true;
}
readStream(sSubClass, sRStyle, bBdo, bNeedLi, nLevelLi, bWasP);
if(!bWasP)
{
m_oDocXml += L"</w:p><w:p>";
bWasP = true;
}
}
} }
} }
@ -624,12 +691,13 @@ private:
{ {
// sSelectors = getStyle(sSelectors); // sSelectors = getStyle(sSelectors);
bool bWasP = true;
m_oDocXml += L"<w:p>"; m_oDocXml += L"<w:p>";
readStream(sSelectors, L"", false, false, -1); readStream(sSelectors, L"", false, false, -1, bWasP);
m_oDocXml += L"</w:p>"; m_oDocXml += L"</w:p>";
} }
void readUl(std::vector<std::string>& sSelectors, std::wstring sRStyle, bool bBdo, int nLevelLi) void readUl(std::vector<std::string>& sSelectors, std::wstring sRStyle, bool bBdo, int nLevelLi, bool& bWasP)
{ {
if(m_oLightReader.IsEmptyNode()) if(m_oLightReader.IsEmptyNode())
return; return;
@ -639,7 +707,17 @@ private:
{ {
if(m_oLightReader.GetName() != L"li") if(m_oLightReader.GetName() != L"li")
continue; continue;
readStream(sSelectors, sRStyle, bBdo, true, nLevelLi + 1); if(!bWasP)
{
m_oDocXml += L"</w:p><w:p>";
bWasP = true;
}
readStream(sSelectors, sRStyle, bBdo, true, nLevelLi + 1, bWasP);
if(!bWasP)
{
m_oDocXml += L"</w:p><w:p>";
bWasP = true;
}
} }
} }
@ -664,7 +742,7 @@ private:
m_oNoteXml += L"</w:t></w:r></w:p></w:footnote>"; m_oNoteXml += L"</w:t></w:r></w:p></w:footnote>";
} }
void readLink(std::vector<std::string>& sSelectors, std::wstring sRStyle, bool bBdo, bool bNeedLi, int nLevelLi) void readLink(std::vector<std::string>& sSelectors, std::wstring sRStyle, bool bBdo, bool bNeedLi, int nLevelLi, bool& bWasP)
{ {
std::wstring sRef = L""; std::wstring sRef = L"";
std::wstring sTitle = L""; std::wstring sTitle = L"";
@ -709,7 +787,7 @@ private:
m_oDocXml += L"\" r:id=\"rHyp"; m_oDocXml += L"\" r:id=\"rHyp";
m_oDocXml += std::to_wstring(m_nHyperlinkId++); m_oDocXml += std::to_wstring(m_nHyperlinkId++);
m_oDocXml += L"\">"; m_oDocXml += L"\">";
readStream(sSelectors, sRStyle += L"<w:rStyle w:val=\"link\"/>", bBdo, bNeedLi, nLevelLi); readStream(sSelectors, sRStyle += L"<w:rStyle w:val=\"link\"/>", bBdo, bNeedLi, nLevelLi, bWasP);
m_oDocXml += L"</w:hyperlink>"; m_oDocXml += L"</w:hyperlink>";
} }
@ -760,6 +838,8 @@ private:
size_t nSrcM = sSrcM.rfind(L"/") + 1; size_t nSrcM = sSrcM.rfind(L"/") + 1;
sImageName = sSrcM.substr(nSrcM); sImageName = sSrcM.substr(nSrcM);
bRes = NSFile::CFileBinary::Copy(m_sSrc + L"/" + sSrcM, m_sDst + L"/word/media/" + sImageName); bRes = NSFile::CFileBinary::Copy(m_sSrc + L"/" + sSrcM, m_sDst + L"/word/media/" + sImageName);
if(!bRes)
bRes = NSFile::CFileBinary::Copy(m_sSrc + L"/" + sImageName, m_sDst + L"/word/media/" + sImageName);
} }
if(bRes) if(bRes)
@ -847,7 +927,10 @@ private:
} }
// Ссылки // Ссылки
else if(sName == L"a") else if(sName == L"a")
readLink(sSubClass, sRStyle, bBdo, false, -1); {
bool bWasP = true;
readLink(sSubClass, sRStyle, bBdo, false, -1, bWasP);
}
// Абревиатура, реализована как сноски // Абревиатура, реализована как сноски
else if(sName == L"abbr") else if(sName == L"abbr")
readAbbr(sSubClass, sRStyle, bBdo); readAbbr(sSubClass, sRStyle, bBdo);

View File

@ -17,6 +17,7 @@ struct CNode
std::wstring m_sName; // Имя тэга std::wstring m_sName; // Имя тэга
std::wstring m_sId; // Id тэга std::wstring m_sId; // Id тэга
std::wstring m_sClass; // Класс тэга std::wstring m_sClass; // Класс тэга
std::wstring m_sStyle; // Стиль тэга
}; };
struct CHtmlParams struct CHtmlParams