Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

remark-containers

nevenall6.8kMIT1.2.0

Markdown parsing for custom containers

markdown, remark, unified

readme

remark-containers

This remark plugin provides parsing for containers in your markdown.

Default Syntax

Containers begin with ::: [noparse] {HTML Element Name} [optional list of classes] on a new line, and end with ::: on a new line. Container markers may be indented by up to 2 spaces.

For example:

::: aside class-one class-two
# Header One

With container contents. 
:::

renders as:

<aside class="class-one class-two">
  <h1>Header One</h1>
  <p>With container contents.</p>
</aside>

Containers may be nested

For example:

::: div outer
# Header One

Outer contents.

  ::: div inner
  Inner contents.
  :::

More outer contents.
::: 

renders as:

<div class="outer">           
  <h1>Header One</h1>         
  <p>Outer contents.</p>      
  <div class="inner">         
    <p>Inner contents.</p>    
  </div>                      
  <p>More outer contents.</p> 
</div>                        

noparse stops processing of the container contents and instead treats it as raw text.

For example:

::: noparse div outer
# Header One

Outer contents.

 ::: div inner
 Inner contents. 
 :::

More outer contents.
::: 

renders as:

<div class="outer">           
# Header One
Outer contents.
::: div inner
Inner contents. 
:::
More outer contents.
</div>                        

Installation

npm install remark-containers

Usage

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

unified()
  .use(parse)
  .use(containers)
  .use(remark2rehype)
  .use(stringify)

Options

Passing an options object allows full control over the resulting mdast.

.use(containers, {
  default: true, 
  custom: [{
    type: 'callout',
    element: 'article',
    transform: function(node, config, tokenize) {
      node.data.hProperties = {
          className: config || 'left'
      }
    }
    }, {
        type: 'quote',
        element: 'aside',
        transform: function(node, config, tokenize) {
          var words = tokenizeWords.parse(config)

          node.data.hProperties = {
              className: `quoted ${words.shift()}`
          }
          node.children.push({
              type: 'footer',
              data: {
                hName: 'footer'
              },
              children: tokenize(words.join(' '))
          })
        }
    }
  ]
})

default

When true the default syntax will also be enabled.

custom

An array of custom container configurations.

type

A single word string identifying the type of this container. Any markdown of the form ::: {type} will use this custom transform.

element

The html element name to use for the container. Default 'div'.

transform(node, config, tokenize)

A function to manipulate the mdast node.

node

The mdast node for this container.

config

The string after ::: type until the end of the line. Can be used to configure how the transform operates.

tokenize

A function(value): mdastNode you can use to tokenize an inline markdown string, if needed.

Feedback

Bugs & feedback.

License

MIT © Dan Behlings

changelog

Changelog

Since this package is starting to be used by the wider world, I'll start a changelog.

I try to keep to semantic versioning.

1.2.0

Minor Compatibility Warning This version reintroduces named regex captures. They were removed earlier because of lack of browser support, but the situation has improved.

Added

  • noparse keyword after ::: prevents treats the body of the container as raw text.

1.1.2

Added

  • more and better tests.

Changed

  • improved container recognition so ::: markers can be indented by 2 spaces and/or be followed by whitespace.

1.1.1

Added

  • Changelog file

Fixed

Info

  • Improved the README file.