[Libreoffice-commits] core.git: sw/qa sw/source

Thorsten Behrens Thorsten.Behrens at CIB.de
Tue Feb 21 08:33:43 UTC 2017


 sw/qa/extras/htmlimport/data/list-style.html |   58 +++++++++++++++++++++++++++
 sw/qa/extras/htmlimport/htmlimport.cxx       |   48 ++++++++++++++++++++++
 sw/source/filter/html/css1kywd.cxx           |    1 
 sw/source/filter/html/css1kywd.hxx           |    2 
 sw/source/filter/html/htmlnumreader.cxx      |   10 ++++
 sw/source/filter/html/svxcss1.cxx            |   52 ++++++++++++++++++++++++
 sw/source/filter/html/svxcss1.hxx            |    5 ++
 7 files changed, 176 insertions(+)

New commits:
commit 0755b26191782b17e307832452af4a66d8fdfac7
Author: Thorsten Behrens <Thorsten.Behrens at CIB.de>
Date:   Mon Feb 20 04:20:51 2017 +0100

    Add list-style-type support to html parser
    
    Change-Id: Ibd7978b12a3c5024c55571b165b82c6abe7a8925
    Reviewed-on: https://gerrit.libreoffice.org/34461
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>

diff --git a/sw/qa/extras/htmlimport/data/list-style.html b/sw/qa/extras/htmlimport/data/list-style.html
new file mode 100644
index 0000000..8c5468a
--- /dev/null
+++ b/sw/qa/extras/htmlimport/data/list-style.html
@@ -0,0 +1,58 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
+  <body>
+    <div>
+      <p>
+        This document contains a number of lists...
+		<ul>
+		  <li>list-style-type</li>
+		  <li>default</li>
+		</ul>
+		<ul style="list-style-type: circle;">
+		  <li>list-style-type</li>
+		  <li>circle</li>
+		</ul>
+		<ul style="list-style-type: square;">
+		  <li>list-style-type</li>
+		  <li>square</li>
+		</ul>
+		<ul style="list-style-type: disc;">
+		  <li>list-style-type</li>
+		  <li>disc</li>
+		</ul>
+		<ol>
+		  <li>list-style-type</li>
+		  <li>default</li>
+		</ol>
+		<ol style="list-style-type: decimal;">
+		  <li>list-style-type</li>
+		  <li>decimal</li>
+		</ol>
+		<ol style="list-style-type: lower-alpha;">
+		  <li>list-style-type</li>
+		  <li>lower-alpha</li>
+		</ol>
+		<ol style="list-style-type: lower-latin;">
+		  <li>list-style-type</li>
+		  <li>lower-latin</li>
+		</ol>
+		<ol style="list-style-type: lower-roman;">
+		  <li>list-style-type</li>
+		  <li>lower-roman</li>
+		</ol>
+		<ol style="list-style-type: upper-alpha;">
+		  <li>list-style-type</li>
+		  <li>upper-alpha</li>
+		</ol>
+		<ol style="list-style-type: upper-latin;">
+		  <li>list-style-type</li>
+		  <li>upper-latin</li>
+		</ol>
+		<ol style="list-style-type: upper-roman;">
+		  <li>list-style-type</li>
+		  <li>upper-roman</li>
+		</ol>
+      </p>
+    </div>
+  </body>
+</html>
diff --git a/sw/qa/extras/htmlimport/htmlimport.cxx b/sw/qa/extras/htmlimport/htmlimport.cxx
index 66d070d..b04f7c9 100644
--- a/sw/qa/extras/htmlimport/htmlimport.cxx
+++ b/sw/qa/extras/htmlimport/htmlimport.cxx
@@ -126,6 +126,54 @@ DECLARE_HTMLIMPORT_TEST(testInlinedImagesPageAndParagraph, "PageAndParagraphFill
     }
 }
 
