From 481f24f6eccf0fde05fcd7f9b234c4641f153263 Mon Sep 17 00:00:00 2001 From: Ayush Hiremani Date: Mon, 9 Mar 2026 12:43:08 +0530 Subject: [PATCH 1/2] fix, ListType to support greek numbering --- src/Html2OpenXml/Expressions/Numbering/ListExpression.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Html2OpenXml/Expressions/Numbering/ListExpression.cs b/src/Html2OpenXml/Expressions/Numbering/ListExpression.cs index 53f006e..2839e2b 100644 --- a/src/Html2OpenXml/Expressions/Numbering/ListExpression.cs +++ b/src/Html2OpenXml/Expressions/Numbering/ListExpression.cs @@ -40,6 +40,7 @@ readonly struct ListContext(string listName, int absNumId, int instanceId, int l private static readonly HashSet supportedListTypes = ["disc", "decimal", "square", "circle", "lower-alpha", "upper-alpha", "lower-latin", "upper-latin", + "lower-greek", "upper-greek", "lower-roman", "upper-roman", "decimal-tiered" /* not W3C compliant */]; private ParagraphStyleId? listParagraphStyleId; @@ -243,6 +244,7 @@ private static string GetListName(IElement listNode, string? parentName = null) "A" => "upper-alpha", "i" => "lower-roman", "I" => "upper-roman", + "lower-greek" or "upper-greek" => type, _ => null }; From 05210b8e807f72cabc075b6f4e486670792e6de2 Mon Sep 17 00:00:00 2001 From: Ayush Hiremani Date: Mon, 9 Mar 2026 17:32:44 +0530 Subject: [PATCH 2/2] write testcase for both upper and lower greek + add greek numbering html content in demo doc --- examples/Demo/Resources/CompleteRunTest.html | 28 ++++++++++ examples/Demo/Resources/NumberingList.htm | 27 ++++++++++ test/HtmlToOpenXml.Tests/NumberingTests.cs | 56 +++++++++++++++++++- 3 files changed, 109 insertions(+), 2 deletions(-) diff --git a/examples/Demo/Resources/CompleteRunTest.html b/examples/Demo/Resources/CompleteRunTest.html index 9c98726..10072ce 100644 --- a/examples/Demo/Resources/CompleteRunTest.html +++ b/examples/Demo/Resources/CompleteRunTest.html @@ -154,6 +154,34 @@
Heading 5
  • Wine
  • +

    An Ordered List with Greek numbering:

    +
      +
    1. alpha
    2. +
    3. + beta +
        +
      1. two.one
      2. +
      3. two.two
      4. +
      5. two.three
      6. +
      +
    4. + +
    5. + three +
        +
      1. three.one
      2. +
      3. + three.two +
          +
        1. three.two.one
        2. +
        3. three.two.two
        4. +
        +
      4. +
      +
    6. +
    7. four
    8. +
    +
    Inside table

    delta parameter (d)

    diff --git a/examples/Demo/Resources/NumberingList.htm b/examples/Demo/Resources/NumberingList.htm index e55b320..c8d064f 100644 --- a/examples/Demo/Resources/NumberingList.htm +++ b/examples/Demo/Resources/NumberingList.htm @@ -78,3 +78,30 @@
  • four
  • + +
      +
    1. one
    2. +
    3. + two +
        +
      1. two.one
      2. +
      3. two.two
      4. +
      5. two.three
      6. +
      +
    4. + +
    5. + three +
        +
      1. three.one
      2. +
      3. + three.two +
          +
        1. three.two.one
        2. +
        3. three.two.two
        4. +
        +
      4. +
      +
    6. +
    7. four
    8. +
    diff --git a/test/HtmlToOpenXml.Tests/NumberingTests.cs b/test/HtmlToOpenXml.Tests/NumberingTests.cs index 06225f6..faa0108 100644 --- a/test/HtmlToOpenXml.Tests/NumberingTests.cs +++ b/test/HtmlToOpenXml.Tests/NumberingTests.cs @@ -1,4 +1,4 @@ -using NUnit.Framework; +using NUnit.Framework; using DocumentFormat.OpenXml.Wordprocessing; using DocumentFormat.OpenXml.Packaging; @@ -649,5 +649,57 @@ public void NestedTable_ReturnsAlignedTable() Assert.That(Convert.ToInt32(tableProperties.TableWidth.Width.Value), Is.GreaterThan(0).And.LessThan(5000)); } } + + [Test] + public async Task LowerGreekList_ReturnsListWithGreekNumbering() + { + await converter.ParseBody(@" +
      +
    1. Item 1
    2. +
    3. Item 2
    4. +
    " + ); + + var elements = mainPart.Document!.Body!.Elements().ToList(); + Assert.That(elements, Has.Count.EqualTo(2)); + + var numbering = mainPart.NumberingDefinitionsPart!.Numbering!; + var absNum = numbering.Elements().SingleOrDefault(); + + Assert.That(absNum, Is.Not.Null); + Assert.That(absNum.AbstractNumDefinitionName?.Val?.Value, Is.EqualTo("lower-greek")); + + var level = absNum.Elements().First(); + + using (Assert.EnterMultipleScope()) + { + Assert.That(level.NumberingFormat?.Val?.Value, Is.EqualTo(NumberFormatValues.LowerLetter)); + Assert.That(level.LevelText?.Val?.Value, Is.EqualTo("%1.")); + } + } + + [Test] + public async Task UpperGreekList_ReturnsListWithGreekNumbering() + { + await converter.ParseBody(@" +
      +
    1. Item 1
    2. +
    " + ); + + var numbering = mainPart.NumberingDefinitionsPart!.Numbering!; + var absNum = numbering.Elements().SingleOrDefault(); + + Assert.That(absNum, Is.Not.Null); + Assert.That(absNum.AbstractNumDefinitionName?.Val?.Value, Is.EqualTo("upper-greek")); + + var level = absNum.Elements().First(); + + using (Assert.EnterMultipleScope()) + { + Assert.That(level.NumberingFormat?.Val?.Value, Is.EqualTo(NumberFormatValues.UpperLetter)); + Assert.That(level.LevelText?.Val?.Value, Is.EqualTo("%1.")); + } + } } -} \ No newline at end of file +}