feat: Improved table of contents (#1223)

* feat: New table of contents

* fix: Hide TOC in edit mode

* feat: Highlight follows scroll position

* scroll tracking

* UI

* fix: Unrelated css fix with long doc titles

* Improve responsiveness

* feat: Add keyboard shortcut access to TOC

* fix: Headings should reflect content correctly when viewing old document revision

* flow

* fix: Persist TOC choice between sessions
This commit is contained in:
Tom Moor
2020-04-05 12:22:26 -07:00
committed by GitHub
parent 0deecfac44
commit d0606a72c3
17 changed files with 370 additions and 55 deletions

View File

@@ -0,0 +1,27 @@
// @flow
import { filter } from 'lodash';
import slugify from 'shared/utils/slugify';
export default function getHeadingsForText(
text: string
): { level: number, title: string, slug: string }[] {
const regex = /^(#{1,6})\s(.*)$/gm;
let match;
let output = [];
while ((match = regex.exec(text)) !== null) {
if (!match) continue;
const level = match[1].length;
const title = match[2];
let slug = slugify(title);
const existing = filter(output, { slug });
if (existing.length) {
slug = `${slug}-${existing.length}`;
}
output.push({ level, title, slug });
}
return output;
}

8
shared/utils/slugify.js Normal file
View File

@@ -0,0 +1,8 @@
// @flow
import slugify from 'slugify';
// Slugify, escape, and remove periods from headings so that they are
// compatible with url hashes AND dom selectors
export default function safeSlugify(text: string) {
return `h-${escape(slugify(text, { lower: true }).replace('.', '-'))}`;
}