# Sponsors
Thanks to the following companies, organizations, and individuals for supporting the ongoing maintenance and development of {%= name %}! [Become a Sponsor](https://github.com/sponsors/jonschlinkert) to add your logo to this README, or any of [my other projects](https://github.com/jonschlinkert?tab=repositories&q=&type=&language=&sort=stargazers)
## Gold Sponsors
| [](https://jaake.tech/) |
|:---:|
| [https://jaake.tech/](https://jaake.tech/) |
## Quick Start
Assuming you want to add a TOC to README.md:
1. `$ npm install -g markdown-toc`
2. Edit README.md and insert the following line where you want the TOC inserted: ``
3. `$ markdown-toc -i README.md`
## CLI
```
Usage: markdown-toc [options]
input: The Markdown file to parse for table of contents,
or "-" to read from stdin.
-i: Edit the file directly, injecting the TOC at ;
(Without this flag, the default is to print the TOC to stdout.)
--json: Print the TOC in JSON format
--append: Append a string to the end of the TOC
--bullets: Bullets to use for items in the generated TOC
(Supports multiple bullets: --bullets "*" --bullets "-" --bullets "+")
(Default is "*".)
--maxdepth: Use headings whose depth is at most maxdepth
(Default is 6.)
--no-firsth1: Include the first h1-level heading in a file
--no-stripHeadingTags: Do not strip extraneous HTML tags from heading
text before slugifying
--indent: Provide the indentation to use - defaults to ' '
(to specify a tab, use the bash-escaped $'\t')
```
## Highlights
**Features**
- Can optionally be used as a [remarkable][] plugin
- Returns an object with the rendered TOC (on `content`), as well as a `json` property with the raw TOC object, so you can generate your own TOC using templates or however you want
- Works with [repeated headings](https://gist.github.com/jonschlinkert/ac5d8122bfaaa394f896)
- Uses sane defaults, so no customization is necessary, but you can if you need to.
- [filter](#filter-headings) out headings you don't want
- [Improve](#titleize) the headings you do want
- Use a custom [slugify](#optionsslugify) function to change how links are created
**Safe!**
- Won't mangle markdown in code examples in gfm code blocks that other TOC generators mistake as being actual headings (this happens when markdown headings are show in _examples_, meaning they arent' actually headings that should be in the toc. Also happens with yaml and coffee-script comments, or any comments that use `#`)
- Won't mangle front-matter, or mistake front-matter properties for headings like other TOC generators
## Usage
```js
var toc = require('{%= name %}');
toc('# One\n\n# Two').content;
// Results in:
// - [One](#one)
// - [Two](#two)
```
To allow customization of the output, an object is returned with the following properties:
- `content` **{String}**: The generated table of contents. Unless you want to customize rendering, this is all you need.
- `highest` **{Number}**: The highest level heading found. This is used to adjust indentation.
- `tokens` **{Array}**: Headings tokens that can be used for custom rendering
## API
### toc.plugin
Use as a [remarkable][] plugin.
```js
var Remarkable = require('remarkable');
var toc = require('markdown-toc');
function render(str, options) {
return new Remarkable()
.use(toc.plugin(options)) // <= register the plugin
.render(str);
}
```
**Usage example**
```js
var results = render('# AAA\n# BBB\n# CCC\nfoo\nbar\nbaz');
```
Results in:
```
- [AAA](#aaa)
- [BBB](#bbb)
- [CCC](#ccc)
```
### toc.json
Object for creating a custom TOC.
```js
toc('# AAA\n## BBB\n### CCC\nfoo').json;
// results in
[ { content: 'AAA', slug: 'aaa', lvl: 1 },
{ content: 'BBB', slug: 'bbb', lvl: 2 },
{ content: 'CCC', slug: 'ccc', lvl: 3 } ]
```
### toc.insert
Insert a table of contents immediately after an _opening_ `` code comment, or replace an existing TOC if both an _opening_ comment and a _closing_ comment (``) are found.
_(This strategy works well since code comments in markdown are hidden when viewed as HTML, like when viewing a README on GitHub README for example)._
**Example**
```
- old toc 1
- old toc 2
- old toc 3
## abc
This is a b c.
## xyz
This is x y z.
```
Would result in something like:
```
- [abc](#abc)
- [xyz](#xyz)
## abc
This is a b c.
## xyz
This is x y z.
```
### Utility functions
As a convenience to folks who wants to create a custom TOC, markdown-toc's internal utility methods are exposed:
```js
var toc = require('markdown-toc');
```
- `toc.bullets()`: render a bullet list from an array of tokens
- `toc.linkify()`: linking a heading `content` string
- `toc.slugify()`: slugify a heading `content` string
- `toc.strip()`: strip words or characters from a heading `content` string
**Example**
```js
var result = toc('# AAA\n## BBB\n### CCC\nfoo');
var str = '';
result.json.forEach(function(heading) {
str += toc.linkify(heading.content);
});
```
## Options
### options.append
Append a string to the end of the TOC.
```js
toc(str, {append: '\n_(TOC generated by Verb)_'});
```
### options.filter
Type: `Function`
Default: `undefined`
Params:
- `str` **{String}** the actual heading string
- `ele` **{Objecct}** object of heading tokens
- `arr` **{Array}** all of the headings objects
**Example**
From time to time, we might get junk like this in our TOC.
```
[.aaa([foo], ...) another bad heading](#-aaa--foo--------another-bad-heading)
```
Unless you like that kind of thing, you might want to filter these bad headings out.
```js
function removeJunk(str, ele, arr) {
return str.indexOf('...') === -1;
}
var result = toc(str, {filter: removeJunk});
//=> beautiful TOC
```
### options.slugify
Type: `Function`
Default: Basic non-word character replacement.
**Example**
```js
var str = toc('# Some Article', {slugify: require('uslug')});
```
### options.bullets
Type: `String|Array`
Default: `*`
The bullet to use for each item in the generated TOC. If passed as an array (`['*', '-', '+']`), the bullet point strings will be used based on the header depth.
### options.maxdepth
Type: `Number`
Default: `6`
Use headings whose depth is at most maxdepth.
### options.firsth1
Type: `Boolean`
Default: `true`
Exclude the first h1-level heading in a file. For example, this prevents the first heading in a README from showing up in the TOC.
### options.stripHeadingTags
Type: `Boolean`
Default: `true`
Strip extraneous HTML tags from heading text before slugifying. This is similar to GitHub markdown behavior.