Compare commits

...

71 Commits

Author SHA1 Message Date
395e54cf76 [ios][x2t] fixed build 2018-08-24 15:11:04 +03:00
40476e7555 [ios][x2t] use system libxml2 2018-08-24 14:59:54 +03:00
04f06c23a1 DocxFormat - extend shading pPr 2018-08-24 13:22:45 +03:00
a9a635747a [ios][x2t] fixed build 2018-08-24 12:50:05 +03:00
4027a0de25 Merge commit 'a232fcd9e1042811d624ff8934dc689f57ac2f57' into develop 2018-08-24 11:10:03 +03:00
a232fcd9e1 DocFormatReader - fix bug #38524 2018-08-23 19:55:44 +03:00
5bc537749e Add date_time library 2018-08-22 19:41:12 +03:00
6e7f6cf204 . 2018-08-22 19:39:28 +03:00
b0c10403c5 OdfFormat - fix bug #38506; others from after testing 2018-08-22 15:42:26 +03:00
5f516f0c56 OdfFormatReader - fix after testing 2018-08-21 13:24:20 +03:00
bfe8abb847 XlsFormatReader - fix users file 2018-08-20 16:56:12 +03:00
d765a7590b DocxFormat - fix bug #38594 2018-08-20 14:11:58 +03:00
dac34c32c0 RtfFormat - fix fonts in meta files 2018-08-17 18:46:47 +03:00
599bf9654d x2t - fix bug #38432 2018-08-17 16:16:22 +03:00
fbd55ca485 OdfFormatReader - fix bugs #38485, #38507 2018-08-17 14:53:40 +03:00
68bb25301d [x2t] Add tcPr.hMerge to Editor.bin 2018-08-16 20:00:14 +03:00
2390e5bffe [x2t] Add custom docx properties SdtGlobalColor, SdtGlobalShowHighlight 2018-08-16 19:11:40 +03:00
01c9c018af [bug] Fix bug 38496 2018-08-16 18:44:50 +03:00
53ed94dbbe [x2t] Add w15:appearance and w15:color to sdtPr 2018-08-13 19:39:52 +03:00
e1fa9b5c46 Add /usr/local/share/fonts to search folders 2018-08-10 17:47:18 +03:00
6341cdbbdb [x2t] Write application and company name from environment variable 2018-08-09 19:35:51 +03:00
c93989767e raster pri fix 2018-08-09 17:02:41 +03:00
f4fa754ce4 Merge pull request #96 from ONLYOFFICE/release/v5.2.0
Release/v5.2.0
2018-08-08 15:04:56 +02:00
a965b30d72 GIF palette generator 2018-08-08 16:04:03 +03:00
dd3dd1e42a [x2t] For bug 38295 2018-08-06 19:47:20 +03:00
d2f1460f1b [x2t] Fix bug 38360 2018-08-06 13:54:43 +03:00
7d88a91fcc up 2018-08-03 10:39:59 +03:00
bf02eec8ef XlsFormatReader - fix #38293 2018-08-02 17:07:55 +03:00
8513ec5ae7 OdfFormatReader - fix after testing 2018-08-01 20:12:59 +03:00
35b43e0683 PptFormatReader - fix bug#37445 2018-08-01 20:11:05 +03:00
421e58fe34 x2t - 2.4.541 fix after testing 2018-08-01 12:51:13 +03:00
048cac74b6 . 2018-07-30 18:28:40 +03:00
069b12839f Merge commit 'c23ff4c8cd5bb2040f75a3a9845fc41d9d496216' into develop 2018-07-30 10:45:09 +03:00
c23ff4c8cd OdfFormatReader - fix after testing.
x2t - version up 2.4.540
2018-07-27 12:59:44 +03:00
ccc27a2e1b x2t - fix after testing 2018-07-26 19:06:06 +03:00
3843f52601 XlsFormat - fix user file 2018-07-26 15:17:54 +03:00
c3ec17c132 . 2018-07-26 13:07:47 +03:00
72cb63b9f5 Add PDFA fornat (emulation) 2018-07-24 18:49:12 +03:00
dd04f5cf12 DocFormatReader - add word 2.0 to checker files 2018-07-24 18:11:16 +03:00
dde6621d10 Merge branch 'release/v5.2.0' of https://github.com/ONLYOFFICE/core into release/v5.2.0 2018-07-24 17:16:02 +03:00
7c3b060794 . 2018-07-24 17:01:49 +03:00
a8e4ccdf80 Remove unused files 2018-07-24 14:46:10 +03:00
aa609336ca [ios][x2t] fixed build 2018-07-23 19:48:36 +03:00
9601d90671 OdfFormatReader - fix dataValidations, conditional formating 2018-07-23 17:31:39 +03:00
f59d7ff845 Merge branch 'release/v5.2.0' of https://github.com/ONLYOFFICE/core into release/v5.2.0 2018-07-23 16:50:13 +03:00
adf2399368 x2t - DocFormat - fix after testing 2018-07-23 16:36:13 +03:00
5da57d65c1 [x2t] Fix empty hyperlink rels bin->docx 2018-07-20 15:12:30 +03:00
feddb37222 static link open ssl to desktop (mac) 2018-07-19 19:46:59 +03:00
81db8d1776 Fix macos build 2018-07-19 15:00:47 +03:00
2a809ab970 OdfFormat - read/write macros OnlyOffice. 2018-07-19 14:48:33 +03:00
b6a0614f00 OdfFormatReader - fix bug #38244 2018-07-19 11:43:57 +03:00
452917f213 [pe][ios] Apply timing to all 2018-07-19 11:13:28 +03:00
96202979ea [x2t] Add headerFooter, legacyDrawingHF, picture, rowBreaks to Editor.bin 2018-07-18 20:42:34 +03:00
5b5ccdc9be [pe][ios] Events 2018-07-18 19:19:13 +03:00
4ca2126abc OdfFormatReader - fix issue #128 2018-07-18 17:10:27 +03:00
adf7ca65ea [ios][pe] events 2018-07-18 16:48:45 +03:00
89235ca12a Changes for core develop branch (desktop) 2018-07-18 12:01:02 +03:00
08d551752e Changes for desktop (develop branch) 2018-07-17 19:55:31 +03:00
77b1303d62 . 2018-07-17 18:12:51 +03:00
93e56e2b8a OdfFormatReader - fix issue #128, add cross references, fix simple annotations 2018-07-17 16:14:20 +03:00
e032fc8294 [bug] Compilation bug 2018-07-17 14:04:07 +03:00
5ae2ac2385 [ios][x2t] fixed build 2018-07-16 15:43:07 +03:00
6b8cb6cae4 Merge pull request #94 from ONLYOFFICE/feature/bin2xlsx-enh
[x2t] Decrease memory consumption while bin->xlsx conversion
2018-07-16 14:10:56 +03:00
e66ea7c628 [x2t] Add saving of templates to fromDocxDir, fromXlsxDir, fromPptxDir 2018-07-16 13:57:20 +03:00
2447925fd6 OdfFormatWriter - alphabetical indexes 2018-07-16 11:31:58 +03:00
9991195d56 . 2018-07-13 18:59:23 +03:00
51f579a682 [ios][pe] events 2018-07-13 18:23:28 +03:00
45e0459434 OdfFormatWriter - .. 2018-07-13 15:26:51 +03:00
2f194ebd97 . 2018-07-13 13:24:56 +03:00
5e4ce83dc1 Ignore -no-warrowing warning while building PdfWriter
Errors looks like:
`../Src/ICCProfile.h:52: error: narrowing conversion of '-72' from 'int'
to 'unsigned char' inside { } [-Wnarrowing]`
2018-07-13 13:05:13 +03:00
5e126e28ff [x2t] Decrease memory consumption while bin->xlsx conversion 2018-07-11 16:58:07 +03:00
284 changed files with 7148 additions and 2816 deletions

