npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

rehype-merge-cells

v1.0.2

Published

A rehype plugin to merge adjacent cells with same content.

Downloads

535

Readme

rehype-merge-cells

A rehype plugin that merges adjacent table cells with identical content.

It operates on HAST nodes in a unified / rehype pipeline. It works with standard GFM Markdown tables and needs no custom table syntax or markers. Vertically adjacent cells are merged using rowspan, horizontally adjacent cells using colspan.

This package implements the same merging algorithm as markdown-it-merge-cells.

Features

  • Supports standard GFM Markdown tables.
  • No custom table syntax or marker is required.
  • Merges vertically adjacent cells with the same content using rowspan.
  • Merges horizontally adjacent cells with the same content using colspan.
  • Runs vertical merging before horizontal merging.
  • Prevents invalid horizontal merges by requiring the matched cells to share the same rowspan height.
  • Never merges header cells with body cells.
  • Recognizes matching inline structures such as emphasis and links.

Install

npm install rehype-merge-cells
yarn add rehype-merge-cells
pnpm add rehype-merge-cells

Usage

import rehypeStringify from 'rehype-stringify';
import remarkGfm from 'remark-gfm';
import remarkParse from 'remark-parse';
import remarkRehype from 'remark-rehype';
import { unified } from 'unified';

import rehypeMergeCells from 'rehype-merge-cells';

const markdown = `
|1|1|3|4|5|
|-|-|-|-|-|
|1|1|2|2|6|
|1|1|2|2|7|
|1|4|3|5|5|
`;

const file = await unified()
  .use(remarkParse)
  .use(remarkGfm)
  .use(remarkRehype)
  .use(rehypeMergeCells)
  .use(rehypeStringify)
  .process(markdown);

console.log(String(file));

Output:

<table>
<thead>
<tr>
<th colspan="2">1</th>
<th>3</th>
<th>4</th>
<th>5</th>
</tr>
</thead>
<tbody>
<tr>
<td rowspan="3">1</td>
<td rowspan="2">1</td>
<td rowspan="2" colspan="2">2</td>
<td>6</td>
</tr>
<tr>
<td>7</td>
</tr>
<tr>
<td>4</td>
<td>3</td>
<td colspan="2">5</td>
</tr>
</tbody>
</table>

API

rehypeMergeCells()

Returns a rehype transformer that visits every table element and merges its cells in place.

The plugin is available as both a default and a named export:

import rehypeMergeCells from 'rehype-merge-cells';
// or
import { rehypeMergeCells } from 'rehype-merge-cells';

Merging rules

Given a table matrix, the plugin applies two passes, in order:

  1. Vertical pass — cells in the same column with identical content are merged upward and assigned rowspan.
  2. Horizontal pass — cells in the same row with identical content are merged leftward and assigned colspan.

The horizontal pass only proceeds when the candidate cells also share the same rowspan height, which keeps the resulting HTML table layout valid.

Header cells are never merged vertically with body cells, although cells within the same header row can still be merged horizontally.

Why vertical first? A column usually represents a field and a row a record. It is far more common for several records to repeat the same value in one field than for one record to repeat the same value across several fields — so vertical merging is allowed to run freely, while horizontal merging is constrained to cells that already line up in height.

Development

Install dependencies:

yarn install

Run tests:

yarn test

Update AVA snapshots:

yarn test:snapshot

AVA stores snapshots next to the tests in test/snapshots/, including the binary .snap file and the readable .md report.

Author

rehype-merge-cells © Baoshuo, Released under the MIT License.

Personal Website · Blog · GitHub @renbaoshuo