Repository navigation
feat(csv): extract multiple tables from Markdown blocks with interactive table chooser - #234
Merged
obvious-autobuild-staging[bot] merged 3 commits intoOct 20, 2026
Conversation
…ive table chooser Co-authored-by: David Boskovic <david@obvious.ai>
Co-authored-by: David Boskovic <david@obvious.ai>
Co-authored-by: David Boskovic <david@obvious.ai>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
Pasting an entire ChatGPT response or Markdown document into
CSV → JSONpreviously worked only when the input consisted solely of a single isolated Markdown or CLI box table. Any surrounding prose,#headings, code fences, or multiple tables in the same pasted block caused the fast-path detector to bail out and fall back to raw CSV parsing over prose lines.What
app/src/lib/markdownTable.ts): AddedextractTablesFromMarkdownBlock(input: string): ExtractedTableCandidate[]and updateddetectMarkdownOrCliTable(input, tableIndex = 0):|---|---|) or CLI box rule (+---+---+/----+----) is present, keeping multi-megabyte regular CSV uploads untouched.```/~~~) while tracking the nearest preceding#heading, Setext heading, or**bold**title line for each table (resetting once consumed).psql/MySQL ASCII box table in document order with human-readable labels (titleorTable N (col1, col2, col3)).app/src/components/InputPane.tsx,app/src/App.tsx,app/src/lib/csvTable.ts,app/src/lib/convert.ts):selectedMarkdownTableIndex(automatically resetting to0wheneverinputchanges) and threadsmarkdownTableIndexintoCsvTableandconvertTextso the selected table is immediately previewed in the spreadsheet grid and converted across all output egress formats (JSON · JSONL · SQL · TS).data-testid="csv-markdown-table-select-{index}",aria-pressed) insidedata-testid="csv-markdown-table-bar"showing${index + 1}. ${title ?? headers} (${rows}×${cols}), alongsideUse only this table (${rows} rows)(data-testid="csv-clean-markdown-pill") which replaces rawinputwith the active table's normalized RFC 4180 CSV while preserving undo history.Clean Markdown table (N rows)/Clean CLI table (N rows)pill.#23inapp/src/changelog/entries.tsand rebuiltapp/dist.How to Review
app/src/lib/markdownTable.ts&app/src/lib/markdownTable.test.ts— multi-table/prose scanner, heading/title attribution, and O(1) 64 KB fast-reject guard.app/src/components/InputPane.tsx&app/src/App.tsx—csv-markdown-table-select-{index}pills, active table grid preview, conversion wiring, andApp.test.tsxcoverage.app/src/lib/convert.ts&app/src/lib/__tests__/convert.test.ts—markdownTableIndexoption forwarding incsvToJsonandconvertText.Test Evidence
AC-18: Multi-table Markdown extraction and interactive table chooser in CSV -> JSON


AC-18: Multi-table Markdown extraction and interactive table chooser in CSV -> JSON — recording
cd app && npm run lint && npx tsc -b --noEmit && npm test && npm run build(35 test suites, 609 tests passing)bash .github/scripts/verify-seo.sh(prerendered HTML check passing)agent-browserat1440×900pasting a multi-table Markdown report, switching between1. By Region (2×3)and2. Top Products (3×3), verifying live grid + JSON output updates, and normalizing viaUse only this table.Human author: David Boskovic (david@obvious.ai)
🔗 Obvious Project · 🧵 Obvious Thread · 🔀 Obvious PR Artifact