From aeda8ec5710cb440dcc23db1c8e54d1b49669c36 Mon Sep 17 00:00:00 2001 From: ElenaSubbotina Date: Fri, 13 Sep 2019 17:08:12 +0300 Subject: [PATCH] DocFormatReader - fix after testing --- ASCOfficeDocFile/Common/XmlTools.h | 20 +++++- .../DocDocxConverter/ListData.cpp | 6 +- ASCOfficeDocFile/DocDocxConverter/ListData.h | 1 + .../DocDocxConverter/ListTable.cpp | 7 +- ASCOfficeDocFile/DocDocxConverter/ListTable.h | 2 +- .../DocDocxConverter/NumberingMapping.cpp | 27 +++++--- .../ParagraphPropertiesMapping.cpp | 68 ++++++++----------- .../DocDocxConverter/VMLPictureMapping.cpp | 4 +- .../DocFormatTest/DocFormatTest.vcproj | 2 +- .../ASCOfficeDrawingConverter.cpp | 6 ++ 10 files changed, 82 insertions(+), 61 deletions(-) diff --git a/ASCOfficeDocFile/Common/XmlTools.h b/ASCOfficeDocFile/Common/XmlTools.h index b6d7a85f3f..7238f03dba 100644 --- a/ASCOfficeDocFile/Common/XmlTools.h +++ b/ASCOfficeDocFile/Common/XmlTools.h @@ -35,6 +35,7 @@ #include #include +#include #include "../../DesktopEditor/common/File.h" @@ -112,7 +113,10 @@ namespace XMLTools class XMLElement ========================================================================================================*/ - class XMLElement + class XMLElement; + typedef class boost::shared_ptr XMLElementPtr; + + class XMLElement { typedef std::pair< std::wstring, std::wstring> AttributeValuePair; @@ -180,7 +184,20 @@ namespace XMLTools } m_Elements.push_back( element ); } + void AppendChild( XMLElementPtr element, bool uniq = false) + { + if (!element) return; + if (m_ChildMap.find(element->GetName()) != m_ChildMap.end()) + { + if (uniq) return; + } + else + { + m_ChildMap.insert(m_ChildMap.end(), std::pair(element->GetName(), 0)); + } + m_Elements.push_back( *element.get() ); + } void RemoveChild( const XMLElement& element ) { m_Elements.remove( element ); @@ -368,7 +385,6 @@ namespace XMLTools } }; - class CStringXmlWriter { std::wstring m_str; diff --git a/ASCOfficeDocFile/DocDocxConverter/ListData.cpp b/ASCOfficeDocFile/DocDocxConverter/ListData.cpp index 6174946a00..623a2222c9 100644 --- a/ASCOfficeDocFile/DocDocxConverter/ListData.cpp +++ b/ASCOfficeDocFile/DocDocxConverter/ListData.cpp @@ -122,7 +122,8 @@ namespace DocFileFormat fNumber1 == val.fNumber1 && fNumberAcross == val.fNumberAcross && fRestartHdn == val.fRestartHdn && - fSpareX == val.fSpareX; + fSpareX == val.fSpareX && + xst == val.xst; return res; } @@ -158,7 +159,8 @@ namespace DocFileFormat fNumber1 == val->fNumber1 && fNumberAcross == val->fNumberAcross && fRestartHdn == val->fRestartHdn && - fSpareX == val->fSpareX; + fSpareX == val->fSpareX && + xst == val->xst; return res; diff --git a/ASCOfficeDocFile/DocDocxConverter/ListData.h b/ASCOfficeDocFile/DocDocxConverter/ListData.h index 090a7c16d8..e45dbe8e39 100644 --- a/ASCOfficeDocFile/DocDocxConverter/ListData.h +++ b/ASCOfficeDocFile/DocDocxConverter/ListData.h @@ -129,6 +129,7 @@ namespace DocFileFormat std::wstring xst; //32 chars ansi public: + std::wstring rPr; bool operator == (const NumberingDescriptor & val) const; bool operator == (const NumberingDescriptorPtr & val) const; diff --git a/ASCOfficeDocFile/DocDocxConverter/ListTable.cpp b/ASCOfficeDocFile/DocDocxConverter/ListTable.cpp index 3c234e40d6..7e241a0ce1 100644 --- a/ASCOfficeDocFile/DocDocxConverter/ListTable.cpp +++ b/ASCOfficeDocFile/DocDocxConverter/ListTable.cpp @@ -72,16 +72,17 @@ namespace DocFileFormat } } - size_t ListTable::appendNumbering( NumberingDescriptorPtr &desc ) + size_t ListTable::appendNumbering( NumberingDescriptorPtr &desc, const std::wstring & rPr ) { for (size_t i = 0; i < listNumbering.size(); ++i) { - if (listNumbering[i]->operator==(desc)) + if (listNumbering[i]->operator == (desc)) { return listNumbering[i]->id; } } - desc->id = listData.size() + listNumbering.size()/* + 1*/; + desc->rPr = rPr; + desc->id = listData.size() + listNumbering.size() + 1; // 23.doc listNumbering.push_back(desc); return desc->id; } diff --git a/ASCOfficeDocFile/DocDocxConverter/ListTable.h b/ASCOfficeDocFile/DocDocxConverter/ListTable.h index 923c875ecb..4a9397d1ac 100644 --- a/ASCOfficeDocFile/DocDocxConverter/ListTable.h +++ b/ASCOfficeDocFile/DocDocxConverter/ListTable.h @@ -47,6 +47,6 @@ namespace DocFileFormat virtual ~ListTable(); ListTable( FileInformationBlock* fib, POLE::Stream* tableStream ); - size_t appendNumbering( NumberingDescriptorPtr &desc ); + size_t appendNumbering( NumberingDescriptorPtr &desc, const std::wstring & rPr ); }; } \ No newline at end of file diff --git a/ASCOfficeDocFile/DocDocxConverter/NumberingMapping.cpp b/ASCOfficeDocFile/DocDocxConverter/NumberingMapping.cpp index a60c45b96c..be5237d417 100644 --- a/ASCOfficeDocFile/DocDocxConverter/NumberingMapping.cpp +++ b/ASCOfficeDocFile/DocDocxConverter/NumberingMapping.cpp @@ -540,17 +540,24 @@ namespace DocFileFormat m_pXmlWriter->WriteNodeEnd(L"w:pPr"); // rPr - m_pXmlWriter->WriteNodeBegin( L"w:rPr", FALSE ); - - if (!fontFamily.empty()) + if (false == lvl->rPr.empty()) { - m_pXmlWriter->WriteNodeBegin( L"w:rFonts", TRUE ); - // w:hint="default" - m_pXmlWriter->WriteAttribute(L"w:hAnsi",fontFamily); - m_pXmlWriter->WriteAttribute(L"w:ascii",fontFamily); - m_pXmlWriter->WriteNodeEnd( L"", TRUE ); + m_pXmlWriter->WriteString( lvl->rPr ); + } + else + { + m_pXmlWriter->WriteNodeBegin( L"w:rPr", FALSE ); + + if (!fontFamily.empty()) + { + m_pXmlWriter->WriteNodeBegin( L"w:rFonts", TRUE ); + // w:hint="default" + m_pXmlWriter->WriteAttribute(L"w:hAnsi", fontFamily); + m_pXmlWriter->WriteAttribute(L"w:ascii", fontFamily); + m_pXmlWriter->WriteNodeEnd( L"", TRUE ); + } + m_pXmlWriter->WriteNodeEnd(L"w:rPr"); } - m_pXmlWriter->WriteNodeEnd(L"w:rPr"); m_pXmlWriter->WriteNodeEnd(L"w:lvl"); } @@ -702,7 +709,7 @@ namespace DocFileFormat } } - if (isPictureBullet) + if (isPictureBullet && false == m_document->PictureBulletsCPsMap.empty()) { m_pXmlWriter->WriteNodeBegin(L"w:lvlPicBulletId",TRUE); m_pXmlWriter->WriteAttribute(L"w:val",FormatUtils::IntToWideString(index)); diff --git a/ASCOfficeDocFile/DocDocxConverter/ParagraphPropertiesMapping.cpp b/ASCOfficeDocFile/DocDocxConverter/ParagraphPropertiesMapping.cpp index cde6b196ee..9f80aa8aad 100644 --- a/ASCOfficeDocFile/DocDocxConverter/ParagraphPropertiesMapping.cpp +++ b/ASCOfficeDocFile/DocDocxConverter/ParagraphPropertiesMapping.cpp @@ -104,32 +104,33 @@ namespace DocFileFormat } //append formatting of paragraph end mark + + XMLTools::XMLElementPtr rPr = XMLTools::XMLElementPtr(XMLTools::XMLElementPtr(new XMLTools::XMLElement( L"w:rPr" ))); + if ( _paraEndChpx != NULL ) { - XMLTools::XMLElement* rPr = new XMLTools::XMLElement( L"w:rPr" ); - - //append properties RevisionData* rev = new RevisionData( _paraEndChpx ); - CharacterPropertiesMapping* ccMapping = new CharacterPropertiesMapping( rPr, m_document, rev, papx, false ); + CharacterPropertiesMapping* ccMapping = new CharacterPropertiesMapping( rPr.get(), m_document, rev, papx, false ); + _paraEndChpx->Convert( ccMapping ); - //append delete infos if ( rev->Type == Deleted ) { - XMLTools::XMLElement del( L"w:del" ); + XMLTools::XMLElement del( L"w:del" ); rPr->AppendChild( del ); } - if( rPr->GetChildCount() >0 ) + if( rPr->GetChildCount() > 0 ) { - _pPr->AppendChild( *rPr ); + _pPr->AppendChild( rPr ); } RELEASEOBJECT( ccMapping ); RELEASEOBJECT( rev ); - RELEASEOBJECT( rPr ); } + bool bNumPr = false; + std::list::iterator end = papx->grpprl->end(); for (std::list::iterator iter = papx->grpprl->begin(); iter != end; ++iter) { @@ -426,7 +427,10 @@ namespace DocFileFormat if (m_document->listTable) { - unsigned short numId = m_document->listTable->appendNumbering( desc ); + std::wstring sRPr; + if (rPr->GetChildCount() > 0) sRPr = rPr->GetXMLString(); + + unsigned short numId = m_document->listTable->appendNumbering( desc, sRPr ); appendValueElement( &numPr, L"numId", numId, true ); } }break; @@ -439,8 +443,10 @@ namespace DocFileFormat case sprmOldPNLvlAnm: { short level = FormatUtils::BytesToUChar( iter->Arguments, 0, iter->argumentsSize) - 1; - if (level > 0 && level < 10) - appendValueElement( _pPr, L"outlineLvl", level, false ); + + level = 0; + appendValueElement( &numPr, L"ilvl", level, true ); + bNumPr = true; }break; case sprmOldPFNoLineNumb: @@ -456,25 +462,11 @@ namespace DocFileFormat case sprmPIlfo: { //Если numbering.xml пустой, то не пищем свойство - //Todo разобраться с закоментированным кодом if (NULL != m_document->listTable && false == m_document->listTable->listData.empty()) { unsigned short numId = FormatUtils::BytesToUInt16( iter->Arguments, 0, iter->argumentsSize ); appendValueElement( &numPr, L"numId", numId, true ); } - - //check if there is a ilvl reference, if not, check the count of LVLs. - //if only one LVL exists in the referenced list, create a hard reference to that LVL - //if (containsLvlReference(papx.grpprl) == false) - //{ - // ListFormatOverride lfo = m_context.Doc.ListFormatOverrideTable[val]; - // int index = NumberingMapping.FindIndexbyId(m_context.Doc.ListTable, lfo.lsid); - // ListData lst = m_context.Doc.ListTable[index]; - // if (lst.rglvl.Length == 1) - // { - // appendValueElement(numPr, "ilvl", "0", true); - // } - //} } break; @@ -645,15 +637,18 @@ namespace DocFileFormat }break; } } - - //append frame properties + + if ( numPr.GetChildCount() > 0 && ((bNumPr && m_document->nWordVersion > 0) || m_document->nWordVersion == 0))//append numPr + {//23.doc + _pPr->AppendChild( numPr ); + } + if ( _framePr->GetAttributeCount() > 0 ) { _pPr->AppendChild( *_framePr ); } _isSectionPageBreak = 0; - //append section properties if ( _sepx != NULL ) { XMLTools::XMLElement sectPr( L"w:sectPr" ); @@ -672,34 +667,27 @@ namespace DocFileFormat _pPr->AppendChild( sectPr ); } - //append indent if ( ind.GetAttributeCount() > 0 ) { _pPr->AppendChild( ind ); } - if ( spacing.GetAttributeCount() > 0 )//append spacing + if ( spacing.GetAttributeCount() > 0 ) { _pPr->AppendChild( spacing ); } - if ( jc ) //append justification + if ( jc ) { _pPr->AppendChild( *jc ); RELEASEOBJECT( jc ); } - - if ( numPr.GetChildCount() > 0 )//append numPr - { - _pPr->AppendChild( numPr ); - } - - if ( pBdr.GetChildCount() > 0 ) //append borders + + if ( pBdr.GetChildCount() > 0 ) { _pPr->AppendChild( pBdr ); } - //write Properties if ( ( _pPr->GetChildCount() > 0 ) || ( _pPr->GetAttributeCount() > 0 ) ) { m_pXmlWriter->WriteString( _pPr->GetXMLString() ); diff --git a/ASCOfficeDocFile/DocDocxConverter/VMLPictureMapping.cpp b/ASCOfficeDocFile/DocDocxConverter/VMLPictureMapping.cpp index b3e4a880a8..b39dac0010 100644 --- a/ASCOfficeDocFile/DocDocxConverter/VMLPictureMapping.cpp +++ b/ASCOfficeDocFile/DocDocxConverter/VMLPictureMapping.cpp @@ -559,8 +559,8 @@ namespace DocFileFormat pict->embeddedData = newData; } - m_context->_docx->ImagesList.push_back(ImageFileStructure(GetTargetExt(Global::msoblipDIB), - pict->embeddedData, pict->embeddedDataSize, Global::msoblipDIB)); + m_context->_docx->ImagesList.push_back(ImageFileStructure(GetTargetExt(btWin32), + pict->embeddedData, pict->embeddedDataSize, btWin32)); m_nImageId = m_context->_docx->RegisterImage(m_caller, btWin32); result = true; diff --git a/ASCOfficeDocFile/DocFormatTest/DocFormatTest.vcproj b/ASCOfficeDocFile/DocFormatTest/DocFormatTest.vcproj index ce5d2c44e7..9ca8d1d61e 100644 --- a/ASCOfficeDocFile/DocFormatTest/DocFormatTest.vcproj +++ b/ASCOfficeDocFile/DocFormatTest/DocFormatTest.vcproj @@ -45,7 +45,7 @@ Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="../../DesktopEditor/xml/build/vs2005;../../DesktopEditor/xml/libxml2/include;../../DesktopEditor/freetype-2.5.2/include" - PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_USE_LIBXML2_READER_;LIBXML_READER_ENABLED;USE_LITE_READER;_USE_XMLLITE_READER_;DONT_WRITE_EMBEDDED_FONTS" + PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_USE_LIBXML2_READER_;LIBXML_READER_ENABLED;USE_LITE_READER;_USE_XMLLITE_READER_;DONT_WRITE_EMBEDDED_FONTS;DONT_USED_EXTRA_LIBRARY" MinimalRebuild="false" BasicRuntimeChecks="3" RuntimeLibrary="3" diff --git a/ASCOfficePPTXFile/ASCOfficeDrawingConverter.cpp b/ASCOfficePPTXFile/ASCOfficeDrawingConverter.cpp index 5fb46f8466..f73c06e9c2 100644 --- a/ASCOfficePPTXFile/ASCOfficeDrawingConverter.cpp +++ b/ASCOfficePPTXFile/ASCOfficeDrawingConverter.cpp @@ -1953,6 +1953,12 @@ void CDrawingConverter::doc_LoadShape(PPTX::Logic::SpTreeElem *elem, XmlUtils::C pPPTShape->m_eType = ppt_shape_type->m_eType; } + else if (std::wstring::npos != strType.find(L"t75")) + { + pPPTShape = new CPPTShape(); + pPPTShape->SetShapeType((PPTShapes::ShapeType)75); + pPPTShape->m_eType = PPTShapes::sptCFrame; + } } if (NULL == pPPTShape)