[Libreoffice-commits] .: writerfilter/Library_ooxml.mk writerfilter/source
Lubos Lunak
llunak at kemper.freedesktop.org
Wed May 4 05:35:44 PDT 2011
writerfilter/Library_ooxml.mk | 1
writerfilter/source/dmapper/GraphicHelpers.cxx | 123 +++++++-----------
writerfilter/source/dmapper/GraphicHelpers.hxx | 7 -
writerfilter/source/dmapper/GraphicImport.cxx | 4
writerfilter/source/ooxml/OOXMLFastContextHandler.cxx | 52 +++++++
writerfilter/source/ooxml/OOXMLFastContextHandler.hxx | 6
writerfilter/source/ooxml/factoryimpl_ns.xsl | 9 +
writerfilter/source/ooxml/model.xml | 20 +-
8 files changed, 137 insertions(+), 85 deletions(-)
New commits:
commit 241480803f698296939d9cb5da6bd74c1442c5f2
Author: LuboÅ¡ LuÅák <l.lunak at suse.cz>
Date: Wed May 4 14:31:03 2011 +0200
read wp:positionOffset, wp:alignV and wp:alignH properly (bnc#513579)
A pretty hackish way (see the comment), but I haven't managed to find
out if there's a proper way to read it.
diff --git a/writerfilter/Library_ooxml.mk b/writerfilter/Library_ooxml.mk
index 13aeb21..053c1d5 100644
--- a/writerfilter/Library_ooxml.mk
+++ b/writerfilter/Library_ooxml.mk
@@ -31,6 +31,7 @@ $(eval $(call gb_Library_set_include,ooxml,\
$$(INCLUDE) \
-I$(realpath $(SRCDIR)/writerfilter/inc) \
-I$(realpath $(SRCDIR)/writerfilter/source/ooxml) \
+ -I$(realpath $(SRCDIR)/writerfilter/source/dmapper) \
-I$(WORKDIR)/writerfilter/inc \
-I$(WORKDIR)/writerfilter/inc/ooxml \
$(if $(filter YES,$(SYSTEM_LIBXML)),$(filter -I%,$(LIBXML_CFLAGS))) \
diff --git a/writerfilter/source/dmapper/GraphicHelpers.cxx b/writerfilter/source/dmapper/GraphicHelpers.cxx
index 1da98a9..af566de 100644
--- a/writerfilter/source/dmapper/GraphicHelpers.cxx
+++ b/writerfilter/source/dmapper/GraphicHelpers.cxx
@@ -19,12 +19,29 @@ namespace dmapper {
using namespace com::sun::star;
-PositionHandler::PositionHandler( ) :
+int PositionHandler::savedPositionOffsetV = 0;
+int PositionHandler::savedPositionOffsetH = 0;
+int PositionHandler::savedAlignV = text::VertOrientation::NONE;
+int PositionHandler::savedAlignH = text::HoriOrientation::NONE;
+
+PositionHandler::PositionHandler( bool vertical ) :
LoggedProperties(dmapper_logger, "PositionHandler")
{
- m_nOrient = text::VertOrientation::NONE;
m_nRelation = text::RelOrientation::FRAME;
- m_nPosition = 0;
+ if( vertical )
+ {
+ m_nPosition = savedPositionOffsetV;
+ m_nOrient = savedAlignV;
+ savedPositionOffsetV = 0;
+ savedAlignV = text::VertOrientation::NONE;
+ }
+ else
+ {
+ m_nPosition = savedPositionOffsetH;
+ m_nOrient = savedAlignH;
+ savedPositionOffsetH = 0;
+ savedAlignH = text::HoriOrientation::NONE;
+ }
}
PositionHandler::~PositionHandler( )
@@ -96,76 +113,44 @@ void PositionHandler::lcl_attribute( Id aName, Value& rVal )
}
}
-void PositionHandler::lcl_sprm( Sprm& rSprm )
+void PositionHandler::lcl_sprm( Sprm& )
{
- Value::Pointer_t pValue = rSprm.getValue();
- sal_Int32 nIntValue = pValue->getInt();
-
- switch ( rSprm.getId( ) )
- {
- case NS_ooxml::LN_CT_PosV_align:
- {
- static Id pVertValues[] =
- {
- NS_ooxml::LN_Value_wordprocessingDrawing_ST_AlignV_top,
- NS_ooxml::LN_Value_wordprocessingDrawing_ST_AlignV_bottom,
- NS_ooxml::LN_Value_wordprocessingDrawing_ST_AlignV_center,
- NS_ooxml::LN_Value_wordprocessingDrawing_ST_AlignV_inside,
- NS_ooxml::LN_Value_wordprocessingDrawing_ST_AlignV_outside
- };
-
- static sal_Int16 pVertOrients[] =
- {
- text::VertOrientation::TOP,
- text::VertOrientation::BOTTOM,
- text::VertOrientation::CENTER,
- text::VertOrientation::NONE,
- text::VertOrientation::NONE
- };
+}
- for ( int i = 0; i < 5; i++ )
- {
- if ( pVertValues[i] == sal_uInt32( nIntValue ) )
- m_nOrient = pVertOrients[i];
- }
- }
- break;
- case NS_ooxml::LN_CT_PosH_align:
- {
- static Id pHoriValues[] =
- {
- NS_ooxml::LN_Value_wordprocessingDrawing_ST_AlignH_left,
- NS_ooxml::LN_Value_wordprocessingDrawing_ST_AlignH_right,
- NS_ooxml::LN_Value_wordprocessingDrawing_ST_AlignH_center,
- NS_ooxml::LN_Value_wordprocessingDrawing_ST_AlignH_inside,
- NS_ooxml::LN_Value_wordprocessingDrawing_ST_AlignH_outside
- };
+void PositionHandler::setPositionOffset(const ::rtl::OUString & sText, bool vertical)
+{
+ if( vertical )
+ savedPositionOffsetV = ConversionHelper::convertEMUToMM100( sText.toInt32());
+ else
+ savedPositionOffsetH = ConversionHelper::convertEMUToMM100( sText.toInt32());
+}
- static sal_Int16 pHoriOrients[] =
- {
- text::HoriOrientation::LEFT,
- text::HoriOrientation::RIGHT,
- text::HoriOrientation::CENTER,
- text::HoriOrientation::INSIDE,
- text::HoriOrientation::OUTSIDE
- };
+void PositionHandler::setAlignH(const ::rtl::OUString & sText)
+{
+ if( sText == rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "left" )))
+ savedAlignH = text::HoriOrientation::LEFT;
+ else if( sText == rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "right" )))
+ savedAlignH = text::HoriOrientation::RIGHT;
+ else if( sText == rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "center" )))
+ savedAlignH = text::HoriOrientation::CENTER;
+ else if( sText == rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "inside" )))
+ savedAlignH = text::HoriOrientation::INSIDE;
+ else if( sText == rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "outside" )))
+ savedAlignH = text::HoriOrientation::OUTSIDE;
+}
- for ( int i = 0; i < 5; i++ )
- {
- if ( pHoriValues[i] == sal_uInt32( nIntValue ) )
- m_nOrient = pHoriOrients[i];
- }
- }
- break;
- case NS_ooxml::LN_CT_PosH_posOffset:
- case NS_ooxml::LN_CT_PosV_posOffset:
- m_nPosition = ConversionHelper::convertEMUToMM100( nIntValue );
- default:
-#ifdef DEBUG_DOMAINMAPPER
- dmapper_logger->element("unhandled");
-#endif
- break;
- }
+void PositionHandler::setAlignV(const ::rtl::OUString & sText)
+{
+ if( sText == rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "top" )))
+ savedAlignV = text::VertOrientation::TOP;
+ else if( sText == rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "bottom" )))
+ savedAlignV = text::VertOrientation::BOTTOM;
+ else if( sText == rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "center" )))
+ savedAlignV = text::VertOrientation::CENTER;
+ else if( sText == rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "inside" )))
+ savedAlignV = text::VertOrientation::NONE;
+ else if( sText == rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "outside" )))
+ savedAlignV = text::VertOrientation::NONE;
}
WrapHandler::WrapHandler( ) :
diff --git a/writerfilter/source/dmapper/GraphicHelpers.hxx b/writerfilter/source/dmapper/GraphicHelpers.hxx
index db353a2..0b65ad8 100644
--- a/writerfilter/source/dmapper/GraphicHelpers.hxx
+++ b/writerfilter/source/dmapper/GraphicHelpers.hxx
@@ -16,8 +16,11 @@ namespace dmapper
class WRITERFILTER_DLLPRIVATE PositionHandler: public LoggedProperties
{
public:
- PositionHandler( );
+ PositionHandler( bool vertical );
~PositionHandler( );
+ static void setPositionOffset(const ::rtl::OUString & sText, bool vertical);
+ static void setAlignH(const ::rtl::OUString & sText);
+ static void setAlignV(const ::rtl::OUString & sText);
sal_Int16 m_nOrient;
sal_Int16 m_nRelation;
@@ -26,6 +29,8 @@ public:
private:
virtual void lcl_attribute( Id aName, Value& rVal );
virtual void lcl_sprm( Sprm& rSprm );
+ static int savedPositionOffsetV, savedPositionOffsetH;
+ static int savedAlignV, savedAlignH;
};
typedef boost::shared_ptr<PositionHandler> PositionHandlerPtr;
diff --git a/writerfilter/source/dmapper/GraphicImport.cxx b/writerfilter/source/dmapper/GraphicImport.cxx
index e58f4c5..13c0e6e 100644
--- a/writerfilter/source/dmapper/GraphicImport.cxx
+++ b/writerfilter/source/dmapper/GraphicImport.cxx
@@ -1180,7 +1180,7 @@ void GraphicImport::lcl_sprm(Sprm & rSprm)
case NS_ooxml::LN_CT_Anchor_positionH: // 90976;
{
// Use a special handler for the positionning
- PositionHandlerPtr pHandler( new PositionHandler );
+ PositionHandlerPtr pHandler( new PositionHandler( false ));
writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
if( pProperties.get( ) )
{
@@ -1197,7 +1197,7 @@ void GraphicImport::lcl_sprm(Sprm & rSprm)
case NS_ooxml::LN_CT_Anchor_positionV: // 90977;
{
// Use a special handler for the positionning
- PositionHandlerPtr pHandler( new PositionHandler );
+ PositionHandlerPtr pHandler( new PositionHandler( true ));
writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
if( pProperties.get( ) )
{
diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
index 685528b..7e588f7 100644
--- a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
+++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
@@ -37,6 +37,8 @@
#include <ooxml/resourceids.hxx>
#include <doctok/sprmids.hxx>
#include <ooxml/OOXMLnamespaceids.hxx>
+#include <dmapper/DomainMapper.hxx>
+#include <GraphicHelpers.hxx>
#include "OOXMLFastContextHandler.hxx"
#include "OOXMLFactory.hxx"
#include "Handler.hxx"
@@ -139,6 +141,7 @@ OOXMLFastContextHandler::OOXMLFastContextHandler
mnTableDepth(0),
mnInstanceNumber(mnInstanceCount),
mnRefCount(0),
+ inPositionV(false),
m_xContext(context)
{
mnInstanceCount++;
@@ -161,6 +164,7 @@ OOXMLFastContextHandler::OOXMLFastContextHandler
mnTableDepth(0),
mnInstanceNumber(mnInstanceCount),
mnRefCount(0),
+ inPositionV(pContext->inPositionV),
m_xContext(pContext->m_xContext)
{
if (pContext != NULL)
@@ -246,6 +250,11 @@ void OOXMLFastContextHandler::lcl_startFastElement
throw (uno::RuntimeException, xml::sax::SAXException)
{
OOXMLFactory::getInstance()->startAction(this, Element);
+ if( Element == (NS_wordprocessingDrawing|OOXML_positionV) )
+ inPositionV = true;
+ else if( Element == (NS_wordprocessingDrawing|OOXML_positionH) )
+ inPositionV = false;
+
}
void OOXMLFastContextHandler::lcl_endFastElement
@@ -825,6 +834,49 @@ void OOXMLFastContextHandler::text(const ::rtl::OUString & sText)
sText.getLength());
}
+/*
+ HACK. An ugly hack. The problem with wp:positionOffset, wp:alignV and wp:alignH
+ is that they do not work in the usual OOXML way of <tag val="value"/> but instead
+ it's <tag>value</tag>, which is otherwise used only things like <t>. And I really
+ haven't managed to find out how to make this XML parsing monstrosity to handle this
+ on its own, so the code is modelled after <t> handling and does it manually in a hackish
+ way - it reads the value as text and converts itself, moreover the reading of the value
+ is done sooner than lcl_sprms() actually results in processing the tags it is enclosed
+ in, so the values are stored in PositionHandler for later use.
+*/
+void OOXMLFastContextHandler::positionOffset(const ::rtl::OUString & sText)
+{
+#ifdef DEBUG_ELEMENT
+ debug_logger->startElement("positionOffset");
+ debug_logger->chars(sText);
+ debug_logger->endElement();
+#endif
+ if (isForwardEvents())
+ ::writerfilter::dmapper::PositionHandler::setPositionOffset( sText, inPositionV );
+}
+
+void OOXMLFastContextHandler::alignH(const ::rtl::OUString & sText)
+{
+#ifdef DEBUG_ELEMENT
+ debug_logger->startElement("alignH");
+ debug_logger->chars(sText);
+ debug_logger->endElement();
+#endif
+ if (isForwardEvents())
+ ::writerfilter::dmapper::PositionHandler::setAlignH( sText );
+}
+
+void OOXMLFastContextHandler::alignV(const ::rtl::OUString & sText)
+{
+#ifdef DEBUG_ELEMENT
+ debug_logger->startElement("alignV");
+ debug_logger->chars(sText);
+ debug_logger->endElement();
+#endif
+ if (isForwardEvents())
+ ::writerfilter::dmapper::PositionHandler::setAlignV( sText );
+}
+
void OOXMLFastContextHandler::propagateCharacterProperties()
{
#ifdef DEBUG_CONTEXT_HANDLER
diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx
index 7d17b77..2995e6b 100644
--- a/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx
+++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx
@@ -204,6 +204,9 @@ public:
void handleLastParagraphInSection();
void endOfParagraph();
void text(const ::rtl::OUString & sText);
+ void positionOffset(const ::rtl::OUString & sText);
+ void alignH(const ::rtl::OUString & sText);
+ void alignV(const ::rtl::OUString & sText);
virtual void propagateCharacterProperties();
virtual void propagateCharacterPropertiesAsSet(const Id & rId);
virtual void propagateTableProperties();
@@ -283,6 +286,9 @@ protected:
sal_uInt32 mnInstanceNumber;
sal_uInt32 mnRefCount;
+
+ bool inPositionV;
+
private:
void operator =(OOXMLFastContextHandler &); // not defined
diff --git a/writerfilter/source/ooxml/factoryimpl_ns.xsl b/writerfilter/source/ooxml/factoryimpl_ns.xsl
index 243ca88..5f3a012 100644
--- a/writerfilter/source/ooxml/factoryimpl_ns.xsl
+++ b/writerfilter/source/ooxml/factoryimpl_ns.xsl
@@ -524,6 +524,15 @@ CreateElementMapPointer </xsl:text>
<xsl:when test="@action='text'">
pHandler->text(sText);
</xsl:when>
+ <xsl:when test="@action='positionOffset'">
+ pHandler->positionOffset(sText);
+ </xsl:when>
+ <xsl:when test="@action='alignH'">
+ pHandler->alignH(sText);
+ </xsl:when>
+ <xsl:when test="@action='alignV'">
+ pHandler->alignV(sText);
+ </xsl:when>
<xsl:when test="@action='newProperty'">
<xsl:text>
OOXMLFastHelper<OOXMLIntegerValue>::newProperty(pHandler, </xsl:text>
diff --git a/writerfilter/source/ooxml/model.xml b/writerfilter/source/ooxml/model.xml
index 12ac0c4..b8fceb4 100644
--- a/writerfilter/source/ooxml/model.xml
+++ b/writerfilter/source/ooxml/model.xml
@@ -6817,13 +6817,11 @@
<element name="wrapThrough" tokenid="ooxml:EG_WrapType_wrapThrough"/>
<element name="wrapTopAndBottom" tokenid="ooxml:EG_WrapType_wrapTopAndBottom"/>
</resource>
- <resource name="ST_PositionOffset" resource="Integer" generated="yes"/>
- <resource name="ST_AlignH" resource="List" generated="yes" tag="shape">
- <value name="left" tokenid="ooxml:Value_wordprocessingDrawing_ST_AlignH_left">left</value>
- <value name="right" tokenid="ooxml:Value_wordprocessingDrawing_ST_AlignH_right">right</value>
- <value name="center" tokenid="ooxml:Value_wordprocessingDrawing_ST_AlignH_center">center</value>
- <value name="inside" tokenid="ooxml:Value_wordprocessingDrawing_ST_AlignH_inside">inside</value>
- <value name="outside" tokenid="ooxml:Value_wordprocessingDrawing_ST_AlignH_outside">outside</value>
+ <resource name="ST_PositionOffset" resource="Value">
+ <action name="characters" action="positionOffset"/>
+ </resource>
+ <resource name="ST_AlignH" resource="Value">
+ <action name="characters" action="alignH"/>
</resource>
<resource name="ST_RelFromH" resource="List" generated="yes">
<value name="margin" tokenid="ooxml:Value_wordprocessingDrawing_ST_RelFromH_margin">margin</value>
@@ -6840,12 +6838,8 @@
<element name="posOffset" tokenid="ooxml:CT_PosH_posOffset"/>
<attribute name="relativeFrom" tokenid="ooxml:CT_PosH_relativeFrom"/>
</resource>
- <resource name="ST_AlignV" resource="List" generated="yes">
- <value name="top" tokenid="ooxml:Value_wordprocessingDrawing_ST_AlignV_top">top</value>
- <value name="bottom" tokenid="ooxml:Value_wordprocessingDrawing_ST_AlignV_bottom">bottom</value>
- <value name="center" tokenid="ooxml:Value_wordprocessingDrawing_ST_AlignV_center">center</value>
- <value name="inside" tokenid="ooxml:Value_wordprocessingDrawing_ST_AlignV_inside">inside</value>
- <value name="outside" tokenid="ooxml:Value_wordprocessingDrawing_ST_AlignV_outside">outside</value>
+ <resource name="ST_AlignV" resource="Value">
+ <action name="characters" action="alignV"/>
</resource>
<resource name="ST_RelFromV" resource="List" generated="yes">
<value name="margin" tokenid="ooxml:Value_wordprocessingDrawing_ST_RelFromV_margin">margin</value>
More information about the Libreoffice-commits
mailing list