Merge pull request 'Fix md/html bugs' (#507) from fix/md into hotfix/v9.2.0

Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/507
This commit is contained in:
Oleg Korshul
2025-10-31 13:27:05 +00:00
16 changed files with 160 additions and 79 deletions

View File

@ -514,6 +514,9 @@ namespace NSCSS
return true;
}
if (!arSelectors.back().m_pCompiledStyle->Empty())
return true;
arSelectors.back().m_pCompiledStyle->SetDpi(m_nDpi);
unsigned int unStart = 0;
@ -522,7 +525,7 @@ namespace NSCSS
if (itFound != arSelectors.crend())
unStart = itFound.base() - arSelectors.cbegin();
std::vector<std::wstring> arNodes = CalculateAllNodes(arSelectors, unStart);
std::vector<std::wstring> arNodes = CalculateAllNodes(arSelectors, unStart, arSelectors.size());
std::vector<std::wstring> arPrevNodes = CalculateAllNodes(arSelectors, 0, unStart);
bool bInTable = false;
@ -548,6 +551,7 @@ namespace NSCSS
{
arSelectors[i].m_pCompiledStyle->m_oBackground.Clear();
arSelectors[i].m_pCompiledStyle->m_oBorder.Clear();
arSelectors[i].m_pCompiledStyle->m_oDisplay.Clear();
}
arSelectors[i].m_pCompiledStyle->AddStyle(arSelectors[i].m_mAttributes, i + 1);
@ -594,7 +598,7 @@ namespace NSCSS
std::vector<std::wstring> CCssCalculator_Private::CalculateAllNodes(const std::vector<CNode> &arSelectors, unsigned int unStart, unsigned int unEnd)
{
if (0 != unEnd && (unEnd < unStart || unEnd > arSelectors.size()))
if ((0 != unEnd && (unEnd < unStart || unEnd > arSelectors.size())) || (unStart == unEnd))
return std::vector<std::wstring>();
std::vector<std::wstring> arNodes;
@ -630,7 +634,7 @@ namespace NSCSS
if (arNextNodes.empty())
return;
const std::vector<CElement*> arTempPrev = pElement->GetPrevElements(arNextNodes.crbegin() + 1, arNextNodes.crend());
const std::vector<CElement*> arTempPrev = pElement->GetPrevElements(arNextNodes.cbegin(), arNextNodes.cend());
const std::vector<CElement*> arTempKins = pElement->GetNextOfKin(wsName, arClasses);
if (!arTempPrev.empty())
@ -647,20 +651,19 @@ namespace NSCSS
std::vector<const CElement*> arFindedElements;
std::wstring wsName, wsId;
std::wstring wsName, wsClasses, wsId;
std::vector<std::wstring> arClasses;
if (!arNodes.empty() && arNodes.back()[0] == L'#')
{
wsId = arNodes.back();
arNodes.pop_back();
arNextNodes.push_back(wsId);
}
if (!arNodes.empty() && arNodes.back()[0] == L'.')
{
arClasses = NS_STATIC_FUNCTIONS::GetWordsW(arNodes.back(), false, L" ");
arNextNodes.push_back(arNodes.back());
wsClasses = arNodes.back();
arClasses = NS_STATIC_FUNCTIONS::GetWordsW(wsClasses, false, L" ");
arNodes.pop_back();
}
@ -668,7 +671,6 @@ namespace NSCSS
{
wsName = arNodes.back();
arNodes.pop_back();
arNextNodes.push_back(wsName);
}
if (!wsId.empty())
@ -727,6 +729,14 @@ namespace NSCSS
{ return oFirstElement->GetWeight() > oSecondElement->GetWeight(); });
}
if (!wsId.empty())
arNextNodes.push_back(wsId);
if (!wsClasses.empty())
arNextNodes.push_back(wsClasses);
arNextNodes.push_back(wsName);
return arFindedElements;
}
@ -741,7 +751,7 @@ namespace NSCSS
if (arSelectors.empty())
return false;
std::vector<std::wstring> arNodes = CalculateAllNodes(arSelectors);
std::vector<std::wstring> arNodes = CalculateAllNodes(arSelectors, 0, arSelectors.size());
std::vector<std::wstring> arNextNodes;
for (size_t i = 0; i < arSelectors.size(); ++i)

