diff --git a/QuickMD/QuickMD/MarkdownBlockParser.swift b/QuickMD/QuickMD/MarkdownBlockParser.swift index 2226306..063b490 100644 --- a/QuickMD/QuickMD/MarkdownBlockParser.swift +++ b/QuickMD/QuickMD/MarkdownBlockParser.swift @@ -239,9 +239,12 @@ struct MarkdownBlockParser: Sendable { if !isTableSeparator(trimmed) && i + 1 < lines.count && isTableSeparator(lines[i + 1]) { flushTextBuffer(&textBuffer, to: &blocks, index: &blockIndex, using: activeRenderer) - let headers = parseTableRow(line) - let columnCount = headers.count var alignments = parseTableAlignments(lines[i + 1]) + // The separator row is authoritative for column count: a header row + // of entirely empty cells (`| | |`, a headerless table) parses to zero + // cells, which would otherwise collapse the whole table to nothing. + var headers = parseTableRow(line) + let columnCount = max(headers.count, alignments.count) var rows: [[String]] = [] i += 2 // Skip header and separator @@ -250,7 +253,8 @@ struct MarkdownBlockParser: Sendable { i += 1 } - // Normalize: ensure all rows and alignments match column count + // Normalize: ensure headers, rows, and alignments match column count + headers = normalizeArray(headers, to: columnCount, default: "") alignments = normalizeArray(alignments, to: columnCount, default: .leading) rows = rows.map { normalizeArray($0, to: columnCount, default: "") } diff --git a/QuickMD/QuickMD/MarkdownExport.swift b/QuickMD/QuickMD/MarkdownExport.swift index 52fccf2..e891528 100644 --- a/QuickMD/QuickMD/MarkdownExport.swift +++ b/QuickMD/QuickMD/MarkdownExport.swift @@ -147,36 +147,42 @@ struct PrintableTableView: View, TableAlignmentProvider { /// Stored column count - computed once on init for efficiency private let columnCount: Int + /// Headerless tables (`| | |`) skip the header band entirely + private let showsHeader: Bool + init(headers: [String], rows: [[String]], alignments: [TextAlignment]) { self.headers = headers self.rows = rows self.alignments = alignments self.renderer = MarkdownRenderer(colorScheme: .light) - self.columnCount = headers.count + self.columnCount = max(headers.count, alignments.count, rows.map(\.count).max() ?? 0) + self.showsHeader = headers.contains { !$0.trimmingCharacters(in: .whitespaces).isEmpty } } var body: some View { VStack(spacing: 0) { - // Header row - HStack(spacing: 0) { - ForEach(0.. String { + index < headers.count ? headers[index] : "" + } + // MARK: - Per-Cell Occurrence Tracking private struct CellOffsets { @@ -146,7 +158,7 @@ struct TableBlockView: View, TableAlignmentProvider { var headerOffsets: [Int] = [] for i in 0..