diff --git a/doc/changes/changes_4.10.0.md b/doc/changes/changes_4.10.0.md index 5124479f..374c5d78 100644 --- a/doc/changes/changes_4.10.0.md +++ b/doc/changes/changes_4.10.0.md @@ -12,6 +12,10 @@ Each release now includes an SPDX 3 SBOM for the product JAR and a SHA-256 check * #542: CI and releases now provide an SPDX 3 SBOM. +## Bugfixes + +* #582: Fixed the Markdown importer silently dropping all specification items after a fenced code block that directly follows a section title. + ## Documentation * #579: Documented planned deprecations and removals. diff --git a/importer/markdown/src/main/java/org/itsallcode/openfasttrace/importer/markdown/MarkdownImporter.java b/importer/markdown/src/main/java/org/itsallcode/openfasttrace/importer/markdown/MarkdownImporter.java index 2a4a6c8e..a75e7aac 100644 --- a/importer/markdown/src/main/java/org/itsallcode/openfasttrace/importer/markdown/MarkdownImporter.java +++ b/importer/markdown/src/main/java/org/itsallcode/openfasttrace/importer/markdown/MarkdownImporter.java @@ -63,6 +63,7 @@ protected Transition[] configureTransitions() transition(TITLE , TITLE , MdPattern.UNDERLINE , () -> {} ), transition(TITLE , TITLE , MdPattern.EMPTY , () -> {} ), transition(TITLE , START , MdPattern.FORWARD , () -> {forward(); resetTitle();} ), + transition(TITLE , CODE_BLOCK , MdPattern.CODE_BEGIN , this::resetTitle ), transition(TITLE , START , MdPattern.EVERYTHING , this::resetTitle ), transition(SPEC_ITEM , SPEC_ITEM , MdPattern.ID , this::beginItem ), diff --git a/importer/markdown/src/test/java/org/itsallcode/openfasttrace/importer/markdown/TestMarkdownMarkupImporter.java b/importer/markdown/src/test/java/org/itsallcode/openfasttrace/importer/markdown/TestMarkdownMarkupImporter.java index b28c4ece..86a621e3 100644 --- a/importer/markdown/src/test/java/org/itsallcode/openfasttrace/importer/markdown/TestMarkdownMarkupImporter.java +++ b/importer/markdown/src/test/java/org/itsallcode/openfasttrace/importer/markdown/TestMarkdownMarkupImporter.java @@ -242,6 +242,25 @@ void testWhenInsideMarkdownCodeBlockThenNoSpecificationItemMustBeDetected(final emptyIterable()); } + @Test + void testWhenCodeBlockDirectlyFollowsTitleThenFollowingSpecificationItemMustBeDetected() + { + assertImport("code_block_after_title.md", """ + ## A diagram before any requirement + + ```mermaid + graph TD + A --> B + ``` + + `req~example~1` + """, + contains(item() + .id(SpecificationItemId.parseId("req~example~1")) + .location("code_block_after_title.md", 8) + .build())); + } + @ParameterizedTest @CsvSource( {