# Table Master for Obsidian
**English** | [简体中文](./README.zh.md)
All-in-one Markdown table workflow for Obsidian. Combines the most useful pieces of three popular table plugins into a single, modern UI:
- **GUI shortcuts** (insert / delete / move row & column, alignment) — replaces *Advanced Tables*
- **Visual grid editor** with drag-to-select and merged-cell support — replaces *Markdown Table Editor*
- **Merged cells** rendered in both Reading view and Live Preview, fully compatible with Table Extended / MultiMarkdown syntax — replaces *Table Extended*
> Table Extended uses the same parser hook for source rendering. Running both plugins together is **not supported**: Table Master will warn you on load and you should disable the others.
## Features
### 1. Floating toolbar
When the cursor enters a GFM table the floating toolbar appears above the first row:
- Insert / delete row & column
- Move row up / down, column left / right
- Align column left / center / right
- **Merge ↑** / **Merge ↓** / **Merge ←** / **Split cell**
- Open the grid editor
- Format / re-pad table
- Paste a table copied from Excel / a web page (HTML or TSV is detected automatically)
### 2. Right-click menu
All table operations are also available from the editor's right-click menu when the cursor is inside a table.
### 3. Visual grid editor
Run the command **Open grid editor** (or click the grid button on the toolbar) to launch a Modal that displays the table as an Excel-like grid.
- Click a cell to edit it inline
- Click and drag, or `Shift`-click, to select a rectangular range
- Use the **Merge** button to merge the selected range
- Use the **Split** button to split the cell at the active selection
- Add / delete rows and columns
- Click **Apply** to write the changes back to the markdown source
### 4. Merged cells (MultiMarkdown / Table Extended syntax)
```markdown
| Stage | Direct Products | ATP Yields |
| ------------------ | --------------- | ---------- |
| Glycolysis | 2 ATP ||
| ^^ | 2 NADH | 3-5 ATP |
| Pyruvate oxidation | 2 NADH | 5 ATP |
| **30-32** ATP |||
```
- `^^` — the cell merges with the row directly above (`rowspan`)
- A trailing `||` extends the previous cell by one column; `|||` by two, and so on (`colspan`)
The parser also accepts every other Table Extended construct:
- **Headerless tables** (block starts with the separator row)
- **Table caption** — `[Caption text]` or `[Caption text][label]` immediately above or below
- **Multiple header rows** (any rows above the separator row)
- **Multiple `
` sections** by inserting a single blank line inside the body
- **Multi-line cells** continued from the next row with a trailing `\`
- Inline Markdown (lists, code, links, embeds) is rendered inside cells in Reading view; Live Preview keeps Obsidian's native widget rendering and only applies merges.
If you prefer maximum portability, set **Merged-cell output format** to `HTML` and Table Master will write a regular `` with `colspan` / `rowspan` attributes instead.
Live Preview applies merges by toggling `rowspan` / `colspan` attributes and hiding placeholder cells in Obsidian's existing table widget — cell text is left untouched, so the widget remains compatible with normal Obsidian editing. Multi-line cells, captions, and inline markdown re-rendering remain Reading View only.
### 5. Cell navigation
`Tab` / `Shift-Tab` move between cells and `Enter` jumps to the next row (creating one if needed). Disable in settings if it interferes with your workflow.
### 6. Design-from-scratch flow
Run **Design new table in grid editor…** to be asked for rows / columns / header presence first, then drop straight into the grid editor. Hit *Apply* to insert the finished table at the cursor — no need to be inside an existing table beforehand.
### 7. Paste tables from Excel / web
Copy a range from Excel, Google Sheets, Numbers, or any web page that contains an HTML ``, then run **Paste table from clipboard** (also available as a button on the floating toolbar when the cursor is in a table):
- Excel / web pages: the rich `text/html` clipboard payload is parsed; `colspan` / `rowspan` are preserved and translated to MultiMarkdown placeholders.
- Plain TSV: tab-separated text is parsed as a fallback (Excel always provides this).
- If the cursor is currently inside a table, the import **replaces** that table; otherwise the new table is inserted at the cursor.
- Pipes inside imported cells are escaped automatically so the markdown round-trips cleanly.
- Multi-line cells (Excel `Alt+Enter`, `
` in HTML, ``/`
`/`
` blocks) are emitted as a single GFM row with `
` between segments. Reading view + Live Preview both upgrade those `
` tokens to real line breaks, so a multi-line cell still wraps visually while merge structure (`rowspan`/`colspan`) stays intact.
## Installation
### From source
```bash
git clone obsidian-table-master
cd obsidian-table-master
npm install
npm run build
```
Copy `main.js`, `manifest.json`, and `styles.css` into `/.obsidian/plugins/table-master/`, then enable the plugin in Obsidian.
### Hot-reload during development
```bash
npm run dev
```
esbuild watches `src/` and rebuilds `main.js` on change. Combine with the [hot-reload](https://github.com/pjeby/hot-reload) plugin for an instant feedback loop.
## Commands
Every action is exposed as a command and can be bound to a hotkey from **Settings → Hotkeys**.
| ID | Description |
| ------------------------ | --------------------------------- |
| `insert-row-above` | Insert row above |
| `insert-row-below` | Insert row below |
| `insert-col-left` | Insert column to the left |
| `insert-col-right` | Insert column to the right |
| `delete-row` | Delete row |
| `delete-col` | Delete column |
| `move-row-up` | Move row up |
| `move-row-down` | Move row down |
| `move-col-left` | Move column left |
| `move-col-right` | Move column right |
| `align-left/center/right/none` | Align column |
| `merge-up` | Merge with cell above |
| `merge-down` | Merge with cell below |
| `merge-left` | Merge with cell to the left |
| `split-cell` | Split merged cell |
| `format-table` | Re-pad table cells |
| `sort-asc` / `sort-desc` | Sort by column |
| `open-grid-editor` | Open the visual grid editor on the table at the cursor |
| `design-new-table` | Open the grid editor with a fresh empty table and insert on apply |
| `toggle-floating-toolbar`| Show/hide the floating toolbar |
| `new-table` | Insert a new empty table |
| `import-table-from-clipboard` | Paste an Excel / web table from the clipboard |
## Settings
- **Merged-cell output format** — Extended (`^^` for rowspan, trailing `||` for colspan; same as Table Extended) or raw HTML (`colspan` / `rowspan` attributes on a ``)
- **Show floating toolbar**
- **Floating toolbar position** — three modes (all use `position: fixed` so a custom theme can't hide them; non-focused tabs auto-hide their own toolbar):
- `Pop up at click position when clicking a table` (default): the toolbar stays hidden until you click inside a table, then springs up at the click point and stays there until you click outside any table.
- `Follow mouse inside table; top-left otherwise`: always visible while the editor is focused. Trails the mouse pointer whenever it's hovering a table; falls back to the top-left of the editor when not.
- `Always at the editor's top-left`: pinned at the top-left of the editor pane regardless of where you click.
- **Enable Tab navigation**
- **Default column alignment**
- **Interface language** — Auto / English / 中文
## Development
```bash
npm test # run unit tests for parser / serializer / ops
npm run build # type-check and bundle for production
```
Architecture is layered so logic is decoupled from Obsidian:
```
src/
table/ pure model + parser + serializer + ops (no Obsidian deps)
editor/ editor mutations driven from the cursor
ui/ floating toolbar, context menu, modal grid editor
render/ reading-view post-processor + live-preview view plugin
i18n/ en / zh dictionaries
settings.ts settings tab
main.ts plugin entry
```
## Credits
Inspired by:
- [Advanced Tables](https://github.com/tgrosinger/advanced-tables-obsidian) by Tony Grosinger
- [Markdown Table Editor](https://github.com/vanadium23/obsidian-markdown-table-editor) by Ivan Tikhonov
- [Table Extended](https://github.com/zhouhua/obsidian-table-extended) by Zhou Hua
All three are MIT-licensed; this plugin is also MIT.