ah-toc v0.1.8
Table of Contents Generator (+ react hook)
The Table of Contents Generator is a JavaScript library that generates a table of contents based on the headings (e.g., <h1>, <h2>, <h3>) within an HTML document. It provides options for customizing the generated table of contents.
- No external dependencies
- Size: 4.04 kB (minified and gzipped)
Installation
You can install the Table of Contents Generator library using npm:
npm install ah-tocUsage
To use the Table of Contents Generator in your project, follow these steps:
1- Pure Javascript
- Import the library:
import TableOfContents from 'ah-toc';- Create an instance of the
TableOfContentsclass:
const options = {
attributes: ['h1', 'h2', 'h3'],
appendTo: 'body',
containerClassName: 'toc',
ordered: false,
contentSelector: '#content'
};
const tableOfContents = new TableOfContents(options);- Call the
initmethod to generate the table of contents:
tableOfContents.init();2- React Hook
Example
import { useRef } from 'react';
import useTableOfContents from 'table-of-contents-library/hook';
const MyComponent = () => {
const contentRef = useRef();
const tocData = useTableOfContents({ contentRef });
return (
<div>
{/* Your content goes here */}
<div ref={contentRef}>...</div>
{/* Render the table of contents */}
{tocData && (
<ul>
{tocData.children.map((node) => (
<li key={node.id}>
<a href={`#${node.id}`}>{node.content}</a>
</li>
))}
</ul>
)}
</div>
);
};useTableOfContents Hook
Parameters
contentRef: AMutableRefObjectcontaining a reference to the content element in the HTML document that contains the headers.
Returns
node: ANodeTypeobject representing the table of contents hierarchy. It will beundefinedinitially and will be updated once the table of contents is generated.
Options
The TableOfContents class accepts an optional options object during initialization. The available options are:
| Option | Type | Default Value | Optional | Description |
|---|---|---|---|---|
attributes | string[] | ['h1', 'h2', 'h3'] | Yes | An array of HTML heading tag names to include in the table of contents. |
appendTo | string | 'body' | Yes | The selector of the element to which the table of contents should be appended. |
containerClassName | string | 'toc' | Yes | The CSS class name to be applied to the container element of the table of contents. |
ordered | boolean | false | Yes | A boolean value indicating whether the generated table of contents should be ordered or unordered. |
contentSelector | string | '#content' | Yes | The selector of the element containing the content to generate the table of contents from. |
Example
Suppose we have the following HTML content:
<div id="content">
<h1>Introduction</h1>
<h2>Section 1</h2>
<h3>Subsection 1.1</h3>
<h3>Subsection 1.2</h3>
<h2>Section 2</h2>
<h3>Subsection 2.1</h3>
<h3>Subsection 2.2</h3>
</div>After calling the init method with the default options, the generated table of contents will be appended to the <body> element and will have the following structure:
<div class="toc">
<ul>
<li>
<a href="#introduction">Introduction</a>
<ul>
<li>
<a href="#section-1">Section 1</a>
<ul>
<li><a href="#subsection-1-1">Subsection 1.1</a
></li>
<li><a href="#subsection-1-2">Subsection 1.2</a></li>
</ul>
</li>
<li>
<a href="#section-2">Section 2</a>
<ul>
<li><a href="#subsection-2-1">Subsection 2.1</a></li>
<li><a href="#subsection-2-2">Subsection 2.2</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>Please note that no CSS styles are added by default to keep the library simple and customizable. You can apply your own CSS styles by targeting the generated classes and elements.
License
This project is licensed under the MIT License.