mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-04-07 13:55:33 +08:00
правка багов по результатам тестирования
DocFormatReader - картинки маркированных списков
This commit is contained in:
committed by
Alexander Trofimov
parent
0e5a581fc8
commit
0e37afed33
@ -77,22 +77,73 @@ namespace ASCDocFormatUtils
|
||||
class FormatUtils
|
||||
{
|
||||
public:
|
||||
static inline std::wstring XmlEncode(std::wstring data)
|
||||
static inline bool IsUnicodeSymbol( wchar_t symbol )
|
||||
{
|
||||
bool result = false;
|
||||
|
||||
if ( ( 0x0009 == symbol ) || ( 0x000A == symbol ) || ( 0x000D == symbol ) ||
|
||||
( ( 0x0020 <= symbol ) && ( 0xD7FF >= symbol ) ) || ( ( 0xE000 <= symbol ) && ( symbol <= 0xFFFD ) ) ||
|
||||
( ( 0x10000 <= symbol ) && symbol ) )
|
||||
{
|
||||
result = true;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
static inline std::wstring XmlEncode(std::wstring data, bool bDeleteNoUnicode = false)
|
||||
{
|
||||
std::wstring buffer;
|
||||
buffer.reserve(data.size());
|
||||
for(size_t pos = 0; pos != data.size(); ++pos)
|
||||
|
||||
if(bDeleteNoUnicode)
|
||||
{
|
||||
switch(data[pos])
|
||||
for(size_t pos = 0; pos != data.size(); ++pos)
|
||||
{
|
||||
case '&': buffer.append(_T("&")); break;
|
||||
case '\"': buffer.append(_T(""")); break;
|
||||
case '\'': buffer.append(_T("'")); break;
|
||||
case '<': buffer.append(_T("<")); break;
|
||||
case '>': buffer.append(_T(">")); break;
|
||||
default: buffer.append(&data[pos], 1); break;
|
||||
switch(data[pos])
|
||||
{
|
||||
case '&': buffer.append(_T("&")); break;
|
||||
case '\"': buffer.append(_T(""")); break;
|
||||
case '\'': buffer.append(_T("'")); break;
|
||||
case '<': buffer.append(_T("<")); break;
|
||||
case '>': buffer.append(_T(">")); break;
|
||||
default:
|
||||
{
|
||||
if ( false == IsUnicodeSymbol( data[pos] ) )
|
||||
{
|
||||
wchar_t symbol1 = data[pos];
|
||||
if(0xD800 <= symbol1 && symbol1 <= 0xDFFF && pos + 1 < data.size())
|
||||
{
|
||||
pos++;
|
||||
wchar_t symbol2 = data[pos];
|
||||
if (symbol1 < 0xDC00 && symbol2 >= 0xDC00 && symbol2 <= 0xDFFF)
|
||||
{
|
||||
buffer.append(&data[pos-1], 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
buffer.append(&data[pos], 1);
|
||||
}break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for(size_t pos = 0; pos != data.size(); ++pos)
|
||||
{
|
||||
switch(data[pos])
|
||||
{
|
||||
case '&': buffer.append(_T("&")); break;
|
||||
case '\"': buffer.append(_T(""")); break;
|
||||
case '\'': buffer.append(_T("'")); break;
|
||||
case '<': buffer.append(_T("<")); break;
|
||||
case '>': buffer.append(_T(">")); break;
|
||||
default: buffer.append(&data[pos], 1); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
|
||||
@ -35,14 +35,14 @@ namespace DocFileFormat
|
||||
FontFamilyName* font = dynamic_cast<FontFamilyName*>( *iter );
|
||||
|
||||
m_pXmlWriter->WriteNodeBegin( _T( "w:font" ), TRUE );
|
||||
m_pXmlWriter->WriteAttribute( _T( "w:name" ), FormatUtils::XmlEncode(font->xszFtn).c_str() );
|
||||
m_pXmlWriter->WriteAttribute( _T( "w:name" ), FormatUtils::XmlEncode(font->xszFtn, true).c_str());
|
||||
m_pXmlWriter->WriteNodeEnd( _T( "" ), TRUE, FALSE );
|
||||
|
||||
//alternative name
|
||||
if ( ( font->xszAlt != wstring( _T( "" ) ) ) && ( font->xszAlt.length() > 0 ) )
|
||||
{
|
||||
m_pXmlWriter->WriteNodeBegin( _T( "w:altName" ), TRUE );
|
||||
m_pXmlWriter->WriteAttribute( _T( "w:val" ), FormatUtils::XmlEncode(font->xszAlt).c_str() );
|
||||
m_pXmlWriter->WriteAttribute( _T( "w:val" ), FormatUtils::XmlEncode(font->xszAlt, true).c_str() );
|
||||
m_pXmlWriter->WriteNodeEnd( _T( "" ), TRUE, FALSE );
|
||||
m_pXmlWriter->WriteNodeEnd( _T( "w:altName" ) );
|
||||
}
|
||||
|
||||
@ -187,9 +187,16 @@ namespace DocFileFormat
|
||||
|
||||
if (sz_obj > 4)
|
||||
{
|
||||
UserType = reader.ReadLengthPrefixedAnsiString();
|
||||
ClipboardFormat = reader.ReadLengthPrefixedAnsiString();
|
||||
Program = reader.ReadLengthPrefixedAnsiString();
|
||||
//todooo сделать по нормальному CompObjHeader - psc3a.doc
|
||||
//UserType = reader.ReadLengthPrefixedAnsiString();
|
||||
|
||||
//sz_obj = reader.GetSize() - reader.GetPosition();
|
||||
//if (sz_obj > 4)
|
||||
// ClipboardFormat = reader.ReadLengthPrefixedAnsiString();
|
||||
|
||||
//sz_obj = reader.GetSize() - reader.GetPosition();
|
||||
//if (sz_obj > 4)
|
||||
// Program = reader.ReadLengthPrefixedAnsiString();
|
||||
}
|
||||
delete pCompStream;
|
||||
}
|
||||
|
||||
@ -46,7 +46,7 @@ namespace DocFileFormat
|
||||
if (lcb > 10000000)
|
||||
return;
|
||||
|
||||
if (lcb > sz)
|
||||
if (lcb > sz && sz != 2) //bullet picture <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
unsigned char* bytes = reader.ReadBytes(sz - fc - 4, false);
|
||||
if ( bytes )
|
||||
@ -56,7 +56,7 @@ namespace DocFileFormat
|
||||
return;
|
||||
}
|
||||
|
||||
if (lcb > 0)
|
||||
if (lcb >= 10)
|
||||
{
|
||||
unsigned short cbHeader = reader.ReadUInt16();
|
||||
|
||||
|
||||
@ -69,7 +69,7 @@ namespace DocFileFormat
|
||||
|
||||
// <w:name val="" />
|
||||
m_pXmlWriter->WriteNodeBegin( _T( "w:name" ), TRUE );
|
||||
m_pXmlWriter->WriteAttribute( _T( "w:val" ), FormatUtils::XmlEncode(getStyleName( *iter )).c_str() );
|
||||
m_pXmlWriter->WriteAttribute( _T( "w:val" ), FormatUtils::XmlEncode(getStyleName( *iter ), true ).c_str());
|
||||
m_pXmlWriter->WriteNodeEnd( _T( "" ), TRUE );
|
||||
|
||||
// <w:basedOn val="" />
|
||||
|
||||
@ -140,6 +140,10 @@ namespace DocFileFormat
|
||||
{
|
||||
m_pXmlWriter->WriteAttribute( _T( "o:ole" ), _T( "" ) );
|
||||
}
|
||||
else if (m_isBulletPicture)
|
||||
{
|
||||
m_pXmlWriter->WriteAttribute( _T( "o:bullet" ), true );
|
||||
}
|
||||
|
||||
std::list<OptionEntry>::iterator end = options.end();
|
||||
for (std::list<OptionEntry>::iterator iter = options.begin(); iter != end; ++iter)
|
||||
|
||||
@ -41,6 +41,8 @@ namespace DocFileFormat
|
||||
// Path
|
||||
if (!pShape->Path.empty())
|
||||
m_pXmlWriter->WriteAttribute( _T("path"), pShape->Path.c_str() );
|
||||
else if (_isBulletPicture)
|
||||
m_pXmlWriter->WriteAttribute( _T("path"), _T("m@4@5l@4@11@9@11@9@5xe"));
|
||||
|
||||
|
||||
//Default fill / stroke
|
||||
@ -87,6 +89,16 @@ namespace DocFileFormat
|
||||
|
||||
m_pXmlWriter->WriteNodeEnd( _T( "v:formulas" ) );
|
||||
}
|
||||
else if (_isBulletPicture)
|
||||
{
|
||||
m_pXmlWriter->WriteString(_T("<v:formulas><v:f eqn=\"if lineDrawn pixelLineWidth 0\"/>\
|
||||
<v:f eqn=\"sum @0 1 0\"/><v:f eqn=\"sum 0 0 @1\"/>\
|
||||
<v:f eqn=\"prod @2 1 2\"/><v:f eqn=\"prod @3 21600 pixelWidth\"/>\
|
||||
<v:f eqn=\"prod @3 21600 pixelHeight\"/><v:f eqn=\"sum @0 0 1\"/>\
|
||||
<v:f eqn=\"prod @6 1 2\"/><v:f eqn=\"prod @7 21600 pixelWidth\"/>\
|
||||
<v:f eqn=\"sum @8 21600 0\"/><v:f eqn=\"prod @7 21600 pixelHeight\"/>\
|
||||
<v:f eqn=\"sum @10 21600 0\"/></v:formulas>"));
|
||||
}
|
||||
|
||||
// Path
|
||||
m_pXmlWriter->WriteNodeBegin( _T( "v:path" ), true );
|
||||
|
||||
Reference in New Issue
Block a user