2
.gitignore vendored
View File

@ -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/

View File

@ -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);

View File

@ -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;

View File

@ -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 );
}
};
}

View File

@ -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();

View File

@ -76,7 +76,7 @@ namespace DocFileFormat
{
result = pRecord->NewObject (reader, size, typeCode, version, instance);
if (result)
result->SiblingIdx = siblingIdx;
result->SiblingIdx = siblingIdx;
RELEASEOBJECT(pRecord);
}
}

View File

@ -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;

View File

@ -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;

View File

@ -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" );

View File

@ -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;
}

View File

@ -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;

View File

@ -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);

View File

@ -37,8 +37,6 @@
namespace DocFileFormat
{
static int count_vml_objects = 0;
class VMLShapeTypeMapping: public PropertiesMapping, public IMapping
{
private:

View File

@ -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;

View File

@ -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

View File

@ -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"

View File

@ -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;&quot;..\..\..\..\..\DesktopEditor\freetype-2.5.2\include&quot;;..\..\..\..\..\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"
>

View 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;
}
}

View 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

View File

@ -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());

View File

@ -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()

View File

@ -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

View File

@ -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

View File

@ -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{

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -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
{

View File

@ -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);
}

View File

@ -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

View File

@ -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

View File

@ -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 */,
);

View File

@ -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)

View File

@ -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());

View File

@ -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,

View File

@ -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);

View File

@ -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 \

View File

@ -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_;
}
}

View File

@ -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");
}
}
}

View File

@ -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_;

View File

@ -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);

View File

@ -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_;
};

View File

@ -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;
}

View File

@ -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 )

View File

@ -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;

View File

@ -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()) ;

View File

@ -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;
};
//------------------------------------------------------------------------

View File

@ -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");
}
}
}

View File

@ -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_; }

View File

@ -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);
}
}
}
}

View File

@ -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

View File

@ -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]);
}
}
}

View File

@ -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)
{

View File

@ -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"\"";
}

View File

@ -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:

View File

@ -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]);
}

View File

@ -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]);

View File

@ -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)
{

View File

@ -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

View File

@ -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)
{

View File

@ -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());

View File

@ -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 )
{

View File

@ -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());

View File

@ -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");
}
}
}

View File

@ -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()

View File

@ -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);
}

View File

@ -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); \
}

View File

@ -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 );
}
}

View File

@ -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;

View File

@ -52,7 +52,8 @@ public:
None,
Lowercase,
Uppercase,
Capitalize
Capitalize,
Underline
};
text_transform()

View File

@ -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();
}
}
}

View File

@ -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;

View File

@ -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();
}

View File

@ -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;
}

View File

@ -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"]";
}

View File

@ -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)
{

View File

@ -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_;
};
}

View File

@ -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_);
}

View File

@ -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);

View File

@ -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);

View File

@ -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:

View File

@ -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;
}
}
}

View File

@ -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,

View File

@ -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();
}

View File

@ -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_;
};

View File

@ -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)
{
}
}
}

View File

@ -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

View File

@ -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_);

View File

@ -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_;

View File

@ -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);

View File

@ -244,6 +244,8 @@ public:
CPDOCCORE_DEFINE_VISITABLE();
style_table_cell_properties() {}
virtual void docx_convert(oox::docx_conversion_context & Context) ;
private:

View File

@ -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))

View File

@ -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

View File

@ -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_;

View File

@ -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;
}

View File

@ -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())
{

View File

@ -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);

View File

@ -71,12 +71,6 @@ public:
};
template <class ElementT>
class text_content_impl : public office_element_impl<ElementT>
{
};
}
}
}

View File

@ -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