fdo#44736 RTF import: ignore direct formatting which equals to style
Change-Id: Ie82f18381a95adbfedf7ea02d6844685e44b151d
This commit is contained in:
@@ -399,6 +399,21 @@ void RTFDocumentImpl::setNeedPar(bool bNeedPar)
|
|||||||
m_bNeedPar = bNeedPar;
|
m_bNeedPar = bNeedPar;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
writerfilter::Reference<Properties>::Pointer_t RTFDocumentImpl::getProperties(RTFSprms& rAttributes, RTFSprms& rSprms)
|
||||||
|
{
|
||||||
|
int nStyle = m_aStates.top().nCurrentStyleIndex;
|
||||||
|
RTFReferenceTable::Entries_t::iterator it = m_aStyleTableEntries.find(nStyle);
|
||||||
|
if (it != m_aStyleTableEntries.end())
|
||||||
|
{
|
||||||
|
RTFReferenceProperties& rProps = *(RTFReferenceProperties*)it->second.get();
|
||||||
|
// Get rid of direct formatting what is already in the style.
|
||||||
|
rSprms.deduplicate(rProps.getSprms());
|
||||||
|
rAttributes.deduplicate(rProps.getAttributes());
|
||||||
|
}
|
||||||
|
writerfilter::Reference<Properties>::Pointer_t pRet(new RTFReferenceProperties(rAttributes, rSprms));
|
||||||
|
return pRet;
|
||||||
|
}
|
||||||
|
|
||||||
void RTFDocumentImpl::checkNeedPap()
|
void RTFDocumentImpl::checkNeedPap()
|
||||||
{
|
{
|
||||||
if (m_bNeedPap)
|
if (m_bNeedPap)
|
||||||
@@ -407,7 +422,7 @@ void RTFDocumentImpl::checkNeedPap()
|
|||||||
if (!m_pCurrentBuffer)
|
if (!m_pCurrentBuffer)
|
||||||
{
|
{
|
||||||
writerfilter::Reference<Properties>::Pointer_t const pParagraphProperties(
|
writerfilter::Reference<Properties>::Pointer_t const pParagraphProperties(
|
||||||
new RTFReferenceProperties(m_aStates.top().aParagraphAttributes, m_aStates.top().aParagraphSprms)
|
getProperties(m_aStates.top().aParagraphAttributes, m_aStates.top().aParagraphSprms)
|
||||||
);
|
);
|
||||||
|
|
||||||
// Writer will ignore a page break before a text frame, so guard it with empty paragraphs
|
// Writer will ignore a page break before a text frame, so guard it with empty paragraphs
|
||||||
@@ -441,9 +456,7 @@ void RTFDocumentImpl::runProps()
|
|||||||
{
|
{
|
||||||
if (!m_pCurrentBuffer)
|
if (!m_pCurrentBuffer)
|
||||||
{
|
{
|
||||||
writerfilter::Reference<Properties>::Pointer_t const pProperties(
|
writerfilter::Reference<Properties>::Pointer_t const pProperties = getProperties(m_aStates.top().aCharacterAttributes, m_aStates.top().aCharacterSprms);
|
||||||
new RTFReferenceProperties(m_aStates.top().aCharacterAttributes, m_aStates.top().aCharacterSprms)
|
|
||||||
);
|
|
||||||
Mapper().props(pProperties);
|
Mapper().props(pProperties);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1677,7 +1690,7 @@ int RTFDocumentImpl::dispatchSymbol(RTFKeyword nKeyword)
|
|||||||
m_aStates.top().aTableCellAttributes = m_aDefaultState.aTableCellAttributes;
|
m_aStates.top().aTableCellAttributes = m_aDefaultState.aTableCellAttributes;
|
||||||
|
|
||||||
writerfilter::Reference<Properties>::Pointer_t const pParagraphProperties(
|
writerfilter::Reference<Properties>::Pointer_t const pParagraphProperties(
|
||||||
new RTFReferenceProperties(m_aStates.top().aParagraphAttributes, m_aStates.top().aParagraphSprms)
|
getProperties(m_aStates.top().aParagraphAttributes, m_aStates.top().aParagraphSprms)
|
||||||
);
|
);
|
||||||
Mapper().props(pParagraphProperties);
|
Mapper().props(pParagraphProperties);
|
||||||
|
|
||||||
@@ -2623,6 +2636,7 @@ int RTFDocumentImpl::dispatchValue(RTFKeyword nKeyword, int nParam)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case RTF_S:
|
case RTF_S:
|
||||||
|
m_aStates.top().nCurrentStyleIndex = nParam;
|
||||||
if (m_aStates.top().nDestinationState == DESTINATION_STYLESHEET || m_aStates.top().nDestinationState == DESTINATION_STYLEENTRY)
|
if (m_aStates.top().nDestinationState == DESTINATION_STYLESHEET || m_aStates.top().nDestinationState == DESTINATION_STYLEENTRY)
|
||||||
{
|
{
|
||||||
m_nCurrentStyleIndex = nParam;
|
m_nCurrentStyleIndex = nParam;
|
||||||
@@ -4206,7 +4220,8 @@ RTFParserState::RTFParserState(RTFDocumentImpl *pDocumentImpl)
|
|||||||
nMonth(0),
|
nMonth(0),
|
||||||
nDay(0),
|
nDay(0),
|
||||||
nHour(0),
|
nHour(0),
|
||||||
nMinute(0)
|
nMinute(0),
|
||||||
|
nCurrentStyleIndex(-1)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -399,6 +399,9 @@ namespace writerfilter {
|
|||||||
|
|
||||||
/// Text from special destinations.
|
/// Text from special destinations.
|
||||||
rtl::OUStringBuffer aDestinationText;
|
rtl::OUStringBuffer aDestinationText;
|
||||||
|
|
||||||
|
/// Same as the int value of NS_rtf::LN_ISTD in aParagraphAttributes, for performance reasons.
|
||||||
|
int nCurrentStyleIndex;
|
||||||
};
|
};
|
||||||
|
|
||||||
class RTFTokenizer;
|
class RTFTokenizer;
|
||||||
@@ -478,6 +481,7 @@ namespace writerfilter {
|
|||||||
void runBreak();
|
void runBreak();
|
||||||
void parBreak();
|
void parBreak();
|
||||||
void tableBreak();
|
void tableBreak();
|
||||||
|
writerfilter::Reference<Properties>::Pointer_t getProperties(RTFSprms& rAttributes, RTFSprms& rSprms);
|
||||||
void checkNeedPap();
|
void checkNeedPap();
|
||||||
void sectBreak(bool bFinal);
|
void sectBreak(bool bFinal);
|
||||||
void replayBuffer(RTFBuffer_t& rBuffer);
|
void replayBuffer(RTFBuffer_t& rBuffer);
|
||||||
|
@@ -62,6 +62,16 @@ std::string RTFReferenceProperties::getType() const
|
|||||||
return "RTFReferenceProperties";
|
return "RTFReferenceProperties";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RTFSprms& RTFReferenceProperties::getAttributes()
|
||||||
|
{
|
||||||
|
return m_aAttributes;
|
||||||
|
}
|
||||||
|
|
||||||
|
RTFSprms& RTFReferenceProperties::getSprms()
|
||||||
|
{
|
||||||
|
return m_aSprms;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace rtftok
|
} // namespace rtftok
|
||||||
} // namespace writerfilter
|
} // namespace writerfilter
|
||||||
|
|
||||||
|
@@ -42,6 +42,8 @@ namespace writerfilter {
|
|||||||
virtual ~RTFReferenceProperties();
|
virtual ~RTFReferenceProperties();
|
||||||
virtual void resolve(Properties & rHandler);
|
virtual void resolve(Properties & rHandler);
|
||||||
virtual std::string getType() const;
|
virtual std::string getType() const;
|
||||||
|
RTFSprms& getAttributes();
|
||||||
|
RTFSprms& getSprms();
|
||||||
private:
|
private:
|
||||||
RTFSprms m_aAttributes;
|
RTFSprms m_aAttributes;
|
||||||
RTFSprms m_aSprms;
|
RTFSprms m_aSprms;
|
||||||
|
@@ -29,6 +29,7 @@
|
|||||||
#include <rtl/strbuf.hxx>
|
#include <rtl/strbuf.hxx>
|
||||||
|
|
||||||
#include <resourcemodel/QNameToString.hxx>
|
#include <resourcemodel/QNameToString.hxx>
|
||||||
|
#include <doctok/resourceids.hxx> // NS_rtf namespace
|
||||||
|
|
||||||
using rtl::OStringBuffer;
|
using rtl::OStringBuffer;
|
||||||
|
|
||||||
@@ -130,6 +131,25 @@ bool RTFSprms::erase(Id nKeyword)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RTFSprms::deduplicate(RTFSprms& rReference)
|
||||||
|
{
|
||||||
|
RTFSprms::Iterator_t i = m_aSprms.begin();
|
||||||
|
while (i != m_aSprms.end())
|
||||||
|
{
|
||||||
|
bool bIgnore = false;
|
||||||
|
if (i->first != NS_rtf::LN_ISTD)
|
||||||
|
{
|
||||||
|
RTFValue::Pointer_t pValue(rReference.find(i->first));
|
||||||
|
if (pValue.get() && i->second->equals(*pValue))
|
||||||
|
bIgnore = true;
|
||||||
|
}
|
||||||
|
if (bIgnore)
|
||||||
|
i = m_aSprms.erase(i);
|
||||||
|
else
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
RTFSprms::RTFSprms()
|
RTFSprms::RTFSprms()
|
||||||
: m_aSprms()
|
: m_aSprms()
|
||||||
{
|
{
|
||||||
|
@@ -47,6 +47,8 @@ namespace writerfilter {
|
|||||||
/// Does the same as ->push_back(), except that it can overwrite existing entries.
|
/// Does the same as ->push_back(), except that it can overwrite existing entries.
|
||||||
void set(Id nKeyword, RTFValue::Pointer_t pValue, bool bOverwrite = true);
|
void set(Id nKeyword, RTFValue::Pointer_t pValue, bool bOverwrite = true);
|
||||||
bool erase(Id nKeyword);
|
bool erase(Id nKeyword);
|
||||||
|
/// Removes elements, which are already in the reference set.
|
||||||
|
void deduplicate(RTFSprms& rReference);
|
||||||
void swap(RTFSprms& rOther);
|
void swap(RTFSprms& rOther);
|
||||||
size_t size() const { return m_aSprms.size(); }
|
size_t size() const { return m_aSprms.size(); }
|
||||||
bool empty() const { return m_aSprms.empty(); }
|
bool empty() const { return m_aSprms.empty(); }
|
||||||
|
@@ -200,6 +200,11 @@ RTFValue* RTFValue::Clone()
|
|||||||
return new RTFValue(m_nValue, m_sValue, *m_pAttributes, *m_pSprms, m_xShape, m_xStream, m_xObject, m_bForceString);
|
return new RTFValue(m_nValue, m_sValue, *m_pAttributes, *m_pSprms, m_xShape, m_xStream, m_xObject, m_bForceString);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool RTFValue::equals(RTFValue& rOther)
|
||||||
|
{
|
||||||
|
return m_nValue == rOther.m_nValue;
|
||||||
|
}
|
||||||
|
|
||||||
RTFSprms& RTFValue::getAttributes()
|
RTFSprms& RTFValue::getAttributes()
|
||||||
{
|
{
|
||||||
return *m_pAttributes;
|
return *m_pAttributes;
|
||||||
|
@@ -62,6 +62,7 @@ namespace writerfilter {
|
|||||||
virtual RTFValue* Clone();
|
virtual RTFValue* Clone();
|
||||||
RTFSprms& getAttributes();
|
RTFSprms& getAttributes();
|
||||||
RTFSprms& getSprms();
|
RTFSprms& getSprms();
|
||||||
|
bool equals(RTFValue& rOther);
|
||||||
private:
|
private:
|
||||||
RTFValue& operator=(RTFValue const& rOther);
|
RTFValue& operator=(RTFValue const& rOther);
|
||||||
int m_nValue;
|
int m_nValue;
|
||||||
|
Reference in New Issue
Block a user