mdast utility to find two comments and replace the content in them.
- What is this?
- When should I use this?
- Install
- Use
- API
- Types
- Compatibility
- Security
- Related
- Contribute
- License
This package is a utility that lets you find certain comments, then takes the content between them, and calls a given handler with the result, so that you can change or replace things.
This utility is typically useful when you have certain sections that can be generated. Comments are a hidden part of markdown, so they can be used as processing instructions. You can use those comments to define what content to change or replace.
A similar package, mdast-util-heading-range
, does
the same but uses a heading to mark the start and end of sections.
This package is ESM only. In Node.js (version 12.20+, 14.14+, or 16.0+), install with npm:
npm install mdast-zone
In Deno with esm.sh
:
import {zone} from 'https://esm.sh/mdast-zone@5'
In browsers with esm.sh
:
<script type="module">
import {zone} from 'https://esm.sh/mdast-zone@5?bundle'
</script>
Say we have the following file, example.md
:
<!--foo start-->
Foo
<!--foo end-->
…and a module example.js
:
import {read} from 'to-vfile'
import {remark} from 'remark'
import {zone} from 'mdast-zone'
const file = await remark()
.use(myPluginThatReplacesFoo)
.process(await read('example.md'))
console.log(String(file))
/** @type {import('unified').Plugin<[], import('mdast').Root>} */
function myPluginThatReplacesFoo() {
return (tree) => {
zone(tree, 'foo', (start, nodes, end) => [
start,
{type: 'paragraph', children: [{type: 'text', value: 'Bar.'}]},
end
])
}
}
…now running node example.js
yields:
<!--foo start-->
Bar.
<!--foo end-->
This package exports the identifier zone
.
There is no default export.
Search tree
(Node
) for comments marked name
(string
) and
transform a section with handler
(Function
).
Callback called when a range is found.
Arguments.
Start of range (Node
), an HTML (or MDX) comment node.
Nodes between start
and end
(Array<Node>
).
End of range (Node
), an HTML (or MDX) comment node.
Extra info (Object
):
parent
(Node
) — parent of the rangestart
(number
) — index ofstart
inparent
end
(number
) — index ofend
inparent
Optional list of nodes to replace start
, nodes
, and end
with
(Array<Node>?
).
This package is fully typed with TypeScript.
This package exports the types Handler
and ZoneInfo
.
Projects maintained by the unified collective are compatible with all maintained versions of Node.js. As of now, that is Node.js 12.20+, 14.14+, and 16.0+. Our projects sometimes work with older versions, but this is not guaranteed.
Improper use of handler
can open you up to a cross-site scripting (XSS)
attack as the value it returns is injected into the syntax tree.
This can become a problem if the tree is later transformed to hast.
The following example shows how a script is injected that could run when loaded
in a browser.
function handler(start, nodes, end) {
return [start, {type: 'html', value: '<script>alert(1)</script>'}, end]
}
Yields:
<!--foo start-->
<script>alert(1)</script>
<!--foo end-->
Either do not use user input or use hast-util-santize
.
mdast-util-heading-range
— similar but uses headings to mark sections
See contributing.md
in syntax-tree/.github
for
ways to get started.
See support.md
for ways to get help.
This project has a code of conduct. By interacting with this repository, organization, or community you agree to abide by its terms.