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 🙏

© 2025 – Pkg Stats / Ryan Hefner

remark-custom-blocks

v2.6.1

Published

This plugin parses custom Markdown syntax to create new custom blocks. It adds new nodes types to the [mdast][mdast] produced by [remark][remark]:

Readme

remark-custom-blocks Build Status Coverage Status

This plugin parses custom Markdown syntax to create new custom blocks. It adds new nodes types to the mdast produced by remark:

  • {yourType}CustomBlock

If you are using rehype, the stringified HTML result will be divs with configurable CSS classes.

It is up to you to have CSS rules producing the desired result for these classes.

The goal is to let you create blocks or panels somewhat similar to these.

Each custom block can specify CSS classes and whether users are allowed or required to add a custom title to the block.

Only inline Markdown will be parsed in titles.

AST nodes (see mdast specification)

By default, the plugin will produce the following two nodes, where whatnot is the name of you block:

interface whatnotCustomBlock <: Parent {
  type: "whatnotCustomBlock";
  data: {
    hName: "div" or "details";
    hProperties: {
      className: [string];
    }
  }
}
interface whatnotCustomBlockBody <: Parent {
  type: "whatnotCustomBlockBody";
  data: {
    hName: "div";
    hProperties: {
      className: [string];
    }
  }
}

If your block has a heading, the following node will also be produced:

interface whatnotCustomBlockHeading <: Parent {
  type: "whatnotCustomBlockHeading";
  data: {
    hName: "div" or "summary";
    hProperties: {
      className: [string];
    }
  }
}

Installation

npm:

npm install remark-custom-blocks

Usage, Configuration, Syntax

Configuration:

The configuration object follows this pattern:

trigger: {
  classes: String, space-separated classes, optional, default: ''
  title: String, 'optional' | 'required', optional, default: custom titles not allowed
  containerElement: String, optional, default: 'div'
  titleElement: String, optional, default: 'div'
  contentsElement: String, optional, default: 'div'
  details: Boolean, optional, default: false
}

containerElement, titleElement, contentsElement allow you to customize the html elements that will be generated by remark-rehype stringifier. The generated HTML structure will be

<containerElement>
    <titleElement>
        block title
    </titleElement>
    <contentsElement>
        block content
    </contentsElement>
</containerElement>

you can see details: true as a shortcut to

{
    containerElement: 'details',
    titleElement: 'summary',
    contentsElement: 'div',
}

Those specific parameters are here to help you build semantic HTML structure.

Dependencies:

const unified = require('unified')
const remarkParse = require('remark-parse')
const stringify = require('rehype-stringify')
const remark2rehype = require('remark-rehype')

const remarkCustomBlocks = require('remark-custom-blocks')

Usage:

unified()
  .use(remarkParse)
  .use(remarkCustomBlocks, {
    foo: {
      classes: 'a-class another-class'
    },
    bar: {
      classes: 'something',
      title: 'optional'
    },
    qux: {
      classes: 'qux-block',
      title: 'required'
    },
    spoiler: {
      classes: 'spoiler-block',
      title: 'optional',
      details: true
    },
  })
  .use(remark2rehype)
  .use(stringify)

The sample configuration provided above would have the following effect:

  1. Allows you to use the following Markdown syntax to create blocks:

    [[foo]]
    | content
    
    [[bar]]
    | content
    
    [[bar | my **title**]]
    | content
    
    [[qux | my title]]
    | content
    
    [[spoiler | my title]]
    | content
    • Block foo cannot have a title, [[foo | title]] will not result in a block.
    • Block bar can have a title but does not need to.
    • Block qux requires a title, [[qux]] will not result in a block.
  2. This Remark plugin would create mdast nodes for these two blocks, these nodes would be of type:

    • fooCustomBlock, content will be in fooCustomBlockBody
    • barCustomBlock, content in barCustomBlockBody, optional title in barCustomBlockHeading
    • quxCustomBlock, content in quxCustomBlockBody, required title in quxCustomBlockHeading
  3. If you're using rehype, you will end up with these 4 divs and 1 details:

    <div class="custom-block a-class another-class">
      <div class="custom-block-body"><p>content</p></div>
    </div>
    
    <div class="custom-block something">
      <div class="custom-block-body"><p>content</p></div>
    </div>
    
    <div class="custom-block something">
      <div class="custom-block-heading">my <strong>title</strong></div>
      <div class="custom-block-body"><p>content</p></div>
    </div>
    
    <div class="custom-block qux-block">
      <div class="custom-block-heading">my title</div>
      <div class="custom-block-body"><p>content</p></div>
    </div>
    
     <details class="custom-block spoiler-block">
      <summary class="custom-block-heading">my title</summary>
      <div class="custom-block-body"><p>content</p></div>
    </details>

License

MIT © Zeste de Savoir