Documentation

Commentary

Rewrite GFM (GitHub Flavored Markdown) pipe tables so they fit a
given character width.  Cells that exceed their allocated column
width are word-wrapped by emitting additional pipe-table lines.
The wrapped text is meant for readable source editing and
round-tripping with `markdown-table-wrap-unwrap': wrapped header
lines no longer form valid GFM tables, and wrapped body
continuation lines and spacer lines are parsed as additional
rows by Markdown renderers.

The main entry point is `markdown-table-wrap':

  (markdown-table-wrap TABLE-TEXT WIDTH)
  (markdown-table-wrap TABLE-TEXT WIDTH MAX-CELL-HEIGHT)
  (markdown-table-wrap TABLE-TEXT WIDTH MAX-CELL-HEIGHT STRIP-MARKUP)
  (markdown-table-wrap TABLE-TEXT WIDTH MAX-CELL-HEIGHT STRIP-MARKUP COMPACT)

For rendering the same table at multiple widths (e.g., during
window resize), `markdown-table-wrap-batch' parses and measures
once, then renders at each width:

  (markdown-table-wrap-batch TABLE-TEXT WIDTHS)

To merge continuation rows back into logical rows (e.g., before
re-wrapping at a new width), use `markdown-table-wrap-unwrap':

  (markdown-table-wrap
    (markdown-table-wrap-unwrap WRAPPED-TEXT) NEW-WIDTH)

Features:
- Markup-aware wrapping: bold, italic, links, images, code
  (single and double backtick), and strikethrough spans are
  kept intact across line breaks.
- Graceful degradation: when a column is too narrow for markup
  overhead, markers are dropped and inner text is wrapped as
  plain text, preserving legibility over formatting.
- Waterfill column-width allocation: wider columns get more space
  (proportional to sqrt of content width) but the effect is
  dampened so narrow columns aren't starved.  Monotonic — widening
  the terminal never shrinks any column.
- Alignment preservation (left, right, center).
- Optional cell-height cap with ellipsis truncation.
- Automatic row separators for visual breathing room when wrapping
  occurs (opt out with COMPACT).
- Code-fence awareness: tables inside ``` or ~~~ blocks are
  left untouched.
- Unicode-aware width: CJK, combining characters, and VS16
  emoji measured correctly for terminal alignment.
- Backtick parity guard: cells whose wrapping would produce
  odd backtick counts fall back to single-line, preventing
  font-lock leaking across rows.
- Zero dependencies -- pure Elisp, no `markdown-mode' required.

STRIP-MARKUP controls width measurement: nil (default) measures
raw string width; non-nil strips inline markup first (for use
when `markdown-hide-markup' is enabled).

All public functions use the `markdown-table-wrap-' prefix.
Internal helpers use `markdown-table-wrap--' (double dash).
No `defcustom' is defined -- configuration is passed as
parameters.  The consuming package owns its own customization
variables and passes values through.

Requires

Dependencies

Consumers

Reverse Dependencies