mity / md4c

C Markdown parser. Fast. SAX-like interface. Compliant to CommonMark specification.
MIT License
756 stars 138 forks source link

Unordered lists have incorrect mark when containing nested ordered lists #153

Closed rundel closed 3 years ago

rundel commented 3 years ago

When parsing the CommonMark Example 269 the returned mark within details for the UL block is . when it should be -.

Example 269:

1. - 2. foo

My version of the parse tree looks like the following:

md_block_doc [flags:]
└── md_block_ol [start: 1, tight: 1, mark_delimiter: '.']
    └── md_block_li
        └── md_block_ul [tight: 1, mark: '.']
            └── md_block_li
                └── md_block_ol [start: 2, tight: 1, mark_delimiter: '.']
                    └── md_block_li
                        └── md_text_normal - "foo"

it seems like similar things happen for any case where an ordered list is nested inside an unordered list see below:

> parse_md("1. - 1. foo", character())
md_block_doc [flags:]
└── md_block_ol [start: 1, tight: 1, mark_delimiter: '.']
    └── md_block_li
        └── md_block_ul [tight: 1, mark: '.']
            └── md_block_li
                └── md_block_ol [start: 1, tight: 1, mark_delimiter: '.']
                    └── md_block_li
                        └── md_text_normal - "foo"

> parse_md("1. - - foo", character())
md_block_doc [flags:]
└── md_block_ol [start: 1, tight: 1, mark_delimiter: '-']
    └── md_block_li
        └── md_block_ul [tight: 1, mark: '-']
            └── md_block_li
                └── md_block_ul [tight: 1, mark: '-']
                    └── md_block_li
                        └── md_text_normal - "foo"

> parse_md("- - 1. foo", character())
md_block_doc [flags:]
└── md_block_ul [tight: 1, mark: '.']
    └── md_block_li
        └── md_block_ul [tight: 1, mark: '.']
            └── md_block_li
                └── md_block_ol [start: 1, tight: 1, mark_delimiter: '.']
                    └── md_block_li
                        └── md_text_normal - "foo"

> parse_md("- 1. foo", character())
md_block_doc [flags:]
└── md_block_ul [tight: 1, mark: '.']
    └── md_block_li
        └── md_block_ol [start: 1, tight: 1, mark_delimiter: '.']
            └── md_block_li
                └── md_text_normal - "foo"

> parse_md("1. * 1. foo", character())
md_block_doc [flags:]
└── md_block_ol [start: 1, tight: 1, mark_delimiter: '.']
    └── md_block_li
        └── md_block_ul [tight: 1, mark: '.']
            └── md_block_li
                └── md_block_ol [start: 1, tight: 1, mark_delimiter: '.']
                    └── md_block_li
                        └── md_text_normal - "foo"
mity commented 3 years ago

Good catch. Should be fixed now.