[Libreoffice-commits] core.git: 3 commits - sw/inc sw/source writerfilter/source

Jan Holesovsky kendy at collabora.com
Wed Sep 18 03:21:49 PDT 2013


 sw/inc/format.hxx                               |    1 
 sw/source/core/attr/format.cxx                  |    3 -
 sw/source/filter/ww8/docxattributeoutput.cxx    |   25 ++++------
 sw/source/filter/ww8/wrtw8sty.cxx               |   58 ++++++++++++++++++++++++
 sw/source/filter/ww8/wrtww8.hxx                 |    9 +++
 writerfilter/source/dmapper/StyleSheetTable.cxx |   24 ++++++---
 6 files changed, 92 insertions(+), 28 deletions(-)

New commits:
commit e47c7970a43d95a65f2a6d6942777314aea41bba
Author: Jan Holesovsky <kendy at collabora.com>
Date:   Wed Sep 18 12:19:45 2013 +0200

    DOCX styles: Generate the styleIds similar ways as MSO does.
    
    Makes the id's nicer than the styleXY.
    
    Change-Id: Ica0da1404578f834a79f940bf31c93d25f842e7f

diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index f005500..dc317ca 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -1280,11 +1280,12 @@ void DocxAttributeOutput::StartRuby( const SwTxtNode& rNode, xub_StrLen nPos, co
     StartRunProperties( );
     SwWW8AttrIter aAttrIt( m_rExport, rNode );
     aAttrIt.OutAttr( nPos, true );
+
     sal_uInt16 nStyle = m_rExport.GetId( *rRuby.GetTxtRuby()->GetCharFmt() );
-    OString aStyleId( "style" );
-    aStyleId += OString::number( nStyle );
+    OString aStyleId(m_rExport.pStyles->GetStyleId(nStyle));
     m_pSerializer->singleElementNS( XML_w, XML_rStyle,
             FSNS( XML_w, XML_val ), aStyleId.getStr(), FSEND );
+
     EndRunProperties( NULL );
     RunText( rRuby.GetText( ) );
     EndRun( );
@@ -1531,8 +1532,7 @@ void DocxAttributeOutput::FormatDrop( const SwTxtNode& /*rNode*/, const SwFmtDro
 
 void DocxAttributeOutput::ParagraphStyle( sal_uInt16 nStyle )
 {
-    OString aStyleId( "style" );
-    aStyleId += OString::number( nStyle );
+    OString aStyleId(m_rExport.pStyles->GetStyleId(nStyle));
 
     m_pSerializer->singleElementNS( XML_w, XML_pStyle, FSNS( XML_w, XML_val ), aStyleId.getStr(), FSEND );
 }
@@ -3249,11 +3249,9 @@ oox::drawingml::DrawingML& DocxAttributeOutput::GetDrawingML()
 void DocxAttributeOutput::StartStyle( const String& rName, bool bPapFmt,
         sal_uInt16 nBase, sal_uInt16 nNext, sal_uInt16 /*nWwId*/, sal_uInt16 nId, bool bAutoUpdate )
 {
-    OString aStyle( "style" );
-
     m_pSerializer->startElementNS( XML_w, XML_style,
             FSNS( XML_w, XML_type ), bPapFmt? "paragraph": "character", // FIXME is this correct?
-            FSNS( XML_w, XML_styleId ), OString( aStyle + OString::number( nId ) ).getStr(),
+            FSNS( XML_w, XML_styleId ), m_rExport.pStyles->GetStyleId(nId).getStr(),
             FSEND );
 
     m_pSerializer->singleElementNS( XML_w, XML_name,
@@ -3263,12 +3261,12 @@ void DocxAttributeOutput::StartStyle( const String& rName, bool bPapFmt,
     if ( nBase != 0x0FFF )
     {
         m_pSerializer->singleElementNS( XML_w, XML_basedOn,
-                FSNS( XML_w, XML_val ), OString( aStyle + OString::number( nBase ) ).getStr(),
+                FSNS( XML_w, XML_val ), m_rExport.pStyles->GetStyleId(nBase).getStr(),
                 FSEND );
     }
 
     m_pSerializer->singleElementNS( XML_w, XML_next,
-            FSNS( XML_w, XML_val ), OString( aStyle + OString::number( nNext ) ).getStr(),
+            FSNS( XML_w, XML_val ), m_rExport.pStyles->GetStyleId(nNext).getStr(),
             FSEND );
 
     if ( bAutoUpdate )
@@ -4336,16 +4334,14 @@ void DocxAttributeOutput::TextINetFormat( const SwFmtINetFmt& rLink )
     const SwTxtINetFmt* pINetFmt = rLink.GetTxtINetFmt();
     const SwCharFmt* pCharFmt = pINetFmt->GetCharFmt();
 
-    OString aStyleId( "style" );
-    aStyleId += OString::number( m_rExport.GetId( *pCharFmt ) );
+    OString aStyleId(m_rExport.pStyles->GetStyleId(m_rExport.GetId(*pCharFmt)));
 
     m_pSerializer->singleElementNS( XML_w, XML_rStyle, FSNS( XML_w, XML_val ), aStyleId.getStr(), FSEND );
 }
 
 void DocxAttributeOutput::TextCharFormat( const SwFmtCharFmt& rCharFmt )
 {
-    OString aStyleId( "style" );
-    aStyleId += OString::number( m_rExport.GetId( *rCharFmt.GetCharFmt() ) );
+    OString aStyleId(m_rExport.pStyles->GetStyleId(m_rExport.GetId(*rCharFmt.GetCharFmt())));
 
     m_pSerializer->singleElementNS( XML_w, XML_rStyle, FSNS( XML_w, XML_val ), aStyleId.getStr(), FSEND );
 }
@@ -4534,8 +4530,7 @@ void DocxAttributeOutput::TextFootnote_Impl( const SwFmtFtn& rFootnote )
     // footnote/endnote run properties
     const SwCharFmt* pCharFmt = rInfo.GetAnchorCharFmt( *m_rExport.pDoc );
 
-    OString aStyleId( "style" );
-    aStyleId += OString::number( m_rExport.GetId( *pCharFmt ) );
+    OString aStyleId(m_rExport.pStyles->GetStyleId(m_rExport.GetId(*pCharFmt)));
 
     m_pSerializer->singleElementNS( XML_w, XML_rStyle, FSNS( XML_w, XML_val ), aStyleId.getStr(), FSEND );
 
diff --git a/sw/source/filter/ww8/wrtw8sty.cxx b/sw/source/filter/ww8/wrtw8sty.cxx
index 573e98a..2ca0b04 100644
--- a/sw/source/filter/ww8/wrtw8sty.cxx
+++ b/sw/source/filter/ww8/wrtw8sty.cxx
@@ -20,6 +20,7 @@
 
 #include <algorithm>
 #include <functional>
+#include <unordered_set>
 
 #include <boost/scoped_array.hpp>
 
@@ -158,6 +159,7 @@ MSWordStyles::MSWordStyles( MSWordExportBase& rExport )
     memset( pFmtA, 0, nAlloc * sizeof( SwFmt* ) );
 
     BuildStylesTable();
+    BuildStyleIds();
 }
 
 MSWordStyles::~MSWordStyles()
@@ -293,6 +295,62 @@ void MSWordStyles::BuildStylesTable()
     }
 }
 
+void MSWordStyles::BuildStyleIds()
+{
+    std::unordered_set<OString, OStringHash> aUsed;
+
+    m_aStyleIds.push_back("Normal");
+    aUsed.insert("normal");
+
+    for (sal_uInt16 n = 1; n < nUsedSlots; ++n)
+    {
+        const OUString aName(pFmtA[n]? pFmtA[n]->GetName(): OUString());
+
+        OStringBuffer aStyleIdBuf(aName.getLength());
+        for (int i = 0; i < aName.getLength(); ++i)
+        {
+            sal_Unicode nChar = aName[i];
+            if (('0' <= nChar && nChar <= '9') ||
+                ('a' <= nChar && nChar <= 'z') ||
+                ('A' <= nChar && nChar <= 'Z'))
+            {
+                // first letter should be uppercase
+                if (aStyleIdBuf.isEmpty() && ('a' < nChar && nChar <= 'z'))
+                    aStyleIdBuf.append(char(nChar - ('a' - 'A')));
+                else
+                    aStyleIdBuf.append(char(nChar));
+            }
+        }
+
+        OString aStyleId(aStyleIdBuf.makeStringAndClear());
+        if (aStyleId.isEmpty())
+            aStyleId = "Style";
+
+        OString aLower(aStyleId.toAsciiLowerCase());
+
+        // check for uniqueness & construct something unique if we have to
+        if (aUsed.find(aLower) == aUsed.end())
+        {
+            aUsed.insert(aLower);
+            m_aStyleIds.push_back(aStyleId);
+        }
+        else
+        {
+            int nFree = 1;
+            while (aUsed.find(aLower + OString::number(nFree)) != aUsed.end())
+                ++nFree;
+
+            aUsed.insert(aLower + OString::number(nFree));
+            m_aStyleIds.push_back(aStyleId + OString::number(nFree));
+        }
+    }
+}
+
+OString MSWordStyles::GetStyleId(sal_uInt16 nId) const
+{
+    return m_aStyleIds[nId];
+}
+
 /// For WW8 only - extend pO so that the size of pTableStrm is even.
 static void impl_SkipOdd( ww::bytes* pO, sal_Size nTableStrmTell )
 {
diff --git a/sw/source/filter/ww8/wrtww8.hxx b/sw/source/filter/ww8/wrtww8.hxx
index 5ae203f..8d45349 100644
--- a/sw/source/filter/ww8/wrtww8.hxx
+++ b/sw/source/filter/ww8/wrtww8.hxx
@@ -1509,9 +1509,15 @@ class MSWordStyles
     SwFmt** pFmtA;
     sal_uInt16 nUsedSlots;
 
+    /// We need to build style id's for DOCX export; ideally we should roundtrip that, but this is good enough.
+    std::vector<OString> m_aStyleIds;
+
     /// Create the style table, called from the constructor.
     void BuildStylesTable();
 
+    /// Based on pFmtA, fill in m_aStyleIds with unique, MS-like names.
+    void BuildStyleIds();
+
     /// Get slot number during building the style table.
     sal_uInt16 BuildGetSlot( const SwFmt& rFmt );
 
@@ -1542,6 +1548,9 @@ public:
     /// Get id of the style (rFmt).
     sal_uInt16 GetSlot( const SwFmt& rFmt ) const;
 
+    /// Get styleId of the nId-th style (nId is its position in pFmtA).
+    OString GetStyleId(sal_uInt16 nId) const;
+
     const SwFmt* GetSwFmt() const { return (*pFmtA); }
 };
 
commit 47fb53309cb8f5171431df6d49395880a3c034f2
Author: Jan Holesovsky <kendy at collabora.com>
Date:   Tue Sep 17 16:21:35 2013 +0200

    Make the comments readable in the code.
    
    [And kill one unhelpful one - comments a removal of something.]
    
    Change-Id: Ia4229fe889aa0aae115e6ab9b6808e0f054bb199

diff --git a/writerfilter/source/dmapper/StyleSheetTable.cxx b/writerfilter/source/dmapper/StyleSheetTable.cxx
index 481a35b..7b385d8 100644
--- a/writerfilter/source/dmapper/StyleSheetTable.cxx
+++ b/writerfilter/source/dmapper/StyleSheetTable.cxx
@@ -724,6 +724,7 @@ void StyleSheetTable::ApplyStyleSheets( FontTablePtr rFontTable )
                     uno::Reference< container::XNameContainer > xStyles = bParaStyle ? xParaStyles : xCharStyles;
                     uno::Reference< style::XStyle > xStyle;
                     OUString sConvertedStyleName = ConvertStyleName( pEntry->sStyleName );
+
                     // When pasting, don't update existing styles.
                     if(xStyles->hasByName( sConvertedStyleName ) && m_pImpl->m_bIsNewDoc)
                         xStyles->getByName( sConvertedStyleName ) >>= xStyle;
@@ -761,18 +762,21 @@ void StyleSheetTable::ApplyStyleSheets( FontTablePtr rFontTable )
                         if( !m_pImpl->m_rDMapper.IsOOXMLImport() && nFontCount > 2 )
                         {
                             uno::Any aTwoHundredFortyTwip = uno::makeAny(12.);
-    //                      font size to 240 twip (12 pts) for all if not set
+
+                            // font size to 240 twip (12 pts) for all if not set
                             pEntry->pProperties->Insert(PROP_CHAR_HEIGHT, aTwoHundredFortyTwip, false);
-    //                      western font not already set -> apply first font
+
+                            // western font not already set -> apply first font
                             const FontEntry::Pointer_t pWesternFontEntry(rFontTable->getFontEntry( 0 ));
                             OUString sWesternFontName = pWesternFontEntry->sFontName;
                             pEntry->pProperties->Insert(PROP_CHAR_FONT_NAME, uno::makeAny( sWesternFontName ), false);
 
-    //                      CJK  ... apply second font
+                            // CJK  ... apply second font
                             const FontEntry::Pointer_t pCJKFontEntry(rFontTable->getFontEntry( 2 ));
                             pEntry->pProperties->Insert(PROP_CHAR_FONT_NAME_ASIAN, uno::makeAny( pCJKFontEntry->sFontName ), false);
                             pEntry->pProperties->Insert(PROP_CHAR_HEIGHT_ASIAN, aTwoHundredFortyTwip, false);
-    //                      CTL  ... apply third font, if available
+
+                            // CTL  ... apply third font, if available
                             if( nFontCount > 3 )
                             {
                                 const FontEntry::Pointer_t pCTLFontEntry(rFontTable->getFontEntry( 3 ));
@@ -780,13 +784,14 @@ void StyleSheetTable::ApplyStyleSheets( FontTablePtr rFontTable )
                                 pEntry->pProperties->Insert(PROP_CHAR_HEIGHT_COMPLEX, aTwoHundredFortyTwip, false);
                             }
                         }
-    //                  Widow/Orphan -> set both to two if not already set
+
+                        // Widow/Orphan -> set both to two if not already set
                         uno::Any aTwo = uno::makeAny(sal_Int8(2));
                         pEntry->pProperties->Insert(PROP_PARA_WIDOWS, aTwo, false);
                         pEntry->pProperties->Insert(PROP_PARA_ORPHANS, aTwo, false);
-    //                  Left-to-right direction if not already set
+
+                        // Left-to-right direction if not already set
                         pEntry->pProperties->Insert(PROP_WRITING_MODE, uno::makeAny( sal_Int16(text::WritingMode_LR_TB) ), false);
-                        // Don't set font color to Auto if not already set: this could hide the default font color setting
                     }
 
                     uno::Sequence< beans::PropertyValue > aPropValues = pEntry->pProperties->GetPropertyValues();
