From 255de797f80f2fbb73c432ca3f7a106719ac2169 Mon Sep 17 00:00:00 2001 From: superdooper86 Date: Thu, 7 May 2026 17:43:45 +0200 Subject: [PATCH] =?UTF-8?q?Release=20v1.0.7=20=E2=80=94=20fix=20markdown?= =?UTF-8?q?=20rendering=20in=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add ReleaseNotesText view that pre-processes headers (##, ###) to bold and converts - bullets to • before passing to AttributedString, which only supports inline markdown. Replaces both Text(.init()) call sites. --- ClaudeChecker/ContentView.swift | 39 +++++++++++++++++++++++++++------ ClaudeChecker/Info.plist | 4 ++-- RELEASE_NOTES.md | 6 ++--- 3 files changed, 37 insertions(+), 12 deletions(-) diff --git a/ClaudeChecker/ContentView.swift b/ClaudeChecker/ContentView.swift index 4c8cc00..b9b1cb0 100644 --- a/ClaudeChecker/ContentView.swift +++ b/ClaudeChecker/ContentView.swift @@ -977,6 +977,36 @@ struct UpdateSuccessBanner: View { } } +// MARK: - Markdown notes renderer + +struct ReleaseNotesText: View { + let text: String + var font: Font = .system(size: 12) + + var body: some View { + let processed = text + .split(separator: "\n", omittingEmptySubsequences: false) + .map { line -> String in + let s = String(line) + if s.hasPrefix("### ") { return "**\(s.dropFirst(4))**" } + if s.hasPrefix("## ") { return "**\(s.dropFirst(3))**" } + if s.hasPrefix("# ") { return "**\(s.dropFirst(2))**" } + if s.hasPrefix("- ") { return "• \(s.dropFirst(2))" } + return s + } + .joined(separator: "\n") + + if let attr = try? AttributedString(markdown: processed, + options: .init(interpretedSyntax: .inlineOnlyPreservingWhitespace)) { + Text(attr).font(font).foregroundColor(.secondary) + .fixedSize(horizontal: false, vertical: true) + } else { + Text(text).font(font).foregroundColor(.secondary) + .fixedSize(horizontal: false, vertical: true) + } + } +} + // MARK: - Update Banner struct UpdateBanner: View { @@ -992,10 +1022,7 @@ struct UpdateBanner: View { Text("Update available — v\(updater.latestVersion)") .font(.system(size: 12, weight: .semibold)) if !updater.releaseNotes.isEmpty { - Text(updater.releaseNotes) - .font(.system(size: 11)) - .foregroundColor(.secondary) - .fixedSize(horizontal: false, vertical: true) + ReleaseNotesText(text: updater.releaseNotes, font: .system(size: 11)) } } Spacer() @@ -1061,9 +1088,7 @@ struct UpdateSheet: View { .foregroundColor(.blue) } if !updater.releaseNotes.isEmpty { - Text(updater.releaseNotes) - .font(.system(size: 12)) - .foregroundColor(.secondary) + ReleaseNotesText(text: updater.releaseNotes) } } Spacer() diff --git a/ClaudeChecker/Info.plist b/ClaudeChecker/Info.plist index 8ee6b4e..95170f8 100644 --- a/ClaudeChecker/Info.plist +++ b/ClaudeChecker/Info.plist @@ -15,9 +15,9 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.0.6 + 1.0.7 CFBundleVersion - 25 + 26 LSMinimumSystemVersion 13.0 LSUIElement diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index d049848..179ed9f 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,4 +1,4 @@ -## What's new in v1.0.6 +## What's new in v1.0.7 -### Improved update notification -The update notification now reads **"Tap to view release notes & update now!"** — making it clear you can read what's changed before installing. +### Release notes now render correctly +Fixed markdown rendering in the update banner and update sheet — headers, **bold text**, and bullet points now display properly instead of showing raw `##` and `**` characters.