+DECLARE_HTMLIMPORT_TEST(testListStyleType, "list-style.html")
+{
+    // check unnumbered list style - should be type circle here
+    uno::Reference< beans::XPropertySet > xParagraphProperties(getParagraph(4),
+                                                               uno::UNO_QUERY);
+    uno::Reference<container::XIndexAccess> xLevels(
+        xParagraphProperties->getPropertyValue("NumberingRules"), uno::UNO_QUERY);
+    uno::Sequence<beans::PropertyValue> aProps;
+    xLevels->getByIndex(0) >>= aProps; // 1st level
+
+    bool bBulletFound=false;
+    for (int i = 0; i < aProps.getLength(); ++i)
+    {
+        const beans::PropertyValue& rProp = aProps[i];
+
+        if (rProp.Name == "BulletChar")
+        {
+            // should be 'o'.
+            CPPUNIT_ASSERT_EQUAL(OUString("\xEE\x80\x89", 3, RTL_TEXTENCODING_UTF8), rProp.Value.get<OUString>());
+            bBulletFound = true;
+            break;
+        }
+    }
+    CPPUNIT_ASSERT_MESSAGE("no BulletChar property found for para 4", bBulletFound);
+
+    // check numbered list style - should be type lower-alpha here
+    xParagraphProperties.set(getParagraph(14),
+                             uno::UNO_QUERY);
+    xLevels.set(xParagraphProperties->getPropertyValue("NumberingRules"),
+                uno::UNO_QUERY);
+    xLevels->getByIndex(0) >>= aProps; // 1st level
+
+    for (int i = 0; i < aProps.getLength(); ++i)
+    {
+        const beans::PropertyValue& rProp = aProps[i];
+
+        if (rProp.Name == "NumberingType")
+        {
+            printf("style is %d\n", rProp.Value.get<sal_Int16>());
+            // is lower-alpha in input, translates into chars_lower_letter here
+            CPPUNIT_ASSERT_EQUAL(style::NumberingType::CHARS_LOWER_LETTER,
+                                 rProp.Value.get<sal_Int16>());
+            return;
+        }
+    }
+    CPPUNIT_FAIL("no NumberingType property found for para 14");
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/filter/html/css1kywd.cxx b/sw/source/filter/html/css1kywd.cxx
index 6088d42..7f8cc83 100644
--- a/sw/source/filter/html/css1kywd.cxx
+++ b/sw/source/filter/html/css1kywd.cxx
@@ -144,6 +144,7 @@ const sal_Char* sCSS1_PV_justify = "justify";
 const sal_Char* sCSS1_P_text_indent = "text-indent";
 
 const sal_Char* sCSS1_P_line_height = "line-height";
+const sal_Char* sCSS1_P_list_style_type = "list-style-type";
 
 // Strings for box properties
 
diff --git a/sw/source/filter/html/css1kywd.hxx b/sw/source/filter/html/css1kywd.hxx
index 9522cd7..49e41a2 100644
--- a/sw/source/filter/html/css1kywd.hxx
+++ b/sw/source/filter/html/css1kywd.hxx
@@ -147,6 +147,8 @@ extern const sal_Char* sCSS1_P_text_indent;
 
 extern const sal_Char* sCSS1_P_line_height;
 
+extern const sal_Char* sCSS1_P_list_style_type;
+
 // Strings for box properties
 
 extern const sal_Char* sCSS1_P_margin_left;
diff --git a/sw/source/filter/html/htmlnumreader.cxx b/sw/source/filter/html/htmlnumreader.cxx
index cc7a608..0626634 100644
--- a/sw/source/filter/html/htmlnumreader.cxx
+++ b/sw/source/filter/html/htmlnumreader.cxx
@@ -288,6 +288,16 @@ void SwHTMLParser::NewNumBulList( int nToken )
                     aNumFormat.SetFirstLineOffset( nTextIndent );
                     bChangeNumFormat = true;
                 }
+                if( aPropInfo.m_bNumbering )
+                {
+                    aNumFormat.SetNumberingType(aPropInfo.m_nNumberingType);
+                    bChangeNumFormat = true;
+                }
+                if( aPropInfo.m_bBullet )
+                {
+                    aNumFormat.SetBulletChar( (sal_Unicode)aPropInfo.m_cBulletChar );
+                    bChangeNumFormat = true;
+                }
             }
             aPropInfo.m_bLeftMargin = aPropInfo.m_bTextIndent = false;
             if( !aPropInfo.m_bRightMargin )
diff --git a/sw/source/filter/html/svxcss1.cxx b/sw/source/filter/html/svxcss1.cxx
index 5373a5f..9841091 100644
--- a/sw/source/filter/html/svxcss1.cxx
+++ b/sw/source/filter/html/svxcss1.cxx
@@ -53,6 +53,7 @@
 
 #include "css1kywd.hxx"
 #include "svxcss1.hxx"
+#include "htmlnum.hxx"
 
 #include <utility>
 
@@ -215,6 +216,26 @@ static CSS1PropertyEnum const aPageBreakTable[] =
     { nullptr,                    0                           }
 };
 
