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:
public:
RtfFontTableReader()
{
m_bUseGlobalCodepage = true;
m_eInternalState = is_normal;
m_oFont.SetDefaultOOX();
}
......@@ -667,7 +669,7 @@ public:
m_oFont.m_sPanose += sText;
else if( is_altname == m_eInternalState )
m_oFont.m_sAltName += sText;
else if( is_normal == m_eInternalState )
else if( is_normal == m_eInternalState && sText.GetLength() > 0)
{
if( sText.Find(';') != -1 )
{
......@@ -1873,7 +1875,8 @@ private: void TryToPepairResult( RtfDocument& oDocument, RtfReader& oReader )
}
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() );
RtfParagraphPtr oNewPar = RtfParagraphPtr( new RtfParagraph() );
RtfCharPtr oNewChar = RtfCharPtr( new RtfChar() );
......@@ -2011,7 +2014,9 @@ public:
else
sBullet += (char) nWinChar;
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 );
}
}
......
......@@ -205,9 +205,16 @@ public: CString RenderToOOX(RenderParameter oRenderParameter)
int nIndex = sInsertText.Find( _T("HYPERLINK") );
if( -1 != nIndex )
{
//оставляем только одну ссылку
CString sHyperlink = sInsertText;
sHyperlink.Delete( nIndex, 9/*(int)_tcslen( _T("HYPERLINK") )*/ );
int nSplash = sHyperlink.Find( _T("\\") );
if (nSplash > 0)
{
sHyperlink = sHyperlink.Left(nSplash);
}
//оставляем только одну ссылку
sHyperlink.Remove( '\"' );
sHyperlink.Trim();
//заменяем пробелы на %20
......
......@@ -2571,11 +2571,11 @@ CString RtfInformation::RenderToOOX(RenderParameter oRenderParameter)
if( m_sKeywords.GetLength() > 0 ) pCore->m_sKeywords = m_sKeywords;
if( m_sComment.GetLength() > 0 ) pCore->m_sDescription = m_sComment;
CString sCreateTime = m_oCreateTime.RenderToOOX( oRenderParameter );
if( false == sCreateTime.IsEmpty() ) pCore->m_sCreated = sCreateTime;
CString sRevTime = m_oRevTime.RenderToOOX( oRenderParameter );
if( false == sRevTime.IsEmpty() ) pCore->m_sModified = sRevTime;
//CString sCreateTime = m_oCreateTime.RenderToOOX( oRenderParameter );
//if( false == sCreateTime.IsEmpty() ) pCore->m_sCreated = sCreateTime;
//
//CString sRevTime = m_oRevTime.RenderToOOX( oRenderParameter );
//if( false == sRevTime.IsEmpty() ) pCore->m_sModified = sRevTime;
//CString sPrintTime = m_oPrintTime.RenderToOOX( oRenderParameter );
//if( _T("") != sPrintTime )
......
......@@ -41,7 +41,6 @@ void RtfReader::PopState()
//delete psaveOld;
}
CString RtfAbstractReader::ExecuteTextInternalCodePage( std::string& sCharString, RtfDocument& oDocument, RtfReader& oReader)
{
CString sResult;
......@@ -52,7 +51,7 @@ CString RtfAbstractReader::ExecuteTextInternalCodePage( std::string& sCharString
//применяем параметры codepage от текущего шрифта todo associated fonts.
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 )
{
......
......@@ -79,6 +79,8 @@ public:
m_nCurGroups = 1;
m_oFileWriter = NULL;
m_bStopReader = false;
m_bUseGlobalCodepage = false;
}
bool Parse(RtfDocument& oDocument, RtfReader& oReader )
{
......@@ -202,7 +204,7 @@ public:
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;
......@@ -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 )
......@@ -265,7 +267,7 @@ public:
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:
RtfToken m_oTok;
......@@ -274,7 +276,10 @@ private:
int m_nSkipChars;
bool m_bSkip;
bool m_bStopReader;
protected:
int m_nCurGroups;
bool m_bUseGlobalCodepage;
};
......@@ -480,11 +480,14 @@ public:
w_out.GetBuffer(insize);
char *inptr = (char*)start.operator ->();
char* outptr = (char*)w_out.GetBuffer();
if (nCodepage > 0)
{
#if defined (_WIN32) || defined (_WIN64)
int insize = MultiByteToWideChar(nCodepage, 0, start, -1, NULL, NULL);
if (MultiByteToWideChar(nCodepage, 0, start, -1, w_out.GetBuffer(), insize) > 0)
int insize = MultiByteToWideChar(nCodepage, 0, inptr, -1, NULL, NULL);
if (MultiByteToWideChar(nCodepage, 0, inptr, -1, (LPWSTR)outptr, insize) > 0)
{
w_out.ReleaseBuffer();
ansi = false;
......@@ -496,9 +499,6 @@ public:
if (ic != (iconv_t) -1)
{
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);
if (nconv == 0)
......@@ -520,15 +520,21 @@ public:
std::string out;
bool ansi = true;
size_t insize = end- start;
size_t insize = end - start;
out.reserve(insize);
char *inptr = (char*)start.operator ->();
char* outptr = (char*)out.c_str();
if (nCodepage > 0)
{
#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
std::string sCodepage = "CP" + std::to_string(nCodepage);
......@@ -536,9 +542,6 @@ public:
if (ic != (iconv_t) -1)
{
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);
if (nconv == 0) ansi = false;
......
......@@ -36,6 +36,7 @@ public:
sResult.Append( _T("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>") );
sResult.AppendChar('\n');
sResult.Append( _T("<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">") );
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());
......
......@@ -7,14 +7,14 @@ private:
CString m_sFileXml;
OOXWriter& m_oWriter;
CString CreateXml()
std::wstring CreateXml()
{
CString sResult;
sResult.Append( _T("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>") );
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( m_sFileXml );
sResult.Append( _T("</w:settings>") );
std::wstring sResult;
sResult.append( _T("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>") );
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( m_sFileXml );
sResult.append( _T("</w:settings>") );
return sResult;
}
public:
......@@ -36,7 +36,7 @@ public:
if( false == m_sFileXml.IsEmpty() )
{
//генерируем свою xml
CString sXml = CreateXml();
std::wstring sXml = CreateXml();
//todoooo ПЕРЕПИСАТЬ
......@@ -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_oContentTypes.AddContent( _T("application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml"), _T("/word/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") );
//DWORD dwBytesWritten;
//CStringA sXmlUTF = Convert::UnicodeToUtf8( sXml );
//::WriteFile(hFile, sXmlUTF, sXmlUTF.GetLength(), &dwBytesWritten, NULL);
//CloseHandle( hFile );
std::string sXmlUTF = NSFile::CUtf8Converter::GetUtf8StringFromUnicode(sXml);
file.WriteFile((void*)sXmlUTF.c_str(), sXmlUTF.length());
file.CloseFile();
;
return true;
}
else
......
......@@ -89,6 +89,24 @@ bool OOXWriter::SaveByItemEnd()
OOX::CPath pathWord = m_sTargetFolder + FILE_SEPARATOR_STR + _T("word");
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");
FileSystem::Directory::CreateDirectory(pathDocProps.GetPath());
......@@ -111,23 +129,6 @@ bool OOXWriter::SaveByItemEnd()
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;
nResult &= m_oContentTypes.Save(m_sTargetFolder);
......
......@@ -2,6 +2,6 @@
//1
//0
//1
//52
#define INTVER 1,0,1,52
#define STRVER "1,0,1,52\0"
//54
#define INTVER 1,0,1,54
#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