diff --git a/app/lib/shared/changelog.dart b/app/lib/shared/changelog.dart index db602ed7f3..c23ff11fe7 100644 --- a/app/lib/shared/changelog.dart +++ b/app/lib/shared/changelog.dart @@ -382,11 +382,12 @@ class ChangelogParser { /// - `unreleased` /// - `next release (...)` _ParsedHeader? _tryParseAsHeader(html.Element elem, String input) { + assert(input == input.trim()); final level = _acceptedHeaderTags.indexOf(elem.localName!); final anchor = elem.attributes['id']; // special case: unreleased - final inputLowerCase = input.toLowerCase().trim(); + final inputLowerCase = input.toLowerCase(); final unreleasedTexts = ['unreleased', 'next release']; for (final unreleasedText in unreleasedTexts) { if (inputLowerCase == unreleasedText) { @@ -401,6 +402,12 @@ class ChangelogParser { } } + // remove leading 'Version' label + const versionLabelPrefix = 'version '; + if (inputLowerCase.startsWith(versionLabelPrefix)) { + input = input.substring(versionLabelPrefix.length).trim(); + } + // extract version final versionPart = input.split(' ').firstWhereOrNull((e) => e.isNotEmpty); if (versionPart == null) { diff --git a/app/test/shared/changelog_test.dart b/app/test/shared/changelog_test.dart index f9703758fd..a9dbc7f3d5 100644 --- a/app/test/shared/changelog_test.dart +++ b/app/test/shared/changelog_test.dart @@ -118,11 +118,16 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Added - Pre-release version + +## Version 0.9.0 (Bugfix release) + +- Fixing a bug. + '''; final changelog = _parse(markdown); - expect(changelog.releases, hasLength(3)); + expect(changelog.releases, hasLength(4)); expect(changelog.releases[0].version, equals('2.0.0')); expect(changelog.releases[0].date, equals(DateTime(2025, 8, 1))); @@ -132,6 +137,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). expect(changelog.releases[2].version, equals('1.0.0-beta.1')); expect(changelog.releases[2].date, equals(DateTime(2025, 1, 15))); + + expect(changelog.releases[3].version, equals('0.9.0')); + expect(changelog.releases[3].note, '(Bugfix release)'); }); test('handles different date formats', () { @@ -234,6 +242,21 @@ void main() { expect(changelog.releases[1].version, equals('1.0.0')); }); + test('handles mixed header levels #2', () { + const markdown = '''## Changelog + +#### v2.0.0 + +#### v1.0.0 + +'''; + final changelog = _parse(markdown); + expect( + changelog.releases.map((e) => e.version).toList(), + ['2.0.0', '1.0.0'], + ); + }); + test('handles embedded header levels', () { const markdown = ''' # Changelog