View File

@ -110,7 +110,7 @@ namespace NSCSS
void ClearPageData();
#endif
std::vector<std::wstring> CalculateAllNodes(const std::vector<CNode>& arSelectors, unsigned int unStart = 0, unsigned int unEnd = 0);
std::vector<std::wstring> CalculateAllNodes(const std::vector<CNode>& arSelectors, unsigned int unStart, unsigned int unEnd);
std::vector<const CElement*> FindElements(std::vector<std::wstring>& arNodes, std::vector<std::wstring>& arNextNodes);
void AddStyles(const std::string& sStyle);

View File

@ -176,14 +176,14 @@ namespace NSCSS
return arElements;
}
std::vector<CElement *> CElement::GetPrevElements(const std::vector<std::wstring>::const_reverse_iterator& oNodesRBegin, const std::vector<std::wstring>::const_reverse_iterator& oNodesREnd) const
std::vector<CElement *> CElement::GetPrevElements(const std::vector<std::wstring>::const_iterator& oNodesBegin, const std::vector<std::wstring>::const_iterator& oNodesEnd) const
{
if (oNodesRBegin >= oNodesREnd || m_arPrevElements.empty())
if (oNodesBegin >= oNodesEnd || m_arPrevElements.empty())
return std::vector<CElement*>();
std::vector<CElement*> arElements;
for (std::vector<std::wstring>::const_reverse_iterator iWord = oNodesRBegin; iWord != oNodesREnd; ++iWord)
for (std::vector<std::wstring>::const_iterator iWord = oNodesBegin; iWord != oNodesEnd; ++iWord)
{
if ((*iWord)[0] == L'.' && ((*iWord).find(L" ") != std::wstring::npos))
{
@ -195,7 +195,7 @@ namespace NSCSS
if (oPrevElement->m_sSelector == wsClass)
{
arElements.push_back(oPrevElement);
std::vector<CElement*> arTempElements = oPrevElement->GetPrevElements(iWord + 1, oNodesREnd);
std::vector<CElement*> arTempElements = oPrevElement->GetPrevElements(iWord + 1, oNodesEnd);
arElements.insert(arElements.end(), arTempElements.begin(), arTempElements.end());
}
}
@ -208,9 +208,8 @@ namespace NSCSS
if (oPrevElement->m_sSelector == *iWord)
{
arElements.push_back(oPrevElement);
std::vector<CElement*> arTempElements = oPrevElement->GetPrevElements(iWord + 1, oNodesREnd);
std::vector<CElement*> arTempElements = oPrevElement->GetPrevElements(iWord + 1, oNodesEnd);
arElements.insert(arElements.end(), arTempElements.begin(), arTempElements.end());
// return arElements;
}
}
}

View File

@ -39,7 +39,7 @@ namespace NSCSS
std::map<std::wstring, std::wstring> GetFullStyle(const std::vector<CNode>& arSelectors) const;
std::map<std::wstring, std::wstring> GetFullStyle(const std::vector<std::wstring>& arNodes) const;
std::vector<CElement *> GetNextOfKin(const std::wstring& sName, const std::vector<std::wstring>& arClasses = {}) const;
std::vector<CElement *> GetPrevElements(const std::vector<std::wstring>::const_reverse_iterator& oNodesRBegin, const std::vector<std::wstring>::const_reverse_iterator& oNodesREnd) const;
std::vector<CElement *> GetPrevElements(const std::vector<std::wstring>::const_iterator& oNodesBegin, const std::vector<std::wstring>::const_iterator& oNodesEnd) const;
std::map<std::wstring, std::wstring> GetConvertStyle(const std::vector<CNode>& arNodes) const;
CElement *FindPrevElement(const std::wstring& sSelector) const;