@@ -795,7 +800,8 @@ void StyleSheetTable::ApplyStyleSheets( FontTablePtr rFontTable )
                     {
                             bAddFollowStyle = true;
                     }
-                    //remove Left/RightMargin values from TOX heading styles
+
+                    // remove Left/RightMargin values from TOX heading styles
                     if( bParaStyle )
                     {
                         // Set the outline levels
@@ -874,7 +880,7 @@ void StyleSheetTable::ApplyStyleSheets( FontTablePtr rFontTable )
                         PropValVector aSortedPropVals;
                         for( sal_Int32 nProp = 0; nProp < aPropValues.getLength(); ++nProp)
                         {
-                                // Don't add the style name properties
+                            // Don't add the style name properties
                             bool bIsParaStyleName = aPropValues[nProp].Name == "ParaStyleName";
                             bool bIsCharStyleName = aPropValues[nProp].Name == "CharStyleName";
                             if ( !bIsParaStyleName && !bIsCharStyleName )
commit 33f6696f393363dc9c182dfc732f87465e5e53ea
Author: Jan Holesovsky <kendy at collabora.com>
Date:   Tue Sep 17 14:17:02 2013 +0200

    DOCX styles: nFmtId is unused, kill it.
    
    Change-Id: Id54c1c9b5cdbfd502cc3ca6cb7a101a40b3b169b

diff --git a/sw/inc/format.hxx b/sw/inc/format.hxx
index 2063ee3..a058dc6 100644
--- a/sw/inc/format.hxx
+++ b/sw/inc/format.hxx
@@ -40,7 +40,6 @@ class SW_DLLPUBLIC SwFmt : public SwModify
     SwAttrSet aSet;
 
     sal_uInt16 nWhichId;
-    sal_uInt16 nFmtId;            ///< Format-ID for reading / writing.
     sal_uInt16 nPoolFmtId;        /**< Id for "automatically" created formats.
                                        (is not hard attribution!!!) */
     sal_uInt16 nPoolHelpId;       ///< HelpId for this Pool-style.
diff --git a/sw/source/core/attr/format.cxx b/sw/source/core/attr/format.cxx
index 6777a2b..de54367 100644
--- a/sw/source/core/attr/format.cxx
+++ b/sw/source/core/attr/format.cxx
@@ -35,7 +35,6 @@ SwFmt::SwFmt( SwAttrPool& rPool, const sal_Char* pFmtNm,
     aFmtName( OUString::createFromAscii(pFmtNm) ),
     aSet( rPool, pWhichRanges ),
     nWhichId( nFmtWhich ),
-    nFmtId( 0 ),
     nPoolFmtId( USHRT_MAX ),
     nPoolHelpId( USHRT_MAX ),
     nPoolHlpFileId( UCHAR_MAX )
@@ -55,7 +54,6 @@ SwFmt::SwFmt( SwAttrPool& rPool, const OUString& rFmtNm,
     aFmtName( rFmtNm ),
     aSet( rPool, pWhichRanges ),
     nWhichId( nFmtWhich ),
-    nFmtId( 0 ),
     nPoolFmtId( USHRT_MAX ),
     nPoolHelpId( USHRT_MAX ),
     nPoolHlpFileId( UCHAR_MAX )
@@ -73,7 +71,6 @@ SwFmt::SwFmt( const SwFmt& rFmt )
     aFmtName( rFmt.aFmtName ),
     aSet( rFmt.aSet ),
     nWhichId( rFmt.nWhichId ),
-    nFmtId( 0 ),
     nPoolFmtId( rFmt.GetPoolFmtId() ),
     nPoolHelpId( rFmt.GetPoolHelpId() ),
     nPoolHlpFileId( rFmt.GetPoolHlpFileId() )


More information about the Libreoffice-commits mailing list