diff --git a/src/Rules/OrderedListRule.php b/src/Rules/OrderedListRule.php index 33aeebe..588673b 100644 --- a/src/Rules/OrderedListRule.php +++ b/src/Rules/OrderedListRule.php @@ -39,7 +39,7 @@ public function shouldParse(Parser $parser): bool public function parse(Parser $parser): ?Token { - $parser->consumeWhile('0123456789'); + $number = $parser->consumeWhile('0123456789'); $parser->consumeIncluding('.'); $content = trim($parser->consumeUntil(Parser::NEW_LINE)); $parser->consumeWhile(Parser::NEW_LINE); @@ -68,6 +68,6 @@ public function parse(Parser $parser): ?Token return null; } - return new OrderedListToken([$item]); + return new OrderedListToken([$item], (int) $number); } } diff --git a/src/Tokens/OrderedListToken.php b/src/Tokens/OrderedListToken.php index d3ddbf0..429e1df 100644 --- a/src/Tokens/OrderedListToken.php +++ b/src/Tokens/OrderedListToken.php @@ -18,6 +18,9 @@ final class OrderedListToken implements Token public function __construct( /** @var \Tempest\Markdown\Tokens\ListItem[] */ public array $items = [], + + /** The number the list starts at, as written in the first item's marker. */ + public int $start = 1, ) {} public function parse(Parser $parser): string @@ -33,7 +36,9 @@ public function parse(Parser $parser): string new TextRule(), ]); - $list = '
    '; + $list = $this->start === 1 + ? '
      ' + : '
        '; foreach ($this->items as $item) { $content = $parser->parse($item->content); diff --git a/tests/Rules/OrderedListRuleTest.php b/tests/Rules/OrderedListRuleTest.php index 68e872d..fd24d31 100644 --- a/tests/Rules/OrderedListRuleTest.php +++ b/tests/Rules/OrderedListRuleTest.php @@ -40,7 +40,10 @@ public function test_lex_multi_digit_numbers(): void "10. ten\n11. eleven\n", ); - $this->assertSame('
        1. ten
        2. eleven
        ', $html); + $this->assertSame( + '
        1. ten
        2. eleven
        ', + $html, + ); } #[Test] @@ -117,4 +120,29 @@ public function test_only_numbers_are_allowed(): void $this->assertSame('', $html); } + + #[Test] + public function lex_keeps_the_start_number(): void + { + $html = + (string) new Parser(highlighter: null, rules: [new OrderedListRule()])->parse( + "2. two\n3. three\n", + ); + + $this->assertSame( + '
        1. two
        2. three
        ', + $html, + ); + } + + #[Test] + public function lex_omits_the_start_attribute_when_the_list_starts_at_one(): void + { + $html = + (string) new Parser(highlighter: null, rules: [new OrderedListRule()])->parse( + "1. one\n5. five\n", + ); + + $this->assertSame('
        1. one
        2. five
        ', $html); + } }