[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-&gt;text(sText);
         </xsl:when>
+        <xsl:when test="@action='positionOffset'">
+    pHandler-&gt;positionOffset(sText);
+        </xsl:when>
+        <xsl:when test="@action='alignH'">
+    pHandler-&gt;alignH(sText);
+        </xsl:when>
+        <xsl:when test="@action='alignV'">
+    pHandler-&gt;alignV(sText);
+        </xsl:when>
         <xsl:when test="@action='newProperty'">
           <xsl:text>
     OOXMLFastHelper&lt;OOXMLIntegerValue&gt;::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