mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-02-11 02:16:02 +08:00
Compare commits
71 Commits
core-linux
...
core-win-6
| Author | SHA1 | Date | |
|---|---|---|---|
| 395e54cf76 | |||
| 40476e7555 | |||
| 04f06c23a1 | |||
| a9a635747a | |||
| 4027a0de25 | |||
| a232fcd9e1 | |||
| 5bc537749e | |||
| 6e7f6cf204 | |||
| b0c10403c5 | |||
| 5f516f0c56 | |||
| bfe8abb847 | |||
| d765a7590b | |||
| dac34c32c0 | |||
| 599bf9654d | |||
| fbd55ca485 | |||
| 68bb25301d | |||
| 2390e5bffe | |||
| 01c9c018af | |||
| 53ed94dbbe | |||
| e1fa9b5c46 | |||
| 6341cdbbdb | |||
| c93989767e | |||
| f4fa754ce4 | |||
| a965b30d72 | |||
| dd3dd1e42a | |||
| d2f1460f1b | |||
| 7d88a91fcc | |||
| bf02eec8ef | |||
| 8513ec5ae7 | |||
| 35b43e0683 | |||
| 421e58fe34 | |||
| 048cac74b6 | |||
| 069b12839f | |||
| c23ff4c8cd | |||
| ccc27a2e1b | |||
| 3843f52601 | |||
| c3ec17c132 | |||
| 72cb63b9f5 | |||
| dd04f5cf12 | |||
| dde6621d10 | |||
| 7c3b060794 | |||
| a8e4ccdf80 | |||
| aa609336ca | |||
| 9601d90671 | |||
| f59d7ff845 | |||
| adf2399368 | |||
| 5da57d65c1 | |||
| feddb37222 | |||
| 81db8d1776 | |||
| 2a809ab970 | |||
| b6a0614f00 | |||
| 452917f213 | |||
| 96202979ea | |||
| 5b5ccdc9be | |||
| 4ca2126abc | |||
| adf7ca65ea | |||
| 89235ca12a | |||
| 08d551752e | |||
| 77b1303d62 | |||
| 93e56e2b8a | |||
| e032fc8294 | |||
| 5ae2ac2385 | |||
| 6b8cb6cae4 | |||
| e66ea7c628 | |||
| 2447925fd6 | |||
| 9991195d56 | |||
| 51f579a682 | |||
| 45e0459434 | |||
| 2f194ebd97 | |||
| 5e4ce83dc1 | |||
| 5e126e28ff |
2
.gitignore
vendored
2
.gitignore
vendored
@ -35,6 +35,7 @@ Common/3dParty/openssl/openssl
|
||||
.idea
|
||||
.svn
|
||||
.DS_Store
|
||||
.qmake.stash
|
||||
Thumbs.db
|
||||
*.xcuserstate
|
||||
*.xcuserdatad
|
||||
@ -55,3 +56,4 @@ X2tConverter/**/Makefile.*
|
||||
*.zip
|
||||
*.tar.gz
|
||||
**/*.build/
|
||||
|
||||
|
||||
@ -916,7 +916,7 @@ namespace DocFileFormat
|
||||
PictureDescriptor pictDiscr(chpx, m_document->WordDocumentStream, 0x7fffffff, m_document->nWordVersion);
|
||||
ShapeContainer* pShape = m_document->GetOfficeArt()->GetShapeContainer(pSpa->GetShapeID());
|
||||
|
||||
if (pShape)
|
||||
if ((pShape) /*&& (false == pShape->isLastIdentify())*/)
|
||||
{
|
||||
VMLShapeMapping oVmlWriter (m_context, m_pXmlWriter, pSpa, &pictDiscr, _caller);
|
||||
|
||||
@ -950,23 +950,24 @@ namespace DocFileFormat
|
||||
|
||||
m_pXmlWriter->WriteNodeEnd (L"w:pict");
|
||||
}
|
||||
else if ((oPicture.mfp.mm > 98) && (NULL != oPicture.shapeContainer))
|
||||
else if ((oPicture.mfp.mm > 98) && (NULL != oPicture.shapeContainer)/* && (false == oPicture.shapeContainer->isLastIdentify())*/)
|
||||
{
|
||||
bool bFormula = false;
|
||||
|
||||
XMLTools::CStringXmlWriter pictWriter;
|
||||
pictWriter.WriteNodeBegin (L"w:pict");
|
||||
|
||||
bool picture = true;
|
||||
bool bPicture = true;
|
||||
|
||||
if (oPicture.shapeContainer)
|
||||
{
|
||||
int shape_type = oPicture.shapeContainer->getShapeType();
|
||||
|
||||
if (shape_type != msosptPictureFrame) picture = false;//шаблон 1.doc картинка в колонтитуле
|
||||
if (shape_type != msosptPictureFrame) bPicture = false;//шаблон 1.doc картинка в колонтитуле
|
||||
}
|
||||
|
||||
if (picture)
|
||||
XMLTools::CStringXmlWriter pictWriter;
|
||||
pictWriter.WriteNodeBegin (L"w:pict");
|
||||
|
||||
if (bPicture)
|
||||
{
|
||||
VMLPictureMapping oVmlMapper(m_context, &pictWriter, false, _caller, isInline);
|
||||
oPicture.Convert (&oVmlMapper);
|
||||
@ -989,7 +990,8 @@ namespace DocFileFormat
|
||||
_writeAfterRun = oVmlMapper.m_equationXml;
|
||||
bFormula = true;
|
||||
}
|
||||
}else
|
||||
}
|
||||
else
|
||||
{
|
||||
VMLShapeMapping oVmlMapper(m_context, &pictWriter, NULL, &oPicture, _caller, isInline);
|
||||
oPicture.shapeContainer->Convert(&oVmlMapper);
|
||||
|
||||
@ -58,7 +58,7 @@ namespace DocFileFormat
|
||||
|
||||
public:
|
||||
|
||||
OfficeArtContent (const FileInformationBlock* pFIB, POLE::Stream* pStream): m_pDrawingGroupData(NULL), m_pBackgroud(NULL)
|
||||
OfficeArtContent (const FileInformationBlock* pFIB, POLE::Stream* pStream): m_pDrawingGroupData(NULL), m_pBackgroud(NULL), m_uLastShapeId(1024)
|
||||
{
|
||||
VirtualStreamReader oStearmReader(pStream, 0 , pFIB->m_nWordVersion);
|
||||
|
||||
@ -86,7 +86,6 @@ namespace DocFileFormat
|
||||
{
|
||||
if (GroupContainer::TYPE_CODE_0xF003 == groupChild->TypeCode)
|
||||
{
|
||||
// the child is a subgroup
|
||||
GroupContainer* group = static_cast<GroupContainer*>(groupChild);
|
||||
if (group)
|
||||
{
|
||||
@ -95,7 +94,6 @@ namespace DocFileFormat
|
||||
}
|
||||
else if (ShapeContainer::TYPE_CODE_0xF004 == groupChild->TypeCode)
|
||||
{
|
||||
// the child is a shape
|
||||
ShapeContainer* shape = static_cast<ShapeContainer*>(groupChild);
|
||||
if (shape)
|
||||
{
|
||||
@ -106,6 +104,14 @@ namespace DocFileFormat
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (DrawingRecord::TYPE_CODE_0xF008 == groupChild->TypeCode)
|
||||
{
|
||||
DrawingRecord* dr = static_cast<DrawingRecord*>(groupChild);
|
||||
if (dr)
|
||||
{
|
||||
m_uLastShapeId = dr->spidCur;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -183,7 +189,7 @@ namespace DocFileFormat
|
||||
{
|
||||
return m_pDrawingGroupData;
|
||||
}
|
||||
|
||||
unsigned int m_uLastShapeId;
|
||||
private:
|
||||
ShapeContainer* m_pBackgroud;
|
||||
DrawingGroup* m_pDrawingGroupData;
|
||||
|
||||
@ -38,30 +38,30 @@ namespace DocFileFormat
|
||||
class DrawingRecord: public Record
|
||||
{
|
||||
public:
|
||||
static const unsigned short TYPE_CODE_0xF008 = 0xF008;
|
||||
static const unsigned short TYPE_CODE_0xF008 = 0xF008;
|
||||
|
||||
unsigned int csp; // The number of shapes in this drawing
|
||||
int spidCur; // The last MSOSPID given to an SP in this DG
|
||||
unsigned int csp; // The number of shapes in this drawing
|
||||
unsigned int spidCur; // The last MSOSPID given to an SP in this DG
|
||||
|
||||
DrawingRecord():
|
||||
Record(), csp(0), spidCur(0)
|
||||
{
|
||||
}
|
||||
DrawingRecord():
|
||||
Record(), csp(0), spidCur(0)
|
||||
{
|
||||
}
|
||||
|
||||
DrawingRecord( IBinaryReader* _reader, unsigned int size, unsigned int typeCode, unsigned int version, unsigned int instance ):
|
||||
Record( _reader, size, typeCode, version, instance )
|
||||
{
|
||||
DrawingRecord( IBinaryReader* _reader, unsigned int size, unsigned int typeCode, unsigned int version, unsigned int instance ):
|
||||
Record( _reader, size, typeCode, version, instance )
|
||||
{
|
||||
csp = Reader->ReadUInt32();
|
||||
spidCur = Reader->ReadInt32();
|
||||
}
|
||||
}
|
||||
|
||||
virtual ~DrawingRecord()
|
||||
{
|
||||
}
|
||||
virtual ~DrawingRecord()
|
||||
{
|
||||
}
|
||||
|
||||
virtual Record* NewObject( IBinaryReader* _reader, unsigned int bodySize, unsigned int typeCode, unsigned int version, unsigned int instance )
|
||||
{
|
||||
return new DrawingRecord( _reader, bodySize, typeCode, version, instance );
|
||||
}
|
||||
virtual Record* NewObject( IBinaryReader* _reader, unsigned int bodySize, unsigned int typeCode, unsigned int version, unsigned int instance )
|
||||
{
|
||||
return new DrawingRecord( _reader, bodySize, typeCode, version, instance );
|
||||
}
|
||||
};
|
||||
}
|
||||
@ -50,13 +50,9 @@ namespace DocFileFormat
|
||||
/*========================================================================================================*/
|
||||
|
||||
Record::Record( IBinaryReader* _reader, unsigned int bodySize, unsigned int typeCode, unsigned int version, unsigned int instance ):
|
||||
HeaderSize(0), BodySize(0), RawData(NULL), SiblingIdx(0), TypeCode(0), Version(0), Instance(0), Reader(NULL),
|
||||
HeaderSize(Record::HEADER_SIZE_IN_BYTES), BodySize(bodySize), RawData(NULL), SiblingIdx(0), TypeCode(typeCode), Version(version), Instance(instance), Reader(NULL),
|
||||
_ParentRecord(NULL)
|
||||
{
|
||||
BodySize = bodySize;
|
||||
TypeCode = typeCode;
|
||||
Version = version;
|
||||
Instance = instance;
|
||||
HeaderSize = Record::HEADER_SIZE_IN_BYTES;
|
||||
|
||||
int real_size = _reader->GetSize() - _reader->GetPosition();
|
||||
|
||||
@ -76,7 +76,7 @@ namespace DocFileFormat
|
||||
{
|
||||
result = pRecord->NewObject (reader, size, typeCode, version, instance);
|
||||
if (result)
|
||||
result->SiblingIdx = siblingIdx;
|
||||
result->SiblingIdx = siblingIdx;
|
||||
RELEASEOBJECT(pRecord);
|
||||
}
|
||||
}
|
||||
|
||||
@ -104,7 +104,7 @@ OleObject::OleObject( const CharacterPropertyExceptions* chpx, WordDocument* doc
|
||||
szData = szData >> 16;
|
||||
}
|
||||
unsigned char* bytes = reader.ReadBytes( szData, true );
|
||||
if (bytes)
|
||||
if (bytes && szData < 0xffff)
|
||||
{
|
||||
emeddedData = std::string((char*)bytes, szData);
|
||||
delete []bytes;
|
||||
|
||||
@ -566,14 +566,35 @@ namespace DocFileFormat
|
||||
|
||||
case sprmOldPDxaAbs:
|
||||
case sprmPDxaAbs:
|
||||
appendValueAttribute( _framePr, L"w:x", FormatUtils::BytesToInt16( iter->Arguments, 0, iter->argumentsSize ) );
|
||||
break;
|
||||
|
||||
{
|
||||
unsigned short val = FormatUtils::BytesToUInt16( iter->Arguments, 0, iter->argumentsSize );
|
||||
switch (val)
|
||||
{
|
||||
case 0x0000: break; //left
|
||||
case 0xfffc: appendValueAttribute( _framePr, L"w:xAlign", L"center"); break;
|
||||
case 0xfff8: appendValueAttribute( _framePr, L"w:xAlign", L"right"); break;
|
||||
case 0xfff4: appendValueAttribute( _framePr, L"w:xAlign", L"inside"); break;
|
||||
case 0xfff0: appendValueAttribute( _framePr, L"w:xAlign", L"outside"); break;
|
||||
default:
|
||||
appendValueAttribute( _framePr, L"w:x", (short)val);
|
||||
}
|
||||
}break;
|
||||
case sprmOldPDyaAbs:
|
||||
case sprmPDyaAbs:
|
||||
appendValueAttribute( _framePr, L"w:y", FormatUtils::BytesToInt16( iter->Arguments, 0, iter->argumentsSize ) );
|
||||
break;
|
||||
|
||||
{
|
||||
unsigned short val = FormatUtils::BytesToUInt16( iter->Arguments, 0, iter->argumentsSize );
|
||||
switch (val)
|
||||
{
|
||||
case 0x0000: break; //inline
|
||||
case 0xfffc: appendValueAttribute( _framePr, L"w:yAlign", L"top"); break;
|
||||
case 0xfff8: appendValueAttribute( _framePr, L"w:yAlign", L"center"); break;
|
||||
case 0xfff4: appendValueAttribute( _framePr, L"w:yAlign", L"bottom"); break;
|
||||
case 0xfff0: appendValueAttribute( _framePr, L"w:yAlign", L"inside"); break;
|
||||
case 0xffec: appendValueAttribute( _framePr, L"w:yAlign", L"outside"); break;
|
||||
default:
|
||||
appendValueAttribute( _framePr, L"w:y", (short)val );
|
||||
}
|
||||
}break;
|
||||
case sprmPWHeightAbs:
|
||||
appendValueAttribute( _framePr, L"w:h", FormatUtils::BytesToInt16( iter->Arguments, 0, iter->argumentsSize ) );
|
||||
break;
|
||||
|
||||
@ -320,6 +320,18 @@ namespace DocFileFormat
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (_gridSpan <= 1 && nComputedCellWidth > _width && _width > 1)
|
||||
{
|
||||
int width_current = 0;
|
||||
for (int i = _gridIndex; i < _grid->size(); i++)
|
||||
{
|
||||
width_current += _grid->at(i);
|
||||
if (width_current >= nComputedCellWidth)
|
||||
break;
|
||||
_gridSpan++;
|
||||
}
|
||||
_width = nComputedCellWidth;
|
||||
}
|
||||
|
||||
XMLTools::XMLElement tcW ( L"w:tcW" );
|
||||
|
||||
|
||||
@ -142,7 +142,7 @@ namespace DocFileFormat
|
||||
{
|
||||
newXmlString.clear();
|
||||
|
||||
std::wstring sTempFolder = m_ctx->_doc->m_sTempFolder;
|
||||
std::wstring sTempFolder = m_context->_doc->m_sTempFolder;
|
||||
if (sTempFolder.empty())
|
||||
{
|
||||
sTempFolder = NSFile::CFileBinary::GetTempPath();
|
||||
@ -211,7 +211,7 @@ namespace DocFileFormat
|
||||
|
||||
VMLPictureMapping::VMLPictureMapping(ConversionContext* ctx, XMLTools::CStringXmlWriter* writer, bool olePreview, IMapping* caller, bool isInlinePicture) : PropertiesMapping(writer)
|
||||
{
|
||||
m_ctx = ctx;
|
||||
m_context = ctx;
|
||||
m_isOlePreview = olePreview;
|
||||
m_imageData = NULL;
|
||||
m_nImageId = 0;
|
||||
@ -229,7 +229,18 @@ namespace DocFileFormat
|
||||
{
|
||||
RELEASEOBJECT(m_imageData);
|
||||
}
|
||||
std::wstring VMLPictureMapping::GetShapeID(const Shape* pShape) const
|
||||
{
|
||||
std::wstring strXmlAttr;
|
||||
|
||||
if (NULL != pShape)
|
||||
{
|
||||
strXmlAttr += std::wstring(L"_x0000_i");
|
||||
strXmlAttr += FormatUtils::IntToWideString(pShape->GetShapeID());
|
||||
}
|
||||
|
||||
return strXmlAttr;
|
||||
}
|
||||
void VMLPictureMapping::Apply( IVisitable* visited )
|
||||
{
|
||||
PictureDescriptor* pict = dynamic_cast<PictureDescriptor*>(visited);
|
||||
@ -248,13 +259,14 @@ namespace DocFileFormat
|
||||
std::vector<OptionEntryPtr> options;
|
||||
|
||||
PictureFrameType type;
|
||||
Shape* pShape = NULL;
|
||||
if ((pict->shapeContainer || pict->blipStoreEntry) && pict->shapeContainer->Children.size() > 0)
|
||||
{
|
||||
Shape* shape = static_cast<Shape*>(*(pict->shapeContainer->Children.begin()));
|
||||
options = pict->shapeContainer->ExtractOptions();
|
||||
pShape = static_cast<Shape*>(*(pict->shapeContainer->Children.begin()));
|
||||
options = pict->shapeContainer->ExtractOptions();
|
||||
|
||||
//v:shapetype
|
||||
type.SetType(shape->Instance);
|
||||
type.SetType(pShape->Instance);
|
||||
|
||||
VMLShapeTypeMapping* vmlShapeTypeMapping = new VMLShapeTypeMapping( m_pXmlWriter, m_isInlinePicture );
|
||||
|
||||
@ -265,13 +277,16 @@ namespace DocFileFormat
|
||||
{
|
||||
type.SetType(msosptPictureFrame);
|
||||
}
|
||||
m_pXmlWriter->WriteNodeBegin( L"v:shape", true );
|
||||
m_pXmlWriter->WriteNodeBegin( L"v:shape", true );
|
||||
|
||||
//m_shapeId = GetShapeID(pShape); - todooo одинаковые картинки (одинаковый spid) - Anexo№3.doc
|
||||
|
||||
|
||||
count_vml_objects++;
|
||||
|
||||
if (m_shapeId.empty())
|
||||
m_shapeId = L"_x0000_s" + FormatUtils::IntToWideString(1024 + count_vml_objects);
|
||||
{
|
||||
m_context->_doc->GetOfficeArt()->m_uLastShapeId++;
|
||||
m_shapeId = L"_x0000_i" + FormatUtils::IntToWideString(m_context->_doc->GetOfficeArt()->m_uLastShapeId);
|
||||
}
|
||||
|
||||
m_pXmlWriter->WriteAttribute( L"id", m_shapeId);
|
||||
|
||||
@ -443,13 +458,17 @@ namespace DocFileFormat
|
||||
}
|
||||
m_pXmlWriter->WriteNodeEnd( L"", TRUE, FALSE );
|
||||
|
||||
//v:imageData
|
||||
if (CopyPicture(pict))
|
||||
{
|
||||
//v:imageData
|
||||
appendValueAttribute(m_imageData, L"r:id", L"rId" + FormatUtils::IntToWideString(m_nImageId));
|
||||
appendValueAttribute(m_imageData, L"o:title", L"" );
|
||||
m_pXmlWriter->WriteString(m_imageData->GetXMLString());
|
||||
}
|
||||
else
|
||||
{
|
||||
appendValueAttribute(m_imageData, L"r:id", L"");
|
||||
}
|
||||
m_pXmlWriter->WriteString(m_imageData->GetXMLString());
|
||||
|
||||
{//borders
|
||||
writePictureBorder( L"bordertop", pict->brcTop );
|
||||
@ -510,10 +529,10 @@ namespace DocFileFormat
|
||||
pict->embeddedData = newData;
|
||||
|
||||
}
|
||||
m_ctx->_docx->ImagesList.push_back(ImageFileStructure(GetTargetExt(Global::msoblipDIB),
|
||||
m_context->_docx->ImagesList.push_back(ImageFileStructure(GetTargetExt(Global::msoblipDIB),
|
||||
std::vector<unsigned char>(pict->embeddedData, (pict->embeddedData + pict->embeddedDataSize)), Global::msoblipDIB));
|
||||
|
||||
m_nImageId = m_ctx->_docx->RegisterImage(m_caller, btWin32);
|
||||
m_nImageId = m_context->_docx->RegisterImage(m_caller, btWin32);
|
||||
result = true;
|
||||
}
|
||||
else if ((oBlipEntry != NULL) && (oBlipEntry->Blip != NULL))
|
||||
@ -530,7 +549,7 @@ namespace DocFileFormat
|
||||
unsigned char *newData = NULL;
|
||||
int newDataSize = metaBlip->oMetaFile.ToBuffer(newData);
|
||||
|
||||
m_ctx->_docx->ImagesList.push_back(ImageFileStructure(GetTargetExt(oBlipEntry->btWin32), std::vector<unsigned char>(newData, (newData + newDataSize))));
|
||||
m_context->_docx->ImagesList.push_back(ImageFileStructure(GetTargetExt(oBlipEntry->btWin32), std::vector<unsigned char>(newData, (newData + newDataSize))));
|
||||
|
||||
RELEASEARRAYOBJECTS(newData);
|
||||
}
|
||||
@ -546,7 +565,7 @@ namespace DocFileFormat
|
||||
BitmapBlip* bitBlip = static_cast<BitmapBlip*>(oBlipEntry->Blip);
|
||||
if (bitBlip)
|
||||
{
|
||||
m_ctx->_docx->ImagesList.push_back(ImageFileStructure(GetTargetExt(oBlipEntry->btWin32),
|
||||
m_context->_docx->ImagesList.push_back(ImageFileStructure(GetTargetExt(oBlipEntry->btWin32),
|
||||
std::vector<unsigned char>(bitBlip->m_pvBits, (bitBlip->m_pvBits + bitBlip->pvBitsSize)), oBlipEntry->btWin32));
|
||||
}
|
||||
}break;
|
||||
@ -557,7 +576,7 @@ namespace DocFileFormat
|
||||
}break;
|
||||
}
|
||||
|
||||
m_nImageId = m_ctx->_docx->RegisterImage(m_caller, oBlipEntry->btWin32);
|
||||
m_nImageId = m_context->_docx->RegisterImage(m_caller, oBlipEntry->btWin32);
|
||||
result = true;
|
||||
}
|
||||
|
||||
|
||||
@ -58,6 +58,7 @@ namespace DocFileFormat
|
||||
void writePictureBorder (const std::wstring & name, const BorderCode* brc);
|
||||
void appendStyleProperty( std::wstring* b, const std::wstring& propName, const std::wstring& propValue ) const;
|
||||
bool ParseEmbeddedEquation( const std::string & xmlString, std::wstring & newXmlString );
|
||||
std::wstring GetShapeID(const Shape* pShape) const;
|
||||
protected:
|
||||
/// Copies the picture from the binary stream to the zip archive
|
||||
/// and creates the relationships for the image.
|
||||
@ -77,7 +78,7 @@ namespace DocFileFormat
|
||||
std::wstring m_shapeId;
|
||||
private:
|
||||
|
||||
ConversionContext* m_ctx;
|
||||
ConversionContext* m_context;
|
||||
IMapping* m_caller;
|
||||
int m_nImageId;
|
||||
|
||||
|
||||
@ -235,10 +235,11 @@ namespace DocFileFormat
|
||||
|
||||
m_shapeId = GetShapeID(pShape);
|
||||
|
||||
count_vml_objects++;
|
||||
|
||||
if (m_shapeId.empty())
|
||||
m_shapeId = std::wstring(L"_x0000_s") + FormatUtils::IntToWideString(1024 + count_vml_objects);
|
||||
{
|
||||
m_context->_doc->GetOfficeArt()->m_uLastShapeId++;
|
||||
m_shapeId = std::wstring(L"_x0000_s") + FormatUtils::IntToWideString(m_context->_doc->GetOfficeArt()->m_uLastShapeId);
|
||||
}
|
||||
|
||||
m_pXmlWriter->WriteAttribute ( L"id", m_shapeId );
|
||||
|
||||
@ -2265,9 +2266,10 @@ namespace DocFileFormat
|
||||
TwipsValue w( primitive->dxa );
|
||||
TwipsValue h( primitive->dya );
|
||||
|
||||
std::wstring strId = std::wstring(L"_x0000_s") + FormatUtils::IntToWideString(1024 + count_vml_objects);
|
||||
m_context->_doc->GetOfficeArt()->m_uLastShapeId++;
|
||||
|
||||
std::wstring strId = std::wstring(L"_x0000_s") + FormatUtils::IntToWideString(m_context->_doc->GetOfficeArt()->m_uLastShapeId);
|
||||
|
||||
count_vml_objects++;
|
||||
//m_pXmlWriter->WriteAttribute ( L"id") , strId);
|
||||
m_pXmlWriter->WriteAttribute ( L"o:spid", strId);
|
||||
|
||||
|
||||
@ -37,8 +37,6 @@
|
||||
|
||||
namespace DocFileFormat
|
||||
{
|
||||
static int count_vml_objects = 0;
|
||||
|
||||
class VMLShapeTypeMapping: public PropertiesMapping, public IMapping
|
||||
{
|
||||
private:
|
||||
|
||||
@ -338,7 +338,7 @@ namespace DocFileFormat
|
||||
HeaderStoriesPlex = new Plex<EmptyStructure>( EmptyStructure::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfHdd, FIB->m_FibWord97.lcbPlcfHdd, nWordVersion);
|
||||
}
|
||||
|
||||
if (FIB->m_RgLw97.ccpAtn > 0)
|
||||
if (FIB->m_RgLw97.ccpAtn > 0)
|
||||
{
|
||||
AnnotationsReferencePlex = new Plex<AnnotationReferenceDescriptor>(AnnotationReferenceDescriptor::GetSize(nWordVersion), TableStream, FIB->m_FibWord97.fcPlcfandRef, FIB->m_FibWord97.lcbPlcfandRef, nWordVersion);
|
||||
IndividualCommentsPlex = new Plex<EmptyStructure> (EmptyStructure::STRUCTURE_SIZE, TableStream, FIB->m_FibWord97.fcPlcfandTxt, FIB->m_FibWord97.lcbPlcfandTxt, nWordVersion);
|
||||
@ -417,7 +417,7 @@ namespace DocFileFormat
|
||||
AnnotationOwners = new AnnotationOwnerList (FIB, TableStream);
|
||||
}
|
||||
|
||||
if (m_pCallFunc)
|
||||
if (m_pCallFunc)
|
||||
{
|
||||
m_pCallFunc->OnProgress(m_pCallFunc->caller, DOC_ONPROGRESSEVENT_ID, 300000 );
|
||||
|
||||
@ -435,24 +435,24 @@ namespace DocFileFormat
|
||||
std::unordered_map<int, int> fonts_charsets;
|
||||
bool bFontsCodePage = false;
|
||||
|
||||
for ( std::vector<ByteStructure*>::iterator iter = FontTable->Data.begin(); !bFontsCodePage && iter != FontTable->Data.end(); iter++ )
|
||||
for ( size_t i = 0; !bFontsCodePage && i < FontTable->Data.size(); ++i)
|
||||
{
|
||||
FontFamilyName* font = dynamic_cast<FontFamilyName*>( *iter );
|
||||
FontFamilyName* font = dynamic_cast<FontFamilyName*>( FontTable->Data[i]);
|
||||
if (!font) continue;
|
||||
|
||||
if (fonts_charsets.find(font->chs) == fonts_charsets.end())
|
||||
{
|
||||
fonts_charsets.insert(std::make_pair(font->chs, font->ff));
|
||||
|
||||
for (int i = 0 ; i < sizeof(aCodePages) / 2; i++)
|
||||
{
|
||||
if (aCodePages[i][0] == font->chs && font->chs != 0)
|
||||
{
|
||||
nFontsCodePage = aCodePages[i][1];
|
||||
bFontsCodePage = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (size_t j = 0 ; j < 32; j++)
|
||||
{
|
||||
if (aCodePages[j][0] == font->chs && font->chs != 0)
|
||||
{
|
||||
nFontsCodePage = aCodePages[j][1];
|
||||
bFontsCodePage = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -465,7 +465,7 @@ namespace DocFileFormat
|
||||
Text = m_PieceTable->GetAllEncodingText (WordDocumentStream);
|
||||
}
|
||||
|
||||
if (FIB->m_FibWord97.lcbClx < 1 || ((Text) && (Text->empty())))
|
||||
if (FIB->m_FibWord97.lcbClx < 1 || ((Text) && (Text->empty())))
|
||||
{
|
||||
int cb = FIB->m_FibBase.fcMac - FIB->m_FibBase.fcMin;
|
||||
|
||||
|
||||
@ -34,6 +34,7 @@
|
||||
|
||||
#include "../../DesktopEditor/raster/BgraFrame.h"
|
||||
#include "../../DesktopEditor/common/Directory.h"
|
||||
#include "../../DesktopEditor/common/SystemUtils.h"
|
||||
|
||||
#include "../../Common/DocxFormat/Source/DocxFormat/App.h"
|
||||
#include "../../Common/DocxFormat/Source/DocxFormat/Core.h"
|
||||
@ -224,7 +225,10 @@ namespace DocFileFormat
|
||||
OOX::CApp* pApp = new OOX::CApp(NULL);
|
||||
if (pApp)
|
||||
{
|
||||
pApp->SetApplication(L"ONLYOFFICE");
|
||||
std::wstring sApplication = NSSystemUtils::GetEnvVariable(NSSystemUtils::gc_EnvApplicationName);
|
||||
if (sApplication.empty())
|
||||
sApplication = NSSystemUtils::gc_EnvApplicationNameDefault;
|
||||
pApp->SetApplication(sApplication);
|
||||
#if defined(INTVER)
|
||||
pApp->SetAppVersion(VALUE2STR(INTVER));
|
||||
#endif
|
||||
|
||||
@ -172,7 +172,7 @@
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;USE_ATL_CSTRINGS;_USE_LIBXML2_READER_;LIBXML_READER_ENABLED;USE_LITE_READER;_USE_XMLLITE_READER_"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;_USE_LIBXML2_READER_;LIBXML_READER_ENABLED;USE_LITE_READER;_USE_XMLLITE_READER_;PPTX_DEF;PPT_DEF;ENABLE_PPT_TO_PPTX_CONVERT;AVS_USE_CONVERT_PPTX_TOCUSTOM_VML;DONT_WRITE_EMBEDDED_FONTS"
|
||||
RuntimeLibrary="2"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
|
||||
@ -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_ATL_CSTRINGS;_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"
|
||||
MinimalRebuild="false"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="3"
|
||||
@ -205,7 +205,7 @@
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories="..\..\..\..\..\Common\OfficeDrawing;"..\..\..\..\..\DesktopEditor\freetype-2.5.2\include";..\..\..\..\..\Common\OfficeDrawing\Shapes"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_USE_LIBXML2_READER_;LIBXML_READER_ENABLED;USE_LITE_READER;_USE_XMLLITE_READER_"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_USE_LIBXML2_READER_;LIBXML_READER_ENABLED;USE_LITE_READER;_USE_XMLLITE_READER_;DONT_WRITE_EMBEDDED_FONTS"
|
||||
RuntimeLibrary="2"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
@ -373,6 +373,10 @@
|
||||
RelativePath="..\..\XlsxSerializerCom\Writer\CSVWriter.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\ASCOfficeDocxFile2\BinReader\CustormXmlWriter.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\..\ASCOfficeDocxFile2\DocWrapper\DocxSerializer.cpp"
|
||||
>
|
||||
|
||||
76
ASCOfficeDocxFile2/BinReader/CustormXmlWriter.cpp
Normal file
76
ASCOfficeDocxFile2/BinReader/CustormXmlWriter.cpp
Normal file
@ -0,0 +1,76 @@
|
||||
/*
|
||||
* (c) Copyright Ascensio System SIA 2010-2018
|
||||
*
|
||||
* This program is a free software product. You can redistribute it and/or
|
||||
* modify it under the terms of the GNU Affero General Public License (AGPL)
|
||||
* version 3 as published by the Free Software Foundation. In accordance with
|
||||
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
|
||||
* that Ascensio System SIA expressly excludes the warranty of non-infringement
|
||||
* of any third-party rights.
|
||||
*
|
||||
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
|
||||
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
|
||||
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
|
||||
*
|
||||
* You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia,
|
||||
* EU, LV-1021.
|
||||
*
|
||||
* The interactive user interfaces in modified source and object code versions
|
||||
* of the Program must display Appropriate Legal Notices, as required under
|
||||
* Section 5 of the GNU AGPL version 3.
|
||||
*
|
||||
* Pursuant to Section 7(b) of the License you must retain the original Product
|
||||
* logo when distributing the program. Pursuant to Section 7(e) we decline to
|
||||
* grant you any rights under trademark law for use of our trademarks.
|
||||
*
|
||||
* All the Product's GUI elements, including illustrations and icon sets, as
|
||||
* well as technical writing content are licensed under the terms of the
|
||||
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
|
||||
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
|
||||
*
|
||||
*/
|
||||
|
||||
#include "CustormXmlWriter.h"
|
||||
#include "../../Common/DocxFormat/Source/DocxFormat/CustomXml.h"
|
||||
#include "../../ASCOfficePPTXFile/ASCOfficeDrawingConverter.h"
|
||||
|
||||
namespace Writers
|
||||
{
|
||||
CustomXmlWriter::CustomXmlWriter(std::wstring sDir, NSBinPptxRW::CDrawingConverter* pDrawingConverter):m_sDir(sDir),m_pDrawingConverter(pDrawingConverter)
|
||||
{
|
||||
m_nCount = 0;
|
||||
}
|
||||
std::wstring CustomXmlWriter::WriteCustomXml(const std::wstring& sUrl, const std::wstring& sXml)
|
||||
{
|
||||
m_nCount++;
|
||||
OOX::CCustomXMLProps oCustomXMLProps(NULL);
|
||||
OOX::CCustomXMLProps::CShemaRef* pShemaRef = new OOX::CCustomXMLProps::CShemaRef();
|
||||
pShemaRef->m_sUri = sUrl;
|
||||
//todo guid
|
||||
oCustomXMLProps.m_oItemID.FromString(L"{5D0AEA6B-E499-4EEF-98A3-AFBB261C493E}");
|
||||
oCustomXMLProps.m_oShemaRefs.Init();
|
||||
oCustomXMLProps.m_oShemaRefs->m_arrItems.push_back(pShemaRef);
|
||||
|
||||
std::wstring sCustomXmlPropsDir = m_sDir + FILE_SEPARATOR_STR;
|
||||
sCustomXmlPropsDir += OOX::FileTypes::CustomXmlProps.DefaultDirectory().GetPath();
|
||||
NSDirectory::CreateDirectories(sCustomXmlPropsDir);
|
||||
std::wstring sCustomXMLPropsFilename = OOX::FileTypes::CustomXmlProps.DefaultFileName().GetBasename();
|
||||
sCustomXMLPropsFilename += std::to_wstring(m_nCount) + OOX::FileTypes::CustomXmlProps.DefaultFileName().GetExtention();
|
||||
oCustomXMLProps.write(OOX::CPath(sCustomXmlPropsDir + FILE_SEPARATOR_STR + sCustomXMLPropsFilename), OOX::CPath(sCustomXmlPropsDir), *m_pDrawingConverter->GetContentTypes());
|
||||
|
||||
std::wstring sCustomXmlFilename;
|
||||
sCustomXmlFilename = OOX::FileTypes::CustomXml.DefaultFileName().GetBasename() + std::to_wstring(m_nCount);
|
||||
sCustomXmlFilename += OOX::FileTypes::CustomXml.DefaultFileName().GetExtention();
|
||||
std::wstring sCustomXmlDir = m_sDir + FILE_SEPARATOR_STR + OOX::FileTypes::CustomXml.DefaultDirectory().GetPath();
|
||||
std::wstring sCustomXmlRelsDir = sCustomXmlDir + FILE_SEPARATOR_STR + L"_rels";
|
||||
NSDirectory::CreateDirectories(sCustomXmlRelsDir);
|
||||
|
||||
m_pDrawingConverter->SetDstContentRels();
|
||||
long lId;
|
||||
m_pDrawingConverter->WriteRels(OOX::FileTypes::CustomXmlProps.RelationType(), sCustomXMLPropsFilename, L"", &lId);
|
||||
m_pDrawingConverter->SaveDstContentRels(sCustomXmlRelsDir + FILE_SEPARATOR_STR + sCustomXmlFilename + L".rels");
|
||||
|
||||
NSFile::CFileBinary::SaveToFile(sCustomXmlDir + FILE_SEPARATOR_STR + sCustomXmlFilename, sXml);
|
||||
return sCustomXmlFilename;
|
||||
}
|
||||
}
|
||||
54
ASCOfficeDocxFile2/BinReader/CustormXmlWriter.h
Normal file
54
ASCOfficeDocxFile2/BinReader/CustormXmlWriter.h
Normal file
@ -0,0 +1,54 @@
|
||||
/*
|
||||
* (c) Copyright Ascensio System SIA 2010-2018
|
||||
*
|
||||
* This program is a free software product. You can redistribute it and/or
|
||||
* modify it under the terms of the GNU Affero General Public License (AGPL)
|
||||
* version 3 as published by the Free Software Foundation. In accordance with
|
||||
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
|
||||
* that Ascensio System SIA expressly excludes the warranty of non-infringement
|
||||
* of any third-party rights.
|
||||
*
|
||||
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
|
||||
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
|
||||
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
|
||||
*
|
||||
* You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia,
|
||||
* EU, LV-1021.
|
||||
*
|
||||
* The interactive user interfaces in modified source and object code versions
|
||||
* of the Program must display Appropriate Legal Notices, as required under
|
||||
* Section 5 of the GNU AGPL version 3.
|
||||
*
|
||||
* Pursuant to Section 7(b) of the License you must retain the original Product
|
||||
* logo when distributing the program. Pursuant to Section 7(e) we decline to
|
||||
* grant you any rights under trademark law for use of our trademarks.
|
||||
*
|
||||
* All the Product's GUI elements, including illustrations and icon sets, as
|
||||
* well as technical writing content are licensed under the terms of the
|
||||
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
|
||||
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
|
||||
*
|
||||
*/
|
||||
#ifndef CUSTOM_XML_WRITER
|
||||
#define CUSTOM_XML_WRITER
|
||||
|
||||
#include "../../XlsxSerializerCom/Common/Common.h"
|
||||
|
||||
namespace NSBinPptxRW
|
||||
{
|
||||
class CDrawingConverter;
|
||||
}
|
||||
|
||||
namespace Writers
|
||||
{
|
||||
class CustomXmlWriter
|
||||
{
|
||||
int m_nCount;
|
||||
std::wstring m_sDir;
|
||||
NSBinPptxRW::CDrawingConverter* m_pDrawingConverter;
|
||||
public:
|
||||
CustomXmlWriter(std::wstring sDir, NSBinPptxRW::CDrawingConverter* pDrawingConverter);
|
||||
std::wstring WriteCustomXml(const std::wstring& sUrl, const std::wstring& sXml);
|
||||
};
|
||||
}
|
||||
#endif // #ifndef CUSTOM_XML_WRITER
|
||||
@ -66,12 +66,13 @@ xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawin
|
||||
xmlns:w10=\"urn:schemas-microsoft-com:office:word\" \
|
||||
xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" \
|
||||
xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" \
|
||||
xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\" \
|
||||
xmlns:wpg=\"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup\" \
|
||||
xmlns:wpi=\"http://schemas.microsoft.com/office/word/2010/wordprocessingInk\" \
|
||||
xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" \
|
||||
xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\" \
|
||||
xmlns:wps=\"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\" \
|
||||
mc:Ignorable=\"w14 wp14\">")));
|
||||
mc:Ignorable=\"w14 w15 wp14\">")));
|
||||
|
||||
oFile.WriteStringUTF8(m_oBackground.GetData());
|
||||
|
||||
|
||||
@ -47,6 +47,7 @@
|
||||
#include "DocumentRelsWriter.h"
|
||||
#include "webSettingsWriter.h"
|
||||
#include "DefaultThemeWriter.h"
|
||||
#include "CustormXmlWriter.h"
|
||||
|
||||
namespace BinDocxRW
|
||||
{
|
||||
@ -77,6 +78,7 @@ namespace Writers
|
||||
DocumentRelsWriter m_oDocumentRelsWriter;
|
||||
WebSettingsWriter m_oWebSettingsWriter;
|
||||
DefaultThemeWriter m_oTheme;
|
||||
CustomXmlWriter m_oCustomXmlWriter;
|
||||
|
||||
smart_ptr<OOX::VbaProject> m_pVbaProject;
|
||||
|
||||
@ -102,7 +104,8 @@ namespace Writers
|
||||
m_oDocumentRelsWriter (sDirOutput),
|
||||
m_oWebSettingsWriter (sDirOutput),
|
||||
m_nDocPrIndex(0),
|
||||
m_pComments(NULL)
|
||||
m_pComments(NULL),
|
||||
m_oCustomXmlWriter (sDirOutput, pDrawingConverter)
|
||||
{
|
||||
}
|
||||
int getNextDocPr()
|
||||
|
||||
@ -72,12 +72,13 @@ xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawin
|
||||
xmlns:w10=\"urn:schemas-microsoft-com:office:word\" \
|
||||
xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" \
|
||||
xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" \
|
||||
xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\" \
|
||||
xmlns:wpg=\"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup\" \
|
||||
xmlns:wpi=\"http://schemas.microsoft.com/office/word/2010/wordprocessingInk\" \
|
||||
xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\" \
|
||||
xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" \
|
||||
xmlns:wps=\"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\" \
|
||||
mc:Ignorable=\"w14 wp14\">");
|
||||
mc:Ignorable=\"w14 w15 wp14\">");
|
||||
static std::wstring g_string_hdr_End = _T("</w:hdr>");
|
||||
|
||||
static std::wstring g_string_ftr_Start = _T("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\
|
||||
@ -92,18 +93,19 @@ xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawin
|
||||
xmlns:w10=\"urn:schemas-microsoft-com:office:word\" \
|
||||
xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" \
|
||||
xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" \
|
||||
xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\" \
|
||||
xmlns:wpg=\"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup\" \
|
||||
xmlns:wpi=\"http://schemas.microsoft.com/office/word/2010/wordprocessingInk\" \
|
||||
xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\" \
|
||||
xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" \
|
||||
xmlns:wps=\"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\" \
|
||||
mc:Ignorable=\"w14 wp14\">");
|
||||
mc:Ignorable=\"w14 w15 wp14\">");
|
||||
static std::wstring g_string_ftr_End = _T("</w:ftr>");
|
||||
|
||||
static std::wstring g_string_footnotes_Start = _T("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><w:footnotes xmlns:wpc=\"http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas\" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\" xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:wp14=\"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing\" xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" xmlns:w10=\"urn:schemas-microsoft-com:office:word\" xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" xmlns:wpg=\"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup\" xmlns:wpi=\"http://schemas.microsoft.com/office/word/2010/wordprocessingInk\" xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\" xmlns:wps=\"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\" xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" mc:Ignorable=\"w14 wp14\">");
|
||||
static std::wstring g_string_footnotes_Start = _T("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><w:footnotes xmlns:wpc=\"http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas\" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\" xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:wp14=\"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing\" xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" xmlns:w10=\"urn:schemas-microsoft-com:office:word\" xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\" xmlns:wpg=\"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup\" xmlns:wpi=\"http://schemas.microsoft.com/office/word/2010/wordprocessingInk\" xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\" xmlns:wps=\"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\" xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" mc:Ignorable=\"w14 w15 wp14\">");
|
||||
static std::wstring g_string_footnotes_End = _T("</w:footnotes>");
|
||||
|
||||
static std::wstring g_string_endnotes_Start = _T("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><w:endnotes xmlns:wpc=\"http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas\" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\" xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:wp14=\"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing\" xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" xmlns:w10=\"urn:schemas-microsoft-com:office:word\" xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" xmlns:wpg=\"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup\" xmlns:wpi=\"http://schemas.microsoft.com/office/word/2010/wordprocessingInk\" xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\" xmlns:wps=\"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\" xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" mc:Ignorable=\"w14 wp14\">");
|
||||
static std::wstring g_string_endnotes_Start = _T("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><w:endnotes xmlns:wpc=\"http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas\" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\" xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:wp14=\"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing\" xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" xmlns:w10=\"urn:schemas-microsoft-com:office:word\" xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\" xmlns:wpg=\"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup\" xmlns:wpi=\"http://schemas.microsoft.com/office/word/2010/wordprocessingInk\" xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\" xmlns:wps=\"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\" xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" mc:Ignorable=\"w14 w15 wp14\">");
|
||||
static std::wstring g_string_endnotes_End = _T("</w:endnotes>");
|
||||
|
||||
class HeaderFooterWriter
|
||||
|
||||
@ -36,7 +36,7 @@
|
||||
|
||||
namespace Writers
|
||||
{
|
||||
static std::wstring g_string_n_Start = _T("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><w:numbering xmlns:wpc=\"http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas\" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\" xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:wp14=\"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing\" xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" xmlns:w10=\"urn:schemas-microsoft-com:office:word\" xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" xmlns:wpg=\"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup\" xmlns:wpi=\"http://schemas.microsoft.com/office/word/2010/wordprocessingInk\" xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\" xmlns:wps=\"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\" mc:Ignorable=\"w14 wp14\">");
|
||||
static std::wstring g_string_n_Start = _T("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><w:numbering xmlns:wpc=\"http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas\" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\" xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:wp14=\"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing\" xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" xmlns:w10=\"urn:schemas-microsoft-com:office:word\" xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\" xmlns:wpg=\"http://schemas.microsoft.com/office/word/2010/wordprocessingGroup\" xmlns:wpi=\"http://schemas.microsoft.com/office/word/2010/wordprocessingInk\" xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\" xmlns:wps=\"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\" mc:Ignorable=\"w14 w15 wp14\">");
|
||||
static std::wstring g_string_n_End = _T("</w:numbering>");
|
||||
|
||||
class NumberingWriter
|
||||
|
||||
@ -335,10 +335,48 @@ public:
|
||||
sShd += L"<w:shd";
|
||||
if(bValue)
|
||||
{
|
||||
if(shd_Nil == Value)
|
||||
sShd += L" w:val=\"nil\"";
|
||||
else
|
||||
sShd += L" w:val=\"clear\"";
|
||||
switch(Value)
|
||||
{
|
||||
case SimpleTypes::shdClear : sShd += L" w:val=\"clear\""; break;
|
||||
case SimpleTypes::shdDiagCross : sShd += L" w:val=\"diagCross\""; break;
|
||||
case SimpleTypes::shdDiagStripe : sShd += L" w:val=\"diagStripe\""; break;
|
||||
case SimpleTypes::shdHorzCross : sShd += L" w:val=\"horzCross\""; break;
|
||||
case SimpleTypes::shdHorzStripe : sShd += L" w:val=\"horzStripe\""; break;
|
||||
case SimpleTypes::shdNil : sShd += L" w:val=\"nil\""; break;
|
||||
case SimpleTypes::shdPct10 : sShd += L" w:val=\"pct10\""; break;
|
||||
case SimpleTypes::shdPct12 : sShd += L" w:val=\"pct12\""; break;
|
||||
case SimpleTypes::shdPct15 : sShd += L" w:val=\"pct15\""; break;
|
||||
case SimpleTypes::shdPct20 : sShd += L" w:val=\"pct20\""; break;
|
||||
case SimpleTypes::shdPct25 : sShd += L" w:val=\"pct25\""; break;
|
||||
case SimpleTypes::shdPct30 : sShd += L" w:val=\"pct30\""; break;
|
||||
case SimpleTypes::shdPct35 : sShd += L" w:val=\"pct35\""; break;
|
||||
case SimpleTypes::shdPct37 : sShd += L" w:val=\"pct37\""; break;
|
||||
case SimpleTypes::shdPct40 : sShd += L" w:val=\"pct40\""; break;
|
||||
case SimpleTypes::shdPct45 : sShd += L" w:val=\"pct45\""; break;
|
||||
case SimpleTypes::shdPct5 : sShd += L" w:val=\"pct5\""; break;
|
||||
case SimpleTypes::shdPct50 : sShd += L" w:val=\"pct50\""; break;
|
||||
case SimpleTypes::shdPct55 : sShd += L" w:val=\"pct55\""; break;
|
||||
case SimpleTypes::shdPct60 : sShd += L" w:val=\"pct60\""; break;
|
||||
case SimpleTypes::shdPct62 : sShd += L" w:val=\"pct62\""; break;
|
||||
case SimpleTypes::shdPct65 : sShd += L" w:val=\"pct65\""; break;
|
||||
case SimpleTypes::shdPct70 : sShd += L" w:val=\"pct70\""; break;
|
||||
case SimpleTypes::shdPct75 : sShd += L" w:val=\"pct75\""; break;
|
||||
case SimpleTypes::shdPct80 : sShd += L" w:val=\"pct80\""; break;
|
||||
case SimpleTypes::shdPct85 : sShd += L" w:val=\"pct85\""; break;
|
||||
case SimpleTypes::shdPct87 : sShd += L" w:val=\"pct87\""; break;
|
||||
case SimpleTypes::shdPct90 : sShd += L" w:val=\"pct90\""; break;
|
||||
case SimpleTypes::shdPct95 : sShd += L" w:val=\"pct95\""; break;
|
||||
case SimpleTypes::shdReverseDiagStripe : sShd += L" w:val=\"reverseDiagStripe\""; break;
|
||||
case SimpleTypes::shdSolid : sShd += L" w:val=\"solid\""; break;
|
||||
case SimpleTypes::shdThinDiagCross : sShd += L" w:val=\"thinDiagCross\""; break;
|
||||
case SimpleTypes::shdThinDiagStripe : sShd += L" w:val=\"thinDiagStripe\""; break;
|
||||
case SimpleTypes::shdThinHorzCross : sShd += L" w:val=\"thinHorzCross\""; break;
|
||||
case SimpleTypes::shdThinHorzStripe : sShd += L" w:val=\"thinHorzStripe\""; break;
|
||||
case SimpleTypes::shdThinReverseDiagStripe : sShd += L" w:val=\"thinReverseDiagStripe\""; break;
|
||||
case SimpleTypes::shdThinVertStripe : sShd += L" w:val=\"thinVertStripe\""; break;
|
||||
case SimpleTypes::shdVertStripe : sShd += L" w:val=\"vertStripe\""; break;
|
||||
default : sShd += L" w:val=\"solid\""; break;
|
||||
}
|
||||
}
|
||||
sShd += L" w:color=\"auto\"";
|
||||
if(bColor)
|
||||
@ -2800,30 +2838,51 @@ public:
|
||||
}
|
||||
void Write(NSStringUtils::CStringBuilder& wr)
|
||||
{
|
||||
if(false == rId.empty())
|
||||
wr.WriteString(L"<w:hyperlink");
|
||||
if(!rId.empty())
|
||||
{
|
||||
std::wstring sCorrect_rId = XmlUtils::EncodeXmlString(rId);
|
||||
std::wstring sCorrect_tooltip = XmlUtils::EncodeXmlString(sTooltip);
|
||||
std::wstring sCorrect_anchor = XmlUtils::EncodeXmlString(sAnchor);
|
||||
|
||||
std::wstring sStart = L"<w:hyperlink r:id=\"" + sCorrect_rId + L"\"";
|
||||
if(false == sTooltip.empty())
|
||||
{
|
||||
sStart += L" w:tooltip=\"";
|
||||
sStart += sCorrect_tooltip;
|
||||
sStart += L"\"";
|
||||
}
|
||||
if(false == sAnchor.empty())
|
||||
{
|
||||
sStart += L" w:anchor=\"";
|
||||
sStart += sCorrect_anchor;
|
||||
sStart += L"\"";
|
||||
}
|
||||
sStart += L" w:history=\"1\">";
|
||||
wr.WriteString(sStart);
|
||||
wr.Write(writer);
|
||||
wr.WriteString(L"</w:hyperlink>");
|
||||
wr.WriteString(L" r:id=\"");
|
||||
wr.WriteEncodeXmlString(rId);
|
||||
wr.WriteString(L"\"");
|
||||
}
|
||||
if(!sTooltip.empty())
|
||||
{
|
||||
wr.WriteString(L" w:tooltip=\"");
|
||||
wr.WriteEncodeXmlString(sTooltip);
|
||||
wr.WriteString(L"\"");
|
||||
}
|
||||
if(!sAnchor.empty())
|
||||
{
|
||||
wr.WriteString(L" w:anchor=\"");
|
||||
wr.WriteEncodeXmlString(sAnchor);
|
||||
wr.WriteString(L"\"");
|
||||
}
|
||||
if (bHistory)
|
||||
{
|
||||
if (History)
|
||||
{
|
||||
wr.WriteString(L" w:history=\"1\"");
|
||||
}
|
||||
else
|
||||
{
|
||||
wr.WriteString(L" w:history=\"0\"");
|
||||
}
|
||||
}
|
||||
if (!sDocLocation.empty())
|
||||
{
|
||||
wr.WriteString(L" w:docLocation=\"");
|
||||
wr.WriteEncodeXmlString(sDocLocation);
|
||||
wr.WriteString(L"\"");
|
||||
}
|
||||
if (!sTgtFrame.empty())
|
||||
{
|
||||
wr.WriteString(L" w:tgtFrame=\"");
|
||||
wr.WriteEncodeXmlString(sTgtFrame);
|
||||
wr.WriteString(L"\"");
|
||||
}
|
||||
wr.WriteString(L">");
|
||||
wr.Write(writer);
|
||||
wr.WriteString(L"</w:hyperlink>");
|
||||
}
|
||||
};
|
||||
class CFldSimple{
|
||||
|
||||
@ -34,6 +34,41 @@
|
||||
|
||||
namespace BinDocxRW {
|
||||
|
||||
void InnerColorToOOX(rPr& oRPr, ComplexTypes::Word::CColor& oColor)
|
||||
{
|
||||
if (oRPr.bColor)
|
||||
{
|
||||
oColor.m_oVal.Init();
|
||||
oColor.m_oVal->SetValue(SimpleTypes::hexcolorRGB);
|
||||
oColor.m_oVal->Set_R(oRPr.Color.R);
|
||||
oColor.m_oVal->Set_G(oRPr.Color.G);
|
||||
oColor.m_oVal->Set_B(oRPr.Color.B);
|
||||
}
|
||||
if (oRPr.bThemeColor && oRPr.ThemeColor.IsNoEmpty())
|
||||
{
|
||||
if(oRPr.ThemeColor.Auto && !oRPr.bColor)
|
||||
{
|
||||
oColor.m_oVal.Init();
|
||||
oColor.m_oVal->SetValue(SimpleTypes::hexcolorAuto);
|
||||
}
|
||||
if(oRPr.ThemeColor.bColor)
|
||||
{
|
||||
oColor.m_oThemeColor.Init();
|
||||
oColor.m_oThemeColor->SetValue((SimpleTypes::EThemeColor)oRPr.ThemeColor.Color);
|
||||
}
|
||||
if(oRPr.ThemeColor.bTint)
|
||||
{
|
||||
oColor.m_oThemeTint.Init();
|
||||
oColor.m_oThemeTint->SetValue(oRPr.ThemeColor.Tint);
|
||||
}
|
||||
if(oRPr.ThemeColor.bShade)
|
||||
{
|
||||
oColor.m_oThemeShade.Init();
|
||||
oColor.m_oThemeShade->SetValue(oRPr.ThemeColor.Shade);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int Binary_VbaProjectTableReader::Read()
|
||||
{
|
||||
m_oFileWriter.m_pVbaProject = new OOX::VbaProject(NULL);
|
||||
|
||||
@ -182,6 +182,8 @@ public:
|
||||
poResult->UserId = m_oBufferedStream.GetString3(length);\
|
||||
}
|
||||
|
||||
void InnerColorToOOX(rPr& oRPr, ComplexTypes::Word::CColor& oColor);
|
||||
|
||||
class Binary_CommonReader
|
||||
{
|
||||
protected:
|
||||
@ -2249,6 +2251,15 @@ public:
|
||||
case vmerge_Continue:pCStringWriter->WriteString(std::wstring(_T("<w:vMerge w:val=\"continue\" />")));break;
|
||||
}
|
||||
}
|
||||
else if( c_oSerProp_cellPrType::HMerge == type )
|
||||
{
|
||||
BYTE HMerge = m_oBufferedStream.GetUChar();
|
||||
switch(HMerge)
|
||||
{
|
||||
case vmerge_Restart:pCStringWriter->WriteString(std::wstring(_T("<w:hMerge w:val=\"restart\" />")));break;
|
||||
case vmerge_Continue:pCStringWriter->WriteString(std::wstring(_T("<w:hMerge w:val=\"continue\" />")));break;
|
||||
}
|
||||
}
|
||||
else if( c_oSerProp_cellPrType::CellDel == type )
|
||||
{
|
||||
TrackRevision Del;
|
||||
@ -3220,11 +3231,13 @@ public:
|
||||
class Binary_SettingsTableReader : public Binary_CommonReader
|
||||
{
|
||||
Binary_pPrReader m_oBinary_pPrReader;
|
||||
Binary_rPrReader m_oBinary_rPrReader;
|
||||
Writers::SettingWriter& m_oSettingWriter;
|
||||
Writers::FileWriter& m_oFileWriter;
|
||||
OOX::CSettingsCustom& m_oSettingsCustom;
|
||||
public:
|
||||
Binary_SettingsTableReader(NSBinPptxRW::CBinaryFileReader& poBufferedStream, Writers::FileWriter& oFileWriter):
|
||||
Binary_CommonReader(poBufferedStream),m_oSettingWriter(oFileWriter.m_oSettingWriter),m_oFileWriter(oFileWriter),m_oBinary_pPrReader(poBufferedStream, oFileWriter)
|
||||
Binary_SettingsTableReader(NSBinPptxRW::CBinaryFileReader& poBufferedStream, Writers::FileWriter& oFileWriter, OOX::CSettingsCustom& oSettingsCustom):
|
||||
Binary_CommonReader(poBufferedStream),m_oSettingWriter(oFileWriter.m_oSettingWriter),m_oFileWriter(oFileWriter),m_oBinary_pPrReader(poBufferedStream, oFileWriter),m_oBinary_rPrReader(poBufferedStream, oFileWriter),m_oSettingsCustom(oSettingsCustom)
|
||||
{
|
||||
}
|
||||
int Read()
|
||||
@ -3316,6 +3329,18 @@ public:
|
||||
READ1_DEF(length, res, this->ReadEndnotePr, &oEdnProps);
|
||||
m_oFileWriter.m_oSettingWriter.AddSetting(oEdnProps.toXML());
|
||||
}
|
||||
else if( c_oSer_SettingsType::SdtGlobalColor == type )
|
||||
{
|
||||
rPr oRPr(m_oFileWriter.m_oFontTableWriter.m_mapFonts);
|
||||
res = m_oBinary_rPrReader.Read(length, &oRPr);
|
||||
m_oSettingsCustom.m_oSdtGlobalColor.Init();
|
||||
InnerColorToOOX(oRPr, m_oSettingsCustom.m_oSdtGlobalColor.get2());
|
||||
}
|
||||
else if( c_oSer_SettingsType::SdtGlobalShowHighlight == type )
|
||||
{
|
||||
m_oSettingsCustom.m_oSdtGlobalShowHighlight.Init();
|
||||
m_oSettingsCustom.m_oSdtGlobalShowHighlight->m_oVal.FromBool(m_oBufferedStream.GetBool());
|
||||
}
|
||||
else
|
||||
res = c_oSerConstants::ReadUnknown;
|
||||
return res;
|
||||
@ -4493,11 +4518,13 @@ public:
|
||||
NSStringUtils::CStringBuilder* pPrevWriter = m_pCurWriter;
|
||||
m_pCurWriter = &pHyperlink->writer;
|
||||
READ1_DEF(length, res, this->ReadParagraphContent, NULL);
|
||||
long rId;
|
||||
std::wstring sHref = XmlUtils::EncodeXmlString(pHyperlink->sLink);
|
||||
m_oFileWriter.m_pDrawingConverter->WriteRels(std::wstring(_T("http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink")), sHref, std::wstring(_T("External")), &rId);
|
||||
|
||||
pHyperlink->rId = L"rId" + std::to_wstring(rId);
|
||||
if (!pHyperlink->sLink.empty())
|
||||
{
|
||||
long rId;
|
||||
std::wstring sHref = XmlUtils::EncodeXmlString(pHyperlink->sLink);
|
||||
m_oFileWriter.m_pDrawingConverter->WriteRels(std::wstring(_T("http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink")), sHref, std::wstring(_T("External")), &rId);
|
||||
pHyperlink->rId = L"rId" + std::to_wstring(rId);
|
||||
}
|
||||
m_pCurWriter = pPrevWriter;
|
||||
}
|
||||
else
|
||||
@ -8002,11 +8029,24 @@ public:
|
||||
pSdtPr->m_oAlias->m_sVal.Init();
|
||||
pSdtPr->m_oAlias->m_sVal->append(m_oBufferedStream.GetString3(length));
|
||||
}
|
||||
else if (c_oSerSdt::Appearance == type)
|
||||
{
|
||||
pSdtPr->m_oAppearance.Init();
|
||||
pSdtPr->m_oAppearance->m_oVal.Init();
|
||||
pSdtPr->m_oAppearance->m_oVal->SetValue((SimpleTypes::ESdtAppearance)m_oBufferedStream.GetUChar());
|
||||
}
|
||||
else if (c_oSerSdt::ComboBox == type)
|
||||
{
|
||||
pSdtPr->m_oComboBox.Init();
|
||||
READ1_DEF(length, res, this->ReadSdtComboBox, pSdtPr->m_oComboBox.GetPointer());
|
||||
}
|
||||
else if (c_oSerSdt::Color == type)
|
||||
{
|
||||
rPr oRPr(m_oFileWriter.m_oFontTableWriter.m_mapFonts);
|
||||
res = oBinary_rPrReader.Read(length, &oRPr);
|
||||
pSdtPr->m_oColor.Init();
|
||||
InnerColorToOOX(oRPr, pSdtPr->m_oColor.get2());
|
||||
}
|
||||
else if (c_oSerSdt::DataBinding == type)
|
||||
{
|
||||
pSdtPr->m_oDataBinding.Init();
|
||||
@ -8422,11 +8462,12 @@ public:
|
||||
if(c_oSerConstants::ReadOk != res)
|
||||
return res;
|
||||
}
|
||||
OOX::CSettingsCustom oSettingsCustom;
|
||||
if(-1 != nSettingsOffset)
|
||||
{
|
||||
int nOldPos = m_oBufferedStream.GetPos();
|
||||
m_oBufferedStream.Seek(nSettingsOffset);
|
||||
res = Binary_SettingsTableReader(m_oBufferedStream, m_oFileWriter).Read();
|
||||
res = Binary_SettingsTableReader(m_oBufferedStream, m_oFileWriter, oSettingsCustom).Read();
|
||||
if(c_oSerConstants::ReadOk != res)
|
||||
return res;
|
||||
}
|
||||
@ -8573,6 +8614,13 @@ public:
|
||||
m_oFileWriter.m_pDrawingConverter->Registration(L"application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml", L"/word", pFooter->m_sFilename);
|
||||
}
|
||||
}
|
||||
if(!oSettingsCustom.IsEmpty()){
|
||||
std::wstring sFilename = m_oFileWriter.m_oCustomXmlWriter.WriteCustomXml(oSettingsCustom.GetSchemaUrl(), oSettingsCustom.ToXml());
|
||||
std::wstring sRelsPath = L"../" + OOX::FileTypes::CustomXml.DefaultDirectory().GetPath() + L"/" + sFilename;
|
||||
long rId;
|
||||
m_oFileWriter.m_pDrawingConverter->WriteRels(OOX::FileTypes::CustomXml.RelationType(), sRelsPath, L"", &rId);
|
||||
}
|
||||
|
||||
res = Binary_DocumentTableReader(m_oBufferedStream, m_oFileWriter, m_oFileWriter.m_oDocumentWriter, &oBinary_CommentsTableReader.m_oComments).Read();
|
||||
|
||||
OOX::CPath fileRelsPath = m_oFileWriter.m_oDocumentWriter.m_sDir + FILE_SEPARATOR_STR + L"word"
|
||||
|
||||
File diff suppressed because one or more lines are too long
@ -38,7 +38,7 @@
|
||||
|
||||
namespace Writers
|
||||
{
|
||||
static std::wstring g_string_ft_Start = _T("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><w:fonts xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" mc:Ignorable=\"w14\">");
|
||||
static std::wstring g_string_ft_Start = _T("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><w:fonts xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\" mc:Ignorable=\"w14 w15\">");
|
||||
static std::wstring g_string_ft_End = _T("</w:fonts>");
|
||||
|
||||
class FontTableWriter
|
||||
|
||||
@ -445,7 +445,8 @@ extern int g_nCurFormatVersion;
|
||||
textDirection = 11,
|
||||
hideMark = 12,
|
||||
noWrap = 13,
|
||||
tcFitText = 14
|
||||
tcFitText = 14,
|
||||
HMerge = 15
|
||||
};}
|
||||
namespace c_oSerProp_secPrType{enum c_oSerProp_secPrType
|
||||
{
|
||||
@ -761,7 +762,9 @@ extern int g_nCurFormatVersion;
|
||||
MathPr = 2,
|
||||
TrackRevisions = 3,
|
||||
FootnotePr = 4,
|
||||
EndnotePr = 5
|
||||
EndnotePr = 5,
|
||||
SdtGlobalColor = 6,
|
||||
SdtGlobalShowHighlight = 7
|
||||
};}
|
||||
namespace c_oSer_MathPrType{enum c_oSer_SettingsType
|
||||
{
|
||||
@ -1096,7 +1099,9 @@ extern int g_nCurFormatVersion;
|
||||
TabIndex = 32,
|
||||
Tag = 33,
|
||||
Temporary = 34,
|
||||
MultiLine = 35
|
||||
MultiLine = 35,
|
||||
Appearance = 36,
|
||||
Color = 37
|
||||
};}
|
||||
namespace c_oSerFFData{enum c_oSerFFData
|
||||
{
|
||||
|
||||
@ -61,6 +61,7 @@
|
||||
#include "../../Common/DocxFormat/Source/DocxFormat/Media/JsaProject.h"
|
||||
#include "../../Common/DocxFormat/Source/DocxFormat/HeaderFooter.h"
|
||||
#include "../../Common/DocxFormat/Source/DocxFormat/App.h"
|
||||
#include "../../Common/DocxFormat/Source/DocxFormat/CustomXml.h"
|
||||
|
||||
namespace BinDocxRW
|
||||
{
|
||||
@ -314,19 +315,19 @@ namespace BinDocxRW
|
||||
void WriteShd(const ComplexTypes::Word::CShading& Shd)
|
||||
{
|
||||
//Type
|
||||
if(false != Shd.m_oVal.IsInit())
|
||||
if (false != Shd.m_oVal.IsInit())
|
||||
{
|
||||
m_oStream.WriteBYTE(c_oSerShdType::Value);
|
||||
m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
|
||||
switch(Shd.m_oVal.get().GetValue())
|
||||
{
|
||||
case SimpleTypes::shdNil: m_oStream.WriteBYTE(shd_Nil);break;
|
||||
default: m_oStream.WriteBYTE(shd_Clear);break;
|
||||
}
|
||||
m_oStream.WriteBYTE(Shd.m_oVal.get().GetValue()); //Misalignment-footer.doc
|
||||
|
||||
}
|
||||
//Value
|
||||
if(false != Shd.m_oFill.IsInit())
|
||||
if (false != Shd.m_oFill.IsInit())
|
||||
WriteColor(c_oSerShdType::Color, Shd.m_oFill.get());
|
||||
else if (false != Shd.m_oColor.IsInit())
|
||||
WriteColor(c_oSerShdType::Color, Shd.m_oColor.get());
|
||||
|
||||
WriteThemeColor(c_oSerShdType::ColorTheme, Shd.m_oFill, Shd.m_oThemeFill, Shd.m_oThemeFillTint, Shd.m_oThemeFillShade);
|
||||
}
|
||||
void WriteDistance(const NSCommon::nullable<SimpleTypes::CWrapDistance<>>& m_oDistL,
|
||||
@ -2265,6 +2266,24 @@ namespace BinDocxRW
|
||||
m_oBcw.m_oStream.WriteBYTE(vmerge_Continue);
|
||||
}
|
||||
}
|
||||
if(cellPr->m_oHMerge.IsInit())
|
||||
{
|
||||
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_cellPrType::HMerge);
|
||||
m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte);
|
||||
if(cellPr->m_oHMerge->m_oVal.IsInit())
|
||||
{
|
||||
switch(cellPr->m_oHMerge->m_oVal->GetValue())
|
||||
{
|
||||
case SimpleTypes::mergeContinue: m_oBcw.m_oStream.WriteBYTE(vmerge_Continue); break;
|
||||
case SimpleTypes::mergeRestart: m_oBcw.m_oStream.WriteBYTE(vmerge_Restart); break;
|
||||
default: m_oBcw.m_oStream.WriteBYTE(vmerge_Continue);break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_oBcw.m_oStream.WriteBYTE(vmerge_Continue);
|
||||
}
|
||||
}
|
||||
if(cellPr->m_oCellDel.IsInit())
|
||||
{
|
||||
m_oBcw.m_oStream.WriteBYTE(c_oSerProp_cellPrType::CellDel);
|
||||
@ -7074,12 +7093,27 @@ namespace BinDocxRW
|
||||
m_oBcw.m_oStream.WriteStringW3(oStdPr.m_oAlias->m_sVal.get());
|
||||
m_oBcw.WriteItemEnd(nCurPos);
|
||||
}
|
||||
if(oStdPr.m_oAppearance.IsInit() && oStdPr.m_oAppearance->m_oVal.IsInit())
|
||||
{
|
||||
nCurPos = m_oBcw.WriteItemStart(c_oSerSdt::Appearance);
|
||||
m_oBcw.m_oStream.WriteBYTE(oStdPr.m_oAppearance->m_oVal->GetValue());
|
||||
m_oBcw.WriteItemEnd(nCurPos);
|
||||
}
|
||||
if(oStdPr.m_oComboBox.IsInit())
|
||||
{
|
||||
nCurPos = m_oBcw.WriteItemStart(c_oSerSdt::ComboBox);
|
||||
WriteSdtComboBox(oStdPr.m_oComboBox.get());
|
||||
m_oBcw.WriteItemEnd(nCurPos);
|
||||
}
|
||||
if(oStdPr.m_oColor.IsInit())
|
||||
{
|
||||
nCurPos = m_oBcw.WriteItemStart(c_oSerSdt::Color);
|
||||
if(oStdPr.m_oColor->m_oVal.IsInit())
|
||||
m_oBcw.WriteColor(c_oSerProp_rPrType::Color, oStdPr.m_oColor->m_oVal.get());
|
||||
|
||||
m_oBcw.WriteThemeColor(c_oSerProp_rPrType::ColorTheme, oStdPr.m_oColor->m_oVal, oStdPr.m_oColor->m_oThemeColor, oStdPr.m_oColor->m_oThemeTint, oStdPr.m_oColor->m_oThemeShade);
|
||||
m_oBcw.WriteItemEnd(nCurPos);
|
||||
}
|
||||
if(oStdPr.m_oDataBinding.IsInit())
|
||||
{
|
||||
nCurPos = m_oBcw.WriteItemStart(c_oSerSdt::DataBinding);
|
||||
@ -7477,17 +7511,18 @@ namespace BinDocxRW
|
||||
{
|
||||
BinaryCommonWriter m_oBcw;
|
||||
Binary_pPrWriter bpPrs;
|
||||
Binary_rPrWriter brPrs;
|
||||
public:
|
||||
BinarySettingsTableWriter(ParamsWriter& oParamsWriter):m_oBcw(oParamsWriter),bpPrs(oParamsWriter, NULL)
|
||||
BinarySettingsTableWriter(ParamsWriter& oParamsWriter):m_oBcw(oParamsWriter),bpPrs(oParamsWriter, NULL), brPrs(oParamsWriter)
|
||||
{
|
||||
};
|
||||
void Write(OOX::CSettings& oSettings)
|
||||
void Write(OOX::CSettings& oSettings, OOX::CSettingsCustom& oSettingsCustom)
|
||||
{
|
||||
int nStart = m_oBcw.WriteItemWithLengthStart();
|
||||
WriteSettingsContent(oSettings);
|
||||
WriteSettingsContent(oSettings, oSettingsCustom);
|
||||
m_oBcw.WriteItemWithLengthEnd(nStart);
|
||||
}
|
||||
void WriteSettingsContent(OOX::CSettings& oSettings)
|
||||
void WriteSettingsContent(OOX::CSettings& oSettings, OOX::CSettingsCustom& oSettingsCustom)
|
||||
{
|
||||
int nCurPos = 0;
|
||||
if(oSettings.m_oClrSchemeMapping.IsInit())
|
||||
@ -7528,6 +7563,20 @@ namespace BinDocxRW
|
||||
NULL, &oSettings.m_oEndnotePr->m_oPos, &oSettings.m_oEndnotePr->m_arrEndnote);
|
||||
m_oBcw.WriteItemEnd(nCurPos);
|
||||
}
|
||||
if(oSettingsCustom.m_oSdtGlobalColor.IsInit())
|
||||
{
|
||||
nCurPos = m_oBcw.WriteItemStart(c_oSer_SettingsType::SdtGlobalColor);
|
||||
OOX::Logic::CRunProperty oRPr;
|
||||
oRPr.m_oColor = oSettingsCustom.m_oSdtGlobalColor;
|
||||
brPrs.Write_rPr(&oRPr);
|
||||
m_oBcw.WriteItemEnd(nCurPos);
|
||||
}
|
||||
if(oSettingsCustom.m_oSdtGlobalShowHighlight.IsInit())
|
||||
{
|
||||
nCurPos = m_oBcw.WriteItemStart(c_oSer_SettingsType::SdtGlobalShowHighlight);
|
||||
m_oBcw.m_oStream.WriteBOOL(oSettingsCustom.m_oSdtGlobalShowHighlight->m_oVal.ToBool());
|
||||
m_oBcw.WriteItemEnd(nCurPos);
|
||||
}
|
||||
};
|
||||
void WriteMathPr(const OOX::Logic::CMathPr &pMathPr)
|
||||
{
|
||||
@ -8039,9 +8088,16 @@ namespace BinDocxRW
|
||||
//Write Settings
|
||||
if(NULL != oDocx.m_pSettings)
|
||||
{
|
||||
std::wstring sSettings = oDocx.GetCustomSettings();
|
||||
OOX::CSettingsCustom oSettingsCustom;
|
||||
if(!sSettings.empty())
|
||||
{
|
||||
oSettingsCustom.FromXml(sSettings);
|
||||
}
|
||||
|
||||
BinDocxRW::BinarySettingsTableWriter oBinarySettingsTableWriter(m_oParamsWriter);
|
||||
int nCurPos = this->WriteTableStart(BinDocxRW::c_oSerTableTypes::Settings);
|
||||
oBinarySettingsTableWriter.Write(*oDocx.m_pSettings);
|
||||
oBinarySettingsTableWriter.Write(*oDocx.m_pSettings, oSettingsCustom);
|
||||
this->WriteTableEnd(nCurPos);
|
||||
}
|
||||
|
||||
|
||||
@ -34,6 +34,7 @@
|
||||
#include "../../DesktopEditor/common/Directory.h"
|
||||
#include "../../DesktopEditor/common/File.h"
|
||||
#include "../../DesktopEditor/common/Path.h"
|
||||
#include "../../DesktopEditor/common/SystemUtils.h"
|
||||
#include "../BinWriter/BinWriters.h"
|
||||
#include "../BinReader/Readers.h"
|
||||
#include "../../ASCOfficePPTXFile/Editor/FontPicker.h"
|
||||
@ -298,7 +299,10 @@ bool BinDocxRW::CDocxSerializer::loadFromFile(const std::wstring& sSrcFileName,
|
||||
OOX::CApp* pApp = new OOX::CApp(NULL);
|
||||
if (pApp)
|
||||
{
|
||||
pApp->SetApplication(L"ONLYOFFICE");
|
||||
std::wstring sApplication = NSSystemUtils::GetEnvVariable(NSSystemUtils::gc_EnvApplicationName);
|
||||
if (sApplication.empty())
|
||||
sApplication = NSSystemUtils::gc_EnvApplicationNameDefault;
|
||||
pApp->SetApplication(sApplication);
|
||||
#if defined(INTVER)
|
||||
pApp->SetAppVersion(VALUE2STR(INTVER));
|
||||
#endif
|
||||
|
||||
@ -34,7 +34,8 @@ SOURCES += \
|
||||
../../XlsxSerializerCom/Writer/CSVWriter.cpp \
|
||||
../../OfficeCryptReader/source/ECMACryptFile.cpp \
|
||||
../../OfficeCryptReader/source/CryptTransform.cpp \
|
||||
../BinReader/Readers.cpp
|
||||
../BinReader/Readers.cpp \
|
||||
../BinReader/CustormXmlWriter.cpp
|
||||
|
||||
HEADERS += ../DocWrapper/DocxSerializer.h \
|
||||
../DocWrapper/FontProcessor.h \
|
||||
@ -69,4 +70,5 @@ HEADERS += ../DocWrapper/DocxSerializer.h \
|
||||
../BinReader/DefaultThemeWriter.h \
|
||||
../DocWrapper/ChartWriter.h \
|
||||
../../OfficeCryptReader/source/ECMACryptFile.h \
|
||||
../../OfficeCryptReader/source/CryptTransform.h
|
||||
../../OfficeCryptReader/source/CryptTransform.h \
|
||||
../BinReader/CustormXmlWriter.h
|
||||
|
||||
@ -53,6 +53,12 @@
|
||||
69F181AF1C77274E00B2952B /* FileDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 69F181AD1C77274E00B2952B /* FileDownloader.h */; };
|
||||
8A404FD3208A01AF00F2D5CF /* FileDownloader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8A404FD2208A01AF00F2D5CF /* FileDownloader.cpp */; };
|
||||
8A404FD5208A01CE00F2D5CF /* FileDownloader_private.h in Headers */ = {isa = PBXBuildFile; fileRef = 8A404FD4208A01CE00F2D5CF /* FileDownloader_private.h */; };
|
||||
8AB24BFD213004E400E80DDD /* CustormXmlWriter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8AB24BFB213004E300E80DDD /* CustormXmlWriter.cpp */; };
|
||||
8AB24BFE213004E400E80DDD /* CustormXmlWriter.h in Headers */ = {isa = PBXBuildFile; fileRef = 8AB24BFC213004E300E80DDD /* CustormXmlWriter.h */; };
|
||||
8AC6D2052130146000D9C0F1 /* xmlutils.h in Headers */ = {isa = PBXBuildFile; fileRef = 8AC6D2042130146000D9C0F1 /* xmlutils.h */; };
|
||||
8AC6D2092130146800D9C0F1 /* xmllight_private.h in Headers */ = {isa = PBXBuildFile; fileRef = 8AC6D2062130146800D9C0F1 /* xmllight_private.h */; };
|
||||
8AC6D20A2130146800D9C0F1 /* xmldom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8AC6D2072130146800D9C0F1 /* xmldom.cpp */; };
|
||||
8AC6D20B2130146800D9C0F1 /* xmllight.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8AC6D2082130146800D9C0F1 /* xmllight.cpp */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
@ -103,6 +109,12 @@
|
||||
69F181AD1C77274E00B2952B /* FileDownloader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FileDownloader.h; path = ../../../Common/FileDownloader/FileDownloader.h; sourceTree = "<group>"; };
|
||||
8A404FD2208A01AF00F2D5CF /* FileDownloader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FileDownloader.cpp; path = ../../../Common/FileDownloader/FileDownloader.cpp; sourceTree = "<group>"; };
|
||||
8A404FD4208A01CE00F2D5CF /* FileDownloader_private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FileDownloader_private.h; path = ../../../Common/FileDownloader/FileDownloader_private.h; sourceTree = "<group>"; };
|
||||
8AB24BFB213004E300E80DDD /* CustormXmlWriter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CustormXmlWriter.cpp; sourceTree = "<group>"; };
|
||||
8AB24BFC213004E300E80DDD /* CustormXmlWriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustormXmlWriter.h; sourceTree = "<group>"; };
|
||||
8AC6D2042130146000D9C0F1 /* xmlutils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = xmlutils.h; path = ../../../DesktopEditor/xml/include/xmlutils.h; sourceTree = "<group>"; };
|
||||
8AC6D2062130146800D9C0F1 /* xmllight_private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = xmllight_private.h; path = ../../../DesktopEditor/xml/src/xmllight_private.h; sourceTree = "<group>"; };
|
||||
8AC6D2072130146800D9C0F1 /* xmldom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = xmldom.cpp; path = ../../../DesktopEditor/xml/src/xmldom.cpp; sourceTree = "<group>"; };
|
||||
8AC6D2082130146800D9C0F1 /* xmllight.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = xmllight.cpp; path = ../../../DesktopEditor/xml/src/xmllight.cpp; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@ -135,6 +147,7 @@
|
||||
17E17EDE1AC453F800BEA2EA /* ASCOfficeDocxFile2Lib */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
8AC6D2032130145600D9C0F1 /* XmlUtils */,
|
||||
17E17F4D1AC454E200BEA2EA /* Common */,
|
||||
17E17F1A1AC4549B00BEA2EA /* XlsxSerializerCom */,
|
||||
17E17F0D1AC4546100BEA2EA /* DocWrapper */,
|
||||
@ -149,6 +162,8 @@
|
||||
children = (
|
||||
17E17EEB1AC4544900BEA2EA /* ChartWriter.h */,
|
||||
17E17EEC1AC4544900BEA2EA /* CommentsWriter.h */,
|
||||
8AB24BFB213004E300E80DDD /* CustormXmlWriter.cpp */,
|
||||
8AB24BFC213004E300E80DDD /* CustormXmlWriter.h */,
|
||||
17A765271B0F3DC30046BC0B /* DefaultThemeWriter.h */,
|
||||
17E17EF01AC4544900BEA2EA /* DocumentRelsWriter.h */,
|
||||
17E17EF11AC4544900BEA2EA /* DocumentWriter.h */,
|
||||
@ -252,6 +267,17 @@
|
||||
name = BinWriter;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
8AC6D2032130145600D9C0F1 /* XmlUtils */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
8AC6D2072130146800D9C0F1 /* xmldom.cpp */,
|
||||
8AC6D2062130146800D9C0F1 /* xmllight_private.h */,
|
||||
8AC6D2082130146800D9C0F1 /* xmllight.cpp */,
|
||||
8AC6D2042130146000D9C0F1 /* xmlutils.h */,
|
||||
);
|
||||
name = XmlUtils;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXHeadersBuildPhase section */
|
||||
@ -276,7 +302,9 @@
|
||||
17C1FEAD1ACC42C4006B99B3 /* ChartWriter.h in Headers */,
|
||||
17C1FEAE1ACC42C4006B99B3 /* DocumentRelsWriter.h in Headers */,
|
||||
17C1FEAF1ACC42C4006B99B3 /* CommentsWriter.h in Headers */,
|
||||
8AC6D2052130146000D9C0F1 /* xmlutils.h in Headers */,
|
||||
69F181AF1C77274E00B2952B /* FileDownloader.h in Headers */,
|
||||
8AC6D2092130146800D9C0F1 /* xmllight_private.h in Headers */,
|
||||
17C1FEB01ACC42C4006B99B3 /* BinaryCommonReader.h in Headers */,
|
||||
17C1FEB11ACC42C4006B99B3 /* Common.h in Headers */,
|
||||
8A404FD5208A01CE00F2D5CF /* FileDownloader_private.h in Headers */,
|
||||
@ -292,6 +320,7 @@
|
||||
17C1FEBC1ACC42C4006B99B3 /* DocxSerializer.h in Headers */,
|
||||
17C1FEBD1ACC42C4006B99B3 /* FileWriter.h in Headers */,
|
||||
17C1FEBE1ACC42C4006B99B3 /* CSVWriter.h in Headers */,
|
||||
8AB24BFE213004E400E80DDD /* CustormXmlWriter.h in Headers */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@ -346,17 +375,20 @@
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
8AB24BFD213004E400E80DDD /* CustormXmlWriter.cpp in Sources */,
|
||||
17C1FE961ACC42C4006B99B3 /* Common.cpp in Sources */,
|
||||
17C1FE971ACC42C4006B99B3 /* ChartFromToBinary.cpp in Sources */,
|
||||
17C1FE981ACC42C4006B99B3 /* CSVReader.cpp in Sources */,
|
||||
17C1FE991ACC42C4006B99B3 /* DocxSerializer.cpp in Sources */,
|
||||
17C1FE9A1ACC42C4006B99B3 /* CommonWriter.cpp in Sources */,
|
||||
8AC6D20B2130146800D9C0F1 /* xmllight.cpp in Sources */,
|
||||
17C1FE9B1ACC42C4006B99B3 /* CSVWriter.cpp in Sources */,
|
||||
69414A301CB51666003E771B /* ChartWriter.cpp in Sources */,
|
||||
6967917E1D9E8AEE002CA4BA /* BinWriters.cpp in Sources */,
|
||||
69BBDF251F0B8AAC00EB1BF7 /* FileDownloader_mac.mm in Sources */,
|
||||
17C1FE9C1ACC42C4006B99B3 /* XlsxSerializer.cpp in Sources */,
|
||||
690FE0851E9BBD68004B26D0 /* Readers.cpp in Sources */,
|
||||
8AC6D20A2130146800D9C0F1 /* xmldom.cpp in Sources */,
|
||||
17C1FE9D1ACC42C4006B99B3 /* FontProcessor.cpp in Sources */,
|
||||
8A404FD3208A01AF00F2D5CF /* FileDownloader.cpp in Sources */,
|
||||
);
|
||||
|
||||
@ -51,6 +51,7 @@ namespace formulasconvert {
|
||||
void replace_cells_range(std::wstring& expr, bool withTableName);
|
||||
bool check_formula(std::wstring& expr);
|
||||
void replace_semicolons(std::wstring& expr);
|
||||
void replace_tilda(std::wstring& expr);
|
||||
void replace_vertical(std::wstring& expr);
|
||||
void replace_space(std::wstring& expr);
|
||||
|
||||
@ -291,7 +292,17 @@ namespace formulasconvert {
|
||||
else
|
||||
return L"";
|
||||
}
|
||||
|
||||
std::wstring replace_tilda_formater(boost::wsmatch const & what)
|
||||
{
|
||||
if (what[1].matched)
|
||||
return L";";
|
||||
else if (what[2].matched)
|
||||
return what[2].str();
|
||||
else if (what[3].matched)
|
||||
return what[3].str();
|
||||
else
|
||||
return L"";
|
||||
}
|
||||
// TODO
|
||||
// заменить точки с запятой во всех вхождениях кроме находящихся в кавычках --*и в фигурных скобках*--
|
||||
void odf2oox_converter::Impl::replace_semicolons(std::wstring& expr)
|
||||
@ -302,9 +313,20 @@ namespace formulasconvert {
|
||||
boost::wregex(L"(;)|(\".*?\")|('.*?')"),
|
||||
&replace_semicolons_formater,
|
||||
boost::match_default | boost::format_all);
|
||||
|
||||
expr = res;
|
||||
}
|
||||
void odf2oox_converter::Impl::replace_tilda(std::wstring& expr)
|
||||
{
|
||||
const std::wstring res = boost::regex_replace(
|
||||
expr,
|
||||
//boost::wregex(L"(;)|(?:\".*?\")|(?:'.*?')"),
|
||||
boost::wregex(L"(~)|(\".*?\")|('.*?')"),
|
||||
&replace_semicolons_formater,
|
||||
boost::match_default | boost::format_all);
|
||||
|
||||
expr = res;
|
||||
}
|
||||
std::wstring replace_vertical_formater(boost::wsmatch const & what)
|
||||
{
|
||||
if (what[1].matched)
|
||||
@ -462,6 +484,7 @@ namespace formulasconvert {
|
||||
|
||||
replace_cells_range (workstr, true);
|
||||
replace_semicolons (workstr);
|
||||
replace_tilda (workstr);
|
||||
replace_vertical (workstr);
|
||||
|
||||
if (isFormula)
|
||||
|
||||
@ -32,7 +32,6 @@
|
||||
#include "formulasconvert.h"
|
||||
|
||||
#include <boost/regex.hpp>
|
||||
#include <boost/foreach.hpp>
|
||||
#include <boost/algorithm/string.hpp>
|
||||
|
||||
#include"../../Common/DocxFormat/Source/XML/Utils.h"
|
||||
@ -221,6 +220,20 @@ void oox2odf_converter::Impl::replace_named_ref(std::wstring & expr)
|
||||
|
||||
namespace
|
||||
{
|
||||
std::wstring replace_tilda_formater(boost::wsmatch const & what)
|
||||
{
|
||||
if (what[1].matched)
|
||||
return L";";
|
||||
else if (what[2].matched)
|
||||
return what[2].str();
|
||||
else if (what[3].matched)
|
||||
return what[3].str();
|
||||
//else if (what[4].matched)
|
||||
// return what[4].str();
|
||||
else
|
||||
return L"";
|
||||
}
|
||||
|
||||
|
||||
std::wstring replace_semicolons_formater(boost::wsmatch const & what)
|
||||
{
|
||||
@ -251,7 +264,6 @@ void oox2odf_converter::Impl::replace_semicolons(std::wstring& expr)
|
||||
boost::match_default | boost::format_all);
|
||||
expr = res;
|
||||
}
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
@ -306,9 +318,9 @@ std::wstring forbidden_formulas1[] =
|
||||
|
||||
bool is_forbidden1(const std::wstring & formula)
|
||||
{
|
||||
BOOST_FOREACH(const std::wstring & s, forbidden_formulas1)
|
||||
{
|
||||
if (boost::algorithm::contains(formula, s))
|
||||
for (size_t i = 0; i < 1; i++)
|
||||
{
|
||||
if (boost::algorithm::contains(formula, forbidden_formulas1[i]))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@ -669,9 +681,10 @@ size_t getColAddressInv(const std::wstring & a_)
|
||||
size_t mul = 1;
|
||||
bool f = true;
|
||||
size_t res = 0;
|
||||
BOOST_REVERSE_FOREACH(const wchar_t c, a)
|
||||
|
||||
for (int i = a.length() - 1; i >= 0; i--)
|
||||
{
|
||||
size_t v = c - L'A';
|
||||
size_t v = a[i] - L'A';
|
||||
if (f)
|
||||
f = false;
|
||||
else
|
||||
@ -700,14 +713,13 @@ void splitCellAddress(const std::wstring & a_, std::wstring & col, std::wstring
|
||||
::XmlUtils::replace_all( a, L"$", L"");
|
||||
//::XmlUtils::replace_all( a, L"'", L"");
|
||||
::boost::algorithm::to_upper(a);
|
||||
|
||||
|
||||
BOOST_FOREACH(wchar_t c, a)
|
||||
for (size_t i = 0; i < a.length(); i++)
|
||||
{
|
||||
if (c >= L'0' && c <= L'9')
|
||||
row +=c;
|
||||
if (a[i] >= L'0' && a[i] <= L'9')
|
||||
row += a[i];
|
||||
else
|
||||
col += c;
|
||||
col += a[i];
|
||||
}
|
||||
std::reverse(col.begin(), col.end());
|
||||
std::reverse(row.begin(), row.end());
|
||||
|
||||
@ -52,8 +52,10 @@ enum ElementType
|
||||
typeTextReferenceMarkEnd,
|
||||
typeTextReferenceRef,
|
||||
|
||||
typeTextFieldFieldmarkStart,
|
||||
typeTextFieldFieldmarkEnd,
|
||||
typeFieldFieldmarkStart,
|
||||
typeFieldFieldmarkEnd,
|
||||
typeFieldFieldmark,
|
||||
typeFieldParam,
|
||||
|
||||
typeTextSpan,
|
||||
typeTextA,
|
||||
@ -501,6 +503,7 @@ enum ElementType
|
||||
typeFormTextarea,
|
||||
typeFormTime,
|
||||
typeFormValueRange,
|
||||
typeFormItem,
|
||||
|
||||
typeDrawPage,
|
||||
typePresentationFooterDecl,
|
||||
|
||||
@ -45,7 +45,7 @@ namespace utils {
|
||||
std::wstring replace_xml_to_text_ImplRegEx(const std::wstring & Text);
|
||||
std::string replace_xml_to_text_ImplRegEx(const std::string & Text);
|
||||
|
||||
std::wstring replace_text_to_xml_ImplReplace(const std::wstring & Text);
|
||||
std::wstring replace_text_to_xml_ImplReplace(const std::wstring & Text, bool dDeleteUnicode = false);
|
||||
std::string replace_text_to_xml_ImplReplace(const std::string & Text);
|
||||
|
||||
std::wstring replace_amp_text_to_xml_ImplReplace(const std::wstring & Text);
|
||||
@ -55,7 +55,7 @@ namespace utils {
|
||||
std::string replace_xml_to_text_ImplReplace(const std::string & Text);
|
||||
}
|
||||
|
||||
std::wstring replace_text_to_xml(const std::wstring & Text);
|
||||
std::wstring replace_text_to_xml(const std::wstring & Text, bool dDeleteUnicode = false);
|
||||
std::string replace_text_to_xml(const std::string & Text);
|
||||
|
||||
std::wstring replace_amp_text_to_xml(const std::wstring & Text);
|
||||
|
||||
@ -214,8 +214,8 @@ SOURCES += \
|
||||
../src/odf/datatypes/tablefunction.cpp \
|
||||
../src/odf/datatypes/tableorder.cpp \
|
||||
../src/odf/datatypes/dategroup.cpp \
|
||||
../src/odf/datatypes/bibliography \
|
||||
../src/odfcommandtype.cpp \
|
||||
../src/odf/datatypes/bibliography.cpp \
|
||||
../src/odf/datatypes/commandtype.cpp \
|
||||
../src/docx/xlsx_conditionalFormatting.cpp \
|
||||
../src/docx/xlsx_dxfs.cpp \
|
||||
../src/docx/docx_content_type.cpp \
|
||||
|
||||
@ -31,7 +31,6 @@
|
||||
*/
|
||||
|
||||
#include <string>
|
||||
#include <boost/foreach.hpp>
|
||||
#include <cmath>
|
||||
|
||||
#include <boost/optional/optional_io.hpp>
|
||||
@ -78,14 +77,13 @@ std::wstring RGBToString(int r, int g, int b)
|
||||
color v(r, g, b);
|
||||
double minDist = (std::numeric_limits<double>::max)();
|
||||
|
||||
|
||||
BOOST_FOREACH(color const & c, colors)
|
||||
for (size_t i = 0; i < 6; i++)
|
||||
{
|
||||
double dist = color_dist(v, c);
|
||||
double dist = color_dist(v, colors[i]);
|
||||
if (dist < minDist)
|
||||
{
|
||||
minDist = dist;
|
||||
result = c.name_;
|
||||
result = colors[i].name_;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -30,9 +30,6 @@
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include <boost/foreach.hpp>
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include <xml/utils.h>
|
||||
@ -306,10 +303,15 @@ void docx_conversion_context::finish_run()
|
||||
{
|
||||
if (false == in_run_) return;
|
||||
|
||||
if (get_comments_context().state() == 4)
|
||||
{
|
||||
output_stream()<< L"<w:commentReference w:id=\"" << get_comments_context().current_id() << L"\"/>";
|
||||
get_comments_context().state(0);
|
||||
}
|
||||
output_stream() << L"</w:r>";
|
||||
in_run_ = false;
|
||||
|
||||
if (get_comments_context().state()==2)
|
||||
if (get_comments_context().state() == 2)
|
||||
{
|
||||
output_stream()<< L"<w:commentRangeEnd w:id=\"" << get_comments_context().current_id() << L"\"/>";
|
||||
|
||||
@ -318,7 +320,6 @@ void docx_conversion_context::finish_run()
|
||||
get_comments_context().state(0);
|
||||
finish_run();
|
||||
}
|
||||
|
||||
}
|
||||
void docx_conversion_context::start_math_formula()
|
||||
{
|
||||
@ -369,57 +370,77 @@ void docx_conversion_context::start_index_content()
|
||||
|
||||
std::wstring sInstrText;
|
||||
|
||||
switch(table_content_context_.type_table_content)
|
||||
if (table_content_context_.type_table_content == 3)
|
||||
{
|
||||
case 1: sInstrText += L" TOC \\f \\h \\u"; break;
|
||||
case 2:
|
||||
case 4:
|
||||
case 6:
|
||||
case 7: sInstrText += L" TOC \\h \\z"; break;
|
||||
case 5: sInstrText += L" INDEX \\z"; break;
|
||||
case 3: sInstrText += L" BIBLIOGRAPHY"; break;
|
||||
sInstrText = L" BIBLIOGRAPHY ";
|
||||
}
|
||||
if (table_content_context_.min_outline_level > 0)
|
||||
else if (table_content_context_.type_table_content == 5)
|
||||
{
|
||||
if (table_content_context_.max_outline_level > 9)
|
||||
table_content_context_.max_outline_level = 9;
|
||||
|
||||
sInstrText += L" \\o \"" + std::to_wstring(table_content_context_.min_outline_level) + L"-" +
|
||||
std::to_wstring(table_content_context_.max_outline_level) + L"\"";
|
||||
sInstrText = L" INDEX";
|
||||
if (table_content_context_.bSeparators)
|
||||
sInstrText += L" \\h \"A\"";
|
||||
}
|
||||
if (false == table_content_context_.outline_level_styles.empty())
|
||||
else
|
||||
{
|
||||
sInstrText += L"\\t \"";
|
||||
sInstrText += L" TOC";
|
||||
|
||||
bool bLink = false, bPages = false;
|
||||
|
||||
for (std::map<int, std::wstring>::iterator it = table_content_context_.outline_level_styles.begin();
|
||||
it != table_content_context_.outline_level_styles.end(); ++it)
|
||||
if (table_content_context_.current_template.empty())
|
||||
{
|
||||
sInstrText += it->second + L";" + std::to_wstring(it->first) + L";";
|
||||
bLink = true;
|
||||
bPages = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (size_t i = 0; i < table_content_context_.current_template.size(); i++)
|
||||
{
|
||||
for (size_t j = 0; j < table_content_context_.current_template[i].content.size(); j++)
|
||||
{
|
||||
if (table_content_context_.current_template[i].content[j] == 3) bLink = true;
|
||||
if (table_content_context_.current_template[i].content[j] == 6) bPages = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sInstrText += L"\"";
|
||||
}
|
||||
if (bLink)
|
||||
sInstrText += L" \\h";
|
||||
|
||||
if (!table_content_context_.caption_sequence_name.empty())
|
||||
{
|
||||
sInstrText += L" \\c \"" + table_content_context_.caption_sequence_name + L"\"";
|
||||
}
|
||||
if (table_content_context_.type_table_content == 1)
|
||||
sInstrText += L" \\f \\u";
|
||||
else
|
||||
sInstrText += L" \\z";
|
||||
|
||||
output_stream() << L"<w:r>";
|
||||
output_stream() << L"<w:fldChar w:fldCharType=\"begin\"/>";
|
||||
output_stream() << L"</w:r>";
|
||||
output_stream() << L"<w:r>";
|
||||
output_stream() << L"<w:instrText xml:space=\"preserve\">" << sInstrText << L" </w:instrText>";
|
||||
output_stream() << L"</w:r>";
|
||||
output_stream() << L"<w:r>";
|
||||
//output_stream() << L"<w:rPr>
|
||||
//output_stream() << L"<w:rFonts w:ascii="Minion Pro" w:eastAsia="DejaVuSans" w:hAnsi="Minion Pro"/>
|
||||
//output_stream() << L"<w:bCs w:val="0"/>
|
||||
//output_stream() << L"<w:sz w:val="21"/>
|
||||
//output_stream() << L"<w:szCs w:val="24"/>
|
||||
//output_stream() << L"</w:rPr>
|
||||
output_stream() << L"<w:fldChar w:fldCharType=\"separate\"/>";
|
||||
output_stream() << L"</w:r>";
|
||||
if (table_content_context_.min_outline_level > 0)
|
||||
{
|
||||
if (table_content_context_.max_outline_level > 9)
|
||||
table_content_context_.max_outline_level = 9;
|
||||
|
||||
sInstrText += L" \\o \"" + std::to_wstring(table_content_context_.min_outline_level) + L"-" +
|
||||
std::to_wstring(table_content_context_.max_outline_level) + L"\"";
|
||||
if (!bPages)
|
||||
sInstrText += L" \\n "+ std::to_wstring(table_content_context_.min_outline_level) + L"-" +
|
||||
std::to_wstring(table_content_context_.max_outline_level);
|
||||
}
|
||||
if (false == table_content_context_.outline_level_styles.empty())
|
||||
{
|
||||
sInstrText += L" \\t \"";
|
||||
|
||||
for (std::map<int, std::wstring>::iterator it = table_content_context_.outline_level_styles.begin();
|
||||
it != table_content_context_.outline_level_styles.end(); ++it)
|
||||
{
|
||||
sInstrText += it->second + L";" + std::to_wstring(it->first) + L";";
|
||||
}
|
||||
|
||||
sInstrText += L"\"";
|
||||
}
|
||||
|
||||
if (!table_content_context_.caption_sequence_name.empty())
|
||||
{
|
||||
sInstrText += L" \\c \"" + table_content_context_.caption_sequence_name + L"\"";
|
||||
}
|
||||
}
|
||||
start_field(sInstrText, L"");
|
||||
|
||||
finish_paragraph();
|
||||
}
|
||||
@ -428,16 +449,51 @@ void docx_conversion_context::end_index_content()
|
||||
if (!in_table_content_) return;
|
||||
|
||||
start_paragraph(false);
|
||||
output_stream() << L"<w:r>";
|
||||
//output_stream() << L"<w:rPr>";
|
||||
//output_stream() << L"<w:rFonts w:ascii="Minion Pro" w:hAnsi="Minion Pro"/>";
|
||||
//output_stream() << L"<w:sz w:val="20"/>
|
||||
//output_stream() << L"</w:rPr>";
|
||||
output_stream() << L"<w:fldChar w:fldCharType=\"end\"/>";
|
||||
output_stream() << L"</w:r>";
|
||||
end_field();
|
||||
|
||||
finish_paragraph();
|
||||
}
|
||||
void docx_conversion_context::start_field(const std::wstring & sInstrText, const std::wstring & sName)
|
||||
{
|
||||
output_stream() << L"<w:r>";
|
||||
output_stream() << L"<w:fldChar w:fldCharType=\"begin\">";
|
||||
|
||||
if (!sName.empty())
|
||||
{
|
||||
output_stream() << L"<w:ffData><w:name w:val=\"" << sName << L"\"/><w:enabled/><w:calcOnExit w:val=\"0\"/></w:ffData>";
|
||||
}
|
||||
output_stream() << L"</w:fldChar>";
|
||||
output_stream() << L"</w:r>";
|
||||
output_stream() << L"<w:r>";
|
||||
output_stream() << L"<w:instrText xml:space=\"preserve\">" << XmlUtils::EncodeXmlString(sInstrText) << L" </w:instrText>";
|
||||
output_stream() << L"</w:r>";
|
||||
output_stream() << L"<w:r>";
|
||||
|
||||
output_stream() << L"<w:fldChar w:fldCharType=\"separate\"/>";
|
||||
output_stream() << L"</w:r>";
|
||||
|
||||
if (!sName.empty())
|
||||
{
|
||||
start_bookmark(sName);
|
||||
}
|
||||
fields_names_stack_.push_back(sName);
|
||||
}
|
||||
void docx_conversion_context::end_field()
|
||||
{
|
||||
if (fields_names_stack_.empty()) return;
|
||||
|
||||
output_stream() << L"<w:r>";
|
||||
output_stream() << L"<w:fldChar w:fldCharType=\"end\"/>";
|
||||
output_stream() << L"</w:r>";
|
||||
|
||||
std::wstring sName = fields_names_stack_.back();
|
||||
fields_names_stack_.pop_back();
|
||||
|
||||
if (!sName.empty())
|
||||
{
|
||||
end_bookmark(sName);
|
||||
}
|
||||
}
|
||||
void docx_conversion_context::end_sdt()
|
||||
{
|
||||
if (!in_table_content_) return;
|
||||
@ -477,7 +533,7 @@ void docx_conversion_context::start_bookmark (const std::wstring &name)
|
||||
}
|
||||
|
||||
finish_run();
|
||||
output_stream() << L"<w:bookmarkStart w:id=\"" << std::to_wstring(id) << L"\" w:name=\"" << name << L"\"/>";
|
||||
output_stream() << L"<w:bookmarkStart w:id=\"" << std::to_wstring(id) << L"\" w:name=\"" << XmlUtils::EncodeXmlString(name) << L"\"/>";
|
||||
}
|
||||
|
||||
void docx_conversion_context::end_bookmark (const std::wstring &name)
|
||||
@ -578,7 +634,8 @@ oox_chart_context & docx_conversion_context::current_chart()
|
||||
void docx_conversion_context::add_new_run(std::wstring parentStyleId)
|
||||
{
|
||||
finish_run();
|
||||
if (get_comments_context().state()==1)
|
||||
if (get_comments_context().state() == 1 ||
|
||||
get_comments_context().state() == 4)//??? comment in run
|
||||
{
|
||||
output_stream() << L"<w:commentRangeStart w:id=\"" << get_comments_context().current_id() << L"\" />";
|
||||
get_comments_context().state(2);//active
|
||||
@ -878,22 +935,24 @@ xmlns:wps=\"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\"
|
||||
mc:Ignorable=\"w14 wp14\">";
|
||||
|
||||
std::vector<int> numIds;
|
||||
BOOST_FOREACH(odf_reader::list_style_instance_ptr & inst, list_styles.instances())
|
||||
{
|
||||
odf_reader::office_element_ptr_array & content = inst->get_text_list_style()->get_content();
|
||||
|
||||
odf_reader::list_style_container::instances_array & arListStyles = list_styles.instances();
|
||||
for (size_t i = 0; i < arListStyles.size(); i++)
|
||||
{
|
||||
odf_reader::office_element_ptr_array & content = arListStyles[i]->get_text_list_style()->get_content();
|
||||
|
||||
if (content.size() < 1)
|
||||
continue;
|
||||
|
||||
const int abstractNumId = list_styles.id_by_name(inst->get_style_name());
|
||||
const int abstractNumId = list_styles.id_by_name(arListStyles[i]->get_style_name());
|
||||
|
||||
strm << L"<w:abstractNum w:abstractNumId=\"" << abstractNumId << "\">";
|
||||
numIds.push_back(abstractNumId);
|
||||
|
||||
for (size_t i = 0; i < (std::min)( content.size(), (size_t)9); i++)
|
||||
for (size_t j = 0; j < (std::min)( content.size(), (size_t)9); j++)
|
||||
{
|
||||
start_text_list_style(inst->get_text_list_style()->get_style_name());
|
||||
content[i]->docx_convert(*this);
|
||||
start_text_list_style(arListStyles[i]->get_text_list_style()->get_style_name());
|
||||
content[j]->docx_convert(*this);
|
||||
// TODO
|
||||
end_text_list_style();
|
||||
}
|
||||
@ -924,21 +983,25 @@ void docx_conversion_context::process_fonts()
|
||||
odf_reader::odf_read_context & context = doc->odf_context();
|
||||
odf_reader::fonts_container & fonts = context.fontContainer();
|
||||
|
||||
BOOST_FOREACH(odf_reader::font_instance_ptr & inst, fonts.instances())
|
||||
odf_reader::fonts_container::instances_array &arFonts = fonts.instances();
|
||||
for (size_t i = 0; i < arFonts.size(); i++)
|
||||
{
|
||||
strm << L"<w:font w:name=\"" << inst->name() << L"\" >";
|
||||
if (!arFonts[i]) continue;
|
||||
if (arFonts[i]->name().empty()) continue;
|
||||
|
||||
if (!inst->charset().empty())
|
||||
strm << L"<w:charset w:val=\"" << inst->charset() <<"\" />";
|
||||
strm << L"<w:font w:name=\"" << arFonts[i]->name() << L"\" >";
|
||||
|
||||
if (!inst->family().empty())
|
||||
strm << L"<w:family w:val=\"" << inst->family() << "\" />";
|
||||
if (!arFonts[i]->charset().empty())
|
||||
strm << L"<w:charset w:val=\"" << arFonts[i]->charset() <<"\" />";
|
||||
|
||||
if (!inst->pitch().empty())
|
||||
strm << L"<w:pitch w:val=\"" << inst->pitch() << "\" />";
|
||||
if (!arFonts[i]->family().empty())
|
||||
strm << L"<w:family w:val=\"" << arFonts[i]->family() << "\" />";
|
||||
|
||||
if (!inst->alt_name().empty())
|
||||
strm << L"<w:altName w:val=\"" << inst->alt_name() << "\" />";
|
||||
if (!arFonts[i]->pitch().empty())
|
||||
strm << L"<w:pitch w:val=\"" << arFonts[i]->pitch() << "\" />";
|
||||
|
||||
if (!arFonts[i]->alt_name().empty())
|
||||
strm << L"<w:altName w:val=\"" << arFonts[i]->alt_name() << "\" />";
|
||||
|
||||
strm << L"</w:font>";
|
||||
}
|
||||
@ -969,9 +1032,11 @@ void docx_conversion_context::process_styles()
|
||||
odf_reader::styles_container & styles = context.styleContainer();
|
||||
|
||||
// add all styles to the map
|
||||
BOOST_FOREACH(odf_reader::style_instance_ptr & inst, styles.instances())
|
||||
odf_reader::styles_container::instances_array &arStyles = styles.instances();
|
||||
for (size_t i = 0; i < arStyles.size(); i++)
|
||||
{
|
||||
styles_map_.get(inst->name(), inst->type());
|
||||
if (!arStyles[i]) continue;
|
||||
styles_map_.get(arStyles[i]->name(), arStyles[i]->type());
|
||||
}
|
||||
|
||||
_Wostream << L"<w:docDefaults>";
|
||||
@ -990,51 +1055,54 @@ void docx_conversion_context::process_styles()
|
||||
|
||||
_Wostream << L"</w:docDefaults>";
|
||||
|
||||
BOOST_FOREACH(odf_reader::style_instance_ptr & inst, styles.instances())
|
||||
{
|
||||
if (!inst->is_automatic() &&
|
||||
for (size_t i = 0; i < arStyles.size(); i++)
|
||||
{
|
||||
if (!arStyles[i]->is_automatic() &&
|
||||
(
|
||||
inst->type() == odf_types::style_family::Paragraph ||
|
||||
inst->type() == odf_types::style_family::Text
|
||||
arStyles[i]->type() == odf_types::style_family::Paragraph ||
|
||||
arStyles[i]->type() == odf_types::style_family::Text
|
||||
))
|
||||
{
|
||||
const std::wstring id = styles_map_.get(inst->name(), inst->type());
|
||||
_Wostream << L"<w:style w:styleId=\"" << id << L"\" w:type=\"" << StyleTypeOdf2Docx(inst->type()) << L"\"";
|
||||
if (!inst->is_default())
|
||||
const std::wstring id = styles_map_.get(arStyles[i]->name(), arStyles[i]->type());
|
||||
_Wostream << L"<w:style w:styleId=\"" << id << L"\" w:type=\"" << StyleTypeOdf2Docx(arStyles[i]->type()) << L"\"";
|
||||
if (!arStyles[i]->is_default())
|
||||
{
|
||||
_Wostream << L" w:customStyle=\"1\"";
|
||||
}
|
||||
_Wostream << L">";
|
||||
|
||||
const std::wstring displayName = StyleDisplayName(inst->name(), inst->type());
|
||||
const std::wstring displayName = StyleDisplayName(arStyles[i]->name(), arStyles[i]->type());
|
||||
|
||||
_Wostream << L"<w:name w:val=\"" << displayName << L"\" />";
|
||||
|
||||
if (odf_reader::style_instance * baseOn = inst->parent())
|
||||
if (odf_reader::style_instance * baseOn = arStyles[i]->parent())
|
||||
{
|
||||
const std::wstring basedOnId = styles_map_.get(baseOn->name(), baseOn->type());
|
||||
_Wostream << L"<w:basedOn w:val=\"" << basedOnId << "\" />";
|
||||
}
|
||||
else if (!inst->is_default() && styles_map_.check(L"", inst->type()))
|
||||
else if (!arStyles[i]->is_default() && styles_map_.check(L"", arStyles[i]->type()))
|
||||
{
|
||||
const std::wstring basedOnId = styles_map_.get(L"", inst->type());
|
||||
const std::wstring basedOnId = styles_map_.get(L"", arStyles[i]->type());
|
||||
_Wostream << L"<w:basedOn w:val=\"" << basedOnId << "\" />";
|
||||
}
|
||||
|
||||
if (odf_reader::style_instance * next = inst->next())
|
||||
if (odf_reader::style_instance * next = arStyles[i]->next())
|
||||
{
|
||||
const std::wstring nextId = styles_map_.get(next->name(), next->type());
|
||||
_Wostream << L"<w:next w:val=\"" << nextId << "\" />";
|
||||
}
|
||||
else if (inst->is_default())
|
||||
else if (arStyles[i]->is_default())
|
||||
{
|
||||
// self
|
||||
_Wostream << L"<w:next w:val=\"" << id << "\" />";
|
||||
}
|
||||
|
||||
if (odf_reader::style_content * content = inst->content())
|
||||
if (odf_reader::style_content * content = arStyles[i]->content())
|
||||
{
|
||||
get_styles_context().start_process_style(inst.get());
|
||||
get_tabs_context().clear();
|
||||
odf_reader::calc_tab_stops(arStyles[i].get(), get_tabs_context());
|
||||
|
||||
get_styles_context().start_process_style(arStyles[i].get());
|
||||
content->docx_convert(*this, true);
|
||||
get_styles_context().end_process_style();
|
||||
}
|
||||
@ -1295,10 +1363,11 @@ void docx_conversion_context::pop_text_properties()
|
||||
odf_reader::style_text_properties_ptr docx_conversion_context::current_text_properties()
|
||||
{
|
||||
odf_reader::style_text_properties_ptr cur = boost::make_shared<odf_reader::style_text_properties>();
|
||||
BOOST_FOREACH(const odf_reader::style_text_properties * prop, text_properties_stack_)
|
||||
|
||||
for (size_t i = 0; i < text_properties_stack_.size(); i++)
|
||||
{
|
||||
if (prop)
|
||||
cur->content().apply_from( prop->content() );
|
||||
if (text_properties_stack_[i])
|
||||
cur->content().apply_from( text_properties_stack_[i]->content() );
|
||||
}
|
||||
return cur;
|
||||
}
|
||||
@ -1545,15 +1614,31 @@ int docx_conversion_context::process_paragraph_attr(odf_reader::text::paragraph_
|
||||
|
||||
output_stream() << L"</w:pPr>";
|
||||
finish_paragraph();
|
||||
start_paragraph();
|
||||
start_paragraph();
|
||||
if ((Attr->outline_level_) && (*Attr->outline_level_ > 0))
|
||||
{
|
||||
output_stream() << L"<w:pPr>";
|
||||
output_stream() << L"<w:outlineLvl w:val=\"" << *Attr->outline_level_ - 1 << L"\"/>";
|
||||
output_stream() << L"</w:pPr>";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
output_stream() << get_section_context().dump_;
|
||||
get_section_context().dump_.clear();
|
||||
if ((Attr->outline_level_) && (*Attr->outline_level_ > 0))
|
||||
{
|
||||
output_stream() << L"<w:outlineLvl w:val=\"" << *Attr->outline_level_ - 1 << L"\"/>";
|
||||
}
|
||||
output_stream() << L"</w:pPr>";
|
||||
}
|
||||
}
|
||||
else if ((Attr->outline_level_) && (*Attr->outline_level_ > 0))
|
||||
{
|
||||
output_stream() << L"<w:pPr>";
|
||||
output_stream() << L"<w:outlineLvl w:val=\"" << *Attr->outline_level_ - 1 << L"\"/>";
|
||||
output_stream() << L"</w:pPr>";
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
@ -1715,10 +1800,7 @@ namespace
|
||||
{
|
||||
// обработка Header/Footer
|
||||
// конвертируем содержимое header/footer и сохраняем результат в виде строки
|
||||
void process_one_header_footer(docx_conversion_context & Context,
|
||||
const std::wstring & styleName,
|
||||
odf_reader::office_element * elm,
|
||||
headers_footers::Type type)
|
||||
void process_one_header_footer(docx_conversion_context & Context, const std::wstring & styleName, odf_reader::office_element *elm, headers_footers::Type type)
|
||||
{
|
||||
if (!elm) return;
|
||||
|
||||
@ -1736,13 +1818,7 @@ namespace
|
||||
Context.dump_hyperlinks(internal_rels, hyperlinks::document_place);
|
||||
|
||||
Context.get_headers_footers().add(styleName, dbgStr, type, internal_rels);
|
||||
|
||||
if (type == headers_footers::headerLeft || type == headers_footers::footerLeft)
|
||||
{
|
||||
Context.set_settings_property(odf_reader::_property(L"evenAndOddHeaders",true));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
void docx_conversion_context::set_settings_property(const odf_reader::_property & prop)
|
||||
{
|
||||
@ -1764,21 +1840,39 @@ void docx_conversion_context::process_headers_footers()
|
||||
odf_reader::page_layout_container & pageLayouts = context.pageLayoutContainer();
|
||||
|
||||
// проходим по всем page layout
|
||||
BOOST_FOREACH(const odf_reader::style_master_page* page, pageLayouts.master_pages())
|
||||
{
|
||||
const std::wstring & styleName = page->attlist_.style_name_.get_value_or( L"" );
|
||||
const std::wstring masterPageNameLayout =context.pageLayoutContainer().page_layout_name_by_style(styleName);
|
||||
add_page_properties(masterPageNameLayout);
|
||||
|
||||
process_one_header_footer(*this, styleName, page->style_header_.get(), headers_footers::header);
|
||||
process_one_header_footer(*this, styleName, page->style_footer_.get(), headers_footers::footer );
|
||||
process_one_header_footer(*this, styleName, page->style_header_first_.get(), headers_footers::headerFirst);
|
||||
process_one_header_footer(*this, styleName, page->style_footer_first_.get(), headers_footers::footerFirst );
|
||||
process_one_header_footer(*this, styleName, page->style_header_left_.get(), headers_footers::headerLeft );
|
||||
process_one_header_footer(*this, styleName, page->style_footer_left_.get(), headers_footers::footerLeft );
|
||||
std::vector<odf_reader::style_master_page*> & master_pages = pageLayouts.master_pages();
|
||||
|
||||
if (!page->style_header_ && !page->style_footer_ && !page->style_header_first_ && !page->style_footer_first_
|
||||
&& !page->style_header_left_ && !page->style_footer_left_)
|
||||
bool bOddEvenPages = false;
|
||||
for (size_t i = 0; i < master_pages.size(); i++)
|
||||
{
|
||||
if (master_pages[i]->style_header_left_ || master_pages[i]->style_footer_left_)
|
||||
bOddEvenPages = true;
|
||||
}
|
||||
if (bOddEvenPages)
|
||||
{
|
||||
set_settings_property(odf_reader::_property(L"evenAndOddHeaders", true));
|
||||
}
|
||||
for (size_t i = 0; i < master_pages.size(); i++)
|
||||
{
|
||||
const std::wstring & styleName = master_pages[i]->attlist_.style_name_.get_value_or( L"" );
|
||||
const std::wstring masterPageNameLayout =context.pageLayoutContainer().page_layout_name_by_style(styleName);
|
||||
|
||||
add_page_properties(masterPageNameLayout);
|
||||
|
||||
process_one_header_footer(*this, styleName, master_pages[i]->style_header_.get(), headers_footers::header);
|
||||
process_one_header_footer(*this, styleName, master_pages[i]->style_footer_.get(), headers_footers::footer );
|
||||
process_one_header_footer(*this, styleName, master_pages[i]->style_header_first_.get(), headers_footers::headerFirst);
|
||||
process_one_header_footer(*this, styleName, master_pages[i]->style_footer_first_.get(), headers_footers::footerFirst );
|
||||
process_one_header_footer(*this, styleName, master_pages[i]->style_header_left_.get(), headers_footers::headerLeft );
|
||||
process_one_header_footer(*this, styleName, master_pages[i]->style_footer_left_.get(), headers_footers::footerLeft );
|
||||
|
||||
if (bOddEvenPages && !master_pages[i]->style_header_left_)
|
||||
process_one_header_footer(*this, styleName, master_pages[i]->style_header_.get(), headers_footers::headerLeft);
|
||||
if (bOddEvenPages && !master_pages[i]->style_footer_left_)
|
||||
process_one_header_footer(*this, styleName, master_pages[i]->style_footer_.get(), headers_footers::footerLeft );
|
||||
|
||||
if (!master_pages[i]->style_header_ && !master_pages[i]->style_footer_ && !master_pages[i]->style_header_first_ && !master_pages[i]->style_footer_first_
|
||||
&& !master_pages[i]->style_header_left_ && !master_pages[i]->style_footer_left_)
|
||||
{
|
||||
//отключенные колонтитулы
|
||||
rels rels_;
|
||||
@ -2041,5 +2135,13 @@ std::wstring docx_conversion_context::get_user_field(const std::wstring & name)
|
||||
return pFind != map_user_fields.end() ? pFind->second : L"";
|
||||
}
|
||||
|
||||
void docx_conversion_context::add_jsaProject(const std::string &content)
|
||||
{
|
||||
if (content.empty()) return;
|
||||
|
||||
output_document_->get_word_files().add_jsaProject(content);
|
||||
output_document_->get_content_types_file().add_or_find_default(L"bin");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -486,14 +486,14 @@ public:
|
||||
std::wstring author;
|
||||
std::wstring initials;
|
||||
};
|
||||
void start_comment(const std::wstring & content, const std::wstring & author, const std::wstring & date)
|
||||
void start_comment(const std::wstring & content, const std::wstring & author, const std::wstring & date, bool inRun = false)
|
||||
{
|
||||
int id = comments_.size()+1;
|
||||
_comment_desc new_comment={content,id,date,author};
|
||||
int id = comments_.size() + 1;
|
||||
_comment_desc new_comment={content, id, date, author};
|
||||
|
||||
comments_.push_back(new_comment);
|
||||
|
||||
state_ = 1;
|
||||
state_ = inRun ? 4 : 1;
|
||||
}
|
||||
int current_id()
|
||||
{
|
||||
@ -668,7 +668,7 @@ public:
|
||||
{
|
||||
current_state.content.push_back(type);
|
||||
}
|
||||
void add_outline_level_style(int level, const std::wstring& style_name)
|
||||
void add_outline_level_style(const std::wstring& style_name, int level)
|
||||
{
|
||||
if (min_outline_level == -1 || min_outline_level > level)
|
||||
min_outline_level = level;
|
||||
@ -683,13 +683,15 @@ public:
|
||||
}
|
||||
void end_level()
|
||||
{
|
||||
current_template.insert(std::make_pair(current_state.name, current_state));
|
||||
current_template.push_back(current_state);
|
||||
|
||||
map_current_template.insert(std::make_pair(current_state.name, current_state));
|
||||
current_state.clear();
|
||||
}
|
||||
void set_current_level(const std::wstring &name)
|
||||
{
|
||||
std::map<std::wstring, _state>::iterator pFind = current_template.find(name);
|
||||
if (pFind == current_template.end())
|
||||
std::map<std::wstring, _state>::iterator pFind = map_current_template.find(name);
|
||||
if (pFind == map_current_template.end())
|
||||
{
|
||||
current_content_template_.clear();
|
||||
}
|
||||
@ -726,11 +728,13 @@ public:
|
||||
current_content_template_index_ = 0;
|
||||
current_content_template_.clear();
|
||||
current_template.clear();
|
||||
map_current_template.clear();
|
||||
current_state.clear();
|
||||
caption_sequence_name.clear();
|
||||
min_outline_level = -1;
|
||||
max_outline_level = -1;
|
||||
outline_level_styles.clear();
|
||||
bSeparators = false;
|
||||
}
|
||||
void add_sequence(const std::wstring & name, int outline_level)
|
||||
{
|
||||
@ -755,12 +759,14 @@ public:
|
||||
int min_outline_level;
|
||||
int max_outline_level;
|
||||
std::map<int, std::wstring> outline_level_styles;
|
||||
bool bSeparators;
|
||||
std::vector<_state> current_template;
|
||||
|
||||
private:
|
||||
std::vector<int> current_content_template_;
|
||||
int current_content_template_index_;
|
||||
|
||||
std::map<std::wstring, _state> current_template;
|
||||
std::map<std::wstring, _state> map_current_template;
|
||||
_state current_state;
|
||||
//std::map<std::wstring, int> sequences;
|
||||
std::vector<std::wstring> sequences;
|
||||
@ -836,8 +842,8 @@ public:
|
||||
void start_body ();
|
||||
void end_body ();
|
||||
|
||||
void start_office_text ();
|
||||
void end_office_text ();
|
||||
void start_office_text ();
|
||||
void end_office_text ();
|
||||
|
||||
void start_sdt (int type);
|
||||
void end_sdt ();
|
||||
@ -848,6 +854,9 @@ public:
|
||||
void start_index_element();
|
||||
void end_index_element();
|
||||
|
||||
void start_field(const std::wstring & sInstrText, const std::wstring & sName);
|
||||
void end_field();
|
||||
|
||||
void process_styles ();
|
||||
void process_fonts ();
|
||||
|
||||
@ -971,14 +980,15 @@ public:
|
||||
|
||||
drop_cap_context & get_drop_cap_context(){return drop_cap_context_;}
|
||||
|
||||
styles_map styles_map_;
|
||||
bool process_headers_footers_;
|
||||
bool delayed_converting_;
|
||||
bool convert_delayed_enabled_;
|
||||
styles_map styles_map_;
|
||||
bool process_headers_footers_;
|
||||
bool delayed_converting_;
|
||||
bool convert_delayed_enabled_;
|
||||
|
||||
void start_changes();
|
||||
void end_changes();
|
||||
void start_changes();
|
||||
void end_changes();
|
||||
|
||||
void add_jsaProject(const std::string &content);
|
||||
private:
|
||||
std::wstringstream document_xml_;
|
||||
std::wstringstream styles_xml_;
|
||||
@ -1022,8 +1032,11 @@ private:
|
||||
std::wstring automatic_parent_style_;
|
||||
std::wstring current_master_page_name_;
|
||||
std::wstring text_list_style_name_;
|
||||
|
||||
std::vector<std::wstring> list_style_stack_;
|
||||
bool first_element_list_item_;
|
||||
std::vector<std::wstring> fields_names_stack_;
|
||||
|
||||
bool first_element_list_item_;
|
||||
|
||||
bool page_break_after_;
|
||||
bool page_break_before_;
|
||||
|
||||
@ -124,6 +124,12 @@ void word_files::write(const std::wstring & RootPath)
|
||||
charts_files_.set_main_document(get_main_document());
|
||||
charts_files_.write(path);
|
||||
}
|
||||
|
||||
if (jsaProject_)
|
||||
{
|
||||
rels_files_.add( relationship(L"jsaId", L"http://schemas.onlyoffice.com/jsaProject", L"jsaProject.bin" ) );
|
||||
jsaProject_->write( path );
|
||||
}
|
||||
|
||||
if (notes_)
|
||||
{
|
||||
@ -185,7 +191,10 @@ bool word_files::has_numbering()
|
||||
{
|
||||
return numbering_ ? true : false;
|
||||
}
|
||||
|
||||
void word_files::add_jsaProject(const std::string &content)
|
||||
{
|
||||
jsaProject_ = package::simple_element::create(L"jsaProject.bin", content);
|
||||
}
|
||||
void word_files::set_headers_footers(headers_footers & HeadersFooters)
|
||||
{
|
||||
headers_footers_elements * elm = new headers_footers_elements(HeadersFooters);
|
||||
|
||||
@ -145,6 +145,7 @@ public:
|
||||
void set_comments (comments_context & commentsContext);
|
||||
|
||||
void add_charts(chart_content_ptr chart);
|
||||
void add_jsaProject(const std::string &content);
|
||||
|
||||
void add_rels(relationship const & r);
|
||||
|
||||
@ -163,6 +164,7 @@ private:
|
||||
element_ptr notes_;
|
||||
element_ptr settings_;
|
||||
element_ptr comments_;
|
||||
element_ptr jsaProject_;
|
||||
|
||||
};
|
||||
|
||||
|
||||
@ -94,8 +94,16 @@ std::wstring docx_table_state::current_row_style() const
|
||||
|
||||
double docx_table_state::get_current_cell_width()
|
||||
{
|
||||
if (current_table_column_ < columns_width_.size())
|
||||
return columns_width_[current_table_column_];
|
||||
if (current_table_column_ + columns_spanned_num_ < columns_width_.size())
|
||||
{
|
||||
//return columns_width_[current_table_column_];
|
||||
double res = 0;
|
||||
for (int i = 0; i < columns_spanned_num_ + 1; i++)
|
||||
{
|
||||
res += columns_width_[current_table_column_ + i];
|
||||
}
|
||||
return res;
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -31,7 +31,6 @@
|
||||
*/
|
||||
|
||||
#include "headers_footers.h"
|
||||
#include <boost/foreach.hpp>
|
||||
#include <boost/lexical_cast.hpp>
|
||||
|
||||
namespace cpdoccore {
|
||||
@ -88,12 +87,12 @@ std::wstring get_rel_type(headers_footers::Type _Type)
|
||||
|
||||
void headers_footers::dump_rels(rels & Rels) const//внешние релсы
|
||||
{
|
||||
BOOST_FOREACH(const instances_map::value_type & instAr, instances_)
|
||||
for (boost::unordered_map<std::wstring, instances_array>::const_iterator it = instances_.begin(); it != instances_.end(); ++it)
|
||||
{
|
||||
BOOST_FOREACH(const instance_ptr & inst, instAr.second)
|
||||
for (size_t i = 0; i < it->second.size(); i++)
|
||||
{
|
||||
if (inst->type_ == none) continue;
|
||||
Rels.add( relationship( inst->id_, get_rel_type(inst->type_), inst->name_, L"" ) );
|
||||
if (it->second[i]->type_ == none) continue;
|
||||
Rels.add( relationship( it->second[i]->id_, get_rel_type(it->second[i]->type_), it->second[i]->name_, L"" ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -107,9 +106,13 @@ bool headers_footers::write_sectPr(const std::wstring & StyleName, bool next_pag
|
||||
|
||||
bool first = false, left = false;
|
||||
bool res = false;
|
||||
|
||||
instances_array & pFind = instances_.at(StyleName);
|
||||
|
||||
BOOST_FOREACH(const instance_ptr & inst, instances_.at(StyleName))
|
||||
for (size_t i = 0; i < pFind.size(); i++)
|
||||
{
|
||||
instance_ptr & inst = pFind[i];
|
||||
|
||||
std::wstring type = L"default";
|
||||
|
||||
if ( inst->type_ == headerFirst || inst->type_ == footerFirst )
|
||||
|
||||
@ -317,8 +317,8 @@ void _oox_drawing::serialize_bodyPr(std::wostream & strm, const std::wstring & n
|
||||
if ((iWrap) && (*iWrap == 0)) CP_XML_ATTR(L"wrap", L"none");
|
||||
}
|
||||
|
||||
_CP_OPT(int) iAlign;
|
||||
odf_reader::GetProperty(prop,L"textarea-vertical_align",iAlign);
|
||||
_CP_OPT(int) iAlign, iVert;
|
||||
odf_reader::GetProperty(prop, L"textarea-vertical_align", iAlign);
|
||||
if (iAlign)
|
||||
{
|
||||
switch (iAlign.get())
|
||||
@ -336,6 +336,16 @@ void _oox_drawing::serialize_bodyPr(std::wostream & strm, const std::wstring & n
|
||||
CP_XML_ATTR(L"anchor", L"just");break;
|
||||
}
|
||||
}
|
||||
odf_reader::GetProperty(prop, L"text_vert", iVert);
|
||||
if (iVert)
|
||||
{
|
||||
switch (iVert.get())
|
||||
{
|
||||
case 1: CP_XML_ATTR(L"vert", L"vert"); break;
|
||||
case 2: CP_XML_ATTR(L"vert", L"vert270"); break;
|
||||
|
||||
}
|
||||
}
|
||||
_CP_OPT(bool) bAutoGrowHeight;
|
||||
_CP_OPT(bool) bFitToSize;
|
||||
odf_reader::GetProperty(prop,L"fit-to-size", bFitToSize);
|
||||
@ -357,7 +367,7 @@ void _oox_drawing::serialize_bodyPr(std::wostream & strm, const std::wstring & n
|
||||
if (bWordArt)
|
||||
{
|
||||
_CP_OPT(int) iVal;
|
||||
odf_reader::GetProperty(prop, L"odf-custom-draw-index",iVal);
|
||||
odf_reader::GetProperty(prop, L"oox-geom-index", iVal);
|
||||
if (iVal)
|
||||
{
|
||||
std::wstring shapeType = _OO_OOX_wordart[*iVal].oox;
|
||||
|
||||
@ -38,6 +38,7 @@
|
||||
|
||||
#include "mediaitems.h"
|
||||
#include "../../DesktopEditor/common/File.h"
|
||||
#include "../../DesktopEditor/common/SystemUtils.h"
|
||||
#include "../../DesktopEditor/graphics/pro/Image.h"
|
||||
#include "../../DesktopEditor/raster/ImageFileFormatChecker.h"
|
||||
#include "../../Common/DocxFormat/Source/Base/Base.h"
|
||||
@ -193,20 +194,25 @@ void content_types_file::set_media(mediaitems & _Mediaitems)
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
|
||||
simple_element::simple_element(const std::wstring & FileName, const std::wstring & Content) : file_name_(FileName)
|
||||
simple_element::simple_element(const std::wstring & FileName, const std::wstring & Content) : file_name_(FileName), bXml(true)
|
||||
{
|
||||
utf8::utf16to8(Content.begin(), Content.end(), std::back_inserter(content_utf8_));
|
||||
}
|
||||
|
||||
simple_element::simple_element(const std::wstring & FileName, const std::string & Content) : file_name_(FileName), content_utf8_(Content), bXml(false)
|
||||
{
|
||||
}
|
||||
void simple_element::write(const std::wstring & RootPath)
|
||||
{
|
||||
std::wstring name_ = RootPath + FILE_SEPARATOR_STR + file_name_;
|
||||
std::wstring name_ = RootPath + FILE_SEPARATOR_STR + file_name_;
|
||||
|
||||
NSFile::CFileBinary file;
|
||||
if ( file.CreateFileW(name_) == true)
|
||||
{
|
||||
std::string root = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>";
|
||||
file.WriteFile((BYTE*)root.c_str(), root.length());
|
||||
if (bXml)
|
||||
{
|
||||
std::string root = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>";
|
||||
file.WriteFile((BYTE*)root.c_str(), root.length());
|
||||
}
|
||||
file.WriteFile((BYTE*)content_utf8_.c_str(), content_utf8_.length());
|
||||
file.CloseFile();
|
||||
}
|
||||
@ -277,7 +283,10 @@ element_ptr simple_element::create(const std::wstring & FileName, const std::wst
|
||||
{
|
||||
return boost::make_shared<simple_element>(FileName, Content);
|
||||
}
|
||||
|
||||
element_ptr simple_element::create(const std::wstring & FileName, const std::string & Content)
|
||||
{
|
||||
return boost::make_shared<simple_element>(FileName, Content);
|
||||
}
|
||||
//-----------------------------------------------------------------------------------------------
|
||||
|
||||
void core_file::write(const std::wstring & RootPath)
|
||||
@ -304,7 +313,11 @@ void app_file::write(const std::wstring & RootPath)
|
||||
resStream << L"<Properties xmlns=\"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\" "
|
||||
L"xmlns:vt=\"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes\" >";
|
||||
|
||||
resStream << L"<Application>ONLYOFFICE";
|
||||
resStream << L"<Application>";
|
||||
std::wstring sApplication = NSSystemUtils::GetEnvVariable(NSSystemUtils::gc_EnvApplicationName);
|
||||
if (sApplication.empty())
|
||||
sApplication = NSSystemUtils::gc_EnvApplicationNameDefault;
|
||||
resStream << sApplication;
|
||||
#if defined(INTVER)
|
||||
std::string s = VALUE2STR(INTVER);
|
||||
resStream << L"/" << std::wstring(s.begin(), s.end()) ;
|
||||
|
||||
@ -99,13 +99,17 @@ public:
|
||||
simple_element(const std::wstring & FileName, const std::wstring & Content);
|
||||
static element_ptr create(const std::wstring & FileName, const std::wstring & Content);
|
||||
|
||||
public:
|
||||
virtual void write(const std::wstring & RootPath);
|
||||
simple_element(const std::wstring & FileName, const std::string & Content);
|
||||
static element_ptr create(const std::wstring & FileName, const std::string & Content);
|
||||
|
||||
virtual void write(const std::wstring & RootPath);
|
||||
|
||||
private:
|
||||
std::wstring file_name_;
|
||||
std::string content_utf8_;
|
||||
|
||||
bool bXml;
|
||||
|
||||
};
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
|
||||
@ -694,12 +694,17 @@ void pptx_conversion_context::start_chart(std::wstring name)
|
||||
//этот контекст нужно передавать в файл
|
||||
|
||||
}
|
||||
|
||||
void pptx_conversion_context::end_chart()
|
||||
{
|
||||
//current_chart().set_drawing_link(current_sheet().get_drawing_link());
|
||||
//излишняя инфа
|
||||
}
|
||||
|
||||
void pptx_conversion_context::add_jsaProject(const std::string &content)
|
||||
{
|
||||
if (content.empty()) return;
|
||||
|
||||
output_document_->get_ppt_files().add_jsaProject(content);
|
||||
output_document_->get_content_types_file().add_or_find_default(L"bin");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -106,6 +106,8 @@ public:
|
||||
void start_theme(std::wstring & name);
|
||||
void end_theme();
|
||||
|
||||
void add_jsaProject(const std::string &content);
|
||||
|
||||
std::pair<int,int> add_author_comments(std::wstring author);
|
||||
|
||||
pptx_slide_context & get_slide_context() { return pptx_slide_context_; }
|
||||
|
||||
@ -455,13 +455,18 @@ void ppt_files::write(const std::wstring & RootPath)
|
||||
}
|
||||
{
|
||||
comments_->set_main_document(get_main_document());
|
||||
comments_->write(path);
|
||||
comments_->write( path );
|
||||
}
|
||||
if (authors_comments_)
|
||||
{
|
||||
rels_files_.add( relationship( L"auId1", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/commentAuthors", L"commentAuthors.xml" ) );
|
||||
authors_comments_->write(path);
|
||||
authors_comments_->write( path );
|
||||
}
|
||||
if (jsaProject_)
|
||||
{
|
||||
rels_files_.add( relationship(L"jsaId", L"http://schemas.onlyoffice.com/jsaProject", L"jsaProject.bin" ) );
|
||||
jsaProject_->write( path );
|
||||
}
|
||||
rels_files_.write(path);
|
||||
}
|
||||
|
||||
@ -532,6 +537,10 @@ void ppt_files::add_theme(pptx_xml_theme_ptr theme)
|
||||
{
|
||||
themes_files_.add_theme(theme);
|
||||
}
|
||||
void ppt_files::add_jsaProject(const std::string &content)
|
||||
{
|
||||
jsaProject_ = package::simple_element::create(L"jsaProject.bin", content);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -222,7 +222,8 @@ public:
|
||||
void add_theme (pptx_xml_theme_ptr theme);
|
||||
|
||||
void set_authors_comments(pptx_xml_authors_comments_ptr & authors_comments);
|
||||
|
||||
|
||||
void add_jsaProject (const std::string &content);
|
||||
private:
|
||||
rels_files rels_files_;
|
||||
|
||||
@ -242,6 +243,7 @@ private:
|
||||
element_ptr comments_;
|
||||
element_ptr media_;
|
||||
element_ptr embeddings_;
|
||||
element_ptr jsaProject_;
|
||||
};
|
||||
|
||||
// xlsx_document
|
||||
|
||||
@ -32,7 +32,6 @@
|
||||
|
||||
#include "xlsx_borders.h"
|
||||
|
||||
#include <boost/foreach.hpp>
|
||||
#include <boost/functional.hpp>
|
||||
#include <boost/unordered_set.hpp>
|
||||
#include <xml/simple_xml_writer.h>
|
||||
@ -203,9 +202,9 @@ public:
|
||||
{
|
||||
std::vector<xlsx_border> inst_array;
|
||||
|
||||
BOOST_FOREACH(const xlsx_border & inst, borders_)
|
||||
for (boost::unordered_set<xlsx_border, boost::hash<xlsx_border>>::iterator it = borders_.begin(); it != borders_.end(); ++it)
|
||||
{
|
||||
inst_array.push_back(inst);
|
||||
inst_array.push_back(*it);
|
||||
}
|
||||
|
||||
std::sort(inst_array.begin(), inst_array.end(), compare_());
|
||||
@ -215,9 +214,10 @@ public:
|
||||
CP_XML_NODE(L"borders")
|
||||
{
|
||||
CP_XML_ATTR(L"count", inst_array.size());
|
||||
BOOST_FOREACH( xlsx_border & border, inst_array)
|
||||
|
||||
for (size_t i = 0; i < inst_array.size(); i++)
|
||||
{
|
||||
cpdoccore::oox::xlsx_serialize(CP_XML_STREAM(), border);
|
||||
cpdoccore::oox::xlsx_serialize(CP_XML_STREAM(), inst_array[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -61,7 +61,9 @@ namespace oox {
|
||||
case 3: CP_XML_ATTR(L"type", L"min"); break;
|
||||
case 4: CP_XML_ATTR(L"type", L"max"); break; //todooo ext - autoMax
|
||||
case 5: CP_XML_ATTR(L"type", L"min"); break;
|
||||
case 6: CP_XML_ATTR(L"type", L"formula"); break;
|
||||
case 6: CP_XML_ATTR(L"type", L"formula"); break;
|
||||
case 7: CP_XML_ATTR(L"type", L"percentile");break;//BOA PARA ESTUDAR - JOGAR LOTOFACIL minha predileta 1.ods
|
||||
|
||||
}
|
||||
if (val)
|
||||
{
|
||||
|
||||
@ -45,21 +45,20 @@
|
||||
namespace cpdoccore {
|
||||
namespace oox {
|
||||
|
||||
class xlsx_dataValidation
|
||||
struct xlsx_dataValidation
|
||||
{
|
||||
public:
|
||||
xlsx_dataValidation() : showErrorMessage(false), showInputMessage(false), showDropDown(false), allowBlank(false) {}
|
||||
|
||||
std::wstring ref;
|
||||
std::wstring activate_ref;
|
||||
//std::wstring activate_ref;
|
||||
std::map<int, std::vector<int>> mapCells;
|
||||
|
||||
std::wstring type;
|
||||
std::wstring formula1;
|
||||
std::wstring formula2;
|
||||
std::wstring operator_;
|
||||
bool showErrorMessage;
|
||||
bool showInputMessage;
|
||||
bool showDropDown;
|
||||
bool allowBlank;
|
||||
bool showErrorMessage = false;
|
||||
bool showInputMessage = false;
|
||||
bool showDropDown = false;
|
||||
bool allowBlank = false;
|
||||
};
|
||||
typedef shared_ptr<xlsx_dataValidation>::Type xlsx_dataValidation_ptr;
|
||||
|
||||
@ -80,9 +79,61 @@ public:
|
||||
for (std::map<std::wstring, xlsx_dataValidation_ptr>::iterator it = mapActivateDataValidations.begin();
|
||||
it != mapActivateDataValidations.end(); ++it)
|
||||
{
|
||||
//prepare
|
||||
std::map<int, std::vector<std::pair<int, int>>> mapCells;
|
||||
for (std::map<int, std::vector<int>>::iterator jt = it->second->mapCells.begin(); jt != it->second->mapCells.end(); ++jt)
|
||||
{
|
||||
std::sort(jt->second.begin(), jt->second.end());
|
||||
std::vector<std::pair<int, int>> arr;
|
||||
MakePairVector(jt->second, arr);
|
||||
|
||||
mapCells.insert(std::make_pair(jt->first, arr));
|
||||
}
|
||||
std::wstring activate_ref;
|
||||
|
||||
std::map<int, std::vector<std::pair<int, int>>>::iterator jt1 = mapCells.begin();
|
||||
while ( jt1 != mapCells.end() )
|
||||
{
|
||||
for (size_t i = 0; i < jt1->second.size(); i++)
|
||||
{
|
||||
std::map<int, std::vector<std::pair<int, int>>>::iterator jt2 = jt1;
|
||||
while(jt2 != mapCells.end())
|
||||
{
|
||||
std::map<int, std::vector<std::pair<int, int>>>::iterator jt2_next = jt2; ++jt2_next;
|
||||
if (jt2_next == mapCells.end() || jt2->first + 1 != jt2_next->first)
|
||||
break;
|
||||
|
||||
size_t j = 0; bool bFound = false;
|
||||
for (size_t j = 0; j < jt2_next->second.size(); j++)
|
||||
{
|
||||
if (jt1->second[i].first == jt2_next->second[j].first ||
|
||||
jt1->second[i].second == jt2_next->second[j].second)
|
||||
{
|
||||
bFound = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (bFound)
|
||||
{
|
||||
jt2_next->second.erase(jt2_next->second.begin() + j, jt2_next->second.begin() + j + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
jt2 = jt2_next;
|
||||
}
|
||||
if (!activate_ref.empty()) activate_ref += L" ";
|
||||
activate_ref += oox::getCellAddress(jt1->first, jt1->second[i].first);
|
||||
|
||||
if (jt1->first != jt2->first || jt1->second[i].first != jt1->second[i].second)
|
||||
activate_ref += L":" + oox::getCellAddress(jt2->first, jt1->second[i].second);
|
||||
}
|
||||
++jt1;
|
||||
}
|
||||
CP_XML_NODE(L"dataValidation")
|
||||
{
|
||||
CP_XML_ATTR(L"sqref", it->second->activate_ref);
|
||||
CP_XML_ATTR(L"sqref", activate_ref);
|
||||
CP_XML_ATTR(L"allowBlank", it->second->allowBlank);
|
||||
CP_XML_ATTR(L"operator", it->second->operator_);
|
||||
CP_XML_ATTR(L"showDropDown", it->second->showDropDown);
|
||||
@ -115,6 +166,21 @@ public:
|
||||
|
||||
std::map<std::wstring, xlsx_dataValidation_ptr> mapDataValidations; //for all tables
|
||||
std::map<std::wstring, xlsx_dataValidation_ptr> mapActivateDataValidations; //in current table
|
||||
|
||||
private:
|
||||
void MakePairVector(std::vector<int> & arInput, std::vector<std::pair<int, int>> &arOutput)
|
||||
{
|
||||
int pos = arInput[0];
|
||||
for (size_t i = 1; i < arInput.size(); i++)
|
||||
{
|
||||
if (arInput[i-1] + 1 != arInput[i])
|
||||
{
|
||||
arOutput.push_back(std::make_pair(pos, arInput[i - 1]));
|
||||
pos = arInput[i];
|
||||
}
|
||||
}
|
||||
arOutput.push_back(std::make_pair(pos, arInput[arInput.size() - 1]));
|
||||
}
|
||||
};
|
||||
|
||||
xlsx_dataValidations_context::xlsx_dataValidations_context() :
|
||||
@ -128,24 +194,48 @@ void xlsx_dataValidations_context::serialize(std::wostream & _Wostream)
|
||||
{
|
||||
return impl_->serialize(_Wostream);
|
||||
}
|
||||
void xlsx_dataValidations_context::activate(const std::wstring & name, const std::wstring & ref)
|
||||
void xlsx_dataValidations_context::activate(const std::wstring & name, int col, int row/*const std::wstring & ref*/)
|
||||
{
|
||||
std::map<std::wstring, xlsx_dataValidation_ptr>::iterator pFindActivate = impl_->mapActivateDataValidations.find(name);
|
||||
|
||||
if (pFindActivate != impl_->mapActivateDataValidations.end())
|
||||
{
|
||||
pFindActivate->second->activate_ref += L" " + ref;
|
||||
}
|
||||
else
|
||||
|
||||
if (pFindActivate == impl_->mapActivateDataValidations.end())
|
||||
{
|
||||
std::map<std::wstring, xlsx_dataValidation_ptr>::iterator pFind = impl_->mapDataValidations.find(name);
|
||||
|
||||
xlsx_dataValidation_ptr _new;
|
||||
if (pFind != impl_->mapDataValidations.end())
|
||||
{
|
||||
pFind->second->activate_ref = ref;
|
||||
impl_->mapActivateDataValidations.insert(std::make_pair(name, pFind->second));
|
||||
_new = pFind->second;
|
||||
}
|
||||
else
|
||||
{
|
||||
_new = xlsx_dataValidation_ptr(new xlsx_dataValidation);
|
||||
}
|
||||
impl_->mapActivateDataValidations.insert(std::make_pair(name, _new));
|
||||
|
||||
pFindActivate = impl_->mapActivateDataValidations.find(name);
|
||||
}
|
||||
|
||||
std::map<int, std::vector<int>>::iterator pFindCol = pFindActivate->second->mapCells.find(col);
|
||||
|
||||
if (pFindCol == pFindActivate->second->mapCells.end())
|
||||
{
|
||||
std::vector<int> rows; rows.push_back(row);
|
||||
pFindActivate->second->mapCells.insert(std::make_pair(col, rows));
|
||||
}
|
||||
else
|
||||
{
|
||||
pFindCol->second.push_back(row);
|
||||
}
|
||||
}
|
||||
void xlsx_dataValidations_context::add(const std::wstring & name, const std::wstring &ref)
|
||||
{
|
||||
xlsx_dataValidation_ptr _new = xlsx_dataValidation_ptr(new xlsx_dataValidation);
|
||||
|
||||
formulasconvert::odf2oox_converter converter;
|
||||
_new->ref = converter.convert_named_ref(ref, false, L";");
|
||||
|
||||
impl_->mapDataValidations.insert(std::make_pair(name, _new));
|
||||
}
|
||||
void xlsx_dataValidations_context::add_help_msg(const std::wstring & name, bool val)
|
||||
{
|
||||
@ -164,17 +254,6 @@ void xlsx_dataValidations_context::add_error_msg(const std::wstring & name, bool
|
||||
|
||||
pFind->second->showErrorMessage = val;
|
||||
}
|
||||
|
||||
void xlsx_dataValidations_context::add(const std::wstring & name, const std::wstring &ref)
|
||||
{
|
||||
xlsx_dataValidation_ptr _new = xlsx_dataValidation_ptr(new xlsx_dataValidation());
|
||||
|
||||
formulasconvert::odf2oox_converter converter;
|
||||
_new->ref = converter.convert_named_ref(ref, false, L";");
|
||||
|
||||
impl_->mapDataValidations.insert(std::make_pair(name, _new));
|
||||
}
|
||||
|
||||
void xlsx_dataValidations_context::add_formula(const std::wstring & name, const std::wstring & f) // todooo пооптимальней
|
||||
{
|
||||
std::map<std::wstring, xlsx_dataValidation_ptr>::iterator pFind = impl_->mapDataValidations.find(name);
|
||||
@ -192,11 +271,13 @@ void xlsx_dataValidations_context::add_formula(const std::wstring & name, const
|
||||
|
||||
if ( val.substr(0, 1) == L"\"")
|
||||
{
|
||||
std::wstring keep = val;
|
||||
XmlUtils::replace_all(val, L"\"", L"");
|
||||
|
||||
pFind->second->formula1 = converter.convert(val);
|
||||
|
||||
if ( std::wstring::npos != val.find(L";") )//convert formula replacing ; on ,
|
||||
if ( (std::wstring::npos != val.find(L";")) || //convert formula replacing ; on ,
|
||||
L"\"" + pFind->second->formula1 + L"\"" == keep)
|
||||
{
|
||||
pFind->second->formula1 = L"\"" + pFind->second->formula1 + L"\"";
|
||||
}
|
||||
|
||||
@ -44,12 +44,12 @@ public:
|
||||
xlsx_dataValidations_context();
|
||||
~xlsx_dataValidations_context();
|
||||
|
||||
void add(const std::wstring & name, const std::wstring & ref);
|
||||
void add(const std::wstring & name, /*int col, int row*/const std::wstring & ref);
|
||||
void add_formula(const std::wstring & name, const std::wstring & f);
|
||||
void add_help_msg(const std::wstring & name, bool val);
|
||||
void add_error_msg(const std::wstring & name, bool val);
|
||||
|
||||
void activate(const std::wstring & name, const std::wstring & ref);
|
||||
void activate(const std::wstring & name, int col, int row/*const std::wstring & ref*/);
|
||||
|
||||
void serialize(std::wostream & _Wostream);
|
||||
private:
|
||||
|
||||
@ -34,7 +34,6 @@
|
||||
|
||||
#include <xml/simple_xml_writer.h>
|
||||
|
||||
#include <boost/foreach.hpp>
|
||||
#include <boost/functional.hpp>
|
||||
#include <boost/unordered_set.hpp>
|
||||
|
||||
@ -155,10 +154,10 @@ struct compare_xlsx_fills
|
||||
void xlsx_fills::serialize(std::wostream & _Wostream) const
|
||||
{
|
||||
std::vector<xlsx_fill> inst_array;
|
||||
|
||||
BOOST_FOREACH(const xlsx_fill & inst, impl_->fills_)
|
||||
{
|
||||
inst_array.push_back(inst);
|
||||
|
||||
for (boost::unordered_set<xlsx_fill, boost::hash<xlsx_fill>>::iterator it = impl_->fills_.begin(); it != impl_->fills_.end(); ++it)
|
||||
{
|
||||
inst_array.push_back(*it);
|
||||
}
|
||||
|
||||
std::sort(inst_array.begin(), inst_array.end(), compare_xlsx_fills());
|
||||
@ -169,7 +168,7 @@ void xlsx_fills::serialize(std::wostream & _Wostream) const
|
||||
{
|
||||
CP_XML_ATTR(L"count", inst_array.size());
|
||||
|
||||
for (int i = 0; i < inst_array.size(); i++)
|
||||
for (size_t i = 0; i < inst_array.size(); i++)
|
||||
{
|
||||
xlsx_serialize(CP_XML_STREAM(), inst_array[i]);
|
||||
}
|
||||
|
||||
@ -35,7 +35,6 @@
|
||||
|
||||
#include <xml/simple_xml_writer.h>
|
||||
|
||||
#include <boost/foreach.hpp>
|
||||
#include <boost/functional.hpp>
|
||||
#include <boost/unordered_set.hpp>
|
||||
|
||||
@ -79,9 +78,9 @@ void xlsx_fonts::Impl::serialize(std::wostream & _Wostream) const
|
||||
{
|
||||
std::vector<xlsx_font> fonts;
|
||||
|
||||
BOOST_FOREACH(const xlsx_font & fnt, fonts_)
|
||||
for (boost::unordered_set<xlsx_font, boost::hash<xlsx_font>>::iterator it = fonts_.begin(); it != fonts_.end(); ++it)
|
||||
{
|
||||
fonts.push_back(fnt);
|
||||
fonts.push_back(*it);
|
||||
}
|
||||
|
||||
std::sort(fonts.begin(), fonts.end(), compare_xlsx_fonts());
|
||||
@ -91,6 +90,7 @@ void xlsx_fonts::Impl::serialize(std::wostream & _Wostream) const
|
||||
CP_XML_NODE(L"fonts")
|
||||
{
|
||||
CP_XML_ATTR(L"count", fonts.size());
|
||||
|
||||
for (size_t i = 0; i < fonts.size(); ++i)
|
||||
{
|
||||
xlsx_serialize(CP_XML_STREAM(), fonts[i]);
|
||||
|
||||
@ -251,6 +251,11 @@ void xl_files::write(const std::wstring & RootPath)
|
||||
comments_->set_main_document(get_main_document());
|
||||
comments_->write(path);
|
||||
}
|
||||
if (jsaProject_)
|
||||
{
|
||||
rels_files_.add( relationship(L"jsaId", L"http://schemas.onlyoffice.com/jsaProject", L"jsaProject.bin" ) );
|
||||
jsaProject_->write( path );
|
||||
}
|
||||
rels_files_.write(path);
|
||||
}
|
||||
|
||||
@ -313,6 +318,10 @@ void xl_files::add_pivot_table(pivot_table_content_ptr pivot_table)
|
||||
{
|
||||
pivot_table_files_.add_pivot_table(pivot_table);
|
||||
}
|
||||
void xl_files::add_jsaProject(const std::string &content)
|
||||
{
|
||||
jsaProject_ = package::simple_element::create(L"jsaProject.bin", content);
|
||||
}
|
||||
//----------------------------------------------------------------------------------------
|
||||
void xl_pivot_cache_files::add_pivot_cache(pivot_cache_content_ptr pivot_cache)
|
||||
{
|
||||
|
||||
@ -232,6 +232,7 @@ public:
|
||||
void add_charts (chart_content_ptr chart);
|
||||
void add_pivot_cache (pivot_cache_content_ptr cache);
|
||||
void add_pivot_table (pivot_table_content_ptr table);
|
||||
void add_jsaProject (const std::string &content);
|
||||
|
||||
private:
|
||||
rels_files rels_files_;
|
||||
@ -251,6 +252,7 @@ private:
|
||||
element_ptr vml_drawings_;
|
||||
element_ptr comments_;
|
||||
element_ptr connections_;
|
||||
element_ptr jsaProject_;
|
||||
};
|
||||
|
||||
class xlsx_document : public document
|
||||
|
||||
@ -86,6 +86,7 @@ public:
|
||||
struct _field
|
||||
{
|
||||
std::wstring name;
|
||||
bool name_enabled = false;
|
||||
std::wstring display_name;
|
||||
int type = -1;
|
||||
int hierarchy = -1;
|
||||
@ -422,6 +423,8 @@ void xlsx_pivots_context::Impl::sort_fields()
|
||||
|
||||
bool bAddRepeateRow = false;
|
||||
bool bAddRepeateCol = false;
|
||||
bool bShowEmptyCol = true;
|
||||
bool bShowEmptyRow = true;
|
||||
|
||||
int count_items_col = -1, count_items_row = -1;
|
||||
|
||||
@ -479,25 +482,15 @@ void xlsx_pivots_context::Impl::sort_fields()
|
||||
if (count_items_col != current_.fields[i].caches.size())
|
||||
bAddRepeateCol = true;
|
||||
}
|
||||
if (!current_.fields[i].show_empty || !current_.fields[i].repeat_item_labels )
|
||||
bShowEmptyCol = false;
|
||||
|
||||
}
|
||||
else if (current_.fields[i].name_enabled)
|
||||
{
|
||||
count_items_col = 0;
|
||||
bAddRepeateCol = true; //add col axis
|
||||
}
|
||||
//if (current_.fields[i].data_layout)
|
||||
//{
|
||||
// bAddRepeateCol = false;
|
||||
|
||||
// if ((current_.fields[i].name.empty() && (!current_.identify_categories || current_.fields[i].hierarchy >= 0)) ||
|
||||
// current_.fields[i].used_in_referenes )
|
||||
// {
|
||||
// if ((current_.col_fields.empty()) || (current_.col_fields.back() != -2))
|
||||
// {
|
||||
// bAddRepeateCol = true;
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
||||
//if (current_.fields[i].caches.empty())
|
||||
// bEmptyColCache = true;
|
||||
|
||||
|
||||
}break;
|
||||
case 1: // data
|
||||
{
|
||||
@ -547,10 +540,20 @@ void xlsx_pivots_context::Impl::sort_fields()
|
||||
}
|
||||
else
|
||||
{
|
||||
if (count_items_row != current_.fields[i].caches.size())
|
||||
if (count_items_row < current_.fields[i].caches.size())
|
||||
bAddRepeateRow = true;
|
||||
}
|
||||
}
|
||||
else if (current_.fields[i].name_enabled)
|
||||
{
|
||||
count_items_row = 0;
|
||||
bAddRepeateRow = true; //add row axis
|
||||
}
|
||||
if (!current_.fields[i].show_empty)
|
||||
bShowEmptyRow = false;
|
||||
|
||||
if (!current_.fields[i].repeat_item_labels)
|
||||
bAddRepeateCol = false;
|
||||
|
||||
if (current_.fields[i].data_layout)
|
||||
{
|
||||
@ -575,10 +578,10 @@ void xlsx_pivots_context::Impl::sort_fields()
|
||||
i--;
|
||||
}
|
||||
}
|
||||
if (bAddRepeateCol || (count_items_col == 0 && current_.bAxisCol)) ///* || (bEmptyColCache && current_.grand_total < 0)*/?? Financial Execution (template).ods
|
||||
if ((bAddRepeateCol || (count_items_col == 0 && current_.bAxisCol))/* && bShowEmptyCol*/) ///* || (bEmptyColCache && current_.grand_total < 0)*/?? Financial Execution (template).ods
|
||||
current_.col_fields.push_back(-2);
|
||||
|
||||
if (bAddRepeateRow || (count_items_row == 0 && current_.bAxisRow))
|
||||
if ((bAddRepeateRow || (count_items_row == 0 && current_.bAxisRow))/* && bShowEmptyRow*/)
|
||||
current_.row_fields.push_back(-2);
|
||||
}
|
||||
void xlsx_pivots_context::Impl::serialize_view(std::wostream & strm)
|
||||
@ -1296,6 +1299,7 @@ void xlsx_pivots_context::start_field()
|
||||
void xlsx_pivots_context::set_field_name(std::wstring name)
|
||||
{
|
||||
impl_->current_.fields.back().name = name;
|
||||
impl_->current_.fields.back().name_enabled = true;
|
||||
}
|
||||
void xlsx_pivots_context::set_field_display(std::wstring name)
|
||||
{
|
||||
|
||||
@ -30,7 +30,6 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <boost/foreach.hpp>
|
||||
#include "../odf/style_text_properties.h"
|
||||
#include "../odf/style_paragraph_properties.h"
|
||||
|
||||
@ -223,11 +222,11 @@ namespace
|
||||
void xlsx_style_manager::Impl::serialize_xf(std::wostream & _Wostream, const xlsx_xf_array & xfArray, const std::wstring & nodeName)
|
||||
{
|
||||
std::vector<xlsx_xf> xfs_;
|
||||
|
||||
BOOST_FOREACH(const xlsx_xf & xfRecord, xfArray)
|
||||
{
|
||||
xfs_.push_back(xfRecord);
|
||||
}
|
||||
|
||||
for (boost::unordered_set<xlsx_xf, boost::hash<xlsx_xf>>::iterator it = xfArray.begin(); it != xfArray.end(); ++it)
|
||||
{
|
||||
xfs_.push_back(*it);
|
||||
}
|
||||
|
||||
std::sort(xfs_.begin(), xfs_.end(), compare_xlsx_xf());
|
||||
|
||||
|
||||
@ -220,7 +220,9 @@ void xlsx_table_state::start_cell(size_t columnsSpanned, size_t rowsSpanned)
|
||||
|
||||
// в случае если объединение имеет место добавляем запись о нем
|
||||
if (columnsSpanned != 0 || rowsSpanned != 0)
|
||||
xlsx_merge_cells_.add_merge(current_table_column_, current_table_row_, columnsSpanned, rowsSpanned);
|
||||
{
|
||||
xlsx_merge_cells_.add_merge(current_table_column_, current_table_row_, columnsSpanned, rowsSpanned);
|
||||
}
|
||||
|
||||
if ( current_columns_spaned() > 0 )
|
||||
{
|
||||
|
||||
@ -33,7 +33,6 @@
|
||||
#include "xlsx_utils.h"
|
||||
|
||||
#include <boost/lexical_cast.hpp>
|
||||
#include <boost/foreach.hpp>
|
||||
#include <boost/regex.hpp>
|
||||
|
||||
#include <boost/date_time/gregorian/gregorian.hpp>
|
||||
@ -90,14 +89,15 @@ std::wstring getCellAddress(size_t col, size_t row)
|
||||
size_t getColAddressInv(const std::wstring & a_)
|
||||
{
|
||||
std::wstring a = a_;
|
||||
::boost::algorithm::to_upper(a);
|
||||
boost::algorithm::to_upper(a);
|
||||
static const size_t r = (L'Z' - L'A' + 1);
|
||||
size_t mul = 1;
|
||||
bool f = true;
|
||||
size_t res = 0;
|
||||
BOOST_REVERSE_FOREACH(const wchar_t c, a)
|
||||
{
|
||||
size_t v = c - L'A';
|
||||
|
||||
for (int i = a.length() - 1; i >= 0; i--)
|
||||
{
|
||||
size_t v = a[i] - L'A';
|
||||
if (f)
|
||||
f = false;
|
||||
else
|
||||
@ -129,13 +129,12 @@ void splitCellAddress(const std::wstring & a_, std::wstring & col, std::wstring
|
||||
|
||||
boost::algorithm::to_upper(a);
|
||||
|
||||
|
||||
BOOST_FOREACH(wchar_t c, a)
|
||||
{
|
||||
if (c >= L'0' && c <= L'9')
|
||||
row +=c;
|
||||
for (size_t i = 0; i < a.length(); i++)
|
||||
{
|
||||
if (a[i] >= L'0' && a[i] <= L'9')
|
||||
row += a[i];
|
||||
else
|
||||
col += c;
|
||||
col += a[i];
|
||||
}
|
||||
std::reverse(col.begin(), col.end());
|
||||
std::reverse(row.begin(), row.end());
|
||||
|
||||
@ -755,7 +755,13 @@ void xlsx_conversion_context::set_conditional_format_dataBar (_CP_OPT(int) min,
|
||||
{
|
||||
get_table_context().state()->get_conditionalFormatting_context().set_dataBar(min, max);
|
||||
}
|
||||
|
||||
void xlsx_conversion_context::add_jsaProject(const std::string &content)
|
||||
{
|
||||
if (content.empty()) return;
|
||||
|
||||
output_document_->get_xl_files().add_jsaProject(content);
|
||||
output_document_->get_content_types_file().add_or_find_default(L"bin");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -156,6 +156,8 @@ public:
|
||||
void add_conditional_format_color (std::wstring col);
|
||||
void add_conditional_format_entry (int type, std::wstring value);
|
||||
void set_conditional_format_dataBar (_CP_OPT(int) min, _CP_OPT(int) max);
|
||||
|
||||
void add_jsaProject (const std::string &content);
|
||||
//------------------------------------------------------------------------------------
|
||||
|
||||
odf_reader::odf_document * root()
|
||||
|
||||
@ -201,8 +201,8 @@ style_table_cell_properties_attlist calc_table_cell_properties(const style_insta
|
||||
std::vector<const style_table_cell_properties*> props;
|
||||
while (styleInstance)
|
||||
{
|
||||
if (const style_content * content = styleInstance->content())
|
||||
if (const style_table_cell_properties * prop = content->get_style_table_cell_properties())
|
||||
if (style_content * content = styleInstance->content())
|
||||
if (style_table_cell_properties * prop = content->get_style_table_cell_properties())
|
||||
{
|
||||
props.insert(props.begin(), prop);
|
||||
}
|
||||
|
||||
@ -29,8 +29,6 @@
|
||||
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
|
||||
*
|
||||
*/
|
||||
#include <boost/foreach.hpp>
|
||||
|
||||
#include "../docx/xlsx_textcontext.h"
|
||||
#include "../docx/xlsx_num_format_context.h"
|
||||
|
||||
@ -61,17 +59,17 @@ class office_element;
|
||||
typedef shared_ptr<const office_element>::Type office_element_ptr_const;
|
||||
|
||||
#define ACCEPT_ALL_CONTENT(VAL) \
|
||||
BOOST_FOREACH(office_element_ptr & elm, (VAL)) \
|
||||
for (size_t ii = 0; ii < VAL.size(); ++ii) \
|
||||
{ \
|
||||
if (elm) \
|
||||
elm->accept(*this); \
|
||||
if (VAL[ii]) \
|
||||
VAL[ii]->accept(*this); \
|
||||
}
|
||||
|
||||
#define ACCEPT_ALL_CONTENT_CONST(VAL) \
|
||||
BOOST_FOREACH(const office_element_ptr_const & elm, (VAL)) \
|
||||
for (size_t ii = 0; ii < VAL.size(); ++ii) \
|
||||
{ \
|
||||
if (elm) \
|
||||
elm->accept(*this); \
|
||||
if (VAL[ii]) \
|
||||
VAL[ii]->accept(*this); \
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -50,7 +50,7 @@ std::wostream & operator << (std::wostream & _Wostream, const style_repeat & _Va
|
||||
case style_repeat::Stretch:
|
||||
_Wostream << L"stretch";
|
||||
break;
|
||||
default:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return _Wostream;
|
||||
@ -67,9 +67,10 @@ style_repeat style_repeat::parse(const std::wstring & Str)
|
||||
return style_repeat( Repeat );
|
||||
else if (tmp == L"stretch")
|
||||
return style_repeat( Stretch );
|
||||
else
|
||||
else if (tmp == L"scale")//LOWriter-form-controls modded.odt
|
||||
return style_repeat( Stretch );
|
||||
else
|
||||
{
|
||||
BOOST_THROW_EXCEPTION( errors::invalid_attribute() );
|
||||
return style_repeat( NoRepeat );
|
||||
}
|
||||
}
|
||||
|
||||
@ -73,7 +73,9 @@ text_transform text_transform::parse(const std::wstring & Str)
|
||||
return text_transform(Uppercase);
|
||||
else if (tmp == L"capitalize")
|
||||
return text_transform(Capitalize);
|
||||
else
|
||||
else if (tmp == L"underline")
|
||||
return text_transform(Underline);
|
||||
else
|
||||
{
|
||||
BOOST_THROW_EXCEPTION( errors::invalid_attribute() );
|
||||
return None;
|
||||
|
||||
@ -52,7 +52,8 @@ public:
|
||||
None,
|
||||
Lowercase,
|
||||
Uppercase,
|
||||
Capitalize
|
||||
Capitalize,
|
||||
Underline
|
||||
};
|
||||
|
||||
text_transform()
|
||||
|
||||
@ -39,21 +39,22 @@ namespace odf_reader {
|
||||
class document_context::Impl
|
||||
{
|
||||
public:
|
||||
Impl() : last_paragraph_(NULL) {}
|
||||
Impl() : last_element_(NULL) {}
|
||||
|
||||
public:
|
||||
void set_last_paragraph(text::paragraph * Paragraph)
|
||||
void set_last_element(office_element* elem)
|
||||
{
|
||||
last_paragraph_ = Paragraph;
|
||||
last_element_ = elem;
|
||||
}
|
||||
|
||||
text::paragraph * get_last_paragraph()
|
||||
office_element* get_last_element()
|
||||
{
|
||||
return last_paragraph_;
|
||||
return last_element_;
|
||||
}
|
||||
|
||||
private:
|
||||
text::paragraph * last_paragraph_;
|
||||
office_element * last_element_;
|
||||
|
||||
|
||||
};
|
||||
|
||||
@ -68,18 +69,15 @@ document_context::~document_context()
|
||||
{
|
||||
delete impl_;
|
||||
}
|
||||
|
||||
void document_context::set_last_paragraph(text::paragraph * Paragraph)
|
||||
void document_context::set_last_element(office_element* elem)
|
||||
{
|
||||
return impl_->set_last_paragraph(Paragraph);
|
||||
return impl_->set_last_element(elem);
|
||||
}
|
||||
|
||||
text::paragraph * document_context::get_last_paragraph()
|
||||
office_element* document_context::get_last_element()
|
||||
{
|
||||
return impl_->get_last_paragraph();
|
||||
return impl_->get_last_element();
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -36,18 +36,14 @@ namespace odf_reader {
|
||||
|
||||
class office_element;
|
||||
|
||||
namespace text {
|
||||
class paragraph;
|
||||
}
|
||||
|
||||
class document_context
|
||||
{
|
||||
public:
|
||||
document_context();
|
||||
virtual ~document_context();
|
||||
|
||||
void set_last_paragraph(text::paragraph * Paragraph);
|
||||
text::paragraph * get_last_paragraph();
|
||||
void set_last_element(office_element* elem);
|
||||
office_element* get_last_element();
|
||||
|
||||
int level;
|
||||
|
||||
|
||||
@ -774,6 +774,20 @@ void common_draw_docx_convert(oox::docx_conversion_context & Context, union_comm
|
||||
style_instance * defaultStyle = Context.root()->odf_context().styleContainer().style_default_by_type(odf_types::style_family::Graphic);
|
||||
if (defaultStyle)instances.push_back(defaultStyle);
|
||||
}
|
||||
else if (styleInst->content())
|
||||
{
|
||||
style_paragraph_properties *para_props = styleInst->content()->get_style_paragraph_properties();
|
||||
if ((para_props) && (para_props->content_.style_writing_mode_))
|
||||
{
|
||||
switch(para_props->content_.style_writing_mode_->get_type())
|
||||
{
|
||||
case writing_mode::TbLr:
|
||||
drawing->additional.push_back(odf_reader::_property(L"text_vert", 2)); break;
|
||||
case writing_mode::TbRl:
|
||||
drawing->additional.push_back(odf_reader::_property(L"text_vert", 1)); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
instances.push_back(styleInst);
|
||||
}
|
||||
@ -870,7 +884,7 @@ void common_draw_docx_convert(oox::docx_conversion_context & Context, union_comm
|
||||
}
|
||||
|
||||
}
|
||||
drawing->number_wrapped_paragraphs=graphicProperties.style_number_wrapped_paragraphs_.
|
||||
drawing->number_wrapped_paragraphs = graphicProperties.style_number_wrapped_paragraphs_.
|
||||
get_value_or( integer_or_nolimit( integer_or_nolimit::NoLimit) ).get_value();
|
||||
if (anchor && anchor->get_type() == anchor_type::AsChar && drawing->posOffsetV< 0)
|
||||
{
|
||||
@ -1232,7 +1246,7 @@ void draw_text_box::docx_convert(oox::docx_conversion_context & Context)
|
||||
|
||||
const std::wstring & content = Context.get_drawing_context().get_text_stream_frame();
|
||||
|
||||
drawing->additional.push_back(_property(L"text-content",content));
|
||||
drawing->additional.push_back(_property(L"text-content", content));
|
||||
Context.get_drawing_context().clear_stream_frame();
|
||||
|
||||
/////////
|
||||
@ -1255,7 +1269,19 @@ void draw_text_box::docx_convert(oox::docx_conversion_context & Context)
|
||||
//}
|
||||
auto_fit_shape = true;
|
||||
}
|
||||
|
||||
else if ((frame->draw_frame_attlist_.fo_min_height_) && (draw_text_box_attlist_.fo_min_height_->get_type()==length_or_percent::Length))
|
||||
{
|
||||
size_t min_y = get_value_emu(frame->draw_frame_attlist_.fo_min_height_->get_length());
|
||||
if (drawing->cy < min_y)
|
||||
{
|
||||
drawing->cy = min_y;
|
||||
}
|
||||
auto_fit_shape = true;
|
||||
}
|
||||
else if ((frame->common_draw_attlists_.rel_size_.style_rel_height_) && (frame->common_draw_attlists_.rel_size_.style_rel_height_->get_type() == percent_or_scale::ScaleMin))
|
||||
{
|
||||
auto_fit_shape = true;
|
||||
}
|
||||
|
||||
if ((draw_text_box_attlist_.fo_min_width_) && (draw_text_box_attlist_.fo_min_width_->get_type()==length_or_percent::Length))
|
||||
{
|
||||
@ -1290,6 +1316,12 @@ void draw_text_box::docx_convert(oox::docx_conversion_context & Context)
|
||||
}
|
||||
else if (auto_fit_text)
|
||||
drawing->additional.push_back(_property(L"fit-to-size", auto_fit_text));
|
||||
|
||||
if (drawing->cx < 1 && drawing->cy < 1)
|
||||
{
|
||||
drawing->cx = 10;
|
||||
drawing->cy = 10;
|
||||
}
|
||||
}
|
||||
void draw_g::docx_convert(oox::docx_conversion_context & Context)
|
||||
{
|
||||
@ -1413,8 +1445,7 @@ void draw_frame::docx_convert(oox::docx_conversion_context & Context)
|
||||
Context.get_drawing_context().start_frame(this);
|
||||
|
||||
const _CP_OPT(std::wstring) name =
|
||||
common_draw_attlists_.shape_with_text_and_styles_.
|
||||
common_shape_draw_attlist_.draw_name_;
|
||||
common_draw_attlists_.shape_with_text_and_styles_.common_shape_draw_attlist_.draw_name_;
|
||||
|
||||
Context.get_drawing_context().add_name_object(name.get_value_or(L"Object"));
|
||||
|
||||
@ -1642,6 +1673,11 @@ void draw_control::docx_convert(oox::docx_conversion_context & Context)
|
||||
oox::text_forms_context::_state & state = Context.get_forms_context().get_state_element(*control_id_);
|
||||
if (state.id.empty()) return;
|
||||
|
||||
if ((state.type == 6 || state.type == 4) && state.element)
|
||||
{
|
||||
return state.element->docx_convert_sdt(Context, this);
|
||||
}
|
||||
|
||||
Context.get_drawing_context().start_shape(NULL);
|
||||
Context.get_drawing_context().add_name_object(state.name.empty() ? L"Control" : state.name);
|
||||
|
||||
@ -1694,7 +1730,7 @@ void draw_control::docx_convert(oox::docx_conversion_context & Context)
|
||||
|
||||
Context.add_new_run(L"");
|
||||
Context.output_stream() << L"<w:t xml:space=\"preserve\">";
|
||||
Context.output_stream() << xml::utils::replace_text_to_xml( text );
|
||||
Context.output_stream() << xml::utils::replace_text_to_xml( text, true );
|
||||
Context.output_stream() << L"</w:t>";
|
||||
Context.finish_run();
|
||||
}
|
||||
|
||||
@ -37,7 +37,6 @@
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
|
||||
#include <boost/foreach.hpp>
|
||||
#include <boost/regex.h>
|
||||
|
||||
#include <xml/xmlchar.h>
|
||||
@ -438,9 +437,9 @@ int draw_enhanced_geometry::parsing(_CP_OPT(std::wstring) val)
|
||||
int pos = 0, res = -1;
|
||||
if (!val) return res;
|
||||
|
||||
BOOST_FOREACH(wchar_t c, val.get())
|
||||
for (size_t i = 0; i < val->length(); i++)
|
||||
{
|
||||
if (c < L'0' && c > L'9')
|
||||
if (val->at(i) < L'0' && val->at(i) > L'9')
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
@ -32,7 +32,6 @@
|
||||
|
||||
#include "number_style.h"
|
||||
|
||||
#include <boost/foreach.hpp>
|
||||
#include <odf/odf_document.h>
|
||||
|
||||
#include <xml/xmlchar.h>
|
||||
@ -78,10 +77,10 @@ void number_style_base::oox_convert_impl(oox::num_format_context & Context)
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_FOREACH(const office_element_ptr & elm, content_)
|
||||
for (size_t i = 0; i < content_.size(); i++)
|
||||
{
|
||||
number_style_base *number_style_ = dynamic_cast<number_style_base *> (elm.get());
|
||||
number_element *number_element_ = dynamic_cast<number_element *> (elm.get());
|
||||
number_style_base *number_style_ = dynamic_cast<number_style_base *> (content_[i].get());
|
||||
number_element *number_element_ = dynamic_cast<number_element *> (content_[i].get());
|
||||
|
||||
if (number_style_) number_style_->oox_convert(Context);
|
||||
if (number_element_) number_element_->oox_convert(Context);
|
||||
@ -93,9 +92,9 @@ void number_style_base::oox_convert(oox::num_format_context & Context)
|
||||
{
|
||||
if (!style_map_.empty())
|
||||
{
|
||||
BOOST_FOREACH(const office_element_ptr & elm, style_map_)
|
||||
{
|
||||
if (const style_map * styleMap = dynamic_cast<const style_map *>(elm.get()))
|
||||
for (size_t i = 0; i < style_map_.size(); i++)
|
||||
{
|
||||
if (const style_map * styleMap = dynamic_cast<const style_map *>(style_map_[i].get()))
|
||||
{
|
||||
const std::wstring applyStyleName = styleMap->style_apply_style_name_;
|
||||
const std::wstring condition = styleMap->style_condition_;
|
||||
@ -309,12 +308,13 @@ void number_currency_symbol::add_text(const std::wstring & Text)
|
||||
void number_currency_symbol::oox_convert(oox::num_format_context & Context)
|
||||
{
|
||||
std::wostream & strm = Context.output();
|
||||
strm << L"[$";//xml::utils::replace_text_to_xml(L"\"");
|
||||
BOOST_FOREACH(const std::wstring & t, text_)
|
||||
strm << L"[$";
|
||||
|
||||
for (size_t i = 0; i < text_.size(); i++)
|
||||
{
|
||||
strm << xml::utils::replace_text_to_xml(t);
|
||||
strm << xml::utils::replace_text_to_xml(text_[i]);
|
||||
}
|
||||
strm << L"]";;//xml::utils::replace_text_to_xml(L"\"");
|
||||
strm << L"]";
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -110,6 +110,23 @@ content_xml_t_ptr odf_document::Impl::read_file_content(xml::sax * reader_owner)
|
||||
|
||||
return result;
|
||||
}
|
||||
std::string odf_document::Impl::read_binary(const std::wstring & Path)
|
||||
{
|
||||
std::string result;
|
||||
|
||||
NSFile::CFileBinary file;
|
||||
if (file.OpenFile(Path))
|
||||
{
|
||||
DWORD size = file.GetFileSize();
|
||||
result.resize(size);
|
||||
|
||||
file.ReadFile((BYTE*)result.c_str(), size, size);
|
||||
file.CloseFile();
|
||||
|
||||
result[size] = 0;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
content_xml_t_ptr odf_document::Impl::read_file_content(const std::wstring & Path)
|
||||
{
|
||||
@ -200,6 +217,8 @@ odf_document::Impl::Impl(const std::wstring & srcPath, const std::wstring & temp
|
||||
std::wstring styles_xml = base_folder_ + FILE_SEPARATOR_STR + L"styles.xml";
|
||||
std::wstring meta_xml = base_folder_ + FILE_SEPARATOR_STR + L"meta.xml";
|
||||
std::wstring settings_xml = base_folder_ + FILE_SEPARATOR_STR + L"settings.xml";
|
||||
|
||||
std::wstring jsaProject_bin = base_folder_ + FILE_SEPARATOR_STR + L"jsaProject.bin";
|
||||
|
||||
//-----------------------------------------------------------------------------------------------------
|
||||
_CP_LOG << L"[info] read settings.xml" << std::endl;
|
||||
@ -208,11 +227,13 @@ odf_document::Impl::Impl(const std::wstring & srcPath, const std::wstring & temp
|
||||
_CP_LOG << L"[info] read content.xml" << std::endl;
|
||||
content_xml_ = read_file_content(content_xml);
|
||||
|
||||
_CP_LOG << L"[info] read styles.xml" << std::endl;
|
||||
_CP_LOG << L"[info] read styles.xml" << std::endl;
|
||||
styles_xml_ = read_file_content(styles_xml);
|
||||
|
||||
_CP_LOG << L"[info] read meta.xml" << std::endl;
|
||||
_CP_LOG << L"[info] read meta.xml" << std::endl;
|
||||
meta_xml_ = read_file_content(meta_xml);
|
||||
|
||||
jsaProject_bin_ = read_binary(jsaProject_bin);
|
||||
//----------------------------------------------------------------------------------------
|
||||
_CP_LOG << L"[info] parse fonts" << std::endl;
|
||||
parse_fonts(content_xml_ ? content_xml_->get_content() : NULL);
|
||||
@ -275,9 +296,20 @@ bool odf_document::Impl::decrypt_folder (const std::wstring &password, const std
|
||||
if (false == result)
|
||||
break;
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
NSFile::CFileBinary::Copy(arFiles[i], dstPath + FILE_SEPARATOR_STR + sFileName);
|
||||
pFind = map_encryptions_extra_.find(arFiles[i]);
|
||||
if ( pFind != map_encryptions_.end() )
|
||||
{
|
||||
result = decrypt_file(password, arFiles[i], dstPath + FILE_SEPARATOR_STR + sFileName, pFind->second.first, pFind->second.second);
|
||||
|
||||
if (false == result)
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
NSFile::CFileBinary::Copy(arFiles[i], dstPath + FILE_SEPARATOR_STR + sFileName);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (size_t i = 0; result && i < arDirectories.size(); ++i)
|
||||
@ -552,7 +584,14 @@ void odf_document::Impl::parse_manifests(office_element *element)
|
||||
XmlUtils::replace_all( file_path, L"/", FILE_SEPARATOR_STR);
|
||||
file_path = base_folder_ + FILE_SEPARATOR_STR + file_path;
|
||||
|
||||
map_encryptions_.insert(std::make_pair(file_path, std::make_pair(entry->encryption_data_, entry->size)));
|
||||
if (0 == entry->full_path_.find(L"Basic/")) //Cuaderno de notas 1.2.ods
|
||||
{
|
||||
map_encryptions_extra_.insert(std::make_pair(file_path, std::make_pair(entry->encryption_data_, entry->size)));
|
||||
}
|
||||
else
|
||||
{
|
||||
map_encryptions_.insert(std::make_pair(file_path, std::make_pair(entry->encryption_data_, entry->size)));
|
||||
}
|
||||
}
|
||||
|
||||
if (entry->full_path_ == L"/")
|
||||
@ -1054,6 +1093,8 @@ bool odf_document::Impl::docx_convert(oox::docx_conversion_context & Context)
|
||||
Context.process_list_styles();
|
||||
if (UpdateProgress(850000)) return false;
|
||||
|
||||
Context.add_jsaProject(jsaProject_bin_);
|
||||
|
||||
return true;
|
||||
}
|
||||
bool odf_document::Impl::xlsx_convert(oox::xlsx_conversion_context & Context)
|
||||
@ -1078,6 +1119,7 @@ bool odf_document::Impl::xlsx_convert(oox::xlsx_conversion_context & Context)
|
||||
Context.process_styles();
|
||||
if (UpdateProgress(800000)) return false;
|
||||
|
||||
Context.add_jsaProject(jsaProject_bin_);
|
||||
}
|
||||
catch(boost::exception & ex)
|
||||
{
|
||||
@ -1123,6 +1165,8 @@ bool odf_document::Impl::pptx_convert(oox::pptx_conversion_context & Context)
|
||||
|
||||
Context.end_document();
|
||||
if (UpdateProgress(850000)) return false;
|
||||
|
||||
Context.add_jsaProject(jsaProject_bin_);
|
||||
}
|
||||
catch(boost::exception & ex)
|
||||
{
|
||||
|
||||
@ -80,7 +80,9 @@ public:
|
||||
|
||||
int get_office_mime_type() {return office_mime_type_;}
|
||||
|
||||
bool get_encrypted() {return (false == map_encryptions_.empty());}
|
||||
bool get_encrypted() {return (false == map_encryptions_.empty());}
|
||||
bool get_encrypted_extra() {return (false == map_encryptions_extra_.empty());}
|
||||
|
||||
bool get_error() {return bError;}
|
||||
|
||||
bool UpdateProgress(long Complete);
|
||||
@ -101,11 +103,15 @@ private:
|
||||
bool decrypt_folder (const std::wstring &password, const std::wstring & srcPath, const std::wstring & dstPath);
|
||||
bool decrypt_file (const std::wstring &password, const std::wstring & srcPath, const std::wstring & dstPath, office_element_ptr data, int size );
|
||||
|
||||
content_xml_t_ptr content_xml_;
|
||||
content_xml_t_ptr styles_xml_;
|
||||
content_xml_t_ptr meta_xml_;
|
||||
content_xml_t_ptr settings_xml_;
|
||||
content_xml_t_ptr manifest_xml_;
|
||||
std::string read_binary(const std::wstring & Path);
|
||||
|
||||
content_xml_t_ptr content_xml_;
|
||||
content_xml_t_ptr styles_xml_;
|
||||
content_xml_t_ptr meta_xml_;
|
||||
content_xml_t_ptr settings_xml_;
|
||||
content_xml_t_ptr manifest_xml_;
|
||||
|
||||
std::string jsaProject_bin_;
|
||||
|
||||
std::wstring mimetype_content_file_;
|
||||
|
||||
@ -118,7 +124,8 @@ private:
|
||||
int GetMimetype(std::wstring value);
|
||||
|
||||
std::map<std::wstring, std::pair<office_element_ptr, int>> map_encryptions_;
|
||||
|
||||
std::map<std::wstring, std::pair<office_element_ptr, int>> map_encryptions_extra_;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@ -71,7 +71,7 @@ style_instance::style_instance(
|
||||
|
||||
style_instance * styles_container::hyperlink_style()
|
||||
{
|
||||
if (hyperlink_style_pos_ > 0)
|
||||
if (hyperlink_style_pos_ > 0 && hyperlink_style_pos_ < instances_.size())
|
||||
return instances_[hyperlink_style_pos_].get();
|
||||
else
|
||||
return NULL;
|
||||
@ -450,7 +450,7 @@ const page_layout_instance * page_layout_container::page_layout_first() const
|
||||
bool page_layout_container::compare_page_properties(const std::wstring & master1, const std::wstring & master2)
|
||||
{
|
||||
const page_layout_instance *page_layout1 = page_layout_by_style(master1);
|
||||
const page_layout_instance *page_layout2 = page_layout_by_style(master1);
|
||||
const page_layout_instance *page_layout2 = page_layout_by_style(master2);
|
||||
|
||||
if (!page_layout1 || !page_layout2) return true;
|
||||
if (!page_layout1->style_page_layout_ || !page_layout1->style_page_layout_) return true;
|
||||
@ -458,7 +458,9 @@ bool page_layout_container::compare_page_properties(const std::wstring & master1
|
||||
style_page_layout_properties *props1 = dynamic_cast<style_page_layout_properties*>(page_layout1->style_page_layout_->style_page_layout_properties_.get());
|
||||
style_page_layout_properties *props2 = dynamic_cast<style_page_layout_properties*>(page_layout2->style_page_layout_->style_page_layout_properties_.get());
|
||||
|
||||
if (!props1 || !props1) return true;
|
||||
if (!props1 || !props2) return true;
|
||||
|
||||
if (props1 == props2) return true;
|
||||
|
||||
return props1->attlist_.compare(props2->attlist_);
|
||||
}
|
||||
|
||||
@ -148,7 +148,7 @@ void office_annotation::docx_convert(oox::docx_conversion_context & Context)
|
||||
Context.set_run_state(runState);
|
||||
Context.set_paragraph_state(pState);
|
||||
|
||||
Context.get_comments_context().start_comment(temp_stream.str(), author,date);//content, date, author
|
||||
Context.get_comments_context().start_comment(temp_stream.str(), author, date, runState);//content, date, author
|
||||
|
||||
Context.dump_hyperlinks(Context.get_comments_context().get_rels(), oox::hyperlinks::comment_place);
|
||||
|
||||
|
||||
@ -142,14 +142,14 @@ void office_body::docx_convert(oox::docx_conversion_context & Context)
|
||||
if (content_)
|
||||
content_->docx_convert(Context);
|
||||
|
||||
if (!Context.get_section_context().dump_.empty() && !Context.get_table_context().in_table())
|
||||
if (false == Context.get_section_context().dump_.empty() && false == Context.get_table_context().in_table())
|
||||
{
|
||||
Context.output_stream() << Context.get_section_context().dump_;
|
||||
Context.get_section_context().dump_.clear();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (page_layout_instance * lastPageLayout = Context.root()->odf_context().pageLayoutContainer().page_layout_by_name(Context.get_page_properties()))
|
||||
if (page_layout_instance *lastPageLayout = Context.root()->odf_context().pageLayoutContainer().page_layout_by_name(Context.get_page_properties()))
|
||||
{
|
||||
Context.next_dump_page_properties(true);
|
||||
|
||||
|
||||
@ -34,7 +34,6 @@
|
||||
#include <vector>
|
||||
|
||||
#include <CPSharedPtr.h>
|
||||
#include <CPWeakPtr.h>
|
||||
#include <xml/xmlelement.h>
|
||||
#include <common/readdocelement.h>
|
||||
|
||||
@ -47,16 +46,17 @@
|
||||
#include "visitor.h"
|
||||
#include "../conversionelement.h"
|
||||
|
||||
#include "documentcontext.h"
|
||||
|
||||
#include "../../../Common/DocxFormat/Source/XML/Utils.h"
|
||||
|
||||
namespace cpdoccore {
|
||||
namespace odf_reader {
|
||||
|
||||
class document_context;
|
||||
|
||||
class office_element;
|
||||
|
||||
typedef shared_ptr<office_element>::Type office_element_ptr;
|
||||
typedef weak_ptr<office_element>::Type office_element_weak_ptr;
|
||||
typedef std::vector<office_element_ptr> office_element_ptr_array;
|
||||
|
||||
class office_element : public xml::element<wchar_t>,
|
||||
@ -69,17 +69,49 @@ public:
|
||||
|
||||
virtual ElementType get_type() const = 0;
|
||||
virtual ~office_element() = 0;
|
||||
|
||||
void set_root(bool isRoot) { is_root_ = isRoot; }
|
||||
bool is_root() const { return is_root_; }
|
||||
|
||||
virtual void afterCreate() {};
|
||||
virtual void afterReadContent() {};
|
||||
virtual void afterCreate()
|
||||
{
|
||||
if (!context_) return;
|
||||
|
||||
ElementType type_ = this->get_type();
|
||||
|
||||
if (type_ != typeTextSection)
|
||||
{
|
||||
context_->level++;
|
||||
}
|
||||
}
|
||||
virtual void afterReadContent()
|
||||
{
|
||||
if (!context_) return;
|
||||
|
||||
ElementType type_ = this->get_type();
|
||||
|
||||
if (type_ != typeTextSection)
|
||||
{
|
||||
if (context_->level == 4)
|
||||
{
|
||||
if (office_element * prev= context_->get_last_element())
|
||||
{
|
||||
prev->next_element_style_name = element_style_name;
|
||||
}
|
||||
|
||||
context_->set_last_element(this);
|
||||
}
|
||||
context_->level--;
|
||||
}
|
||||
}
|
||||
|
||||
CPDOCCORE_DEFINE_VISITABLE();
|
||||
|
||||
void setContext(document_context * Context) { context_ = Context; }
|
||||
|
||||
public:
|
||||
_CP_OPT(std::wstring) element_style_name;
|
||||
_CP_OPT(std::wstring) next_element_style_name; //for master page
|
||||
|
||||
virtual std::wostream & text_to_stream(std::wostream & _Wostream) const
|
||||
{
|
||||
_CP_LOG << L"[warning] use base text_to_stream\n";
|
||||
@ -92,8 +124,7 @@ public:
|
||||
return _Wostream;
|
||||
}
|
||||
document_context * getContext() { return context_; }
|
||||
//
|
||||
//protected:
|
||||
|
||||
const document_context * getContext() const { return context_; }
|
||||
|
||||
private:
|
||||
|
||||
@ -406,12 +406,81 @@ void form_combobox::add_attributes( const xml::attributes_wc_ptr & Attributes )
|
||||
{
|
||||
form_element::add_attributes(Attributes);
|
||||
}
|
||||
void form_combobox::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
|
||||
{
|
||||
if CP_CHECK_NAME(L"form", L"item")
|
||||
{
|
||||
CP_CREATE_ELEMENT(items_);
|
||||
}
|
||||
else
|
||||
{
|
||||
form_element::add_child_element(Reader, Ns, Name);
|
||||
}
|
||||
}
|
||||
void form_combobox::docx_convert(oox::docx_conversion_context & Context)
|
||||
{
|
||||
Context.get_forms_context().start_element(4);
|
||||
Context.get_forms_context().set_element(dynamic_cast<form_element*>(this));
|
||||
|
||||
form_element::docx_convert(Context);
|
||||
}
|
||||
void form_combobox::docx_convert_sdt(oox::docx_conversion_context & Context, draw_control *draw)
|
||||
{
|
||||
Context.finish_run();
|
||||
Context.output_stream() << L"<w:sdt>";
|
||||
Context.output_stream() << L"<w:sdtPr>";
|
||||
{
|
||||
if (name_)
|
||||
{
|
||||
Context.output_stream() << L"<w:alias w:val=\"" + xml::utils::replace_text_to_xml(*name_) + L"\"/>";
|
||||
}
|
||||
Context.output_stream() << L"<w:id w:val=\"" + std::to_wstring(Context.get_drawing_context().get_current_shape_id()) + L"\"/>";
|
||||
|
||||
Context.output_stream() << L"<w:dropDownList>";
|
||||
|
||||
for (size_t i = 0; i < items_.size(); i++)
|
||||
{
|
||||
form_item* item = dynamic_cast<form_item*>(items_[i].get());
|
||||
if (!item) continue;
|
||||
|
||||
std::wstring displayText = item->text_.empty() ? item->label_ : item->text_;
|
||||
Context.output_stream() << L"<w:listItem w:displayText=\"" << XmlUtils::EncodeXmlString(displayText);
|
||||
Context.output_stream() << L"\" w:value=\"" << XmlUtils::EncodeXmlString(item->label_) << L"\"/>";
|
||||
}
|
||||
|
||||
Context.output_stream() << L"</w:dropDownList>";
|
||||
}
|
||||
Context.output_stream() << L"</w:sdtPr>";
|
||||
Context.output_stream() << L"<w:sdtContent>";
|
||||
{
|
||||
Context.add_new_run(L"");
|
||||
Context.output_stream() << L"<w:t xml:space=\"preserve\">";
|
||||
if (current_value_)
|
||||
{
|
||||
Context.output_stream() << xml::utils::replace_text_to_xml(*current_value_ );
|
||||
}
|
||||
else
|
||||
{
|
||||
Context.output_stream() << L"Select item";
|
||||
}
|
||||
Context.output_stream() << L"</w:t>";
|
||||
Context.finish_run();
|
||||
}
|
||||
Context.output_stream() << L"</w:sdtContent>";
|
||||
Context.output_stream() << L"</w:sdt>";
|
||||
|
||||
if (label_)
|
||||
{
|
||||
Context.add_new_run(L"");
|
||||
Context.output_stream() << L"<w:t xml:space=\"preserve\">";
|
||||
Context.output_stream() << xml::utils::replace_text_to_xml(*label_ );
|
||||
Context.output_stream() << L"</w:t>";
|
||||
Context.finish_run();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// form:listbox
|
||||
//----------------------------------------------------------------------------------
|
||||
const wchar_t * form_listbox::ns = L"form";
|
||||
@ -427,5 +496,83 @@ void form_listbox::docx_convert(oox::docx_conversion_context & Context)
|
||||
|
||||
form_element::docx_convert(Context);
|
||||
}
|
||||
// form:button
|
||||
//----------------------------------------------------------------------------------
|
||||
const wchar_t * form_date::ns = L"form";
|
||||
const wchar_t * form_date::name = L"date";
|
||||
|
||||
void form_date::add_attributes( const xml::attributes_wc_ptr & Attributes )
|
||||
{
|
||||
form_element::add_attributes(Attributes);
|
||||
}
|
||||
void form_date::docx_convert(oox::docx_conversion_context & Context)
|
||||
{
|
||||
Context.get_forms_context().start_element(6);
|
||||
Context.get_forms_context().set_element(dynamic_cast<form_element*>(this));
|
||||
|
||||
form_element::docx_convert(Context);
|
||||
}
|
||||
void form_date::docx_convert_sdt(oox::docx_conversion_context & Context, draw_control *draw)
|
||||
{
|
||||
Context.finish_run();
|
||||
|
||||
Context.output_stream() << L"<w:sdt>";
|
||||
Context.output_stream() << L"<w:sdtPr>";
|
||||
{
|
||||
if (name_)
|
||||
{
|
||||
Context.output_stream() << L"<w:alias w:val=\"" + xml::utils::replace_text_to_xml(*name_) + L"\"/>";
|
||||
}
|
||||
Context.output_stream() << L"<w:id w:val=\"" + std::to_wstring(Context.get_drawing_context().get_current_shape_id()) + L"\"/>";
|
||||
|
||||
Context.output_stream() << L"<w:date>";
|
||||
Context.output_stream() << L"<w:dateFormat w:val=\"\"/>";
|
||||
Context.output_stream() << L"<w:lid w:val=\"en-US\"/>";
|
||||
Context.output_stream() << L"<w:storeMappedDataAs w:val=\"dateTime\"/>";
|
||||
Context.output_stream() << L"<w:calendar w:val=\"gregorian\"/>";
|
||||
Context.output_stream() << L"</w:date>";
|
||||
}
|
||||
Context.output_stream() << L"</w:sdtPr>";
|
||||
Context.output_stream() << L"<w:sdtContent>";
|
||||
{
|
||||
Context.add_new_run(L"");
|
||||
Context.output_stream() << L"<w:t xml:space=\"preserve\">";
|
||||
if (current_value_)
|
||||
{
|
||||
Context.output_stream() << xml::utils::replace_text_to_xml(*current_value_ );
|
||||
}
|
||||
else
|
||||
{
|
||||
Context.output_stream() << L"[Insert date]";
|
||||
}
|
||||
Context.output_stream() << L"</w:t>";
|
||||
Context.finish_run();
|
||||
}
|
||||
Context.output_stream() << L"</w:sdtContent>";
|
||||
Context.output_stream() << L"</w:sdt>";
|
||||
|
||||
if (label_)
|
||||
{
|
||||
Context.add_new_run(L"");
|
||||
Context.output_stream() << L"<w:t xml:space=\"preserve\">";
|
||||
Context.output_stream() << xml::utils::replace_text_to_xml(*label_ );
|
||||
Context.output_stream() << L"</w:t>";
|
||||
Context.finish_run();
|
||||
}
|
||||
}
|
||||
// form:item
|
||||
//----------------------------------------------------------------------------------
|
||||
const wchar_t * form_item::ns = L"form";
|
||||
const wchar_t * form_item::name = L"item";
|
||||
|
||||
void form_item::add_attributes( const xml::attributes_wc_ptr & Attributes )
|
||||
{
|
||||
CP_APPLY_ATTR(L"form:label", label_, std::wstring(L""));
|
||||
}
|
||||
void form_item::add_text(const std::wstring & Text)
|
||||
{
|
||||
text_ = Text;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -337,10 +337,16 @@ public:
|
||||
CPDOCCORE_DEFINE_VISITABLE();
|
||||
|
||||
virtual void docx_convert (oox::docx_conversion_context & Context) ;
|
||||
virtual void docx_convert_sdt (oox::docx_conversion_context & Context, draw_control* draw);
|
||||
private:
|
||||
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
|
||||
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
|
||||
|
||||
public:
|
||||
_CP_OPT(odf_types::Bool) dropdown_;
|
||||
office_element_ptr_array items_;
|
||||
_CP_OPT(int ) size_;
|
||||
|
||||
//form:list-source-type
|
||||
//form:size
|
||||
//form:auto-complete
|
||||
@ -367,10 +373,9 @@ private:
|
||||
|
||||
public:
|
||||
//form:list-source-type
|
||||
//form:size
|
||||
//form:list-source
|
||||
//form:source-cell-range
|
||||
//form:dropdown
|
||||
|
||||
//form:bound-column
|
||||
//form:xforms-list-source
|
||||
//form:multiple
|
||||
@ -380,10 +385,50 @@ public:
|
||||
};
|
||||
CP_REGISTER_OFFICE_ELEMENT2(form_listbox);
|
||||
|
||||
// form:date
|
||||
class form_date : public form_element
|
||||
{
|
||||
public:
|
||||
static const wchar_t * ns;
|
||||
static const wchar_t * name;
|
||||
static const xml::NodeType xml_type = xml::typeElement;
|
||||
static const ElementType type = typeFormDate;
|
||||
CPDOCCORE_DEFINE_VISITABLE();
|
||||
|
||||
virtual void docx_convert (oox::docx_conversion_context & Context) ;
|
||||
virtual void docx_convert_sdt (oox::docx_conversion_context & Context, draw_control* draw);
|
||||
private:
|
||||
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
|
||||
|
||||
public:
|
||||
|
||||
|
||||
};
|
||||
CP_REGISTER_OFFICE_ELEMENT2(form_date);
|
||||
|
||||
// form:item
|
||||
class form_item : public office_element_impl<form_item>
|
||||
{
|
||||
public:
|
||||
static const wchar_t * ns;
|
||||
static const wchar_t * name;
|
||||
static const xml::NodeType xml_type = xml::typeElement;
|
||||
static const ElementType type = typeFormItem;
|
||||
CPDOCCORE_DEFINE_VISITABLE();
|
||||
|
||||
private:
|
||||
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
|
||||
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name){}
|
||||
virtual void add_text(const std::wstring & Text);
|
||||
|
||||
public:
|
||||
std::wstring label_;
|
||||
std::wstring text_;
|
||||
};
|
||||
CP_REGISTER_OFFICE_ELEMENT2(form_item);
|
||||
}
|
||||
}
|
||||
//<form:connection-resource>7.6.2,
|
||||
//<form:date> 13.5.8,
|
||||
//<form:connection-resource>7.6.2,
|
||||
//<form:file> 13.5.5,
|
||||
//<form:fixed-text> 13.5.10,
|
||||
//<form:form> 13.3,
|
||||
|
||||
@ -36,8 +36,10 @@
|
||||
#include <xml/xmlchar.h>
|
||||
#include <xml/attributes.h>
|
||||
#include <xml/utils.h>
|
||||
#include <odf/odf_document.h>
|
||||
|
||||
#include "serialize_elements.h"
|
||||
#include "odfcontext.h"
|
||||
|
||||
namespace cpdoccore {
|
||||
namespace odf_reader {
|
||||
@ -94,17 +96,17 @@ bool is_text_content(const std::wstring & ns, const std::wstring & name)
|
||||
{
|
||||
return true; // all shapes //
|
||||
}
|
||||
else if (ns == L"office" && name == L"forms")
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void office_text::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
|
||||
{
|
||||
if CP_CHECK_NAME(L"office", L"forms")
|
||||
{
|
||||
CP_CREATE_ELEMENT(forms_);
|
||||
}
|
||||
else if CP_CHECK_NAME(L"text", L"tracked-changes")
|
||||
if CP_CHECK_NAME(L"text", L"tracked-changes")
|
||||
{
|
||||
CP_CREATE_ELEMENT(tracked_changes_);
|
||||
}
|
||||
@ -149,13 +151,50 @@ void office_text::docx_convert(oox::docx_conversion_context & Context)
|
||||
if (tracked_changes_)
|
||||
tracked_changes_->docx_convert(Context);
|
||||
|
||||
if (forms_)
|
||||
forms_->docx_convert(Context);
|
||||
//if (forms_)
|
||||
//forms_->docx_convert(Context);
|
||||
|
||||
Context.start_office_text();
|
||||
for (size_t i = 0; i < content_.size(); i++)
|
||||
{
|
||||
content_[i]->docx_convert(Context);
|
||||
if (content_[i]->element_style_name)
|
||||
{
|
||||
std::wstring text___ = *content_[i]->element_style_name;
|
||||
|
||||
const _CP_OPT(std::wstring) masterPageName = Context.root()->odf_context().styleContainer().master_page_name_by_name(*content_[i]->element_style_name);
|
||||
|
||||
if (masterPageName)
|
||||
{
|
||||
std::wstring masterPageNameLayout = Context.root()->odf_context().pageLayoutContainer().page_layout_name_by_style(*masterPageName);
|
||||
|
||||
if (false == masterPageNameLayout.empty())
|
||||
{
|
||||
Context.set_master_page_name(*masterPageName); //проверка на то что тема действительно существует????
|
||||
|
||||
Context.remove_page_properties();
|
||||
Context.add_page_properties(masterPageNameLayout);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (content_[i]->next_element_style_name)
|
||||
{
|
||||
std::wstring text___ = *content_[i]->next_element_style_name;
|
||||
// проверяем не сменится ли свойства страницы.
|
||||
// если да — устанавливаем контексту флаг на то что необходимо в текущем параграфе
|
||||
// распечатать свойства раздела/секции
|
||||
//проверить ... не она ли текущая - может быть прописан дубляж - и тогда разрыв нарисуется ненужный
|
||||
const _CP_OPT(std::wstring) next_masterPageName = Context.root()->odf_context().styleContainer().master_page_name_by_name(*content_[i]->next_element_style_name);
|
||||
|
||||
if ((next_masterPageName) && (Context.get_master_page_name() != *next_masterPageName))
|
||||
{
|
||||
if (false == Context.root()->odf_context().pageLayoutContainer().compare_page_properties(Context.get_master_page_name(), *next_masterPageName))
|
||||
{
|
||||
Context.next_dump_page_properties(true);
|
||||
//is_empty = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
content_[i]->docx_convert(Context);
|
||||
}
|
||||
Context.end_office_text();
|
||||
}
|
||||
|
||||
@ -67,7 +67,7 @@ private:
|
||||
office_element_ptr user_fields_;
|
||||
office_element_ptr variables_;
|
||||
office_element_ptr sequences_;
|
||||
office_element_ptr forms_;
|
||||
//office_element_ptr forms_; -> content
|
||||
|
||||
office_element_ptr_array content_;
|
||||
};
|
||||
|
||||
@ -122,15 +122,23 @@ const wchar_t * text::name = L"";
|
||||
|
||||
std::wostream & text::text_to_stream(std::wostream & _Wostream) const
|
||||
{
|
||||
_Wostream << xml::utils::replace_text_to_xml( text_ );
|
||||
_Wostream << xml::utils::replace_text_to_xml( text_, true );
|
||||
return _Wostream;
|
||||
}
|
||||
|
||||
void text::add_text(const std::wstring & Text)
|
||||
{
|
||||
text_ = Text;
|
||||
text_.reserve(Text.length());
|
||||
for (size_t i =0; i < Text.length(); i++)
|
||||
{
|
||||
if (Text[i] < 0x20) continue;
|
||||
text_ += Text[i];
|
||||
}
|
||||
}
|
||||
text::text(const std::wstring & Text)
|
||||
{
|
||||
add_text(Text);
|
||||
}
|
||||
|
||||
void text::docx_convert(oox::docx_conversion_context & Context)
|
||||
{
|
||||
if (Context.get_process_note() != oox::docx_conversion_context::noNote &&
|
||||
@ -166,7 +174,7 @@ void text::docx_convert(oox::docx_conversion_context & Context)
|
||||
Context.output_stream() << L" xml:space=\"preserve\"";
|
||||
Context.output_stream() << L">";
|
||||
|
||||
Context.output_stream() << xml::utils::replace_text_to_xml( text_ );
|
||||
Context.output_stream() << xml::utils::replace_text_to_xml( text_, true );//0xf4 0x80 0x80 0x81-??? - Gangs_Aff-Neg.odt
|
||||
Context.output_stream() << L"</" << textNode << L">";
|
||||
|
||||
if (add_del_run)
|
||||
@ -1209,10 +1217,21 @@ void sequence_ref::add_attributes( const xml::attributes_wc_ptr & Attributes )
|
||||
}
|
||||
void sequence_ref::add_text(const std::wstring & Text)
|
||||
{
|
||||
content_ = Text;
|
||||
text_ = text::create(Text) ;
|
||||
}
|
||||
void sequence_ref::docx_convert(oox::docx_conversion_context & Context)
|
||||
{
|
||||
std::wstring ref, sequence;
|
||||
if (!ref_name_) return;
|
||||
|
||||
Context.finish_run();
|
||||
Context.output_stream() << L"<w:fldSimple w:instr=\" REF " << *ref_name_ << L" \\h\">";
|
||||
Context.add_new_run();
|
||||
if (text_)
|
||||
text_->docx_convert(Context);
|
||||
Context.finish_run();
|
||||
|
||||
Context.output_stream() << L"</w:fldSimple>";
|
||||
}
|
||||
//------------------------------------------------------------------------------------------------------------
|
||||
const wchar_t * sequence::ns = L"text";
|
||||
@ -1277,8 +1296,8 @@ void sequence::docx_convert(oox::docx_conversion_context & Context)
|
||||
num_format= L"ARABIC"; break;
|
||||
}
|
||||
}
|
||||
|
||||
Context.output_stream() << L"<w:fldSimple w:instr=\" SEQ " << sequence << L" \\* " << num_format << L" \">";
|
||||
Context.start_bookmark(*ref_name_);
|
||||
Context.output_stream() << L"<w:fldSimple w:instr=\" SEQ " << XmlUtils::EncodeXmlString(sequence) << L" \\* " << num_format << L" \">";
|
||||
Context.add_new_run();
|
||||
for (size_t i = 0; i < text_.size(); i++)
|
||||
{
|
||||
@ -1291,6 +1310,8 @@ void sequence::docx_convert(oox::docx_conversion_context & Context)
|
||||
// Context.end_bookmark(ref);
|
||||
//}
|
||||
Context.output_stream() << L"</w:fldSimple>";
|
||||
|
||||
Context.end_bookmark(*ref_name_);
|
||||
}
|
||||
void sequence::pptx_convert(oox::pptx_conversion_context & Context)
|
||||
{
|
||||
@ -1626,17 +1647,23 @@ void bibliography_mark::add_attributes( const xml::attributes_wc_ptr & Attribute
|
||||
CP_APPLY_ATTR(L"text:school", school_);
|
||||
CP_APPLY_ATTR(L"text:series", series_);
|
||||
CP_APPLY_ATTR(L"text:volume", volume_);
|
||||
|
||||
if (std::wstring::npos != identifier_.find(L"CITATION "))
|
||||
{
|
||||
XmlUtils::replace_all(identifier_, L"CITATION ", L"");
|
||||
}
|
||||
XmlUtils::replace_all(identifier_, L" ", L"");
|
||||
XmlUtils::replace_all(identifier_, L"\\", L"");
|
||||
}
|
||||
|
||||
void bibliography_mark::add_text(const std::wstring & Text)
|
||||
{
|
||||
office_element_ptr elm = text::create(Text) ;
|
||||
content_ = elm;
|
||||
text_ = text::create(Text) ;
|
||||
}
|
||||
|
||||
std::wostream & bibliography_mark::text_to_stream(std::wostream & _Wostream) const
|
||||
{
|
||||
CP_SERIALIZE_TEXT(content_);
|
||||
CP_SERIALIZE_TEXT(text_);
|
||||
return _Wostream;
|
||||
}
|
||||
void bibliography_mark::serialize(std::wostream & strm)
|
||||
@ -1805,6 +1832,20 @@ void bibliography_mark::docx_convert(oox::docx_conversion_context & Context)
|
||||
serialize(strm);
|
||||
|
||||
Context.add_bibliography_item(strm.str());
|
||||
|
||||
if (text_)
|
||||
{
|
||||
docx_serialize_field(L"CITATION " + XmlUtils::EncodeXmlString(identifier_), text_, Context, false);
|
||||
//Context.finish_run();
|
||||
//Context.output_stream() << L"<w:fldSimple w:instr=\" CITATION " << content_ << L" \\h\"/>";
|
||||
|
||||
//Context.add_new_run();
|
||||
// content_->docx_convert(Context);
|
||||
//Context.finish_run();
|
||||
|
||||
//Context.output_stream() << L"</w:fldSimple>";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void bibliography_mark::pptx_convert(oox::pptx_conversion_context & Context)
|
||||
@ -1846,12 +1887,22 @@ void alphabetical_index_mark::add_attributes( const xml::attributes_wc_ptr & Att
|
||||
}
|
||||
void alphabetical_index_mark::docx_convert(oox::docx_conversion_context & Context)
|
||||
{
|
||||
if (!string_value_) return;
|
||||
std::wstring value;
|
||||
if (string_value_ && false == string_value_->empty())
|
||||
{
|
||||
if (*string_value_ != L" ")
|
||||
value = *string_value_;
|
||||
}
|
||||
if (value.empty() && key1_)
|
||||
{
|
||||
value = *key1_;
|
||||
}
|
||||
if (value.empty()) return;
|
||||
|
||||
Context.finish_run();
|
||||
|
||||
Context.output_stream() << L"<w:r><w:fldChar w:fldCharType=\"begin\"/></w:r>";
|
||||
Context.output_stream() << L"<w:r><w:instrText> XE \"" << *string_value_ << L"\"</w:instrText></w:r><w:r><w:fldChar w:fldCharType=\"end\"/></w:r>";
|
||||
Context.output_stream() << L"<w:r><w:instrText> XE \"" << XmlUtils::EncodeXmlString(value) << L"\"</w:instrText></w:r><w:r><w:fldChar w:fldCharType=\"end\"/></w:r>";
|
||||
}
|
||||
//-----------------------------------------------------------------------------------------------
|
||||
// text:alphabetical-index-mark-start
|
||||
@ -1999,8 +2050,107 @@ void field_fieldmark_start::add_attributes( const xml::attributes_wc_ptr & Attri
|
||||
CP_APPLY_ATTR(L"text:name", text_name_);
|
||||
CP_APPLY_ATTR(L"field:type", field_type_);
|
||||
}
|
||||
void field_fieldmark_start::docx_convert(oox::docx_conversion_context & Context)
|
||||
{
|
||||
if (!field_type_) return;
|
||||
if (!text_name_) return;
|
||||
|
||||
if (std::wstring::npos != field_type_->find(L"vnd.oasis.opendocument.field."))
|
||||
{
|
||||
Context.start_field(field_type_->substr(29), *text_name_);
|
||||
}
|
||||
else
|
||||
{
|
||||
Context.start_field(*field_type_, *text_name_);
|
||||
}
|
||||
|
||||
}
|
||||
//------------------------------------------------------------------------------------------------------------
|
||||
const wchar_t * field_fieldmark_end::ns = L"field";
|
||||
const wchar_t * field_fieldmark_end::name = L"fieldmark-end";
|
||||
|
||||
void field_fieldmark_end::docx_convert(oox::docx_conversion_context & Context)
|
||||
{
|
||||
Context.end_field();
|
||||
}
|
||||
//------------------------------------------------------------------------------------------------------------
|
||||
const wchar_t * field_fieldmark::ns = L"field";
|
||||
const wchar_t * field_fieldmark::name = L"fieldmark";
|
||||
|
||||
void field_fieldmark::add_attributes( const xml::attributes_wc_ptr & Attributes )
|
||||
{
|
||||
CP_APPLY_ATTR(L"text:name", text_name_);
|
||||
CP_APPLY_ATTR(L"field:type", field_type_);
|
||||
}
|
||||
void field_fieldmark::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
|
||||
{
|
||||
CP_CREATE_ELEMENT(field_params_);
|
||||
}
|
||||
void field_fieldmark::docx_convert(oox::docx_conversion_context & Context)
|
||||
{
|
||||
if (!field_type_) return;
|
||||
if (!text_name_) return;
|
||||
|
||||
if (std::wstring::npos != field_type_->find(L"FORMCHECKBOX"))
|
||||
{
|
||||
XmlUtils::replace_all( *text_name_, L" ", L"_");
|
||||
|
||||
Context.output_stream() << L"<w:r><w:fldChar w:fldCharType=\"begin\"><w:ffData><w:name w:val=\"" << *text_name_ << L"\"/><w:enabled/>";
|
||||
Context.output_stream() << L"<w:checkBox>";
|
||||
//Context.output_stream() << L"<w:default w:val=\"" << std::to_wstring(current_state_) << L"\"/>
|
||||
Context.output_stream() << L"<w:sizeAuto/>";
|
||||
for (size_t i = 0; i < field_params_.size(); i++)
|
||||
{
|
||||
field_param *param = dynamic_cast<field_param*>(field_params_[i].get());
|
||||
if ((param) && (param->field_name_) && (std::wstring::npos != param->field_name_->find(L"Checkbox_Checked")))
|
||||
{
|
||||
odf_types::Bool value = Bool::parse(*param->field_value_);
|
||||
if (value.get())
|
||||
Context.output_stream() << L"<w:checked/>";
|
||||
break;
|
||||
}
|
||||
}
|
||||
Context.output_stream() << L"</w:checkBox></w:ffData>";
|
||||
Context.output_stream() << L"</w:fldChar></w:r>";
|
||||
Context.output_stream() << L"<w:r><w:instrText>FORMCHECKBOX</w:instrText></w:r>";
|
||||
Context.output_stream() << L"<w:r><w:fldChar w:fldCharType=\"separate\"/></w:r>";
|
||||
Context.output_stream() << L"<w:r><w:t>" << L"" << L"</w:t></w:r>";
|
||||
Context.output_stream() << L"<w:r><w:fldChar w:fldCharType=\"end\"/></w:r>";
|
||||
}
|
||||
else if (std::wstring::npos != field_type_->find(L"FORMDROPDOWN"))
|
||||
{
|
||||
std::wostream & strm = Context.output_stream();
|
||||
Context.finish_run();
|
||||
|
||||
strm << L"<w:r><w:fldChar w:fldCharType=\"begin\"><w:ffData><w:name w:val=\"" << text_name_.get_value_or(L"") << L"\"/><w:enabled/>";
|
||||
|
||||
strm << L"<w:ddList><w:result w:val=\"0\"/>";
|
||||
for (size_t i = 0; i < field_params_.size(); i++)
|
||||
{
|
||||
field_params_[i]->docx_convert(Context);
|
||||
}
|
||||
strm << L"</w:ddList></w:ffData>";
|
||||
|
||||
strm << L"</w:fldChar></w:r>";
|
||||
strm << L"<w:r><w:instrText>FORMDROPDOWN</w:instrText></w:r>";
|
||||
strm << L"<w:r><w:fldChar w:fldCharType=\"separate\"/></w:r>";
|
||||
strm << L"<w:r><w:fldChar w:fldCharType=\"end\"/></w:r>";
|
||||
}
|
||||
else if (std::wstring::npos != field_type_->find(L"FORMTEXT"))
|
||||
{
|
||||
}
|
||||
}
|
||||
//------------------------------------------------------------------------------------------------------------
|
||||
const wchar_t * field_param::ns = L"field";
|
||||
const wchar_t * field_param::name = L"param";
|
||||
|
||||
void field_param::add_attributes( const xml::attributes_wc_ptr & Attributes )
|
||||
{
|
||||
CP_APPLY_ATTR(L"field:name", field_name_);
|
||||
CP_APPLY_ATTR(L"field:value", field_value_);
|
||||
}
|
||||
void field_param::docx_convert(oox::docx_conversion_context & Context)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -83,7 +83,7 @@ public:
|
||||
|
||||
bool preserve_;
|
||||
|
||||
text(const std::wstring & Text) : text_(Text) {preserve_ = true;};
|
||||
text(const std::wstring & Text);
|
||||
text() {preserve_ = true;};
|
||||
|
||||
std::wstring text_;
|
||||
@ -891,7 +891,7 @@ public:
|
||||
_CP_OPT(std::wstring) reference_format_;//caption, category-and-value, value, chapter, direction, page, text, number, number-all-superior, number-no-superior
|
||||
_CP_OPT(std::wstring) ref_name_;
|
||||
|
||||
std::wstring content_;
|
||||
office_element_ptr text_;
|
||||
|
||||
private:
|
||||
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
|
||||
@ -1295,7 +1295,7 @@ public:
|
||||
_CP_OPT(std::wstring) series_;
|
||||
_CP_OPT(std::wstring) volume_;
|
||||
|
||||
office_element_ptr content_;
|
||||
office_element_ptr text_;
|
||||
|
||||
private:
|
||||
virtual void add_attributes ( const xml::attributes_wc_ptr & Attributes );
|
||||
@ -1585,11 +1585,13 @@ public:
|
||||
static const wchar_t * ns;
|
||||
static const wchar_t * name;
|
||||
static const xml::NodeType xml_type = xml::typeElement;
|
||||
static const ElementType type = typeTextFieldFieldmarkStart;
|
||||
static const ElementType type = typeFieldFieldmarkStart;
|
||||
CPDOCCORE_DEFINE_VISITABLE();
|
||||
|
||||
_CP_OPT(std::wstring) text_name_;
|
||||
_CP_OPT(std::wstring) field_type_;
|
||||
|
||||
void docx_convert(oox::docx_conversion_context & Context);
|
||||
private:
|
||||
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
|
||||
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name) {}
|
||||
@ -1605,14 +1607,60 @@ public:
|
||||
static const wchar_t * ns;
|
||||
static const wchar_t * name;
|
||||
static const xml::NodeType xml_type = xml::typeElement;
|
||||
static const ElementType type = typeTextFieldFieldmarkStart;
|
||||
static const ElementType type = typeFieldFieldmarkStart;
|
||||
CPDOCCORE_DEFINE_VISITABLE();
|
||||
|
||||
void docx_convert(oox::docx_conversion_context & Context);
|
||||
private:
|
||||
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes ){}
|
||||
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name) {}
|
||||
};
|
||||
CP_REGISTER_OFFICE_ELEMENT2(field_fieldmark_end);
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// field:fieldmark
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
class field_fieldmark : public text::paragraph_content_element<field_fieldmark>
|
||||
{
|
||||
public:
|
||||
static const wchar_t * ns;
|
||||
static const wchar_t * name;
|
||||
static const xml::NodeType xml_type = xml::typeElement;
|
||||
static const ElementType type = typeFieldFieldmark;
|
||||
CPDOCCORE_DEFINE_VISITABLE();
|
||||
|
||||
_CP_OPT(std::wstring) text_name_;
|
||||
_CP_OPT(std::wstring) field_type_;
|
||||
|
||||
office_element_ptr_array field_params_;
|
||||
|
||||
void docx_convert(oox::docx_conversion_context & Context);
|
||||
private:
|
||||
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
|
||||
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name);
|
||||
};
|
||||
CP_REGISTER_OFFICE_ELEMENT2(field_fieldmark);
|
||||
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
// field:param
|
||||
//-------------------------------------------------------------------------------------------------------------------
|
||||
class field_param : public text::paragraph_content_element<field_param>
|
||||
{
|
||||
public:
|
||||
static const wchar_t * ns;
|
||||
static const wchar_t * name;
|
||||
static const xml::NodeType xml_type = xml::typeElement;
|
||||
static const ElementType type = typeFieldParam;
|
||||
CPDOCCORE_DEFINE_VISITABLE();
|
||||
|
||||
_CP_OPT(std::wstring) field_name_;
|
||||
_CP_OPT(std::wstring) field_value_;
|
||||
|
||||
void docx_convert(oox::docx_conversion_context & Context);
|
||||
private:
|
||||
virtual void add_attributes( const xml::attributes_wc_ptr & Attributes );
|
||||
virtual void add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name){}
|
||||
};
|
||||
CP_REGISTER_OFFICE_ELEMENT2(field_param);
|
||||
} // namespace odf_reader
|
||||
} // namespace cpdoccore
|
||||
|
||||
@ -165,162 +165,61 @@ void style_background_image::add_text(const std::wstring & Text)
|
||||
|
||||
void paragraph_format_properties::add_attributes( const xml::attributes_wc_ptr & Attributes )
|
||||
{
|
||||
// 15.5.1
|
||||
CP_APPLY_ATTR(L"fo:line-height", fo_line_height_);
|
||||
|
||||
// 15.5.2
|
||||
CP_APPLY_ATTR(L"style:line-height-at-least", style_line_height_at_least_);
|
||||
|
||||
// 15.5.3
|
||||
CP_APPLY_ATTR(L"style:line-spacing", style_line_spacing_);
|
||||
|
||||
// 15.5.4
|
||||
CP_APPLY_ATTR(L"style:font-independent-line-spacing", style_font_independent_line_spacing_);
|
||||
|
||||
// 15.5.5
|
||||
CP_APPLY_ATTR(L"fo:text-align", fo_text_align_);
|
||||
|
||||
// 15.5.6
|
||||
CP_APPLY_ATTR(L"fo:text-align-last", fo_text_align_last_);
|
||||
|
||||
// 15.5.7
|
||||
CP_APPLY_ATTR(L"style:justify-single-word", style_justify_single_word_);
|
||||
|
||||
// 15.5.8
|
||||
CP_APPLY_ATTR(L"fo:keep-together", fo_keep_together_);
|
||||
|
||||
// 15.5.9
|
||||
CP_APPLY_ATTR(L"fo:widows", fo_widows_);
|
||||
|
||||
// 15.5.10
|
||||
CP_APPLY_ATTR(L"fo:orphans", fo_orphans_);
|
||||
|
||||
// 15.5.11 - Element
|
||||
|
||||
// 15.5.12
|
||||
CP_APPLY_ATTR(L"style:tab-stop-distance", style_tab_stop_distance_);
|
||||
|
||||
// 15.5.13
|
||||
CP_APPLY_ATTR(L"fo:hyphenation-keep", fo_hyphenation_keep_);
|
||||
|
||||
// 15.5.14
|
||||
CP_APPLY_ATTR(L"fo:hyphenation-ladder-count", fo_hyphenation_ladder_count_);
|
||||
|
||||
// 15.5.15 - Element
|
||||
|
||||
// 15.5.16
|
||||
CP_APPLY_ATTR(L"style:register-true", style_register_true_);
|
||||
|
||||
// 15.5.17
|
||||
CP_APPLY_ATTR(L"fo:margin-left", fo_margin_left_);
|
||||
|
||||
//
|
||||
CP_APPLY_ATTR(L"fo:margin-right", fo_margin_right_);
|
||||
|
||||
// 15.5.18
|
||||
CP_APPLY_ATTR(L"fo:text-indent", fo_text_indent_);
|
||||
|
||||
// 15.5.19
|
||||
CP_APPLY_ATTR(L"style:auto-text-indent", style_auto_text_indent_);
|
||||
|
||||
// 15.5.20
|
||||
CP_APPLY_ATTR(L"fo:margin-top", fo_margin_top_);
|
||||
|
||||
//
|
||||
CP_APPLY_ATTR(L"fo:margin-bottom", fo_margin_bottom_);
|
||||
|
||||
// 15.5.21
|
||||
CP_APPLY_ATTR(L"fo:margin", fo_margin_);
|
||||
|
||||
// 15.5.22
|
||||
CP_APPLY_ATTR(L"fo:break-before", fo_break_before_);
|
||||
|
||||
//
|
||||
CP_APPLY_ATTR(L"fo:break-after", fo_break_after_);
|
||||
|
||||
// 15.5.23
|
||||
CP_APPLY_ATTR(L"fo:background-color", fo_background_color_);
|
||||
|
||||
// 15.5.24 - Element
|
||||
|
||||
// 15.5.25
|
||||
CP_APPLY_ATTR(L"fo:border", fo_border_);
|
||||
|
||||
//
|
||||
CP_APPLY_ATTR(L"fo:border", fo_border_);
|
||||
CP_APPLY_ATTR(L"fo:border-top", fo_border_top_);
|
||||
|
||||
//
|
||||
CP_APPLY_ATTR(L"fo:border-bottom", fo_border_bottom_);
|
||||
|
||||
//
|
||||
CP_APPLY_ATTR(L"fo:border-left", fo_border_left_);
|
||||
|
||||
//
|
||||
CP_APPLY_ATTR(L"fo:border-right", fo_border_right_);
|
||||
|
||||
// 15.5.26
|
||||
//
|
||||
CP_APPLY_ATTR(L"style:border-line-width", style_border_line_width_);
|
||||
|
||||
//
|
||||
CP_APPLY_ATTR(L"style:border-line-width-top", style_border_line_width_top_);
|
||||
//
|
||||
CP_APPLY_ATTR(L"style:border-line-width-bottom", style_border_line_width_bottom_);
|
||||
//
|
||||
CP_APPLY_ATTR(L"style:border-line-width-left", style_border_line_width_left_);
|
||||
//
|
||||
CP_APPLY_ATTR(L"style:border-line-width-right", style_border_line_width_right_);
|
||||
|
||||
// 15.5.27
|
||||
//
|
||||
CP_APPLY_ATTR(L"fo:padding", fo_padding_);
|
||||
|
||||
//
|
||||
CP_APPLY_ATTR(L"fo:padding-top", fo_padding_top_);
|
||||
|
||||
//
|
||||
CP_APPLY_ATTR(L"fo:padding-bottom", fo_padding_bottom_);
|
||||
|
||||
//
|
||||
CP_APPLY_ATTR(L"fo:padding-left", fo_padding_left_);
|
||||
|
||||
//
|
||||
CP_APPLY_ATTR(L"fo:padding-right", fo_padding_right_);
|
||||
|
||||
// 15.5.28
|
||||
CP_APPLY_ATTR(L"style:shadow", style_shadow_);
|
||||
|
||||
// 15.5.29
|
||||
CP_APPLY_ATTR(L"fo:keep-with-next", fo_keep_with_next_);
|
||||
|
||||
// 15.5.30
|
||||
CP_APPLY_ATTR(L"text:number-lines", text_number_lines_);
|
||||
|
||||
// 15.5.31
|
||||
CP_APPLY_ATTR(L"text:line-number", text_line_number_);
|
||||
|
||||
// 15.5.32
|
||||
CP_APPLY_ATTR(L"style:text-autospace", style_text_autospace_);
|
||||
|
||||
// 15.5.33
|
||||
CP_APPLY_ATTR(L"style:punctuation-wrap", style_punctuation_wrap_);
|
||||
|
||||
// 15.5.34
|
||||
CP_APPLY_ATTR(L"style:line-break", style_line_break_);
|
||||
|
||||
// 15.5.35
|
||||
CP_APPLY_ATTR(L"style:vertical-align", style_vertical_align_);
|
||||
|
||||
// 15.5.36
|
||||
CP_APPLY_ATTR(L"style:writing-mode", style_writing_mode_);
|
||||
|
||||
// 15.5.37
|
||||
CP_APPLY_ATTR(L"style:writing-mode-automatic", style_writing_mode_automatic_);
|
||||
|
||||
// 15.5.38
|
||||
CP_APPLY_ATTR(L"style:snap-to-layout-grid", style_snap_to_layout_grid_);
|
||||
|
||||
// 15.5.39
|
||||
_CP_OPT(std::wstring) style_page_number_str_;
|
||||
CP_APPLY_ATTR(L"style:page-number", style_page_number_str_);
|
||||
|
||||
@ -331,7 +230,6 @@ void paragraph_format_properties::add_attributes( const xml::attributes_wc_ptr &
|
||||
style_page_number_= boost::lexical_cast<int>(style_page_number_str_.get());
|
||||
}
|
||||
|
||||
// 15.5.40
|
||||
CP_APPLY_ATTR(L"style:background-transparency", style_background_transparency_);
|
||||
|
||||
CP_APPLY_ATTR(L"style:join_border", style_join_border_);
|
||||
@ -391,6 +289,8 @@ void style_paragraph_properties::add_text(const std::wstring & Text)
|
||||
|
||||
void paragraph_format_properties::apply_from(const paragraph_format_properties & Other)
|
||||
{
|
||||
_CP_APPLY_PROP(outline_level_, Other.outline_level_);
|
||||
|
||||
apply_line_width(fo_line_height_, Other.fo_line_height_);
|
||||
_CP_APPLY_PROP(style_line_height_at_least_, Other.style_line_height_at_least_);
|
||||
_CP_APPLY_PROP(style_line_spacing_, Other.style_line_spacing_);
|
||||
|
||||
@ -211,6 +211,8 @@ public:
|
||||
|
||||
void xlsx_convert(std::wostream & strm, bool in_draw);
|
||||
|
||||
_CP_OPT(unsigned int) outline_level_;
|
||||
|
||||
_CP_OPT(odf_types::line_width) fo_line_height_;
|
||||
_CP_OPT(odf_types::length) style_line_height_at_least_;
|
||||
_CP_OPT(odf_types::length) style_line_spacing_;
|
||||
|
||||
@ -207,29 +207,45 @@ void style_table_column_properties::docx_convert(oox::docx_conversion_context &
|
||||
{
|
||||
std::wostream & strm = Context.output_stream();
|
||||
|
||||
double page_width = 0;
|
||||
|
||||
const page_layout_instance * pp = Context.root()->odf_context().pageLayoutContainer().page_layout_first();
|
||||
if ((pp) && (pp->properties()))
|
||||
{
|
||||
style_page_layout_properties_attlist & attr_page = pp->properties()->attlist_;
|
||||
if (attr_page.fo_page_width_)
|
||||
{
|
||||
page_width = attr_page.fo_page_width_->get_value_unit(odf_types::length::pt);
|
||||
}
|
||||
if (attr_page.common_horizontal_margin_attlist_.fo_margin_left_)
|
||||
{
|
||||
page_width -= attr_page.common_horizontal_margin_attlist_.fo_margin_left_->get_length().get_value_unit(odf_types::length::pt);
|
||||
}
|
||||
if (attr_page.common_horizontal_margin_attlist_.fo_margin_right_)
|
||||
{
|
||||
page_width -= attr_page.common_horizontal_margin_attlist_.fo_margin_right_->get_length().get_value_unit(odf_types::length::pt);
|
||||
}
|
||||
}
|
||||
if (attlist_.style_column_width_)
|
||||
{
|
||||
double kf_max_width_ms = 1.;
|
||||
|
||||
const page_layout_instance * pp = Context.root()->odf_context().pageLayoutContainer().page_layout_first();//
|
||||
if ((pp) && (pp->properties()))
|
||||
{
|
||||
style_page_layout_properties_attlist & attr_page = pp->properties()->attlist_;
|
||||
if (attr_page.fo_page_width_)
|
||||
{
|
||||
int val = 0.5 + 20.0 * attr_page.fo_page_width_->get_value_unit(length::pt);
|
||||
if (val > 31680.)
|
||||
kf_max_width_ms = 31680./val;
|
||||
}
|
||||
}
|
||||
int val = 0.5 + 20.0 * page_width;
|
||||
if (val > 31680.)
|
||||
kf_max_width_ms = 31680./val;
|
||||
|
||||
int val = attlist_.style_column_width_->get_value_unit(length::pt);
|
||||
|
||||
double width = 0.5 + 20.0 * val * kf_max_width_ms;
|
||||
double width = 0.5 + 20.0 * attlist_.style_column_width_->get_value_unit(length::pt) * kf_max_width_ms;
|
||||
|
||||
Context.get_table_context().add_column_width(width);
|
||||
strm << L"<w:gridCol w:w=\"" << (int)(width) << "\"/>";
|
||||
}
|
||||
else if ((attlist_.style_rel_column_width_) && (attlist_.style_rel_column_width_->get_unit() == length::rel))
|
||||
{
|
||||
double width = 0.5 + 20.0 * page_width * attlist_.style_rel_column_width_->get_value() / 65534.;
|
||||
|
||||
Context.get_table_context().add_column_width(width);
|
||||
strm << L"<w:gridCol w:w=\"" << (int)(width) << "\"/>";
|
||||
}
|
||||
else
|
||||
{
|
||||
Context.get_table_context().add_column_width(0);
|
||||
|
||||
@ -244,6 +244,8 @@ public:
|
||||
|
||||
CPDOCCORE_DEFINE_VISITABLE();
|
||||
|
||||
style_table_cell_properties() {}
|
||||
|
||||
virtual void docx_convert(oox::docx_conversion_context & Context) ;
|
||||
|
||||
private:
|
||||
|
||||
@ -365,6 +365,7 @@ void text_format_properties_content::drawing_serialize(std::wostream & strm, std
|
||||
CP_XML_ATTR(L"cap", "small");
|
||||
}
|
||||
}
|
||||
std::wstring underline = L"";
|
||||
if (fo_text_transform_)
|
||||
{
|
||||
if (fo_text_transform_->get_type() == text_transform::Uppercase)
|
||||
@ -375,6 +376,10 @@ void text_format_properties_content::drawing_serialize(std::wostream & strm, std
|
||||
{
|
||||
CP_XML_ATTR(L"cap", "small");
|
||||
}
|
||||
else if (fo_text_transform_->get_type() == text_transform::Underline)
|
||||
{
|
||||
underline = L"sng";
|
||||
}
|
||||
}
|
||||
const int W = process_font_weight(fo_font_weight_);
|
||||
if (W > 0) CP_XML_ATTR(L"b", true);
|
||||
@ -382,9 +387,7 @@ void text_format_properties_content::drawing_serialize(std::wostream & strm, std
|
||||
// underline
|
||||
line_width under = style_text_underline_width_.get_value_or(line_width::Auto);
|
||||
bool underlineBold = under.get_type() == line_width::Bold ||
|
||||
under.get_type() == line_width::Thick;
|
||||
|
||||
std::wstring underline = L"";
|
||||
under.get_type() == line_width::Thick;
|
||||
|
||||
if ((style_text_underline_type_ && style_text_underline_type_->get_type() == line_type::None) ||
|
||||
(style_text_underline_style_ && style_text_underline_style_->get_type() == line_style::None))
|
||||
|
||||
@ -176,9 +176,12 @@ style_section_properties * style_content::get_style_section_properties() const
|
||||
return dynamic_cast<style_section_properties *>(style_section_properties_.get());
|
||||
}
|
||||
|
||||
style_table_cell_properties * style_content::get_style_table_cell_properties() const
|
||||
style_table_cell_properties * style_content::get_style_table_cell_properties(bool always)
|
||||
{
|
||||
return dynamic_cast<style_table_cell_properties *>(style_table_cell_properties_.get());
|
||||
if (!style_table_cell_properties_ && always)
|
||||
style_table_cell_properties_ = boost::make_shared<style_table_cell_properties>();
|
||||
|
||||
return dynamic_cast<style_table_cell_properties *>(style_table_cell_properties_.get());
|
||||
}
|
||||
|
||||
style_table_row_properties * style_content::get_style_table_row_properties() const
|
||||
|
||||
@ -96,11 +96,11 @@ public:
|
||||
style_paragraph_properties * get_style_paragraph_properties() const;
|
||||
style_table_properties * get_style_table_properties() const;
|
||||
style_section_properties * get_style_section_properties() const;
|
||||
style_table_cell_properties * get_style_table_cell_properties() const;
|
||||
style_table_row_properties * get_style_table_row_properties() const;
|
||||
style_table_column_properties * get_style_table_column_properties() const;
|
||||
style_chart_properties * get_style_chart_properties() const;
|
||||
style_drawing_page_properties* get_style_drawing_page_properties() const;
|
||||
style_table_cell_properties * get_style_table_cell_properties (bool always =false);
|
||||
|
||||
private:
|
||||
odf_types::style_family style_family_;
|
||||
|
||||
@ -142,7 +142,9 @@ const wchar_t * table_table::name = L"table";
|
||||
|
||||
void table_table::add_attributes( const xml::attributes_wc_ptr & Attributes )
|
||||
{
|
||||
table_table_attlist_.add_attributes(Attributes);
|
||||
CP_APPLY_ATTR(L"table:style-name", element_style_name);
|
||||
|
||||
table_table_attlist_.add_attributes(Attributes);
|
||||
}
|
||||
|
||||
void table_table::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
|
||||
@ -379,6 +381,9 @@ bool table_table_cell::empty()
|
||||
{
|
||||
if (!content_.elements_.empty()) return false;
|
||||
if (attlist_.table_formula_) return false;
|
||||
|
||||
if (attlist_extra_.table_number_columns_spanned_ > 1) return false;
|
||||
if (attlist_extra_.table_number_rows_spanned_ > 1) return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -69,15 +69,32 @@ void table_table_row::docx_convert(oox::docx_conversion_context & Context)
|
||||
const std::wstring styleName = attlist_.table_style_name_.get_value_or(L"");
|
||||
const std::wstring defaultCellStyle = attlist_.table_default_cell_style_name_.get_value_or(L"");
|
||||
|
||||
const style_instance * inst =
|
||||
Context.root()->odf_context().styleContainer().style_by_name( styleName , style_family::TableRow,Context.process_headers_footers_);
|
||||
|
||||
style_table_cell_properties* cell_props = NULL;
|
||||
style_table_row_properties* row_props = NULL;
|
||||
if (inst && inst->content())
|
||||
{
|
||||
cell_props = inst->content()->get_style_table_cell_properties(true);
|
||||
row_props = inst->content()->get_style_table_row_properties();
|
||||
|
||||
if ((row_props) && (row_props->attlist_.common_background_color_attlist_.fo_background_color_))
|
||||
{
|
||||
if (!cell_props->attlist_.common_background_color_attlist_.fo_background_color_)
|
||||
cell_props->attlist_.common_background_color_attlist_.fo_background_color_ = row_props->attlist_.common_background_color_attlist_.fo_background_color_;
|
||||
}
|
||||
}
|
||||
for (unsigned int i = 0; i < attlist_.table_number_rows_repeated_; ++i)
|
||||
{
|
||||
_Wostream << L"<w:tr>";
|
||||
const style_instance * inst =
|
||||
Context.root()->odf_context().styleContainer().style_by_name( styleName , style_family::TableRow,Context.process_headers_footers_);
|
||||
|
||||
_Wostream << L"<w:trPr>";
|
||||
_Wostream << L"<w:cantSplit w:val=\"false\" />";
|
||||
if (inst && inst->content())inst->content()->docx_convert(Context);
|
||||
|
||||
if (cell_props)
|
||||
cell_props->docx_convert(Context);
|
||||
|
||||
_Wostream << L"</w:trPr>";
|
||||
|
||||
Context.get_table_context().start_row(styleName, defaultCellStyle);
|
||||
@ -144,6 +161,16 @@ void table_table::docx_convert(oox::docx_conversion_context & Context)
|
||||
{
|
||||
std::wostream & _Wostream = Context.output_stream();
|
||||
|
||||
std::wstring sDumpPageProperties;
|
||||
if (false == Context.get_paragraph_state())
|
||||
{
|
||||
std::wstringstream strm;
|
||||
if (Context.process_page_properties(strm))
|
||||
{
|
||||
sDumpPageProperties = strm.str();
|
||||
}
|
||||
}
|
||||
|
||||
bool sub_table = table_table_attlist_.table_is_sub_table_.get_value_or(false);
|
||||
//todooo придумать как сделать внешние границы sub-таблицы границами внешней ячейки (чтоб слияние произошло)
|
||||
|
||||
@ -173,6 +200,15 @@ void table_table::docx_convert(oox::docx_conversion_context & Context)
|
||||
|
||||
Context.get_table_context().end_table();
|
||||
_Wostream << L"</w:tbl>";
|
||||
|
||||
if (false == sDumpPageProperties.empty())
|
||||
{
|
||||
Context.output_stream() << L"<w:p>";
|
||||
Context.output_stream() << L"<w:pPr>";
|
||||
Context.output_stream() << sDumpPageProperties;
|
||||
Context.output_stream() << L"</w:pPr>";
|
||||
Context.output_stream() << L"</w:p>";
|
||||
}
|
||||
}
|
||||
|
||||
void table_columns::docx_convert(oox::docx_conversion_context & Context)
|
||||
@ -285,28 +321,45 @@ void table_table_cell::docx_convert(oox::docx_conversion_context & Context)
|
||||
);
|
||||
}
|
||||
|
||||
if (attlist_extra_.table_number_columns_spanned_ > 1)
|
||||
{
|
||||
_Wostream << L"<w:gridSpan w:val=\"" << attlist_extra_.table_number_columns_spanned_ << "\"/>";
|
||||
Context.get_table_context().set_columns_spanned(attlist_extra_.table_number_columns_spanned_ - 1);
|
||||
}
|
||||
double width = Context.get_table_context().get_current_cell_width();
|
||||
|
||||
|
||||
if (width > 0.01)
|
||||
{
|
||||
_Wostream << L"<w:tcW w:w=\"" << (int)width << L"\" w:type=\"dxa\"/>";
|
||||
}
|
||||
|
||||
if (attlist_extra_.table_number_columns_spanned_ > 1)
|
||||
{
|
||||
_Wostream << L"<w:gridSpan w:val=\"" << attlist_extra_.table_number_columns_spanned_ << "\"/>";
|
||||
Context.get_table_context().set_columns_spanned(attlist_extra_.table_number_columns_spanned_ - 1);
|
||||
}
|
||||
|
||||
|
||||
const style_instance * inst =
|
||||
Context.root()->odf_context().styleContainer().style_by_name( styleName , style_family::TableCell,Context.process_headers_footers_);
|
||||
Context.root()->odf_context().styleContainer().style_by_name( styleName , style_family::TableCell, Context.process_headers_footers_);
|
||||
|
||||
if (inst && inst->content())
|
||||
{
|
||||
if (inst->content()->get_style_table_cell_properties())
|
||||
{
|
||||
inst->content()->get_style_table_cell_properties()->docx_convert(Context);
|
||||
}
|
||||
const std::wstring & currentRowStyle = Context.get_table_context().current_row_style();
|
||||
|
||||
const style_instance * inst_row =
|
||||
Context.root()->odf_context().styleContainer().style_by_name(currentRowStyle, style_family::TableRow, Context.process_headers_footers_);
|
||||
|
||||
style_table_cell_properties *row_cell_props = NULL;
|
||||
if (inst_row && inst_row->content())
|
||||
{
|
||||
row_cell_props = inst_row->content()->get_style_table_cell_properties();
|
||||
}
|
||||
if (inst && inst->content())
|
||||
{
|
||||
style_table_cell_properties merge_cell_props;
|
||||
|
||||
style_table_cell_properties * cell_props = inst->content()->get_style_table_cell_properties();
|
||||
|
||||
if (row_cell_props)
|
||||
merge_cell_props.attlist_.apply_from(row_cell_props->attlist_);
|
||||
if (cell_props)
|
||||
merge_cell_props.attlist_.apply_from(cell_props->attlist_);
|
||||
|
||||
merge_cell_props.docx_convert(Context);
|
||||
|
||||
if (inst->content()->get_style_text_properties())
|
||||
{
|
||||
@ -322,7 +375,7 @@ void table_table_cell::docx_convert(oox::docx_conversion_context & Context)
|
||||
Context.get_table_context().get_default_cell_style_col(Context.get_table_context().current_column());
|
||||
|
||||
if (const style_instance * inst =
|
||||
Context.root()->odf_context().styleContainer().style_by_name(defaultCellStyle, style_family::TableCell,Context.process_headers_footers_))
|
||||
Context.root()->odf_context().styleContainer().style_by_name(defaultCellStyle, style_family::TableCell, Context.process_headers_footers_))
|
||||
{
|
||||
if (const style_content * content = inst->content())
|
||||
{
|
||||
@ -340,7 +393,7 @@ void table_table_cell::docx_convert(oox::docx_conversion_context & Context)
|
||||
const std::wstring & defaultCellStyle = Context.get_table_context().get_default_cell_style_row();
|
||||
|
||||
if (const style_instance * inst =
|
||||
Context.root()->odf_context().styleContainer().style_by_name(defaultCellStyle, style_family::TableCell,Context.process_headers_footers_))
|
||||
Context.root()->odf_context().styleContainer().style_by_name(defaultCellStyle, style_family::TableCell, Context.process_headers_footers_))
|
||||
{
|
||||
if (const style_content * content = inst->content())
|
||||
{
|
||||
|
||||
@ -835,7 +835,7 @@ void table_table_cell::xlsx_convert(oox::xlsx_conversion_context & Context)
|
||||
|
||||
const int sharedStringId = content_.xlsx_convert(Context, &textFormatProperties);
|
||||
|
||||
if (t_val == oox::XlsxCellType::str && sharedStringId >=0)
|
||||
if (t_val == oox::XlsxCellType::str && sharedStringId >= 0)
|
||||
t_val = oox::XlsxCellType::s;//в случае текста, если он есть берем кэшированное значение
|
||||
|
||||
if (skip_next_cell)break;
|
||||
@ -846,7 +846,7 @@ void table_table_cell::xlsx_convert(oox::xlsx_conversion_context & Context)
|
||||
std::wstring ref = oox::getCellAddress(Context.current_table_column(), Context.current_table_row());
|
||||
if (attlist_.table_content_validation_name_)
|
||||
{
|
||||
Context.get_dataValidations_context().activate(*attlist_.table_content_validation_name_, ref);
|
||||
Context.get_dataValidations_context().activate(*attlist_.table_content_validation_name_, /*ref*/Context.current_table_column(), Context.current_table_row());
|
||||
}
|
||||
CP_XML_WRITER(strm)
|
||||
{
|
||||
@ -1087,7 +1087,7 @@ void table_covered_table_cell::xlsx_convert(oox::xlsx_conversion_context & Conte
|
||||
|
||||
is_style_visible = (!cellStyleName.empty() || defaultColumnCellStyle) ? true : false;
|
||||
|
||||
if ( content_.elements_.size() > 0 ||
|
||||
if ( content_.elements_.size() > 0 || attlist_.table_content_validation_name_ ||
|
||||
!formula.empty() ||
|
||||
( t_val == oox::XlsxCellType::n && !number_val.empty()) ||
|
||||
( t_val == oox::XlsxCellType::b && bool_val) ||
|
||||
@ -1111,6 +1111,10 @@ void table_covered_table_cell::xlsx_convert(oox::xlsx_conversion_context & Conte
|
||||
{
|
||||
Context.start_table_covered_cell ();
|
||||
|
||||
if (attlist_.table_content_validation_name_)
|
||||
{
|
||||
Context.get_dataValidations_context().activate(*attlist_.table_content_validation_name_, /*ref*/Context.current_table_column(), Context.current_table_row());
|
||||
}
|
||||
if (is_style_visible)
|
||||
Context.set_current_cell_style_id(xfId_last_set);
|
||||
|
||||
|
||||
@ -71,12 +71,6 @@ public:
|
||||
};
|
||||
|
||||
|
||||
template <class ElementT>
|
||||
class text_content_impl : public office_element_impl<ElementT>
|
||||
{
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -161,35 +161,6 @@ void paragraph::add_text(const std::wstring & Text)
|
||||
office_element_ptr elm = text::create(Text) ;
|
||||
content_.push_back( elm );
|
||||
}
|
||||
|
||||
void paragraph::afterCreate(document_context * Context)
|
||||
{
|
||||
// вызывается сразу после создания объекта
|
||||
if (Context)
|
||||
{
|
||||
Context->level++;
|
||||
// выставляем у предыдущего параграфа указатель на следующий (т.е. на вновь созданный)
|
||||
|
||||
if (Context->level == 1)
|
||||
{
|
||||
if (paragraph * prevPar = Context->get_last_paragraph())
|
||||
{
|
||||
prevPar->set_next(this);
|
||||
}
|
||||
|
||||
// запоминаем в контексте вновь созданный параграф
|
||||
Context->set_last_paragraph(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
void paragraph::afterReadContent(document_context * Context)
|
||||
{
|
||||
if (Context)
|
||||
{
|
||||
Context->level--;
|
||||
}
|
||||
}
|
||||
|
||||
const wchar_t * emptyParagraphContent = L"<w:pPr></w:pPr><w:r><w:rPr></w:rPr></w:r>";
|
||||
|
||||
const wchar_t * emptyParagraphDrawing = L"<w:p><w:pPr></w:pPr></w:p>";
|
||||
@ -315,30 +286,22 @@ void paragraph::docx_convert(oox::docx_conversion_context & Context)
|
||||
|
||||
if (masterPageName)
|
||||
{
|
||||
Context.set_master_page_name(*masterPageName);
|
||||
|
||||
const std::wstring masterPageNameLayout = Context.root()->odf_context().pageLayoutContainer().page_layout_name_by_style(*masterPageName);
|
||||
|
||||
Context.remove_page_properties();
|
||||
Context.add_page_properties(masterPageNameLayout);
|
||||
|
||||
is_empty = false;
|
||||
}
|
||||
|
||||
if (next_par_)
|
||||
if (next_element_style_name)
|
||||
{
|
||||
// проверяем не сменит ли следующий параграф свойства страницы.
|
||||
// если да — устанавливаем контексту флаг на то что необходимо в текущем параграфе
|
||||
// распечатать свойства раздела/секции
|
||||
//проверить ... не она ли текущая - может быть прописан дубляж - и тогда разрыв нарисуется ненужный
|
||||
const std::wstring & next_styleName = next_par_->attrs_.text_style_name_;
|
||||
const _CP_OPT(std::wstring) next_masterPageName = Context.root()->odf_context().styleContainer().master_page_name_by_name(next_styleName);
|
||||
// проверить ... не она ли текущая - может быть прописан дубляж - и тогда разрыв нарисуется ненужный
|
||||
// dump был выше уровнем
|
||||
const _CP_OPT(std::wstring) next_masterPageName = Context.root()->odf_context().styleContainer().master_page_name_by_name(*next_element_style_name);
|
||||
|
||||
if ((next_masterPageName) && (Context.get_master_page_name() != *next_masterPageName))
|
||||
{
|
||||
if (false == Context.root()->odf_context().pageLayoutContainer().compare_page_properties(Context.get_master_page_name(), *next_masterPageName))
|
||||
{
|
||||
Context.next_dump_page_properties(true);
|
||||
is_empty = false;
|
||||
}
|
||||
}
|
||||
@ -473,14 +436,16 @@ std::wostream & h::text_to_stream(std::wostream & _Wostream) const
|
||||
|
||||
void h::add_attributes( const xml::attributes_wc_ptr & Attributes )
|
||||
{
|
||||
CP_APPLY_ATTR(L"text:outline-level" , outline_level_);
|
||||
CP_APPLY_ATTR(L"text:style-name", element_style_name);
|
||||
|
||||
CP_APPLY_ATTR(L"text:outline-level" , outline_level_);
|
||||
CP_APPLY_ATTR(L"text:restart-numbering" , restart_numbering_);
|
||||
CP_APPLY_ATTR(L"text:start-value" , start_value_);
|
||||
CP_APPLY_ATTR(L"text:is-list-header" , is_list_header_);
|
||||
|
||||
paragraph_.add_attributes(Attributes);
|
||||
|
||||
paragraph_.is_header_ = true;
|
||||
paragraph_.is_header_ = true;
|
||||
paragraph_.attrs_.outline_level_ = outline_level_;
|
||||
}
|
||||
|
||||
@ -494,14 +459,12 @@ void h::add_text(const std::wstring & Text)
|
||||
paragraph_.add_text(Text);
|
||||
}
|
||||
|
||||
void h::afterCreate()
|
||||
{
|
||||
paragraph_.afterCreate( getContext() );
|
||||
}
|
||||
void h::afterReadContent()
|
||||
{
|
||||
paragraph_.afterReadContent( getContext() );
|
||||
office_element::afterReadContent();
|
||||
paragraph_.next_element_style_name = next_element_style_name;
|
||||
}
|
||||
|
||||
void h::docx_convert(oox::docx_conversion_context & Context)
|
||||
{
|
||||
paragraph_.docx_convert(Context);
|
||||
@ -520,14 +483,6 @@ void h::pptx_convert(oox::pptx_conversion_context & Context)
|
||||
const wchar_t * p::ns = L"text";
|
||||
const wchar_t * p::name = L"p";
|
||||
|
||||
void p::afterCreate()
|
||||
{
|
||||
paragraph_.afterCreate( getContext() );
|
||||
}
|
||||
void p::afterReadContent()
|
||||
{
|
||||
paragraph_.afterReadContent( getContext() );
|
||||
}
|
||||
std::wostream & p::text_to_stream(std::wostream & _Wostream) const
|
||||
{
|
||||
return paragraph_.text_to_stream(_Wostream);
|
||||
@ -535,6 +490,8 @@ std::wostream & p::text_to_stream(std::wostream & _Wostream) const
|
||||
|
||||
void p::add_attributes( const xml::attributes_wc_ptr & Attributes )
|
||||
{
|
||||
CP_APPLY_ATTR(L"text:style-name", element_style_name);
|
||||
|
||||
paragraph_.add_attributes(Attributes);
|
||||
}
|
||||
|
||||
@ -562,6 +519,11 @@ void p::pptx_convert(oox::pptx_conversion_context & Context)
|
||||
{
|
||||
paragraph_.pptx_convert(Context);
|
||||
}
|
||||
void p::afterReadContent()
|
||||
{
|
||||
office_element::afterReadContent();
|
||||
paragraph_.next_element_style_name = next_element_style_name;
|
||||
}
|
||||
// text:list
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
const wchar_t * list::ns = L"text";
|
||||
@ -661,24 +623,35 @@ std::wostream & section::text_to_stream(std::wostream & _Wostream) const
|
||||
|
||||
void section::afterCreate()
|
||||
{
|
||||
if (document_context * context = getContext())
|
||||
office_element::afterCreate();
|
||||
|
||||
if (document_context * context = getContext())
|
||||
{
|
||||
if (paragraph * lastPar = context->get_last_paragraph())
|
||||
if (p *lastPar = dynamic_cast<p*>(context->get_last_element()))
|
||||
{
|
||||
lastPar->set_next_section(true);
|
||||
lastPar->paragraph_.set_next_section(true);
|
||||
}
|
||||
}
|
||||
else if (h *lastPar = dynamic_cast<h*>(context->get_last_element()))
|
||||
{
|
||||
lastPar->paragraph_.set_next_section(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void section::afterReadContent()
|
||||
{
|
||||
if (document_context * context = getContext())
|
||||
if (document_context * context = getContext())
|
||||
{
|
||||
if (paragraph * lastPar = context->get_last_paragraph())
|
||||
if (p *lastPar = dynamic_cast<p*>(context->get_last_element()))
|
||||
{
|
||||
lastPar->set_next_end_section(true);
|
||||
lastPar->paragraph_.set_next_end_section(true);
|
||||
}
|
||||
else if (h *lastPar = dynamic_cast<h*>(context->get_last_element()))
|
||||
{
|
||||
lastPar->paragraph_.set_next_end_section(true);
|
||||
}
|
||||
}
|
||||
office_element::afterReadContent();
|
||||
}
|
||||
|
||||
void section::add_attributes( const xml::attributes_wc_ptr & Attributes )
|
||||
@ -715,7 +688,44 @@ void section::docx_convert(oox::docx_conversion_context & Context)
|
||||
|
||||
for (size_t i = 0; i < content_.size(); i++)
|
||||
{
|
||||
content_[i]->docx_convert(Context);
|
||||
if (content_[i]->element_style_name)
|
||||
{
|
||||
std::wstring text___ = *content_[i]->element_style_name;
|
||||
|
||||
const _CP_OPT(std::wstring) masterPageName = Context.root()->odf_context().styleContainer().master_page_name_by_name(*content_[i]->element_style_name);
|
||||
|
||||
if (masterPageName)
|
||||
{
|
||||
std::wstring masterPageNameLayout = Context.root()->odf_context().pageLayoutContainer().page_layout_name_by_style(*masterPageName);
|
||||
|
||||
if (false == masterPageNameLayout.empty())
|
||||
{
|
||||
Context.set_master_page_name(*masterPageName); //проверка на то что тема действительно существует????
|
||||
|
||||
Context.remove_page_properties();
|
||||
Context.add_page_properties(masterPageNameLayout);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (content_[i]->next_element_style_name)
|
||||
{
|
||||
std::wstring text___ = *content_[i]->next_element_style_name;
|
||||
// проверяем не сменится ли свойства страницы.
|
||||
// если да — устанавливаем контексту флаг на то что необходимо в текущем параграфе
|
||||
// распечатать свойства раздела/секции
|
||||
//проверить ... не она ли текущая - может быть прописан дубляж - и тогда разрыв нарисуется ненужный
|
||||
const _CP_OPT(std::wstring) next_masterPageName = Context.root()->odf_context().styleContainer().master_page_name_by_name(*content_[i]->next_element_style_name);
|
||||
|
||||
if ((next_masterPageName) && (Context.get_master_page_name() != *next_masterPageName))
|
||||
{
|
||||
if (false == Context.root()->odf_context().pageLayoutContainer().compare_page_properties(Context.get_master_page_name(), *next_masterPageName))
|
||||
{
|
||||
Context.next_dump_page_properties(true);
|
||||
//is_empty = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
content_[i]->docx_convert(Context);
|
||||
}
|
||||
}
|
||||
|
||||
@ -870,6 +880,11 @@ void table_of_content::add_child_element( xml::sax * Reader, const std::wstring
|
||||
}
|
||||
void table_of_content::docx_convert(oox::docx_conversion_context & Context)
|
||||
{
|
||||
std::wstring current_page_properties = Context.get_page_properties();
|
||||
|
||||
Context.get_section_context().add_section (section_attr_.name_, section_attr_.style_name_.get_value_or(L""), current_page_properties);
|
||||
|
||||
Context.add_page_properties(current_page_properties);
|
||||
if (index_body_)
|
||||
{
|
||||
Context.start_sdt(1);
|
||||
@ -945,9 +960,9 @@ void common_entry_template::docx_convert(oox::docx_conversion_context & Context)
|
||||
|
||||
Context.get_table_content_context().start_level(*style_name_);
|
||||
|
||||
if (outline_level_)
|
||||
if (outline_level_ && style_name_)
|
||||
{
|
||||
Context.get_table_content_context().add_outline_level_style(*outline_level_, style_name_.get_value_or(L""));
|
||||
Context.get_table_content_context().add_outline_level_style(*style_name_, *outline_level_);
|
||||
}
|
||||
for (size_t i = 0; i < content_.size(); i++)
|
||||
{
|
||||
@ -1076,11 +1091,17 @@ const wchar_t * illustration_index::name = L"illustration-index";
|
||||
|
||||
void illustration_index::afterCreate()
|
||||
{
|
||||
if (document_context * context = getContext())
|
||||
office_element::afterCreate();
|
||||
|
||||
if (document_context * context = getContext())
|
||||
{
|
||||
if (paragraph * lastPar = context->get_last_paragraph())
|
||||
if (p *lastPar = dynamic_cast<p*>(context->get_last_element()))
|
||||
{
|
||||
lastPar->set_next_section(true);
|
||||
lastPar->paragraph_.set_next_section(true);
|
||||
}
|
||||
else if (h *lastPar = dynamic_cast<h*>(context->get_last_element()))
|
||||
{
|
||||
lastPar->paragraph_.set_next_section(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1089,11 +1110,16 @@ void illustration_index::afterReadContent()
|
||||
{
|
||||
if (document_context * context = getContext())
|
||||
{
|
||||
if (paragraph * lastPar = context->get_last_paragraph())
|
||||
if (p *lastPar = dynamic_cast<p*>(context->get_last_element()))
|
||||
{
|
||||
lastPar->set_next_end_section(true);
|
||||
lastPar->paragraph_.set_next_end_section(true);
|
||||
}
|
||||
else if (h *lastPar = dynamic_cast<h*>(context->get_last_element()))
|
||||
{
|
||||
lastPar->paragraph_.set_next_end_section(true);
|
||||
}
|
||||
}
|
||||
office_element::afterReadContent();
|
||||
}
|
||||
void illustration_index::docx_convert(oox::docx_conversion_context & Context)
|
||||
{
|
||||
@ -1219,11 +1245,17 @@ void alphabetical_index::add_child_element( xml::sax * Reader, const std::wstrin
|
||||
}
|
||||
void alphabetical_index::afterCreate()
|
||||
{
|
||||
if (document_context * context = getContext())
|
||||
office_element::afterCreate();
|
||||
|
||||
if (document_context * context = getContext())
|
||||
{
|
||||
if (paragraph * lastPar = context->get_last_paragraph())
|
||||
if (p *lastPar = dynamic_cast<p*>(context->get_last_element()))
|
||||
{
|
||||
lastPar->set_next_section(true);
|
||||
lastPar->paragraph_.set_next_section(true);
|
||||
}
|
||||
else if (h *lastPar = dynamic_cast<h*>(context->get_last_element()))
|
||||
{
|
||||
lastPar->paragraph_.set_next_section(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1231,11 +1263,16 @@ void alphabetical_index::afterReadContent()
|
||||
{
|
||||
if (document_context * context = getContext())
|
||||
{
|
||||
if (paragraph * lastPar = context->get_last_paragraph())
|
||||
if (p *lastPar = dynamic_cast<p*>(context->get_last_element()))
|
||||
{
|
||||
lastPar->set_next_end_section(true);
|
||||
lastPar->paragraph_.set_next_end_section(true);
|
||||
}
|
||||
else if (h *lastPar = dynamic_cast<h*>(context->get_last_element()))
|
||||
{
|
||||
lastPar->paragraph_.set_next_end_section(true);
|
||||
}
|
||||
}
|
||||
office_element::afterReadContent();
|
||||
}
|
||||
void alphabetical_index::docx_convert(oox::docx_conversion_context & Context)
|
||||
{
|
||||
@ -1273,7 +1310,9 @@ const wchar_t * alphabetical_index_source::name = L"alphabetical-index-source";
|
||||
|
||||
void alphabetical_index_source::add_attributes( const xml::attributes_wc_ptr & Attributes )
|
||||
{
|
||||
CP_APPLY_ATTR(L"text:index-scope", index_scope_); // chapter or document
|
||||
CP_APPLY_ATTR(L"text:index-scope", index_scope_); // chapter or document
|
||||
CP_APPLY_ATTR(L"text:alphabetical-separators", alphabetical_separators_);
|
||||
CP_APPLY_ATTR(L"text:ignore-case", ignore_case_);
|
||||
|
||||
}
|
||||
void alphabetical_index_source::add_child_element( xml::sax * Reader, const std::wstring & Ns, const std::wstring & Name)
|
||||
@ -1286,6 +1325,11 @@ void alphabetical_index_source::add_child_element( xml::sax * Reader, const std:
|
||||
}
|
||||
void alphabetical_index_source::docx_convert(oox::docx_conversion_context & Context)
|
||||
{
|
||||
if (alphabetical_separators_)
|
||||
{
|
||||
Context.get_table_content_context().bSeparators = alphabetical_separators_->get();
|
||||
}
|
||||
|
||||
Context.get_table_content_context().start_template(5);
|
||||
for (size_t i = 0; i < entry_templates_.size(); i++)
|
||||
{
|
||||
@ -1317,11 +1361,17 @@ const wchar_t * object_index::name = L"object-index";
|
||||
|
||||
void object_index::afterCreate()
|
||||
{
|
||||
if (document_context * context = getContext())
|
||||
office_element::afterCreate();
|
||||
|
||||
if (document_context * context = getContext())
|
||||
{
|
||||
if (paragraph * lastPar = context->get_last_paragraph())
|
||||
if (p *lastPar = dynamic_cast<p*>(context->get_last_element()))
|
||||
{
|
||||
lastPar->set_next_section(true);
|
||||
lastPar->paragraph_.set_next_section(true);
|
||||
}
|
||||
else if (h *lastPar = dynamic_cast<h*>(context->get_last_element()))
|
||||
{
|
||||
lastPar->paragraph_.set_next_section(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1329,11 +1379,16 @@ void object_index::afterReadContent()
|
||||
{
|
||||
if (document_context * context = getContext())
|
||||
{
|
||||
if (paragraph * lastPar = context->get_last_paragraph())
|
||||
if (p *lastPar = dynamic_cast<p*>(context->get_last_element()))
|
||||
{
|
||||
lastPar->set_next_end_section(true);
|
||||
lastPar->paragraph_.set_next_end_section(true);
|
||||
}
|
||||
else if (h *lastPar = dynamic_cast<h*>(context->get_last_element()))
|
||||
{
|
||||
lastPar->paragraph_.set_next_end_section(true);
|
||||
}
|
||||
}
|
||||
office_element::afterReadContent();
|
||||
}
|
||||
void object_index::docx_convert(oox::docx_conversion_context & Context)
|
||||
{
|
||||
@ -1419,11 +1474,17 @@ const wchar_t * user_index::name = L"user-index";
|
||||
|
||||
void user_index::afterCreate()
|
||||
{
|
||||
if (document_context * context = getContext())
|
||||
office_element::afterCreate();
|
||||
|
||||
if (document_context * context = getContext())
|
||||
{
|
||||
if (paragraph * lastPar = context->get_last_paragraph())
|
||||
if (p *lastPar = dynamic_cast<p*>(context->get_last_element()))
|
||||
{
|
||||
lastPar->set_next_section(true);
|
||||
lastPar->paragraph_.set_next_section(true);
|
||||
}
|
||||
else if (h *lastPar = dynamic_cast<h*>(context->get_last_element()))
|
||||
{
|
||||
lastPar->paragraph_.set_next_section(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1431,11 +1492,16 @@ void user_index::afterReadContent()
|
||||
{
|
||||
if (document_context * context = getContext())
|
||||
{
|
||||
if (paragraph * lastPar = context->get_last_paragraph())
|
||||
if (p *lastPar = dynamic_cast<p*>(context->get_last_element()))
|
||||
{
|
||||
lastPar->set_next_end_section(true);
|
||||
lastPar->paragraph_.set_next_end_section(true);
|
||||
}
|
||||
else if (h *lastPar = dynamic_cast<h*>(context->get_last_element()))
|
||||
{
|
||||
lastPar->paragraph_.set_next_end_section(true);
|
||||
}
|
||||
}
|
||||
office_element::afterReadContent();
|
||||
}
|
||||
void user_index::docx_convert(oox::docx_conversion_context & Context)
|
||||
{
|
||||
@ -1560,11 +1626,17 @@ const wchar_t * bibliography::name = L"bibliography";
|
||||
|
||||
void bibliography::afterCreate()
|
||||
{
|
||||
if (document_context * context = getContext())
|
||||
office_element::afterCreate();
|
||||
|
||||
if (document_context * context = getContext())
|
||||
{
|
||||
if (paragraph * lastPar = context->get_last_paragraph())
|
||||
if (p *lastPar = dynamic_cast<p*>(context->get_last_element()))
|
||||
{
|
||||
lastPar->set_next_section(true);
|
||||
lastPar->paragraph_.set_next_section(true);
|
||||
}
|
||||
else if (h *lastPar = dynamic_cast<h*>(context->get_last_element()))
|
||||
{
|
||||
lastPar->paragraph_.set_next_section(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1573,11 +1645,16 @@ void bibliography::afterReadContent()
|
||||
{
|
||||
if (document_context * context = getContext())
|
||||
{
|
||||
if (paragraph * lastPar = context->get_last_paragraph())
|
||||
if (p *lastPar = dynamic_cast<p*>(context->get_last_element()))
|
||||
{
|
||||
lastPar->set_next_end_section(true);
|
||||
lastPar->paragraph_.set_next_end_section(true);
|
||||
}
|
||||
else if (h *lastPar = dynamic_cast<h*>(context->get_last_element()))
|
||||
{
|
||||
lastPar->paragraph_.set_next_end_section(true);
|
||||
}
|
||||
}
|
||||
office_element::afterReadContent();
|
||||
}
|
||||
void bibliography::docx_convert(oox::docx_conversion_context & Context)
|
||||
{
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user