Arkounay102 downloadsTurns box-drawing and ASCII art tables from terminal output into real Markdown tables when you paste them, rejoining cells the terminal wrapped over several lines.
Obsidian plugin that turns box-drawing / ASCII art tables into real Markdown tables the moment you paste them.
Paste this (terminal output, Claude Code, mysql, psql, rich, comfy-table, tabulate, ...):
┌──────────────────────────────┬───────────────────────────────────────────────┐
│ Route │ Notes │
├──────────────────────────────┼───────────────────────────────────────────────┤
│ GET /email-deliveries │ paginated list; search + search_scope, types, │
│ │ statuses, engagement, export file name │
├──────────────────────────────┼───────────────────────────────────────────────┤
│ GET /email-deliveries/types │ types present in the caller's scope │
└──────────────────────────────┴───────────────────────────────────────────────┘
and get this in the note:
| Route | Notes |
| --- | --- |
| GET /email-deliveries | paginated list; search + search_scope, types, statuses, engagement, export file name |
| GET /email-deliveries/types | types present in the caller's scope |
Space-aligned tables, the ones pandoc and document converters write, work the same way:
-------------------------------- -------------------- ---------
Group Subgroup Members
-------------------------------- -------------------- ---------
Alpha (#101) Team one (#9001) 250
The longest placeholder (#102) Team two (#9002) 169
-------------------------------- -------------------- ---------
| Group | Subgroup | Members |
| --- | --- | --- |
| Alpha (#101) | Team one (#9001) | 250 |
| The longest placeholder (#102) | Team two (#9002) | 169 |
No build step, the plugin is plain JavaScript.
./install.sh ~/path/to/vault
Then in Obsidian: Settings, Community plugins, Installed plugins, enable Paste ASCII Table. If it does not show up, use the reload icon next to Installed plugins, Obsidian only scans the plugins folder at startup.
+---+ ASCII borders and border-less psql output.---- ------- ---) is the only structure. Columns are cut at the offsets the ruler declares. The header may sit between two rulers or above the only one, and rows may be single lines or several lines separated by a blank line, which covers pandoc's simple and multiline tables.| inside a cell is escaped so it cannot break the table.Both work on text already in a note:
| Setting | Default | What it does |
|---|---|---|
| Convert on paste | on | Turn off to use only the commands. |
| Wrapped cell handling | Smart | Smart rebuilds the original sentence, Always join with a space never glues words together, Keep the line break as <br> preserves genuinely multi-line cells. |
| Escape pipes | on | Escapes | characters found inside cells. |
| Detect column alignment | on | Writes ---: / :---: when the padding shows the column was right aligned or centred. |
| Pad columns | off | Aligns the pipes in the produced Markdown. Off keeps wide tables readable. |
The first three belong to delimited tables and come from one design choice: their columns are found by counting delimiters per line rather than by taking the delimiter offsets from the border, the way a space-aligned table takes its columns from the ruler. Reading the geometry off the border would lift all three.
A two column border-less table (a | b under a ---+--- rule) is not detected, because one | per line is counted the same as prose. Three or more columns work, as does any table with outer borders.
A cell containing | in a +---+ style table is mangled: | is both delimiter and content there, so the row is read as having extra columns and the table is split in two. Box-drawing tables are unaffected, a | in their cells stays content.
When a table has no row separators, a wrapped row is recognised by the cells that fall blank on the continuation line. A wrap where every column continues at once is read as a new row.
Output aligned by spaces alone, with no ruler (kubectl get pods, ls -l, df -h), is left as it is. The ruler is the only thing that separates a table from a paragraph that happens to line up, and guessing the columns from the runs of spaces would convert prose by accident.
The converter is pure JavaScript with no Obsidian dependency, so it runs under plain node:
npm test