Commit 08399f16 authored by ElenaSubbotina's avatar ElenaSubbotina Committed by Alexander Trofimov

DocFormatReader - конвертация объекта автосодержание

parent ed5e68c9
...@@ -6,23 +6,25 @@ namespace DocFileFormat ...@@ -6,23 +6,25 @@ namespace DocFileFormat
CharacterPropertiesMapping::CharacterPropertiesMapping( XmlUtils::CXmlWriter* writer, WordDocument* doc, RevisionData* rev, ParagraphPropertyExceptions* currentPapx, bool styleChpx, bool isRunStyleNeeded) CharacterPropertiesMapping::CharacterPropertiesMapping( XmlUtils::CXmlWriter* writer, WordDocument* doc, RevisionData* rev, ParagraphPropertyExceptions* currentPapx, bool styleChpx, bool isRunStyleNeeded)
: PropertiesMapping( writer ), _isRunStyleNeeded(isRunStyleNeeded), _isOwnRPr(true), _isRTL(false) : PropertiesMapping( writer ), _isRunStyleNeeded(isRunStyleNeeded), _isOwnRPr(true), _isRTL(false)
{ {
this->_doc = doc; _doc = doc;
this->_rPr = new XMLTools::XMLElement<wchar_t>( _T( "w:rPr" ) ); _rPr = new XMLTools::XMLElement<wchar_t>( _T( "w:rPr" ) );
this->_revisionData = rev; _revisionData = rev;
this->_currentPapx = currentPapx; _currentPapx = currentPapx;
this->_styleChpx = styleChpx; _styleChpx = styleChpx;
this->_currentIstd = USHRT_MAX; _currentIstd = USHRT_MAX;
_webHidden = false;
} }
CharacterPropertiesMapping::CharacterPropertiesMapping( XMLTools::XMLElement<wchar_t>* rPr, WordDocument* doc, RevisionData* rev, ParagraphPropertyExceptions* currentPapx, bool styleChpx, bool isRunStyleNeeded ) CharacterPropertiesMapping::CharacterPropertiesMapping( XMLTools::XMLElement<wchar_t>* rPr, WordDocument* doc, RevisionData* rev, ParagraphPropertyExceptions* currentPapx, bool styleChpx, bool isRunStyleNeeded )
: PropertiesMapping( NULL ), _isRunStyleNeeded(isRunStyleNeeded), _isOwnRPr(false), _isRTL(false) : PropertiesMapping( NULL ), _isRunStyleNeeded(isRunStyleNeeded), _isOwnRPr(false), _isRTL(false)
{ {
this->_doc = doc; _doc = doc;
this->_rPr = rPr; _rPr = rPr;
this->_revisionData = rev; _revisionData = rev;
this->_currentPapx = currentPapx; _currentPapx = currentPapx;
this->_styleChpx = styleChpx; _styleChpx = styleChpx;
this->_currentIstd = USHRT_MAX; _currentIstd = USHRT_MAX;
_webHidden = false;
} }
CharacterPropertiesMapping::~CharacterPropertiesMapping() CharacterPropertiesMapping::~CharacterPropertiesMapping()
...@@ -89,6 +91,12 @@ namespace DocFileFormat ...@@ -89,6 +91,12 @@ namespace DocFileFormat
XMLTools::XMLAttribute<wchar_t> * colorVal = new XMLTools::XMLAttribute<wchar_t>( _T( "w:val" ) ); XMLTools::XMLAttribute<wchar_t> * colorVal = new XMLTools::XMLAttribute<wchar_t>( _T( "w:val" ) );
XMLTools::XMLElement<wchar_t> * lang = new XMLTools::XMLElement<wchar_t> ( _T( "w:lang" ) ); XMLTools::XMLElement<wchar_t> * lang = new XMLTools::XMLElement<wchar_t> ( _T( "w:lang" ) );
if (_webHidden)
{
XMLTools::XMLElement<wchar_t> * webHidden = new XMLTools::XMLElement<wchar_t> ( _T( "w:webHidden" ) );
parent->AppendChild( *webHidden );
RELEASEOBJECT( webHidden );
}
std::list<SinglePropertyModifier>::iterator end = sprms->end(); std::list<SinglePropertyModifier>::iterator end = sprms->end();
for (std::list<SinglePropertyModifier>::iterator iter = sprms->begin(); iter != end; ++iter) for (std::list<SinglePropertyModifier>::iterator iter = sprms->begin(); iter != end; ++iter)
{ {
...@@ -96,7 +104,7 @@ namespace DocFileFormat ...@@ -96,7 +104,7 @@ namespace DocFileFormat
{ {
case 0x4A30 : // style id case 0x4A30 : // style id
{ {
if (_isRunStyleNeeded) if (_isRunStyleNeeded && !_webHidden)
{ {
_currentIstd = FormatUtils::BytesToUInt16( iter->Arguments, 0, iter->argumentsSize ); _currentIstd = FormatUtils::BytesToUInt16( iter->Arguments, 0, iter->argumentsSize );
if (_currentIstd < this->_doc->Styles->Styles->size()) if (_currentIstd < this->_doc->Styles->Styles->size())
......
...@@ -29,7 +29,8 @@ namespace DocFileFormat ...@@ -29,7 +29,8 @@ namespace DocFileFormat
void Apply( IVisitable* chpx ); void Apply( IVisitable* chpx );
bool CheckIsSymbolFont(); bool CheckIsSymbolFont();
bool _isRTL; bool _webHidden;
bool _isRTL;
private: private:
void convertSprms( list<SinglePropertyModifier>* sprms, XMLTools::XMLElement<wchar_t>* parent ); void convertSprms( list<SinglePropertyModifier>* sprms, XMLTools::XMLElement<wchar_t>* parent );
list<CharacterPropertyExceptions*> buildHierarchy( const StyleSheet* styleSheet, unsigned short istdStart ); list<CharacterPropertyExceptions*> buildHierarchy( const StyleSheet* styleSheet, unsigned short istdStart );
...@@ -42,17 +43,17 @@ namespace DocFileFormat ...@@ -42,17 +43,17 @@ namespace DocFileFormat
virtual void appendFlagElement( XMLTools::XMLElement<wchar_t>* node, const SinglePropertyModifier& sprm, const wchar_t* elementName, bool unique ); virtual void appendFlagElement( XMLTools::XMLElement<wchar_t>* node, const SinglePropertyModifier& sprm, const wchar_t* elementName, bool unique );
private: private:
XmlUtils::CXmlWriter pRunPr;
WordDocument* _doc; WordDocument* _doc;
XMLTools::XMLElement<wchar_t>* _rPr; XMLTools::XMLElement<wchar_t>* _rPr;
unsigned short _currentIstd; unsigned short _currentIstd;
RevisionData* _revisionData; RevisionData* _revisionData;
bool _styleChpx; bool _styleChpx;
XmlUtils::CXmlWriter pRunPr;
ParagraphPropertyExceptions* _currentPapx; ParagraphPropertyExceptions* _currentPapx;
list<CharacterPropertyExceptions*> _hierarchy; list<CharacterPropertyExceptions*> _hierarchy;
bool _isRunStyleNeeded; bool _isRunStyleNeeded;
bool _isOwnRPr; bool _isOwnRPr;
......
...@@ -17,6 +17,8 @@ namespace DocFileFormat ...@@ -17,6 +17,8 @@ namespace DocFileFormat
m_context = context; m_context = context;
m_bInternalXmlWriter = false; m_bInternalXmlWriter = false;
_writeWebHidden = false;
_writeInstrText = false;
_isSectionPageBreak = 0; _isSectionPageBreak = 0;
} }
...@@ -361,6 +363,8 @@ namespace DocFileFormat ...@@ -361,6 +363,8 @@ namespace DocFileFormat
CharacterPropertiesMapping* rPr = new CharacterPropertiesMapping(m_pXmlWriter, m_document, &rev, _lastValidPapx, false); CharacterPropertiesMapping* rPr = new CharacterPropertiesMapping(m_pXmlWriter, m_document, &rev, _lastValidPapx, false);
if (rPr) if (rPr)
{ {
rPr->_webHidden = _writeWebHidden;
chpx->Convert(rPr); chpx->Convert(rPr);
RELEASEOBJECT(rPr); RELEASEOBJECT(rPr);
} }
...@@ -412,421 +416,452 @@ namespace DocFileFormat ...@@ -412,421 +416,452 @@ namespace DocFileFormat
std::wstring textType = _T( "t" ); std::wstring textType = _T( "t" );
std::wstring text; std::wstring text;
#ifdef _DEBUG if (writeDeletedText)
if (0) {
if (chars) textType = std::wstring(_T("delText"));
{ }
//ATLTRACE (L"Run :"); else if (_writeInstrText)
for (size_t i = 0; i < chars->size(); ++i) {
{ textType = std::wstring(_T("instrText"));
//ATLTRACE (L"0x%x ", chars->operator [](i)); }
}
//ATLTRACE (L"\n");
for ( list<SinglePropertyModifier>::iterator iter = chpx->grpprl->begin(); iter != chpx->grpprl->end(); ++iter) //write text
{ for (unsigned int i = 0; i < chars->size(); ++i)
//if (sprmCPicLocation==iter->OpCode) {
// ATLTRACE (L"SPRM : sprmCPicLocation, %d\n", FormatUtils::BytesToInt32(iter->Arguments, 0, iter->argumentsSize)); wchar_t c = chars->at(i);
//else if (sprmCFSpec == iter->OpCode)
// ATLTRACE (L"SPRM : sprmCFSpec, %d\n", FormatUtils::BytesToInt32(iter->Arguments, 0, iter->argumentsSize)); if (TextMark::Tab == c)
//else if (sprmCRsidText == iter->OpCode) {
// ATLTRACE (L"SPRM : sprmCRsidText, %d\n", FormatUtils::BytesToInt32(iter->Arguments, 0, iter->argumentsSize)); writeTextElement(text, textType);
//else
// ATLTRACE (L"SPRM : %d, %d\n", iter->OpCode, FormatUtils::BytesToInt32(iter->Arguments, 0, iter->argumentsSize)); text.clear();
}
//ATLTRACE (L"\n"); XMLTools::XMLElement<wchar_t> elem(_T("w:tab"));
m_pXmlWriter->WriteString(elem.GetXMLString().c_str());
} }
#endif else if (TextMark::HardLineBreak == c)
if (writeDeletedText)
{ {
textType = std::wstring(_T("delText")); writeTextElement(text, textType);
text.clear();
XMLTools::XMLElement<wchar_t> elem(_T("w:br"));
elem.AppendAttribute(_T("w:type"), _T("textWrapping"));
elem.AppendAttribute(_T("w:clear"), _T("all"));
m_pXmlWriter->WriteString(elem.GetXMLString().c_str());
} }
else if (_writeInstrText) else if (TextMark::ParagraphEnd == c)
{ {
textType = std::wstring(_T("instrText")); //do nothing
} }
else if (TextMark::PageBreakOrSectionMark == c)
//write text
for (unsigned int i = 0; i < chars->size(); ++i)
{ {
wchar_t c = chars->at(i); //write page break, section breaks are written by writeParagraph() method
if (/*!isSectionEnd(c)*/_isSectionPageBreak == 0)
if (TextMark::Tab == c)
{ {
writeTextElement(text, textType); writeTextElement(text, textType);
text.clear(); text.clear();
XMLTools::XMLElement<wchar_t> elem(_T("w:tab")); XMLTools::XMLElement<wchar_t> elem(_T("w:br"));
elem.AppendAttribute(_T("w:type"), _T("page"));
m_pXmlWriter->WriteString(elem.GetXMLString().c_str()); m_pXmlWriter->WriteString(elem.GetXMLString().c_str());
} }
else if (TextMark::HardLineBreak == c) }
{ else if (TextMark::ColumnBreak == c)
writeTextElement(text, textType); {
writeTextElement(text, textType);
text.clear(); text.clear();
XMLTools::XMLElement<wchar_t> elem(_T("w:br")); XMLTools::XMLElement<wchar_t> elem(_T("w:br"));
elem.AppendAttribute(_T("w:type"), _T("textWrapping")); elem.AppendAttribute(_T("w:type"), _T("column"));
elem.AppendAttribute(_T("w:clear"), _T("all"));
m_pXmlWriter->WriteString(elem.GetXMLString().c_str()); m_pXmlWriter->WriteString(elem.GetXMLString().c_str());
} }
else if (TextMark::ParagraphEnd == c) else if (TextMark::FieldBeginMark == c)
{ {
//do nothing int cpFieldStart = initialCp + i;
} int cpFieldEnd = searchNextTextMark( m_document->Text, cpFieldStart, TextMark::FieldEndMark );
else if (TextMark::PageBreakOrSectionMark == c)
{ std::wstring f( ( m_document->Text->begin() + cpFieldStart ), ( m_document->Text->begin() + cpFieldEnd + 1 ) );
//write page break, section breaks are written by writeParagraph() method std::wstring embed ( _T( " EMBED" ) );
if (/*!isSectionEnd(c)*/_isSectionPageBreak == 0) std::wstring link ( _T( " LINK" ) );
{ std::wstring form ( _T( " FORM" ) );
writeTextElement(text, textType); std::wstring excel ( _T( " Excel" ) );
std::wstring word ( _T( " Word" ) );
std::wstring equation ( _T( " Equation" ) ) ;
std::wstring mergeformat( _T( " MERGEFORMAT" ) );
std::wstring quote ( _T( " QUOTE" ) );
std::wstring chart ( _T( "Chart" ) );
std::wstring PBrush ( _T( " PBrush" ) );
std::wstring TOC ( _T( " TOC" ) );
std::wstring HYPERLINK ( _T( " HYPERLINK" ) );
std::wstring PAGEREF ( _T( " PAGEREF" ) );
text.clear(); if ( search( f.begin(), f.end(), form.begin(), form.end() ) != f.end() )
{
m_pXmlWriter->WriteNodeBegin( _T( "w:fldChar" ), TRUE );
m_pXmlWriter->WriteAttribute( _T( "w:fldCharType" ), _T( "begin" ) );
m_pXmlWriter->WriteNodeEnd( _T( "" ), TRUE, FALSE );
XMLTools::XMLElement<wchar_t> elem(_T("w:br")); int cpPic = searchNextTextMark( m_document->Text, cpFieldStart, TextMark::Picture );
elem.AppendAttribute(_T("w:type"), _T("page"));
m_pXmlWriter->WriteString(elem.GetXMLString().c_str()); /*if (cpPic < cpFieldEnd)
} {
} int fcPic = _doc.PieceTable.FileCharacterPositions[cpPic];
else if (TextMark::ColumnBreak == c) CharacterPropertyExceptions chpxPic = _doc.GetCharacterPropertyExceptions(fcPic, fcPic + 1)[0];
{ NilPicfAndBinData npbd = new NilPicfAndBinData(chpxPic, _doc.DataStream);
writeTextElement(text, textType); FormFieldData ffdata = new FormFieldData(npbd.binData);
ffdata.Convert(new FormFieldDataMapping(m_pXmlWriter));
}*/
text.clear(); m_pXmlWriter->WriteNodeEnd( _T( "w:fldChar" ) );
XMLTools::XMLElement<wchar_t> elem(_T("w:br")); _writeInstrText = true;
elem.AppendAttribute(_T("w:type"), _T("column"));
m_pXmlWriter->WriteString(elem.GetXMLString().c_str()); _fldCharCounter++;
} }
else if (TextMark::FieldBeginMark == c) else if (( search( f.begin(), f.end(), mergeformat.begin(), mergeformat.end()) != f.end()) ||
(( search( f.begin(), f.end(), excel.begin(), excel.end()) != f.end() ||
search( f.begin(), f.end(), word.begin(), word.end()) != f.end())
&&
( search(f.begin(), f.end(), embed.begin(), embed.end()) != f.end() ||
search( f.begin(), f.end(), link.begin(), link.end() ) != f.end()) &&
search( f.begin(), f.end(), chart.begin(), chart.end() ) == f.end()))
{ {
int cpFieldStart = initialCp + i; m_pXmlWriter->WriteNodeBegin( _T( "w:fldChar" ), TRUE );
int cpFieldEnd = searchNextTextMark( m_document->Text, cpFieldStart, TextMark::FieldEndMark );
std::wstring f( ( m_document->Text->begin() + cpFieldStart ), ( m_document->Text->begin() + cpFieldEnd + 1 ) );
std::wstring embed ( _T( " EMBED" ) );
std::wstring link ( _T( " LINK" ) );
std::wstring form ( _T( " FORM" ) );
std::wstring excel ( _T( " Excel" ) );
std::wstring word ( _T( " Word" ) );
std::wstring equation ( _T( " Equation" ) ) ;
std::wstring mergeformat( _T( " MERGEFORMAT" ) );
std::wstring quote ( _T( " QUOTE" ) );
std::wstring chart ( _T( "Chart" ) );
std::wstring PBrush ( _T( " PBrush" ) );
if ( search( f.begin(), f.end(), form.begin(), form.end() ) != f.end() )
{
m_pXmlWriter->WriteNodeBegin( _T( "w:fldChar" ), TRUE );
m_pXmlWriter->WriteAttribute( _T( "w:fldCharType" ), _T( "begin" ) ); m_pXmlWriter->WriteAttribute( _T( "w:fldCharType" ), _T( "begin" ) );
m_pXmlWriter->WriteNodeEnd( _T( "" ), TRUE, FALSE ); m_pXmlWriter->WriteNodeEnd( _T( "" ), TRUE, FALSE );
int cpPic = searchNextTextMark( m_document->Text, cpFieldStart, TextMark::Picture ); int cpPic = searchNextTextMark( m_document->Text, cpFieldStart, TextMark::Picture );
/*if (cpPic < cpFieldEnd) m_pXmlWriter->WriteNodeEnd( _T( "w:fldChar" ) );
{
int fcPic = _doc.PieceTable.FileCharacterPositions[cpPic];
CharacterPropertyExceptions chpxPic = _doc.GetCharacterPropertyExceptions(fcPic, fcPic + 1)[0];
NilPicfAndBinData npbd = new NilPicfAndBinData(chpxPic, _doc.DataStream);
FormFieldData ffdata = new FormFieldData(npbd.binData);
ffdata.Convert(new FormFieldDataMapping(m_pXmlWriter));
}*/
m_pXmlWriter->WriteNodeEnd( _T( "w:fldChar" ) ); _writeInstrText = true;
this->_writeInstrText = true; _fldCharCounter++;
}
else if ( search( f.begin(), f.end(), HYPERLINK.begin(), HYPERLINK.end()) != f.end() &&
search( f.begin(), f.end(), PAGEREF.begin(), PAGEREF.end()) != f.end())
{
int cpFieldSep2 = cpFieldStart, cpFieldSep1 = cpFieldStart;
std::vector<std::wstring> toc;
this->_fldCharCounter++; if (search( f.begin(), f.end(), TOC.begin(), TOC.end()) != f.end())
}
else if (( search( f.begin(), f.end(), mergeformat.begin(), mergeformat.end()) != f.end()) ||
(( search( f.begin(), f.end(), excel.begin(), excel.end()) != f.end() ||
search( f.begin(), f.end(), word.begin(), word.end()) != f.end())
&&
( search(f.begin(), f.end(), embed.begin(), embed.end()) != f.end() ||
search( f.begin(), f.end(), link.begin(), link.end() ) != f.end()) &&
search( f.begin(), f.end(), chart.begin(), chart.end() ) == f.end()))
{ {
m_pXmlWriter->WriteNodeBegin( _T( "w:fldChar" ), TRUE ); m_pXmlWriter->WriteNodeBegin( _T( "w:fldChar" ), TRUE );
m_pXmlWriter->WriteAttribute( _T( "w:fldCharType" ), _T( "begin" ) ); m_pXmlWriter->WriteAttribute( _T( "w:fldCharType" ), _T( "begin" ) );
m_pXmlWriter->WriteNodeEnd( _T( "" ), TRUE, FALSE ); m_pXmlWriter->WriteNodeEnd( _T( "" ), TRUE );
int cpPic = searchNextTextMark( m_document->Text, cpFieldStart, TextMark::Picture );
m_pXmlWriter->WriteNodeEnd( _T( "w:fldChar" ) );
this->_writeInstrText = true;
this->_fldCharCounter++; _writeInstrText = true;
_fldCharCounter++;
} }
else if ( search( f.begin(), f.end(), embed.begin(), embed.end()) != f.end() else
|| search( f.begin(), f.end(), link.begin(), link.end() ) != f.end()
|| search( f.begin(), f.end(), quote.begin(), quote.end()) != f.end())
{ {
int cpPic = searchNextTextMark(m_document->Text, cpFieldStart, TextMark::Picture); while ( cpFieldSep2 < cpFieldEnd)
int cpFieldSep = searchNextTextMark(m_document->Text, cpFieldStart, TextMark::FieldSeparator);
if (cpPic < cpFieldEnd)
{ {
int fcPic = m_document->m_PieceTable->FileCharacterPositions->operator []( cpPic ); cpFieldSep2 = searchNextTextMark(m_document->Text, cpFieldSep1 + 1, TextMark::FieldSeparator);
list<CharacterPropertyExceptions*>* chpxs = m_document->GetCharacterPropertyExceptions(fcPic, fcPic + 1); std::wstring f1( ( m_document->Text->begin() + cpFieldSep1 ), ( m_document->Text->begin() + cpFieldSep2 + 1 ) );
toc.push_back(f1);
CharacterPropertyExceptions* chpxPic = chpxs->front(); if (search( f1.begin(), f1.end(), PAGEREF.begin(), PAGEREF.end()) != f1.end())
{
int d = f1.find(PAGEREF);
PictureDescriptor pic(chpxPic, m_document->DataStream); _writeWebHidden = true;
std::wstring _writeTocLink =f1.substr(d + 9);
d = _writeTocLink.find(_T(" "));
_writeTocLink = _writeTocLink.substr(0, d);
_writeAfterRun = std::wstring (_T("<w:hyperlink w:anchor = \""));
_writeAfterRun += _writeTocLink;
_writeAfterRun += std::wstring (_T("\" w:history=\"1\">"));
//if (_writeInstrText == true)
//{
// m_pXmlWriter->WriteNodeBegin( _T( "w:fldChar" ), TRUE );
// m_pXmlWriter->WriteAttribute( _T( "w:fldCharType" ), _T( "separate" ) );
// m_pXmlWriter->WriteNodeEnd( _T( "" ), TRUE );
//}
_writeInstrText = false;
//cp = cpFieldSep1;
}
cpFieldSep1 = cpFieldSep2;
}
_skipRuns = 5;
}
}
else if ( search( f.begin(), f.end(), embed.begin(), embed.end()) != f.end()
|| search( f.begin(), f.end(), link.begin(), link.end() ) != f.end()
|| search( f.begin(), f.end(), quote.begin(), quote.end()) != f.end())
{
int cpPic = searchNextTextMark(m_document->Text, cpFieldStart, TextMark::Picture);
int cpFieldSep = searchNextTextMark(m_document->Text, cpFieldStart, TextMark::FieldSeparator);
RevisionData oData = RevisionData(chpxPic); if (cpPic < cpFieldEnd)
{
int fcPic = m_document->m_PieceTable->FileCharacterPositions->operator []( cpPic );
list<CharacterPropertyExceptions*>* chpxs = m_document->GetCharacterPropertyExceptions(fcPic, fcPic + 1);
CharacterPropertyExceptions* chpxPic = chpxs->front();
CharacterPropertiesMapping* rPr = new CharacterPropertiesMapping(m_pXmlWriter, m_document, &oData, _lastValidPapx, false); PictureDescriptor pic(chpxPic, m_document->DataStream);
if(rPr)
{
chpxPic->Convert(rPr);
RELEASEOBJECT(rPr);
}
XmlUtils::CXmlWriter OleWriter;
OleWriter.WriteNodeBegin (_T( "w:object" ), TRUE);
//append the origin attributes RevisionData oData = RevisionData(chpxPic);
OleWriter.WriteAttribute( _T( "w:dxaOrig" ), FormatUtils::IntToWideString( ( pic.dxaGoal + pic.dxaOrigin ) ).c_str() );
OleWriter.WriteAttribute( _T( "w:dyaOrig" ), FormatUtils::IntToWideString( ( pic.dyaGoal + pic.dyaOrigin ) ).c_str() );
OleWriter.WriteNodeEnd( _T( "" ), TRUE, FALSE );
VMLPictureMapping oVmlMapper (m_context, &OleWriter, true, _caller); CharacterPropertiesMapping* rPr = new CharacterPropertiesMapping(m_pXmlWriter, m_document, &oData, _lastValidPapx, false);
pic.Convert(&oVmlMapper); if(rPr)
RELEASEOBJECT(chpxs); {
chpxPic->Convert(rPr);
RELEASEOBJECT(rPr);
}
XmlUtils::CXmlWriter OleWriter;
OleWriter.WriteNodeBegin (_T( "w:object" ), TRUE);
if ( cpFieldSep < cpFieldEnd ) //append the origin attributes
{ OleWriter.WriteAttribute( _T( "w:dxaOrig" ), FormatUtils::IntToWideString( ( pic.dxaGoal + pic.dxaOrigin ) ).c_str() );
int fcFieldSep = m_document->m_PieceTable->FileCharacterPositions->operator []( cpFieldSep ); OleWriter.WriteAttribute( _T( "w:dyaOrig" ), FormatUtils::IntToWideString( ( pic.dyaGoal + pic.dyaOrigin ) ).c_str() );
list<CharacterPropertyExceptions*>* chpxs = m_document->GetCharacterPropertyExceptions( fcFieldSep, ( fcFieldSep + 1 ) ); OleWriter.WriteNodeEnd( _T( "" ), TRUE, FALSE );
CharacterPropertyExceptions* chpxSep = chpxs->front();
OleObject ole ( chpxSep, m_document->GetStorage() );
OleObjectMapping oleObjectMapping( &OleWriter, m_context, &pic, _caller, oVmlMapper.GetShapeId() );
if (oVmlMapper.m_isEmbedded)
{
ole.isEquation = oVmlMapper.m_isEquation;
ole.isEmbedded = oVmlMapper.m_isEmbedded;
ole.emeddedData = oVmlMapper.m_embeddedData;
}
ole.Convert( &oleObjectMapping );
RELEASEOBJECT( chpxs );
}
OleWriter.WriteNodeEnd( _T( "w:object" ) ); VMLPictureMapping oVmlMapper (m_context, &OleWriter, true, _caller);
pic.Convert(&oVmlMapper);
RELEASEOBJECT(chpxs);
if (!oVmlMapper.m_isEmbedded && oVmlMapper.m_isEquation) if ( cpFieldSep < cpFieldEnd )
{ {
//нельзя в Run писать oMath int fcFieldSep = m_document->m_PieceTable->FileCharacterPositions->operator []( cpFieldSep );
//m_pXmlWriter->WriteString(oVmlMapper.m_equationXml.c_str()); list<CharacterPropertyExceptions*>* chpxs = m_document->GetCharacterPropertyExceptions( fcFieldSep, ( fcFieldSep + 1 ) );
_writeAfterRun = oVmlMapper.m_equationXml; CharacterPropertyExceptions* chpxSep = chpxs->front();
}
else OleObject ole ( chpxSep, m_document->GetStorage() );
OleObjectMapping oleObjectMapping( &OleWriter, m_context, &pic, _caller, oVmlMapper.GetShapeId() );
if (oVmlMapper.m_isEmbedded)
{ {
m_pXmlWriter->WriteString(OleWriter.GetXmlString()); ole.isEquation = oVmlMapper.m_isEquation;
ole.isEmbedded = oVmlMapper.m_isEmbedded;
ole.emeddedData = oVmlMapper.m_embeddedData;
} }
ole.Convert( &oleObjectMapping );
RELEASEOBJECT( chpxs );
} }
if (search(f.begin(), f.end(), embed.begin(), embed.end()) != f.end() ) OleWriter.WriteNodeEnd( _T( "w:object" ) );
this->_skipRuns = 3;
if (!oVmlMapper.m_isEmbedded && oVmlMapper.m_isEquation)
{
//нельзя в Run писать oMath
//m_pXmlWriter->WriteString(oVmlMapper.m_equationXml.c_str());
_writeAfterRun = oVmlMapper.m_equationXml;
}
else else
this->_skipRuns = 5; {
m_pXmlWriter->WriteString(OleWriter.GetXmlString());
}
} }
if (search(f.begin(), f.end(), embed.begin(), embed.end()) != f.end() )
_skipRuns = 3;
else else
{ _skipRuns = 5;
m_pXmlWriter->WriteNodeBegin( _T( "w:fldChar" ), TRUE ); }
else
{
m_pXmlWriter->WriteNodeBegin( _T( "w:fldChar" ), TRUE );
m_pXmlWriter->WriteAttribute( _T( "w:fldCharType" ), _T( "begin" ) ); m_pXmlWriter->WriteAttribute( _T( "w:fldCharType" ), _T( "begin" ) );
m_pXmlWriter->WriteNodeEnd( _T( "" ), TRUE ); m_pXmlWriter->WriteNodeEnd( _T( "" ), TRUE );
this->_writeInstrText = true; _writeInstrText = true;
_fldCharCounter++;
this->_fldCharCounter++;
}
} }
else if (TextMark::FieldSeparator == c) }
else if (TextMark::FieldSeparator == c)
{
if (_fldCharCounter > 0)
{ {
if (_fldCharCounter > 0) XMLTools::XMLElement<wchar_t> elem( _T( "w:fldChar" ) );
{ elem.AppendAttribute( _T( "w:fldCharType" ), _T( "separate" ) );
XMLTools::XMLElement<wchar_t> elem( _T( "w:fldChar" ) );
elem.AppendAttribute( _T( "w:fldCharType" ), _T( "separate" ) );
m_pXmlWriter->WriteString( elem.GetXMLString().c_str() ); m_pXmlWriter->WriteString( elem.GetXMLString().c_str() );
}
} }
else if (TextMark::FieldEndMark == c) }
else if (TextMark::FieldEndMark == c)
{
if (_fldCharCounter > 0)
{ {
if (_fldCharCounter > 0) XMLTools::XMLElement<wchar_t> elem( _T( "w:fldChar" ) );
{ elem.AppendAttribute( _T( "w:fldCharType" ), _T( "end" ) );
XMLTools::XMLElement<wchar_t> elem( _T( "w:fldChar" ) );
elem.AppendAttribute( _T( "w:fldCharType" ), _T( "end" ) );
m_pXmlWriter->WriteString( elem.GetXMLString().c_str() );
this->_fldCharCounter--; m_pXmlWriter->WriteString( elem.GetXMLString().c_str() );
}
if ( this->_fldCharCounter == 0 ) _fldCharCounter--;
{
this->_writeInstrText = false;
}
} }
else if ((TextMark::Symbol == c) && fSpec) if (_writeWebHidden)
{ {
Symbol s = getSymbol( chpx ); _writeAfterRun = std::wstring (_T("</w:hyperlink>"));
}
_writeWebHidden = false;
if ( _fldCharCounter == 0 )
{
_writeInstrText = false;
}
}
else if ((TextMark::Symbol == c) && fSpec)
{
Symbol s = getSymbol( chpx );
m_pXmlWriter->WriteNodeBegin(_T("w:sym"), TRUE); m_pXmlWriter->WriteNodeBegin(_T("w:sym"), TRUE);
m_pXmlWriter->WriteAttribute(_T("w:font"), FormatUtils::XmlEncode(s.FontName).c_str()); m_pXmlWriter->WriteAttribute(_T("w:font"), FormatUtils::XmlEncode(s.FontName).c_str());
m_pXmlWriter->WriteAttribute(_T("w:char"), FormatUtils::XmlEncode(s.HexValue).c_str()); m_pXmlWriter->WriteAttribute(_T("w:char"), FormatUtils::XmlEncode(s.HexValue).c_str());
m_pXmlWriter->WriteNodeEnd(_T(""), TRUE); m_pXmlWriter->WriteNodeEnd(_T(""), TRUE);
}
else if ((TextMark::DrawnObject == c) && fSpec)
{
Spa* pSpa = NULL;
if (typeid(*this) == typeid(MainDocumentMapping))
{
pSpa = static_cast<Spa*>(m_document->OfficeDrawingPlex->GetStruct(cp));
} }
else if ((TextMark::DrawnObject == c) && fSpec) else if ((typeid(*this) == typeid(HeaderMapping) ) || ( typeid(*this) == typeid(FooterMapping)))
{ {
Spa* pSpa = NULL; int headerCp = ( cp - m_document->FIB->m_RgLw97.ccpText - m_document->FIB->m_RgLw97.ccpFtn );
if (typeid(*this) == typeid(MainDocumentMapping)) pSpa = static_cast<Spa*>(m_document->OfficeDrawingPlexHeader->GetStruct(headerCp));
{
pSpa = static_cast<Spa*>(m_document->OfficeDrawingPlex->GetStruct(cp));
}
else if ((typeid(*this) == typeid(HeaderMapping) ) || ( typeid(*this) == typeid(FooterMapping)))
{
int headerCp = ( cp - m_document->FIB->m_RgLw97.ccpText - m_document->FIB->m_RgLw97.ccpFtn );
pSpa = static_cast<Spa*>(m_document->OfficeDrawingPlexHeader->GetStruct(headerCp));
}
if (pSpa)
{
ShapeContainer* pShape = m_document->GetOfficeArt()->GetShapeContainer(pSpa->GetShapeID());
if (pShape)
{
m_pXmlWriter->WriteNodeBegin (_T("w:pict"));
VMLShapeMapping oVmlWriter (m_context, m_pXmlWriter, pSpa, NULL, _caller);
pShape->Convert(&oVmlWriter);
m_pXmlWriter->WriteNodeEnd (_T("w:pict"));
}
}
} }
else if ((TextMark::Picture == c) && fSpec)
if (pSpa)
{ {
PictureDescriptor oPicture (chpx, m_document->DataStream); ShapeContainer* pShape = m_document->GetOfficeArt()->GetShapeContainer(pSpa->GetShapeID());
if ((oPicture.mfp.mm > 98) && (NULL != oPicture.shapeContainer)) if (pShape)
{ {
m_pXmlWriter->WriteNodeBegin (_T("w:pict")); m_pXmlWriter->WriteNodeBegin (_T("w:pict"));
VMLShapeMapping oVmlWriter (m_context, m_pXmlWriter, pSpa, NULL, _caller);
pShape->Convert(&oVmlWriter);
m_pXmlWriter->WriteNodeEnd (_T("w:pict"));
}
}
}
else if ((TextMark::Picture == c) && fSpec)
{
PictureDescriptor oPicture (chpx, m_document->DataStream);
bool picture = true; if ((oPicture.mfp.mm > 98) && (NULL != oPicture.shapeContainer))
{
m_pXmlWriter->WriteNodeBegin (_T("w:pict"));
if (oPicture.shapeContainer) bool picture = true;
{
int shape_type = oPicture.shapeContainer->getShapeType();
if (shape_type != msosptPictureFrame) picture = false; if (oPicture.shapeContainer)
} {
int shape_type = oPicture.shapeContainer->getShapeType();
if (shape_type != msosptPictureFrame) picture = false;
}
if (picture)
{
VMLPictureMapping oVmlMapper(m_context, m_pXmlWriter, false, _caller);
oPicture.Convert (&oVmlMapper);
if (picture) if (oVmlMapper.m_isEmbedded)
{ {
VMLPictureMapping oVmlMapper(m_context, m_pXmlWriter, false, _caller); OleObject ole ( chpx, m_document->GetStorage() );
oPicture.Convert (&oVmlMapper); OleObjectMapping oleObjectMapping( m_pXmlWriter, m_context, &oPicture, _caller, oVmlMapper.GetShapeId() );
if (oVmlMapper.m_isEmbedded)
{
OleObject ole ( chpx, m_document->GetStorage() );
OleObjectMapping oleObjectMapping( m_pXmlWriter, m_context, &oPicture, _caller, oVmlMapper.GetShapeId() );
ole.isEquation = oVmlMapper.m_isEquation;
ole.isEmbedded = oVmlMapper.m_isEmbedded;
ole.emeddedData = oVmlMapper.m_embeddedData;
ole.Convert( &oleObjectMapping ); ole.isEquation = oVmlMapper.m_isEquation;
} ole.isEmbedded = oVmlMapper.m_isEmbedded;
}else ole.emeddedData = oVmlMapper.m_embeddedData;
{
VMLShapeMapping oVmlMapper(m_context, m_pXmlWriter, NULL, &oPicture, _caller);
oPicture.shapeContainer->Convert(&oVmlMapper);
}
m_pXmlWriter->WriteNodeEnd (_T("w:pict")); ole.Convert( &oleObjectMapping );
} }
} }else
else if ((TextMark::AutoNumberedFootnoteReference == c) && fSpec)
{
if ((m_document->FootnoteReferenceCharactersPlex != NULL) && (m_document->FootnoteReferenceCharactersPlex->IsCpExists(cp)))
{
m_pXmlWriter->WriteNodeBegin( _T( "w:footnoteReference" ), TRUE );
m_pXmlWriter->WriteAttribute( _T( "w:id" ), FormatUtils::IntToWideString(_footnoteNr++ ).c_str() );
m_pXmlWriter->WriteNodeEnd( _T( "" ), TRUE );
}
else if ((m_document->IndividualFootnotesPlex != NULL) && (m_document->IndividualFootnotesPlex->IsCpExists(cp - m_document->FIB->m_RgLw97.ccpText)))
{
m_pXmlWriter->WriteNodeBegin( _T( "w:footnoteRef" ), TRUE );
m_pXmlWriter->WriteNodeEnd( _T( "" ), TRUE );
}
else if ((m_document->EndnoteReferenceCharactersPlex != NULL) && (m_document->EndnoteReferenceCharactersPlex->IsCpExists(cp)))
{
m_pXmlWriter->WriteNodeBegin( _T( "w:endnoteReference" ), TRUE );
m_pXmlWriter->WriteAttribute( _T( "w:id" ), FormatUtils::IntToWideString(_endnoteNr++ ).c_str() );
m_pXmlWriter->WriteNodeEnd( _T( "" ), TRUE );
}
else if ((m_document->IndividualEndnotesPlex != NULL) &&
(m_document->IndividualEndnotesPlex->IsCpExists(cp - m_document->FIB->m_RgLw97.ccpAtn - m_document->FIB->m_RgLw97.ccpHdr - m_document->FIB->m_RgLw97.ccpFtn - m_document->FIB->m_RgLw97.ccpText)))
{ {
m_pXmlWriter->WriteNodeBegin( _T( "w:endnoteRef" ), TRUE ); VMLShapeMapping oVmlMapper(m_context, m_pXmlWriter, NULL, &oPicture, _caller);
m_pXmlWriter->WriteNodeEnd( _T( "" ), TRUE ); oPicture.shapeContainer->Convert(&oVmlMapper);
} }
m_pXmlWriter->WriteNodeEnd (_T("w:pict"));
}
}
else if ((TextMark::AutoNumberedFootnoteReference == c) && fSpec)
{
if ((m_document->FootnoteReferenceCharactersPlex != NULL) && (m_document->FootnoteReferenceCharactersPlex->IsCpExists(cp)))
{
m_pXmlWriter->WriteNodeBegin( _T( "w:footnoteReference" ), TRUE );
m_pXmlWriter->WriteAttribute( _T( "w:id" ), FormatUtils::IntToWideString(_footnoteNr++ ).c_str() );
m_pXmlWriter->WriteNodeEnd( _T( "" ), TRUE );
} }
else if (TextMark::AnnotationReference == c) else if ((m_document->IndividualFootnotesPlex != NULL) && (m_document->IndividualFootnotesPlex->IsCpExists(cp - m_document->FIB->m_RgLw97.ccpText)))
{ {
if (typeid(*this) != typeid(CommentsMapping)) m_pXmlWriter->WriteNodeBegin( _T( "w:footnoteRef" ), TRUE );
{ m_pXmlWriter->WriteNodeEnd( _T( "" ), TRUE );
m_pXmlWriter->WriteNodeBegin( _T( "w:commentReference" ), TRUE );
m_pXmlWriter->WriteAttribute( _T( "w:id" ), FormatUtils::IntToWideString( this->_commentNr ).c_str() );
m_pXmlWriter->WriteNodeEnd( _T( "" ), TRUE );
}
else
{
m_pXmlWriter->WriteNodeBegin( _T( "w:annotationRef" ), TRUE );
m_pXmlWriter->WriteNodeEnd( _T( "" ), TRUE );
}
this->_commentNr++;
} }
else if (!FormatUtils::IsControlSymbol(c) && ((int)c != 0xFFFF)) else if ((m_document->EndnoteReferenceCharactersPlex != NULL) && (m_document->EndnoteReferenceCharactersPlex->IsCpExists(cp)))
{ {
text += FormatUtils::GetXMLSymbol(c); m_pXmlWriter->WriteNodeBegin( _T( "w:endnoteReference" ), TRUE );
m_pXmlWriter->WriteAttribute( _T( "w:id" ), FormatUtils::IntToWideString(_endnoteNr++ ).c_str() );
m_pXmlWriter->WriteNodeEnd( _T( "" ), TRUE );
}
else if ((m_document->IndividualEndnotesPlex != NULL) &&
(m_document->IndividualEndnotesPlex->IsCpExists(cp - m_document->FIB->m_RgLw97.ccpAtn - m_document->FIB->m_RgLw97.ccpHdr - m_document->FIB->m_RgLw97.ccpFtn - m_document->FIB->m_RgLw97.ccpText)))
{
m_pXmlWriter->WriteNodeBegin( _T( "w:endnoteRef" ), TRUE );
m_pXmlWriter->WriteNodeEnd( _T( "" ), TRUE );
} }
cp++;
} }
else if (TextMark::AnnotationReference == c)
{
if (typeid(*this) != typeid(CommentsMapping))
{
m_pXmlWriter->WriteNodeBegin( _T( "w:commentReference" ), TRUE );
m_pXmlWriter->WriteAttribute( _T( "w:id" ), FormatUtils::IntToWideString( _commentNr ).c_str() );
m_pXmlWriter->WriteNodeEnd( _T( "" ), TRUE );
}
else
{
m_pXmlWriter->WriteNodeBegin( _T( "w:annotationRef" ), TRUE );
m_pXmlWriter->WriteNodeEnd( _T( "" ), TRUE );
}
if (!text.empty()) _commentNr++;
}
else if (!FormatUtils::IsControlSymbol(c) && ((int)c != 0xFFFF))
{ {
//bool preserve_space = (text.find(_T("\x20")) != text.npos) ? true : false; text += FormatUtils::GetXMLSymbol(c);
}
writeTextStart(textType, true/*preserve_space*/); cp++;
}
if (!text.empty())
{
//bool preserve_space = (text.find(_T("\x20")) != text.npos) ? true : false;
m_pXmlWriter->WriteString(text.c_str()); writeTextStart(textType, true/*preserve_space*/);
writeTextEnd(textType); m_pXmlWriter->WriteString(text.c_str());
#ifdef _DEBUG writeTextEnd(textType);
//OutputDebugStringW ( text.c_str() ); }
//OutputDebugStringW ( _T("\n") );
#endif
}
} }
void DocumentMapping::writeTextElement(const std::wstring& text, const std::wstring& textType) void DocumentMapping::writeTextElement(const std::wstring& text, const std::wstring& textType)
{ {
if ( !text.empty() ) if ( !text.empty() )
{ {
//bool preserve_space = (text.find(_T("\x20")) != text.npos) ? true : false; bool preserve_space = true;//(text.find(_T("\x20")) != text.npos) ? true : false;
if (textType == _T("instrText"))
preserve_space = false;
writeTextStart( textType, true /*preserve_space*/ ); writeTextStart( textType, preserve_space );
m_pXmlWriter->WriteString( text.c_str() ); m_pXmlWriter->WriteString( text.c_str() );
......
...@@ -99,9 +99,11 @@ namespace DocFileFormat ...@@ -99,9 +99,11 @@ namespace DocFileFormat
WordDocument* m_document; WordDocument* m_document;
ConversionContext* m_context; ConversionContext* m_context;
IMapping* _caller;
ParagraphPropertyExceptions* _lastValidPapx; ParagraphPropertyExceptions* _lastValidPapx;
SectionPropertyExceptions* _lastValidSepx; SectionPropertyExceptions* _lastValidSepx;
int _skipRuns; int _skipRuns;
int _sectionNr; int _sectionNr;
int _footnoteNr; int _footnoteNr;
...@@ -109,8 +111,8 @@ namespace DocFileFormat ...@@ -109,8 +111,8 @@ namespace DocFileFormat
int _commentNr; int _commentNr;
int _isSectionPageBreak; //0 - not set, 1 -page break, 2 - continues int _isSectionPageBreak; //0 - not set, 1 -page break, 2 - continues
bool _writeInstrText; bool _writeInstrText;
bool _writeWebHidden;
unsigned int _fldCharCounter; unsigned int _fldCharCounter;
IMapping* _caller;
std::wstring _writeAfterRun; std::wstring _writeAfterRun;
}; };
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment