summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/content_editor/extensions/table_of_contents.js
blob: 9e31158837e220525a970de501d8b8f53a72b28a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import { Node } from '@tiptap/core';
import { InputRule } from 'prosemirror-inputrules';
import { s__ } from '~/locale';
import { PARSE_HTML_PRIORITY_HIGHEST } from '../constants';

export const inputRuleRegExps = [/^\[\[_TOC_\]\]$/, /^\[TOC\]$/];

export default Node.create({
  name: 'tableOfContents',

  inline: false,

  group: 'block',

  parseHTML() {
    return [
      {
        tag: 'ul.section-nav',
        priority: PARSE_HTML_PRIORITY_HIGHEST,
      },
    ];
  },

  renderHTML() {
    return [
      'div',
      {
        class:
          'table-of-contents gl-border-1 gl-border-solid gl-text-center gl-border-gray-100 gl-mb-5',
      },
      s__('ContentEditor|Table of Contents'),
    ];
  },

  addInputRules() {
    const { type } = this;

    return inputRuleRegExps.map(
      (regex) =>
        new InputRule(regex, (state, match, start, end) => {
          const { tr } = state;

          if (match) {
            tr.replaceWith(start - 1, end, type.create());
          }

          return tr;
        }),
    );
  },
});