remark plugin to exclude one or more nodes from transformation in the manner of "prettier-ignore" or "instanbul ignore next"
[![Black Lives Matter!][x-badge-blm-image]][x-badge-blm-link]
[![Last commit timestamp][x-badge-lastcommit-image]][x-badge-repo-link]
[![Codecov][x-badge-codecov-image]][x-badge-codecov-link]
[![Source license][x-badge-license-image]][x-badge-license-link]
[![Uses Semantic Release!][x-badge-semanticrelease-image]][x-badge-semanticrelease-link]
[![NPM version][x-badge-npm-image]][x-badge-npm-link]
[![Monthly Downloads][x-badge-downloads-image]][x-badge-downloads-link]
# remark-ignore
This is a [unified][1] ([remark][2]) plugin that allows you to specify one or
more sections of a Markdown file that should not be transformed or linted by
remark.
This plugin is to remark what [``,
``, and `` are to
Prettier][3]. In effect, remark-ignore is a more generic version of
[remark-lint's ``][4].
This plugin is useful for preventing the transformation of auto-generated
content, e.g. [all-contributors][5], [doctoc][6], etc. You might also be
interested in [remark-tight-comments][7], which removes unnecessary newlines
that remark inserts between/around Markdown comments by default. For a live
example of these two plugins in action, check the source of [this very README.md
file][8]. ✨
---
- [Install](#install)
- [Usage](#usage)
- [Via API](#via-api)
- [Via remark-cli](#via-remark-cli)
- [Via unified configuration](#via-unified-configuration)
- [API](#api)
- [Examples](#examples)
- [Related](#related)
- [Appendix](#appendix)
- [Published Package Details](#published-package-details)
- [License](#license)
- [Contributing and Support](#contributing-and-support)
- [Contributors](#contributors)
## Install
> Due to the nature of the unified ecosystem, this package is ESM only and
> cannot be `require`'d.
To install:
```shell
npm install --save-dev remark-ignore
```
## Usage
For maximum flexibility, there are several ways this plugin can be invoked.
### Via API
```typescript
import { read } from 'to-vfile';
import { remark } from 'remark';
import remarkIgnore from 'remark-ignore';
import remarkReferenceLinks from 'remark-reference-links';
const file = await remark()
// remarkIgnore should always be among the first plugins used
.use(remarkIgnore)
.use(remarkReferenceLinks)
.process(await read('example.md'));
console.log(String(file));
```
There is an alternative syntax that allows you more fine-grain control over when
ignored nodes are hidden from transformers (i.e. `ignoreStart`) versus when they
are revealed (i.e. `ignoreEnd`):
```typescript
import { read } from 'to-vfile';
import { remark } from 'remark';
import { ignoreStart, ignoreEnd } from 'remark-ignore';
import remarkReferenceLinks from 'remark-reference-links';
const file = await remark()
.use(ignoreStart)
.use(remarkReferenceLinks)
.use(pluginThatCallsUseInternally)
.use(ignoreEnd)
.use(pluginThatWillSeeOtherwiseIgnoredNodes)
.process(await read('example.md'));
console.log(String(file));
```
This is useful when dealing with plugins that call [`use`][4] internally, which
might interfere with remark-ignore's default export (`remarkIgnore` in the above
examples) which itself calls `use(ignoreEnd)` internally, or if you want plugins
used before `ignoreStart` and/or after `ignoreEnd` to transform
otherwise-"ignored" nodes.
### Via [remark-cli](https://xunn.at/docs-remark-cli)
```shell
remark -o --use ignore README.md
```
Or, using the alternative syntax:
```shell
remark -o --use ignore/start --use … --use ignore/end README.md
```
### Via [unified configuration](https://xunn.at/docs-unified-configuration)
In `package.json`:
```javascript
/* … */
"remarkConfig": {
"plugins": [
"remark-ignore"
/* … */
]
},
/* … */
```
In `.remarkrc.js` (using the alternative syntax):
```javascript
module.exports = {
plugins: [
'remark-ignore/start',
// …
'remark-ignore/end'
]
};
```
In `.remarkrc.mjs` (using the alternative syntax):
```javascript
import { ignoreStart, ignoreEnd } from 'remark-ignore';
export default {
plugins: [
ignoreStart,
// …
ignoreEnd
]
};
```
## API
Detailed interface information can be found under [`docs/`][x-repo-docs].
## Examples
> Note that ``, ``, and
> `` must always be top-level nodes. If they are
> nested within other nodes, such as a list item, they will be ignored.
Suppose we have the following Markdown file `example.md`:
```markdown
# Some project
[](https://github.com/remarkjs/remark-defsplit/actions)
## Section
[A link](https://example.com)
[Another link](https://example.com)
```
Then running the following JavaScript:
```typescript
import { read } from 'to-vfile';
import { remark } from 'remark';
import remarkIgnore from 'remark-ignore';
import remarkReferenceLinks from 'remark-reference-links';
const file = await remark()
// remarkIgnore should always be among — if not THE — first plugins used
.use(remarkIgnore)
.use(remarkReferenceLinks)
.process(await read('example.md'));
console.log(String(file));
```
Would output the following:
```markdown
# Some project
[![Build][2]][1]
## Section
[A link][3]
[Another link][3]
[1]: https://github.com/remarkjs/remark-defsplit/actions
[2]: https://github.com/remarkjs/remark-defsplit/workflows/main/badge.svg
[3]: https://example.com
```
On the other hand, if `example.md` contained the following:
```markdown
# Some project
[](https://github.com/remarkjs/remark-defsplit/actions)
## Section
[A link](https://example.com)
[Another link](https://example.com)
```
Then running that same JavaScript would output:
```markdown
# Some project
[](https://github.com/remarkjs/remark-defsplit/actions)
## Section
[A link][1]
[Another link][1]
[1]: https://example.com
```
If instead `example.md` contained the following:
```markdown
# Some project
[](https://github.com/remarkjs/remark-defsplit/actions)
## Section
[A link](https://example.com)
[Another link](https://example.com)
```
Then running that same JavaScript would output:
```markdown
# Some project
[](https://github.com/remarkjs/remark-defsplit/actions)
## Section
[A link](https://example.com)
[Another link][1]
[1]: https://example.com
```
## Related
- [remark-tight-comments][7] — remove unnecessary newlines around comments.
- [remark-comments][9] — new syntax to ignore things.
- [remark-message-control][10] — enable, disable, and ignore messages using
comments.
- [mdast-util-hidden][11] — prevent nodes from being seen by [transformers][12].
- [mdast-comment-marker][13] — parse a comment marker in mdast.
- [mdast-zone][14] — treat HTML comments as ranges or markers in mdast.
## Appendix
Further documentation can be found under [`docs/`][x-repo-docs].
### Published Package Details
This is an [ESM-only package][x-pkg-esm-wine] built by Babel for use in Node.js
versions that are not end-of-life. For TypeScript users, this package supports
both `"Node10"` and `"Node16"` module resolution strategies.
Expand details
That means ESM source will load this package via `import { ... } from ...` or
`await import(...)` and CJS source will load this package via dynamic
`import()`. This has several benefits, the foremost being: less code
shipped/smaller package size, avoiding [dual package
hazard][x-pkg-dual-package-hazard] entirely, distributables are not
packed/bundled/uglified, and a drastically less complex build process.
The glaring downside, which may or may not be relevant, is that CJS consumers
cannot `require()` this package and can only use `import()` in an asynchronous
context. This means, in effect, CJS consumers may not be able to use this
package at all.
Each entry point (i.e. `ENTRY`) in [`package.json`'s
`exports[ENTRY]`][x-repo-package-json] object includes one or more [export
conditions][x-pkg-exports-conditions]. These entries may or may not include: an
[`exports[ENTRY].types`][x-pkg-exports-types-key] condition pointing to a type
declaration file for TypeScript and IDEs, a
[`exports[ENTRY].module`][x-pkg-exports-module-key] condition pointing to
(usually ESM) source for Webpack/Rollup, a `exports[ENTRY].node` and/or
`exports[ENTRY].default` condition pointing to (usually CJS2) source for Node.js
`require`/`import` and for browsers and other environments, and [other
conditions][x-pkg-exports-conditions] not enumerated here. Check the
[package.json][x-repo-package-json] file to see which export conditions are
supported.
Note that, regardless of the [`{ "type": "..." }`][x-pkg-type] specified in
[`package.json`][x-repo-package-json], any JavaScript files written in ESM
syntax (including distributables) will always have the `.mjs` extension. Note
also that [`package.json`][x-repo-package-json] may include the
[`sideEffects`][x-pkg-side-effects-key] key, which is almost always `false` for
optimal [tree shaking][x-pkg-tree-shaking] where appropriate.
### License
See [LICENSE][x-repo-license].
## Contributing and Support
**[New issues][x-repo-choose-new-issue] and [pull requests][x-repo-pr-compare]
are always welcome and greatly appreciated! 🤩** Just as well, you can [star 🌟
this project][x-badge-repo-link] to let me know you found it useful! ✊🏿 Or [buy
me a beer][x-repo-sponsor], I'd appreciate it. Thank you!
See [CONTRIBUTING.md][x-repo-contributing] and [SUPPORT.md][x-repo-support] for
more information.
### Contributors
See the [table of contributors][x-repo-contributors].
[x-badge-blm-image]: https://xunn.at/badge-blm 'Join the movement!'
[x-badge-blm-link]: https://xunn.at/donate-blm
[x-badge-codecov-image]:
https://img.shields.io/codecov/c/github/Xunnamius/unified-utils/main?style=flat-square&token=HWRIOBAAPW&flag=package.main_remark-ignore
'Is this package well-tested?'
[x-badge-codecov-link]: https://codecov.io/gh/Xunnamius/unified-utils
[x-badge-downloads-image]:
https://img.shields.io/npm/dm/remark-ignore?style=flat-square
'Number of times this package has been downloaded per month'
[x-badge-downloads-link]: https://npmtrends.com/remark-ignore
[x-badge-lastcommit-image]:
https://img.shields.io/github/last-commit/Xunnamius/unified-utils?style=flat-square
'Latest commit timestamp'
[x-badge-license-image]:
https://img.shields.io/npm/l/remark-ignore?style=flat-square
"This package's source license"
[x-badge-license-link]:
https://github.com/Xunnamius/unified-utils/blob/main/LICENSE
[x-badge-npm-image]:
https://xunn.at/npm-pkg-version/remark-ignore
'Install this package using npm or yarn!'
[x-badge-npm-link]: https://npm.im/remark-ignore
[x-badge-repo-link]: https://github.com/Xunnamius/unified-utils
[x-badge-semanticrelease-image]:
https://xunn.at/badge-semantic-release
'This repo practices continuous integration and deployment!'
[x-badge-semanticrelease-link]:
https://github.com/semantic-release/semantic-release
[x-pkg-dual-package-hazard]:
https://nodejs.org/api/packages.html#dual-package-hazard
[x-pkg-esm-wine]:
https://dev.to/jakobjingleheimer/configuring-commonjs-es-modules-for-nodejs-12ed#esm-source-and-distribution
[x-pkg-exports-conditions]:
https://webpack.js.org/guides/package-exports#reference-syntax
[x-pkg-exports-module-key]:
https://webpack.js.org/guides/package-exports#providing-commonjs-and-esm-version-stateless
[x-pkg-exports-types-key]:
https://devblogs.microsoft.com/typescript/announcing-typescript-4-5-beta#packagejson-exports-imports-and-self-referencing
[x-pkg-side-effects-key]:
https://webpack.js.org/guides/tree-shaking#mark-the-file-as-side-effect-free
[x-pkg-tree-shaking]: https://webpack.js.org/guides/tree-shaking
[x-pkg-type]:
https://github.com/nodejs/node/blob/8d8e06a345043bec787e904edc9a2f5c5e9c275f/doc/api/packages.md#type
[x-repo-choose-new-issue]:
https://github.com/Xunnamius/unified-utils/issues/new/choose
[x-repo-contributing]: /CONTRIBUTING.md
[x-repo-contributors]: /README.md#contributors
[x-repo-docs]: docs
[x-repo-license]: ./LICENSE
[x-repo-package-json]: package.json
[x-repo-pr-compare]: https://github.com/Xunnamius/unified-utils/compare
[x-repo-sponsor]: https://github.com/sponsors/Xunnamius
[x-repo-support]: /.github/SUPPORT.md
[1]: https://github.com/unifiedjs/unified
[2]: https://github.com/remarkjs/remark
[3]: https://prettier.io/docs/en/ignore.html#javascript
[4]: https://github.com/unifiedjs/unified#processoruseplugin-options
[5]: https://github.com/all-contributors/all-contributors
[6]: https://github.com/thlorenz/doctoc
[7]: /packages/remark-tight-comments
[8]:
https://raw.githubusercontent.com/Xunnamius/unified-utils/main/packages/remark-ignore/README.md
[9]:
https://github.com/zestedesavoir/zmarkdown/tree/HEAD/packages/remark-comments#readme
[10]: https://github.com/remarkjs/remark-message-control
[11]: /packages/mdast-util-hidden
[12]: https://github.com/unifiedjs/unified#overview
[13]: https://github.com/syntax-tree/mdast-comment-marker
[14]: https://github.com/syntax-tree/mdast-zone