+static CSS1PropertyEnum const aNumberStyleTable[] =
+{
+    { "decimal",          SVX_NUM_ARABIC              },
+    { "lower-alpha",      SVX_NUM_CHARS_LOWER_LETTER  },
+    { "lower-latin",      SVX_NUM_CHARS_LOWER_LETTER  },
+    { "lower-roman",      SVX_NUM_ROMAN_LOWER         },
+    { "upper-alpha",      SVX_NUM_CHARS_UPPER_LETTER  },
+    { "upper-latin",      SVX_NUM_CHARS_UPPER_LETTER  },
+    { "upper-roman",      SVX_NUM_ROMAN_UPPER         },
+    { nullptr,            0                           }
+};
+
+static CSS1PropertyEnum const aBulletStyleTable[] =
+{
+    { "circle",      HTML_BULLETCHAR_CIRCLE   },
+    { "disc",        HTML_BULLETCHAR_DISC     },
+    { "square",      HTML_BULLETCHAR_SQUARE   },
+    { nullptr,       0                        }
+};
+
 
 static sal_uInt16 const aBorderWidths[] =
 {
@@ -400,6 +421,7 @@ void SvxCSS1PropertyInfo::Clear()
     m_aId.clear();
     m_bTopMargin = m_bBottomMargin = false;
     m_bLeftMargin = m_bRightMargin = m_bTextIndent = false;
+    m_bNumbering = m_bBullet = false;
     m_nLeftMargin = m_nRightMargin = 0;
     m_eFloat = SVX_ADJUST_END;
 
@@ -407,6 +429,9 @@ void SvxCSS1PropertyInfo::Clear()
     m_nTopBorderDistance = m_nBottomBorderDistance =
     m_nLeftBorderDistance = m_nRightBorderDistance = USHRT_MAX;
 
+    m_nNumberingType = 0;
+    m_cBulletChar = ' ';
+
     m_nColumnCount = 0;
 
     m_nLeft = m_nTop = m_nWidth = m_nHeight = 0;
@@ -1673,6 +1698,32 @@ static void ParseCSS1_line_height( const CSS1Expression *pExpr,
 
 }
 
+static void ParseCSS1_list_style_type( const CSS1Expression *pExpr,
+                                       SfxItemSet & /*rItemSet*/,
+                                       SvxCSS1PropertyInfo& rPropInfo,
+                                       const SvxCSS1Parser& /*rParser*/ )
+{
+    OSL_ENSURE( pExpr, "no expression" );
+
+    if( pExpr->GetType() == CSS1_IDENT )
+    {
+        const OUString& rValue = pExpr->GetString();
+
+        // values are context-dependent, so fill both
+        sal_uInt16 nEnum;
+        if( SvxCSS1Parser::GetEnum( aNumberStyleTable, rValue, nEnum ) )
+        {
+            rPropInfo.m_bNumbering = true;
+            rPropInfo.m_nNumberingType = nEnum;
+        }
+        if( SvxCSS1Parser::GetEnum( aBulletStyleTable, rValue, nEnum ) )
+        {
+            rPropInfo.m_bBullet = true;
+            rPropInfo.m_cBulletChar = nEnum;
+        }
+    }
+}
+
 static void ParseCSS1_font( const CSS1Expression *pExpr,
                             SfxItemSet &rItemSet,
                             SvxCSS1PropertyInfo& rPropInfo,
@@ -3080,6 +3131,7 @@ static CSS1PropEntry aCSS1PropFnTab[] =
     CSS1_PROP_ENTRY(font_weight),
     CSS1_PROP_ENTRY(letter_spacing),
     CSS1_PROP_ENTRY(line_height),
+    CSS1_PROP_ENTRY(list_style_type),
     CSS1_PROP_ENTRY(font),
     CSS1_PROP_ENTRY(text_align),
     CSS1_PROP_ENTRY(text_decoration),
diff --git a/sw/source/filter/html/svxcss1.hxx b/sw/source/filter/html/svxcss1.hxx
index ae149a1..e91c643 100644
--- a/sw/source/filter/html/svxcss1.hxx
+++ b/sw/source/filter/html/svxcss1.hxx
@@ -109,6 +109,8 @@ public:
     bool m_bLeftMargin : 1;
     bool m_bRightMargin : 1;
     bool m_bTextIndent : 1;
+    bool m_bNumbering : 1;
+    bool m_bBullet : 1;
 
     SvxAdjust m_eFloat;
 
@@ -119,6 +121,9 @@ public:
     sal_uInt16 m_nLeftBorderDistance;
     sal_uInt16 m_nRightBorderDistance;
 
+    sal_uInt16  m_nNumberingType;
+    sal_Unicode m_cBulletChar;
+
     sal_uInt16 m_nColumnCount;
 
     long m_nLeft, m_nTop;


More information about the Libreoffice-commits mailing list