Commit afd3bc62 authored by Elen.Subbotina's avatar Elen.Subbotina Committed by Alexander Trofimov

RtfFile win (32 & 64 bits) build

Исправлены гиперлинки.
Исправлены кодировки таблицы шрифтов.

git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@62271 954022d7-b5bf-4e40-9824-e11837661b57
parent 810f78ac
...@@ -587,6 +587,8 @@ private: ...@@ -587,6 +587,8 @@ private:
public: public:
RtfFontTableReader() RtfFontTableReader()
{ {
m_bUseGlobalCodepage = true;
m_eInternalState = is_normal; m_eInternalState = is_normal;
m_oFont.SetDefaultOOX(); m_oFont.SetDefaultOOX();
} }
...@@ -667,7 +669,7 @@ public: ...@@ -667,7 +669,7 @@ public:
m_oFont.m_sPanose += sText; m_oFont.m_sPanose += sText;
else if( is_altname == m_eInternalState ) else if( is_altname == m_eInternalState )
m_oFont.m_sAltName += sText; m_oFont.m_sAltName += sText;
else if( is_normal == m_eInternalState ) else if( is_normal == m_eInternalState && sText.GetLength() > 0)
{ {
if( sText.Find(';') != -1 ) if( sText.Find(';') != -1 )
{ {
...@@ -1873,7 +1875,8 @@ private: void TryToPepairResult( RtfDocument& oDocument, RtfReader& oReader ) ...@@ -1873,7 +1875,8 @@ private: void TryToPepairResult( RtfDocument& oDocument, RtfReader& oReader )
} }
int nSkipChar = 0; int nSkipChar = 0;
CString sResultSymbol = RtfAbstractReader::ExecuteTextInternal( oDocument, oReader, sCharA, false, 0, nSkipChar ); RtfAbstractReader reader;
CString sResultSymbol = reader.ExecuteTextInternal( oDocument, oReader, sCharA, false, 0, nSkipChar );
m_oField.m_oResult = TextItemContainerPtr( new TextItemContainer() ); m_oField.m_oResult = TextItemContainerPtr( new TextItemContainer() );
RtfParagraphPtr oNewPar = RtfParagraphPtr( new RtfParagraph() ); RtfParagraphPtr oNewPar = RtfParagraphPtr( new RtfParagraph() );
RtfCharPtr oNewChar = RtfCharPtr( new RtfChar() ); RtfCharPtr oNewChar = RtfCharPtr( new RtfChar() );
...@@ -2011,7 +2014,9 @@ public: ...@@ -2011,7 +2014,9 @@ public:
else else
sBullet += (char) nWinChar; sBullet += (char) nWinChar;
int nSkip = 0; int nSkip = 0;
CString sText = RtfAbstractReader::ExecuteTextInternal( oDocument, oReader, sBullet, false, 0, nSkip );
RtfAbstractReader reader;
CString sText = reader.ExecuteTextInternal( oDocument, oReader, sBullet, false, 0, nSkip );
ExecuteText( oDocument, oReader, sText ); ExecuteText( oDocument, oReader, sText );
} }
} }
......
...@@ -205,9 +205,16 @@ public: CString RenderToOOX(RenderParameter oRenderParameter) ...@@ -205,9 +205,16 @@ public: CString RenderToOOX(RenderParameter oRenderParameter)
int nIndex = sInsertText.Find( _T("HYPERLINK") ); int nIndex = sInsertText.Find( _T("HYPERLINK") );
if( -1 != nIndex ) if( -1 != nIndex )
{ {
//оставляем только одну ссылку
CString sHyperlink = sInsertText; CString sHyperlink = sInsertText;
sHyperlink.Delete( nIndex, 9/*(int)_tcslen( _T("HYPERLINK") )*/ ); sHyperlink.Delete( nIndex, 9/*(int)_tcslen( _T("HYPERLINK") )*/ );
int nSplash = sHyperlink.Find( _T("\\") );
if (nSplash > 0)
{
sHyperlink = sHyperlink.Left(nSplash);
}
//оставляем только одну ссылку
sHyperlink.Remove( '\"' ); sHyperlink.Remove( '\"' );
sHyperlink.Trim(); sHyperlink.Trim();
//заменяем пробелы на %20 //заменяем пробелы на %20
......
...@@ -2571,11 +2571,11 @@ CString RtfInformation::RenderToOOX(RenderParameter oRenderParameter) ...@@ -2571,11 +2571,11 @@ CString RtfInformation::RenderToOOX(RenderParameter oRenderParameter)
if( m_sKeywords.GetLength() > 0 ) pCore->m_sKeywords = m_sKeywords; if( m_sKeywords.GetLength() > 0 ) pCore->m_sKeywords = m_sKeywords;
if( m_sComment.GetLength() > 0 ) pCore->m_sDescription = m_sComment; if( m_sComment.GetLength() > 0 ) pCore->m_sDescription = m_sComment;
CString sCreateTime = m_oCreateTime.RenderToOOX( oRenderParameter ); //CString sCreateTime = m_oCreateTime.RenderToOOX( oRenderParameter );
if( false == sCreateTime.IsEmpty() ) pCore->m_sCreated = sCreateTime; //if( false == sCreateTime.IsEmpty() ) pCore->m_sCreated = sCreateTime;
//
CString sRevTime = m_oRevTime.RenderToOOX( oRenderParameter ); //CString sRevTime = m_oRevTime.RenderToOOX( oRenderParameter );
if( false == sRevTime.IsEmpty() ) pCore->m_sModified = sRevTime; //if( false == sRevTime.IsEmpty() ) pCore->m_sModified = sRevTime;
//CString sPrintTime = m_oPrintTime.RenderToOOX( oRenderParameter ); //CString sPrintTime = m_oPrintTime.RenderToOOX( oRenderParameter );
//if( _T("") != sPrintTime ) //if( _T("") != sPrintTime )
......
...@@ -41,7 +41,6 @@ void RtfReader::PopState() ...@@ -41,7 +41,6 @@ void RtfReader::PopState()
//delete psaveOld; //delete psaveOld;
} }
CString RtfAbstractReader::ExecuteTextInternalCodePage( std::string& sCharString, RtfDocument& oDocument, RtfReader& oReader) CString RtfAbstractReader::ExecuteTextInternalCodePage( std::string& sCharString, RtfDocument& oDocument, RtfReader& oReader)
{ {
CString sResult; CString sResult;
...@@ -52,7 +51,7 @@ CString RtfAbstractReader::ExecuteTextInternalCodePage( std::string& sCharString ...@@ -52,7 +51,7 @@ CString RtfAbstractReader::ExecuteTextInternalCodePage( std::string& sCharString
//применяем параметры codepage от текущего шрифта todo associated fonts. //применяем параметры codepage от текущего шрифта todo associated fonts.
RtfFont oFont; RtfFont oFont;
if( true == oDocument.m_oFontTable.GetFont( oReader.m_oState->m_oCharProp.m_nFont, oFont ) ) if( true == oDocument.m_oFontTable.GetFont( oReader.m_oState->m_oCharProp.m_nFont, oFont ) && !m_bUseGlobalCodepage)
{ {
if( PROP_DEF != oFont.m_nCharset ) if( PROP_DEF != oFont.m_nCharset )
{ {
......
...@@ -79,6 +79,8 @@ public: ...@@ -79,6 +79,8 @@ public:
m_nCurGroups = 1; m_nCurGroups = 1;
m_oFileWriter = NULL; m_oFileWriter = NULL;
m_bStopReader = false; m_bStopReader = false;
m_bUseGlobalCodepage = false;
} }
bool Parse(RtfDocument& oDocument, RtfReader& oReader ) bool Parse(RtfDocument& oDocument, RtfReader& oReader )
{ {
...@@ -202,7 +204,7 @@ public: ...@@ -202,7 +204,7 @@ public:
virtual void ExitReader2( RtfDocument& oDocument, RtfReader& oReader ) virtual void ExitReader2( RtfDocument& oDocument, RtfReader& oReader )
{ {
} }
static CString ExecuteTextInternal( RtfDocument& oDocument, RtfReader& oReader, std::string & sKey, bool bHasPar, int nPar, int& nSkipChars) /*static */CString ExecuteTextInternal( RtfDocument& oDocument, RtfReader& oReader, std::string & sKey, bool bHasPar, int nPar, int& nSkipChars)
{ {
CString sResult; CString sResult;
...@@ -242,7 +244,7 @@ public: ...@@ -242,7 +244,7 @@ public:
} }
} }
} }
static void ExecuteTextInternalSkipChars(CString & sResult, RtfReader& oReader, std::string & sKey, int& nSkipChars) /*static */void ExecuteTextInternalSkipChars(CString & sResult, RtfReader& oReader, std::string & sKey, int& nSkipChars)
{ {
//удаляем символы вслед за юникодом //удаляем символы вслед за юникодом
if( nSkipChars > 0 ) if( nSkipChars > 0 )
...@@ -265,7 +267,7 @@ public: ...@@ -265,7 +267,7 @@ public:
nSkipChars = oReader.m_oState->m_nUD; nSkipChars = oReader.m_oState->m_nUD;
} }
} }
static CString ExecuteTextInternalCodePage( std::string & sCharString, RtfDocument & oDocument, RtfReader & oReader); /*static */CString ExecuteTextInternalCodePage( std::string & sCharString, RtfDocument & oDocument, RtfReader & oReader);
private: private:
RtfToken m_oTok; RtfToken m_oTok;
...@@ -274,7 +276,10 @@ private: ...@@ -274,7 +276,10 @@ private:
int m_nSkipChars; int m_nSkipChars;
bool m_bSkip; bool m_bSkip;
bool m_bStopReader; bool m_bStopReader;
protected: protected:
int m_nCurGroups; int m_nCurGroups;
bool m_bUseGlobalCodepage;
}; };
...@@ -480,11 +480,14 @@ public: ...@@ -480,11 +480,14 @@ public:
w_out.GetBuffer(insize); w_out.GetBuffer(insize);
char *inptr = (char*)start.operator ->();
char* outptr = (char*)w_out.GetBuffer();
if (nCodepage > 0) if (nCodepage > 0)
{ {
#if defined (_WIN32) || defined (_WIN64) #if defined (_WIN32) || defined (_WIN64)
int insize = MultiByteToWideChar(nCodepage, 0, start, -1, NULL, NULL); int insize = MultiByteToWideChar(nCodepage, 0, inptr, -1, NULL, NULL);
if (MultiByteToWideChar(nCodepage, 0, start, -1, w_out.GetBuffer(), insize) > 0) if (MultiByteToWideChar(nCodepage, 0, inptr, -1, (LPWSTR)outptr, insize) > 0)
{ {
w_out.ReleaseBuffer(); w_out.ReleaseBuffer();
ansi = false; ansi = false;
...@@ -496,9 +499,6 @@ public: ...@@ -496,9 +499,6 @@ public:
if (ic != (iconv_t) -1) if (ic != (iconv_t) -1)
{ {
size_t nconv = 0, avail = (insize) * sizeof(wchar_t); size_t nconv = 0, avail = (insize) * sizeof(wchar_t);
char *inptr = (char*)start.operator ->();
char* outptr = (char*)w_out.GetBuffer();
nconv = iconv (ic, &inptr, &insize, &outptr, &avail); nconv = iconv (ic, &inptr, &insize, &outptr, &avail);
if (nconv == 0) if (nconv == 0)
...@@ -520,15 +520,21 @@ public: ...@@ -520,15 +520,21 @@ public:
std::string out; std::string out;
bool ansi = true; bool ansi = true;
size_t insize = end- start; size_t insize = end - start;
out.reserve(insize); out.reserve(insize);
char *inptr = (char*)start.operator ->();
char* outptr = (char*)out.c_str();
if (nCodepage > 0) if (nCodepage > 0)
{ {
#if defined (_WIN32) || defined (_WIN64) #if defined (_WIN32) || defined (_WIN64)
insize = WideCharToMultiByte(nCodepage, 0, start, -1, NULL, NULL); insize = WideCharToMultiByte(nCodepage, 0, (LPCWSTR)inptr, -1, NULL, 0, NULL, NULL);
WideCharToMultiByte(nCodepage, 0, start, -1, out.c_str() , insize); if (WideCharToMultiByte(nCodepage, 0, (LPCWSTR)inptr, -1, outptr, insize, NULL, NULL) > 0)
{
ansi = false;
}
#else #else
std::string sCodepage = "CP" + std::to_string(nCodepage); std::string sCodepage = "CP" + std::to_string(nCodepage);
...@@ -536,9 +542,6 @@ public: ...@@ -536,9 +542,6 @@ public:
if (ic != (iconv_t) -1) if (ic != (iconv_t) -1)
{ {
size_t nconv = 0, avail = insize * sizeof(wchar_t); size_t nconv = 0, avail = insize * sizeof(wchar_t);
char *inptr = (char*)start.operator ->();
char* outptr = (char*)out.c_str();
nconv = iconv (ic, &inptr, &insize, &outptr, &avail); nconv = iconv (ic, &inptr, &insize, &outptr, &avail);
if (nconv == 0) ansi = false; if (nconv == 0) ansi = false;
......
...@@ -36,6 +36,7 @@ public: ...@@ -36,6 +36,7 @@ public:
sResult.Append( _T("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>") ); sResult.Append( _T("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>") );
sResult.AppendChar('\n'); sResult.AppendChar('\n');
sResult.Append( _T("<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">") ); sResult.Append( _T("<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">") );
for( int i = 0; i < (int)m_aTargets.size(); i++ ) for( int i = 0; i < (int)m_aTargets.size(); i++ )
{ {
sResult.AppendFormat( _T("<Relationship Id=\"%ls\" Type=\"%ls\" Target=\"%ls\""), m_aIDs[i].GetBuffer(), m_aTypes[i].GetBuffer(), m_aTargets[i].GetBuffer()); sResult.AppendFormat( _T("<Relationship Id=\"%ls\" Type=\"%ls\" Target=\"%ls\""), m_aIDs[i].GetBuffer(), m_aTypes[i].GetBuffer(), m_aTargets[i].GetBuffer());
......
...@@ -7,14 +7,14 @@ private: ...@@ -7,14 +7,14 @@ private:
CString m_sFileXml; CString m_sFileXml;
OOXWriter& m_oWriter; OOXWriter& m_oWriter;
CString CreateXml() std::wstring CreateXml()
{ {
CString sResult; std::wstring sResult;
sResult.Append( _T("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>") ); sResult.append( _T("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>") );
sResult.Append( _T("\n") ); sResult.append( _T("\n") );
sResult.Append( _T("<w:settings xmlns:w = \"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:m = \"http://schemas.openxmlformats.org/officeDocument/2006/math\">") ); sResult.append( _T("<w:settings xmlns:w = \"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:m = \"http://schemas.openxmlformats.org/officeDocument/2006/math\">") );
sResult.Append( m_sFileXml ); sResult.append( m_sFileXml );
sResult.Append( _T("</w:settings>") ); sResult.append( _T("</w:settings>") );
return sResult; return sResult;
} }
public: public:
...@@ -36,7 +36,7 @@ public: ...@@ -36,7 +36,7 @@ public:
if( false == m_sFileXml.IsEmpty() ) if( false == m_sFileXml.IsEmpty() )
{ {
//генерируем свою xml //генерируем свою xml
CString sXml = CreateXml(); std::wstring sXml = CreateXml();
//todoooo ПЕРЕПИСАТЬ //todoooo ПЕРЕПИСАТЬ
...@@ -55,15 +55,18 @@ public: ...@@ -55,15 +55,18 @@ public:
// } // }
//} //}
//HANDLE hFile = ::CreateFile( sFilename, GENERIC_WRITE, 0, 0, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, 0 ); CFile file;
if (file.CreateFile(pathWord + FILE_SEPARATOR_STR + _T("settings.xml"))) return false;
//m_oWriter.m_oDocRels.AddRelationship( _T("http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings"), _T("settings.xml") ); m_oWriter.m_oDocRels.AddRelationship( _T("http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings"), _T("settings.xml") );
//m_oWriter.m_oContentTypes.AddContent( _T("application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml"), _T("/word/settings.xml") ); m_oWriter.m_oContentTypes.AddContent( _T("application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml"), _T("/word/settings.xml") );
//DWORD dwBytesWritten; std::string sXmlUTF = NSFile::CUtf8Converter::GetUtf8StringFromUnicode(sXml);
//CStringA sXmlUTF = Convert::UnicodeToUtf8( sXml );
//::WriteFile(hFile, sXmlUTF, sXmlUTF.GetLength(), &dwBytesWritten, NULL); file.WriteFile((void*)sXmlUTF.c_str(), sXmlUTF.length());
//CloseHandle( hFile );
file.CloseFile();
;
return true; return true;
} }
else else
......
...@@ -89,6 +89,24 @@ bool OOXWriter::SaveByItemEnd() ...@@ -89,6 +89,24 @@ bool OOXWriter::SaveByItemEnd()
OOX::CPath pathWord = m_sTargetFolder + FILE_SEPARATOR_STR + _T("word"); OOX::CPath pathWord = m_sTargetFolder + FILE_SEPARATOR_STR + _T("word");
FileSystem::Directory::CreateDirectory(pathWord.GetPath()); FileSystem::Directory::CreateDirectory(pathWord.GetPath());
OOX::CPath pathTheme = pathWord + FILE_SEPARATOR_STR + _T("theme");
FileSystem::Directory::CreateDirectory(pathTheme.GetPath()) ;
Writers::DefaultThemeWriter themeWriter;
themeWriter.Write(pathTheme.GetPath() + FILE_SEPARATOR_STR + _T("theme1.xml"));
m_oDocRels.AddRelationship( _T("http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme"), _T("theme/theme1.xml") );
m_oContentTypes.AddContent( _T("application/vnd.openxmlformats-officedocument.theme+xml"), _T("/word/theme/theme1.xml") );
//-----------------------------------------------------------------------------------------------------
((OOXDocumentWriter*)m_poDocumentWriter)->SaveByItemEnd();
((OOXFootnoteWriter*)m_poFootnoteWriter)->Save(pathWord.GetPath());
((OOXEndnoteWriter*)m_poEndnoteWriter)->Save(pathWord.GetPath());
((OOXNumberingWriter*)m_poNumberingWriter)->Save(m_sTargetFolder);
((OOXStylesWriter*)m_poStylesWriter)->Save(m_sTargetFolder);
((OOXFontTableWriter*)m_poFontTableWriter)->Save(m_sTargetFolder);
((OOXSettingsWriter*)m_poSettingsWriter)->Save(m_sTargetFolder); //setting в последнюю очередь
//------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------
OOX::CPath pathDocProps = m_sTargetFolder + FILE_SEPARATOR_STR + _T("docProps"); OOX::CPath pathDocProps = m_sTargetFolder + FILE_SEPARATOR_STR + _T("docProps");
FileSystem::Directory::CreateDirectory(pathDocProps.GetPath()); FileSystem::Directory::CreateDirectory(pathDocProps.GetPath());
...@@ -111,23 +129,6 @@ bool OOXWriter::SaveByItemEnd() ...@@ -111,23 +129,6 @@ bool OOXWriter::SaveByItemEnd()
m_oContentTypes.AddContent( _T("application/vnd.openxmlformats-package.core-properties+xml"), _T("/docProps/core.xml") ); m_oContentTypes.AddContent( _T("application/vnd.openxmlformats-package.core-properties+xml"), _T("/docProps/core.xml") );
} }
//----------------------------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------------------------
OOX::CPath pathTheme = pathWord + FILE_SEPARATOR_STR + _T("theme");
FileSystem::Directory::CreateDirectory(pathTheme.GetPath()) ;
Writers::DefaultThemeWriter themeWriter;
themeWriter.Write(pathTheme.GetPath() + FILE_SEPARATOR_STR + _T("theme1.xml"));
m_oDocRels.AddRelationship( _T("http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme"), _T("theme/theme1.xml") );
m_oContentTypes.AddContent( _T("application/vnd.openxmlformats-officedocument.theme+xml"), _T("/word/theme/theme1.xml") );
//-----------------------------------------------------------------------------------------------------
((OOXDocumentWriter*)m_poDocumentWriter)->SaveByItemEnd();
((OOXFootnoteWriter*)m_poFootnoteWriter)->Save(pathWord.GetPath());
((OOXEndnoteWriter*)m_poEndnoteWriter)->Save(pathWord.GetPath());
((OOXNumberingWriter*)m_poNumberingWriter)->Save(m_sTargetFolder);
((OOXStylesWriter*)m_poStylesWriter)->Save(m_sTargetFolder);
((OOXFontTableWriter*)m_poFontTableWriter)->Save(m_sTargetFolder);
((OOXSettingsWriter*)m_poSettingsWriter)->Save(m_sTargetFolder); //setting в последнюю очередь
bool nResult = true; bool nResult = true;
nResult &= m_oContentTypes.Save(m_sTargetFolder); nResult &= m_oContentTypes.Save(m_sTargetFolder);
......
...@@ -2,6 +2,6 @@ ...@@ -2,6 +2,6 @@
//1 //1
//0 //0
//1 //1
//52 //54
#define INTVER 1,0,1,52 #define INTVER 1,0,1,54
#define STRVER "1,0,1,52\0" #define STRVER "1,0,1,54\0"
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