View File

@ -1483,6 +1483,21 @@ namespace NSCSS
(m_eWhiteSpace.Empty() || m_eWhiteSpace == EWhiteSpace::Normal);
}
void CDisplay::Clear()
{
m_oX.Clear();
m_oY.Clear();
m_oWidth.Clear();
m_oHeight.Clear();
m_oHAlign.Clear();
m_oVAlign.Clear();
m_oDisplay.Clear();
m_eWhiteSpace.Clear();
}
CDisplay &CDisplay::operator+=(const CDisplay &oDisplay)
{
m_oX += oDisplay.m_oX;

View File

@ -373,6 +373,7 @@ namespace NSCSS
const CEnum& GetWhiteSpace() const;
bool Empty() const;
void Clear();
CDisplay& operator+=(const CDisplay& oDisplay);
bool operator==(const CDisplay& oDisplay) const;

View File

@ -39,11 +39,10 @@ void WriteBaseHtmlStyles(NSFile::CFileBinary& oFile)
oFile.WriteStringUTF8(L"table { margin-bottom: 20px; width: 100%; max-width: 100%; border-spacing:0; border-collapse: collapse; border-color: gray;}");
oFile.WriteStringUTF8(L"thead { display: table-header-group; vertical-align: middle; }");
oFile.WriteStringUTF8(L"tr { display: table-row; }");
oFile.WriteStringUTF8(L"th { text-align: left; display: table-cell; font-weight: bold; }");
oFile.WriteStringUTF8(L"th { text-align: center; display: table-cell; font-weight: bold; }");
oFile.WriteStringUTF8(L"table thead tr th { vertical-align: bottom; border-bottom: 2px solid #ddd; }");
oFile.WriteStringUTF8(L"table thead tr th, table tbody tr th, table thead tr td, table tbody tr td { padding 8px; line-height: 1.4; vertical-align: top; border-top: 1px solid #ddd; }");
oFile.WriteStringUTF8(L"table > caption + thead > tr > th, table > colgroup + thead > tr > th, table > thead > tr > th, table > caption + thead > tr > td, table > colgroup + thead > tr > td, table > thead > tr > td { border-top: 0; }");
oFile.WriteStringUTF8(L"table thead tr th, table thead tr td { vertical-align: bottom; border-bottom: 2px solid #ddd; border-top: none; }");
oFile.WriteStringUTF8(L"table tbody tr th, table tbody tr td { padding 8px; line-height: 1.4; vertical-align: top; border-top: 1px solid #ddd; }");
// Styles for blockquote
oFile.WriteStringUTF8(L"blockquote { border-left: 3px solid #e9e9e9; margin: 1.5em 0; padding: 0.5em 10px 0.5em 24px; font-size: 1.25rem; display: block; margin-top: 8pt; font-style: italic; color: #404040; }");
@ -88,7 +87,7 @@ bool ConvertMdFileToHtml(const std::wstring& wsPathToMdFile, const std::wstring&
bool bResult = true;
if (0 != md_html(sMdData.c_str(), sMdData.length(), ToHtmlFile, &oFile,
MD_DIALECT_GITHUB | MD_FLAG_NOINDENTEDCODEBLOCKS | MD_HTML_FLAG_SKIP_UTF8_BOM,
MD_DIALECT_GITHUB | MD_FLAG_NOINDENTEDCODEBLOCKS | MD_HTML_FLAG_SKIP_UTF8_BOM | MD_FLAG_HARD_SOFT_BREAKS,
0))
bResult = false;

View File

@ -68,6 +68,10 @@ namespace MetaFile
#ifdef METAFILE_SUPPORT_SVM
m_oSvmFile.SetFontManager(m_pFontManager);
#endif
#ifdef METAFILE_SUPPORT_SVG
m_oSvgFile.SetFontManager(m_pFontManager);
#endif
m_lType = 0;
}
@ -84,7 +88,6 @@ namespace MetaFile
std::wstring CMetaFile::ConvertToSvg(unsigned int unWidth, unsigned int unHeight)
{
#ifdef METAFILE_SUPPORT_WMF_EMF
if (c_lMetaWmf == m_lType)
{

View File

@ -68,7 +68,13 @@ bool CSvgFile::MarkObject(SVG::CObject *pObject)
if (NULL == pObject || pObject->GetId().empty())
return false;
pObject->AddRef();
pObject->Mark();
const MarkedMap::const_iterator itFound = m_mMarkedObjects.find(pObject->GetId());
if (m_mMarkedObjects.cend() != itFound)
RELEASEINTERFACE(m_mMarkedObjects[pObject->GetId()])
m_mMarkedObjects[pObject->GetId()] = pObject;
return true;

View File

@ -224,7 +224,7 @@ namespace SVG
pObject = CObject::Create<CGraphicsContainer>(oReader, pFile, pParent);
if (!ReadChildrens(oReader, (CGraphicsContainer*)pObject, pFile, (CGraphicsContainer*)pObject))
{
RELEASEOBJECT(pObject);
RELEASEINTERFACE(pObject);
return false;
}
}
@ -290,7 +290,7 @@ namespace SVG
if (ReadChildrens(oReader, (CSymbol*)pObject, pFile))
return true;
else
RELEASEOBJECT(pObject);
RELEASEINTERFACE(pObject);
}
else if ("font" == sElementName)
{
@ -300,11 +300,11 @@ namespace SVG
if (NULL == pObject)
return false;
if ((RendererObject == pObject->GetType() && AddObject((ObjectType*)pObject, pContainer)) ||
if ((RendererObject == pObject->GetType() && (AddObject((ObjectType*)pObject, pContainer) || pObject->Marked())) ||
AppliedObject == pObject->GetType())
return true;
RELEASEOBJECT(pObject);
RELEASEINTERFACE(pObject);
return false;
}

View File

@ -9,7 +9,7 @@ namespace SVG
ObjectType CStopElement::GetType() const
{
return AppliedObject;
return DataObject;
}
SvgDigit CStopElement::GetOffset() const
@ -62,16 +62,7 @@ namespace SVG
return;
WHILE_READ_NEXT_NODE_WITH_ONE_NAME(oReader, "stop")
{
CStopElement *pStopElement = new CStopElement(oReader);
if (NULL == pStopElement)
continue;
pSvgFile->GetSvgCalculator()->SetData(pStopElement);
AddObject(pStopElement);
}
AddObject(CObject::Create<CStopElement>(oReader, pSvgFile));
END_WHILE
}

View File

@ -42,6 +42,18 @@ namespace SVG
: m_oXmlNode(oObject.m_oXmlNode), m_oTransformation(oObject.m_oTransformation)
{}
void CObject::Mark()
{
this->AddRef();
}
bool CObject::Marked() const
{
//Так как по логике кода объект может храниться только в одном контейнере и в списке маркированных элементов,
//то хватит и такой проверки
return 1 != m_lRef;
}
void CObject::SetAttribute(const std::string& sName, CSvgReader& oReader)
{
if ("class" == sName)

View File

@ -34,7 +34,8 @@ namespace SVG
enum ObjectType
{
RendererObject,
AppliedObject
AppliedObject,
DataObject
};
class CObject : public IGrObject
@ -48,6 +49,9 @@ namespace SVG
virtual ObjectType GetType() const = 0;
void Mark();
bool Marked() const;
virtual void SetAttribute(const std::string& sName, CSvgReader& oReader);
void SetData(const std::wstring wsStyles, unsigned short ushLevel, bool bHardMode = false);
@ -92,7 +96,8 @@ namespace SVG
if (NULL == pSvgFile)
return pObject;
if (!pSvgFile->MarkObject(pObject) && AppliedObject == pObject->GetType())
if (DataObject != pObject->GetType() ||
(!pSvgFile->MarkObject(pObject) && AppliedObject == pObject->GetType()))
{
delete pObject;
return NULL;

View File

@ -32,7 +32,7 @@ namespace SVG
const std::vector<NSCSS::CNode> arSelectors = pSvgObject->GetFullPath();
std::vector<std::wstring> arNodes = m_pInternal->CalculateAllNodes(arSelectors);
std::vector<std::wstring> arNodes = m_pInternal->CalculateAllNodes(arSelectors, 0, arSelectors.size());
std::vector<std::wstring> arPrevNodes;
for (size_t i = 0; i < arSelectors.size(); ++i)

View File

@ -136,7 +136,7 @@ namespace SVG
const char* pCheckValue = pValue;
while ('\0' != *pCheckValue)
{
if (0x32 >= *pCheckValue++)
if (std::isprint(static_cast<unsigned char>(*pCheckValue++)))
{
bFoundedSymbol = true;
break;
@ -327,7 +327,7 @@ namespace SVG
pRenderer->put_FontStyle(nStyle);
pRenderer->put_BrushType(c_BrushTypeSolid);
pRenderer->put_BrushColor1(m_oStyles.m_oFill.ToInt());
pRenderer->put_BrushAlpha1(255);
pRenderer->put_BrushAlpha1(255 * m_oStyles.m_oFill.GetOpacity());
}
void CTSpan::UpdateFontSize()

View File

@ -203,6 +203,11 @@ bool TagIsUnprocessed(const std::wstring& wsTagName)
return L"xml" == wsTagName;
}
bool IsSVG(const std::wstring& wsExtention)
{
return L"svg" == wsExtention || L"svg+xml" == wsExtention;
}
static inline HtmlTag GetHtmlTag(const std::wstring& wsStrTag)
{
std::map<std::wstring, HtmlTag>::const_iterator oFound = m_HTML_TAGS.find(wsStrTag);
@ -1248,7 +1253,7 @@ public:
bool ConvertToOOXML(NSStringUtils::CStringBuilder& oStringBuilder)
{
if (m_arRows.empty())
if (m_arRows.empty() && m_arHeaders.empty() && m_arFoother.empty())
return false;
oStringBuilder.WriteNodeBegin(L"w:tbl");
@ -4271,7 +4276,7 @@ private:
if (!pImageData || FALSE == NSBase64::Base64Decode(sSrcM.c_str() + nOffset, nSrcLen, pImageData, &nDecodeLen))
return bRes;
if (L"svg" == sExtention || L"svg+xml" == sExtention)
if (IsSVG(sExtention))
{
std::wstring wsSvg(pImageData, pImageData + nDecodeLen);
bRes = readSVG(wsSvg);
@ -4316,8 +4321,8 @@ private:
{
return sExtention != L"bmp" && sExtention != L"emf" && sExtention != L"emz" && sExtention != L"eps" && sExtention != L"fpx" && sExtention != L"gif" &&
sExtention != L"jpe" && sExtention != L"jpeg" && sExtention != L"jpg" && sExtention != L"jfif" && sExtention != L"pct" && sExtention != L"pict" &&
sExtention != L"png" && sExtention != L"pntg" && sExtention != L"psd" && sExtention != L"qtif" && sExtention != L"sgi" && sExtention != L"svg" &&
sExtention != L"tga" && sExtention != L"tpic" && sExtention != L"tiff" && sExtention != L"tif" && sExtention != L"wmf" && sExtention != L"wmz";
sExtention != L"png" && sExtention != L"pntg" && sExtention != L"psd" && sExtention != L"qtif" && sExtention != L"sgi" && sExtention != L"wmz" &&
sExtention != L"tga" && sExtention != L"tpic" && sExtention != L"tiff" && sExtention != L"tif" && sExtention != L"wmf" && !IsSVG(sExtention);
}
void ImageAlternative(NSStringUtils::CStringBuilder* oXml, std::vector<NSCSS::CNode>& sSelectors, const CTextSettings& oTS, const std::wstring& wsAlt, const std::wstring& wsSrc, const TImageData& oImageData)
@ -4416,16 +4421,57 @@ private:
}
int nImageId = -1;
std::wstring sImageSrc, sExtention;
std::wstring sExtention;
// Предполагаем картинку в Base64
if (bIsBase64)
bRes = readBase64(sSrcM, sExtention);
// Проверка расширения
sExtention = NSFile::GetFileExtention(sSrcM);
std::transform(sExtention.begin(), sExtention.end(), sExtention.begin(), tolower);
std::wstring::const_iterator itFound = std::find_if(sExtention.cbegin(), sExtention.cend(), [](wchar_t wChar){ return !iswalpha(wChar) && L'+' != wChar; });
if (sExtention.cend() != itFound)
sExtention.erase(itFound, sExtention.cend());
// Предполагаем картинку в сети
if (!bRes &&
((!m_sBase.empty() && m_sBase.length() > 4 && m_sBase.substr(0, 4) == L"http") ||
(sSrcM.length() > 4 && sSrcM.substr(0, 4) == L"http")))
{
const std::wstring wsDst = m_sDst + L"/word/media/i" + std::to_wstring(m_arrImages.size()) + L'.' + ((!sExtention.empty()) ? sExtention : L"png");
// Проверка gc_allowNetworkRequest предполагается в kernel_network
NSNetwork::NSFileTransport::CFileDownloader oDownloadImg(m_sBase + sSrcM, false);
oDownloadImg.SetFilePath(wsDst);
bRes = oDownloadImg.DownloadSync();
if (!bRes)
{
ImageAlternative(oXml, sSelectors, oTS, wsAlt, sSrcM, oImageData);
return true;
}
if (IsSVG(sExtention))
{
std::wstring wsFileData;
if (!NSFile::CFileBinary::ReadAllTextUtf8(wsDst, wsFileData) || !readSVG(wsFileData))
bRes = false;
NSFile::CFileBinary::Remove(wsDst);
sExtention = L"png";
}
else if (sExtention.empty())
{
//TODO:: лучше узнавать формат изображения из содержимого
sExtention = L"png";
}
}
if (!bRes)
{
// Проверка расширения
sExtention = NSFile::GetFileExtention(sSrcM);
std::transform(sExtention.begin(), sExtention.end(), sExtention.begin(), tolower);
if (NotValidExtension(sExtention))
{
ImageAlternative(oXml, sSelectors, oTS, wsAlt, sSrcM, oImageData);
@ -4441,36 +4487,24 @@ private:
}
}
// Предполагаем картинку по локальному пути
if (!bRes)
{
sImageSrc = sSrcM;
std::wstring wsDst = m_sDst + L"/word/media/i" + std::to_wstring(m_arrImages.size()) + L'.' + sExtention;
const std::wstring wsDst = m_sDst + L"/word/media/i" + std::to_wstring(m_arrImages.size()) + L'.' + sExtention;
// Предполагаем картинку по локальному пути
if (!((!m_sBase.empty() && m_sBase.length() > 4 && m_sBase.substr(0, 4) == L"http") || (sSrcM.length() > 4 && sSrcM.substr(0, 4) == L"http")))
if (!m_sBase.empty())
{
if (!m_sBase.empty())
{
if (!bRes)
bRes = CopyImage(NSSystemPath::Combine(m_sBase, sSrcM), wsDst, bIsAllowExternalLocalFiles);
if (!bRes)
bRes = CopyImage(NSSystemPath::Combine(m_sSrc, m_sBase + sSrcM), wsDst, bIsAllowExternalLocalFiles);
}
if (!bRes)
bRes = CopyImage(NSSystemPath::Combine(m_sSrc, sSrcM), wsDst, bIsAllowExternalLocalFiles);
bRes = CopyImage(NSSystemPath::Combine(m_sBase, sSrcM), wsDst, bIsAllowExternalLocalFiles);
if (!bRes)
bRes = CopyImage(m_sSrc + L"/" + NSFile::GetFileName(sSrcM), wsDst, bIsAllowExternalLocalFiles);
if (!bRes)
bRes = CopyImage(sSrcM, wsDst, bIsAllowExternalLocalFiles);
}
// Предполагаем картинку в сети
else
{
// Проверка gc_allowNetworkRequest предполагается в kernel_network
NSNetwork::NSFileTransport::CFileDownloader oDownloadImg(m_sBase + sSrcM, false);
oDownloadImg.SetFilePath(wsDst);
bRes = oDownloadImg.DownloadSync();
bRes = CopyImage(NSSystemPath::Combine(m_sSrc, m_sBase + sSrcM), wsDst, bIsAllowExternalLocalFiles);
}
if (!bRes)
bRes = CopyImage(NSSystemPath::Combine(m_sSrc, sSrcM), wsDst, bIsAllowExternalLocalFiles);
if (!bRes)
bRes = CopyImage(m_sSrc + L"/" + NSFile::GetFileName(sSrcM), wsDst, bIsAllowExternalLocalFiles);
if (!bRes)
bRes = CopyImage(sSrcM, wsDst, bIsAllowExternalLocalFiles);
}
if (!bRes)
@ -4478,7 +4512,7 @@ private:
else
{
wrP(oXml, sSelectors, oTS);
ImageRels(oXml, nImageId, sImageSrc, sExtention, oImageData);
ImageRels(oXml, nImageId, sSrcM, sExtention, oImageData);
}
return true;
@ -4681,8 +4715,9 @@ private:
if (bNew)
nImageId = m_arrImages.size();
std::wstring sImageId = std::to_wstring(nImageId);
std::wstring sImageName = sImageId + L'.' + sExtention;
const std::wstring sImageId = std::to_wstring(nImageId);
const std::wstring sImageName = sImageId + L'.' + sExtention;
CBgraFrame oBgraFrame;
if (!oBgraFrame.OpenFile(m_sDst + L"/word/media/i" + sImageName))
{
@ -4757,7 +4792,7 @@ private:
oXml->WriteString(L"\"/></w:r>");
m_oNoteXml.WriteString(L"<w:footnote w:id=\"");
m_oNoteXml.WriteString(std::to_wstring(m_nFootnoteId++));
m_oNoteXml.WriteString(L"\"><w:p><w:pPr><w:pStyle w:val=\"footnote-p\"/></w:pPr><w:r><w:rPr><w:rStyle w:val=\"footnote\"/></w:rPr></w:r><w:r><w:t xml:space=\"preserve\">");
m_oNoteXml.WriteString(L"\"><w:p><w:pPr><w:pStyle w:val=\"footnote-p\"/></w:pPr><w:r><w:rPr><w:footnoteRef/></w:rPr><w:t xml:space=\"preserve\"> </w:t></w:r><w:r><w:rPr><w:rStyle w:val=\"footnote\"/></w:rPr></w:r><w:r><w:t xml:space=\"preserve\">");
m_oNoteXml.WriteEncodeXmlString(sNote);
m_oNoteXml.WriteString(L"</w:t></w:r></w:p></w:footnote>");
@ -4770,8 +4805,13 @@ private:
return false;
if (NULL == m_pFonts)
{
m_pFonts = NSFonts::NSApplication::Create();
if (NULL != m_pFonts)
m_pFonts->Initialize();
}
MetaFile::IMetaFile* pSvgReader = MetaFile::Create(m_pFonts);
if (!pSvgReader->LoadFromString(wsSvg))
{