@shelf/table-of-contents 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/default-settings.d.ts +1 -1
- package/lib/default-settings.js +1 -6
- package/lib/helpers/anchor.js +0 -5
- package/lib/helpers/anchorize.d.ts +1 -1
- package/lib/helpers/anchorize.js +15 -18
- package/lib/helpers/getDataWithoutNestedAnchors.d.ts +3 -0
- package/lib/helpers/getDataWithoutNestedAnchors.js +43 -0
- package/lib/helpers/process.js +6 -8
- package/lib/helpers/toc.d.ts +1 -1
- package/lib/helpers/toc.js +4 -7
- package/lib/helpers/unique.js +0 -3
- package/lib/helpers/untag.js +0 -1
- package/lib/index.js +1 -10
- package/lib/types.d.ts +2 -2
- package/package.json +22 -23
package/lib/default-settings.js
CHANGED
|
@@ -5,13 +5,10 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.DEFAULT_SETTINGS = void 0;
|
|
7
7
|
exports.getSettings = getSettings;
|
|
8
|
-
|
|
9
8
|
var _lodash = _interopRequireDefault(require("lodash.defaults"));
|
|
10
|
-
|
|
11
9
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
|
12
|
-
|
|
13
10
|
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
14
|
-
var DEFAULT_SETTINGS = {
|
|
11
|
+
var DEFAULT_SETTINGS = exports.DEFAULT_SETTINGS = {
|
|
15
12
|
// DEFAULTS FOR toc.process()
|
|
16
13
|
//
|
|
17
14
|
// RegExp to replace with generated TOC.
|
|
@@ -39,8 +36,6 @@ var DEFAULT_SETTINGS = {
|
|
|
39
36
|
// Main TOC template.
|
|
40
37
|
TOC: '<div class="toc"><%= toc %></div>'
|
|
41
38
|
};
|
|
42
|
-
exports.DEFAULT_SETTINGS = DEFAULT_SETTINGS;
|
|
43
|
-
|
|
44
39
|
function getSettings(settingsOverride) {
|
|
45
40
|
return (0, _lodash["default"])({}, settingsOverride, DEFAULT_SETTINGS);
|
|
46
41
|
}
|
package/lib/helpers/anchor.js
CHANGED
|
@@ -4,15 +4,10 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.anchor = anchor;
|
|
7
|
-
|
|
8
7
|
var _entities = require("entities");
|
|
9
|
-
|
|
10
8
|
var _slug = _interopRequireDefault(require("slug"));
|
|
11
|
-
|
|
12
9
|
var _untag = require("./untag");
|
|
13
|
-
|
|
14
10
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
|
15
|
-
|
|
16
11
|
function anchor(s) {
|
|
17
12
|
s = (0, _untag.untag)(s);
|
|
18
13
|
s = s.toLowerCase();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Header, Settings } from '../types';
|
|
1
|
+
import type { Header, Settings } from '../types';
|
|
2
2
|
export declare function anchorize(src: string, settingsOverride?: Partial<Pick<Settings, 'headers' | 'tocMin' | 'tocMax' | 'anchorMin' | 'anchorMax' | 'header'>>): {
|
|
3
3
|
src: string;
|
|
4
4
|
html: string;
|
package/lib/helpers/anchorize.js
CHANGED
|
@@ -4,35 +4,29 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.anchorize = anchorize;
|
|
7
|
-
|
|
8
7
|
var _lodash = _interopRequireDefault(require("lodash.template"));
|
|
9
|
-
|
|
8
|
+
var _defaultSettings = require("../default-settings");
|
|
10
9
|
var _untag = require("./untag");
|
|
11
|
-
|
|
12
10
|
var _unique = require("./unique");
|
|
13
|
-
|
|
14
11
|
var _anchor = require("./anchor");
|
|
15
|
-
|
|
16
|
-
var _defaultSettings = require("../default-settings");
|
|
17
|
-
|
|
12
|
+
var _getDataWithoutNestedAnchors = require("./getDataWithoutNestedAnchors");
|
|
18
13
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
|
19
|
-
|
|
20
14
|
// Parse HTML, returning an array of header objects and anchorized HTML.
|
|
21
15
|
function anchorize(src, settingsOverride) {
|
|
22
16
|
// Normalize options and compile template(s).
|
|
23
17
|
settingsOverride = (0, _defaultSettings.getSettings)(settingsOverride);
|
|
24
|
-
var headerTemplate = (0, _lodash["default"])(settingsOverride.header);
|
|
18
|
+
var headerTemplate = (0, _lodash["default"])(settingsOverride.header);
|
|
25
19
|
|
|
20
|
+
// Process HTML, "anchorizing" headers as-specified.
|
|
26
21
|
var headers = [];
|
|
27
22
|
var names = {};
|
|
28
23
|
var html = src.replace(settingsOverride.headers, function (all, level, attrs, header) {
|
|
29
|
-
level = Number(level);
|
|
30
|
-
|
|
31
|
-
var tocLevel = level >= settingsOverride.tocMin && level <= settingsOverride.tocMax;
|
|
32
|
-
|
|
24
|
+
level = Number(level);
|
|
25
|
+
// @ts-ignore
|
|
26
|
+
var tocLevel = level >= settingsOverride.tocMin && level <= settingsOverride.tocMax;
|
|
27
|
+
// @ts-ignore
|
|
33
28
|
var anchorLevel = level >= settingsOverride.anchorMin && level <= settingsOverride.anchorMax;
|
|
34
29
|
var data;
|
|
35
|
-
|
|
36
30
|
if (tocLevel || anchorLevel) {
|
|
37
31
|
// This data is passed into the specified "header" template function.
|
|
38
32
|
data = {
|
|
@@ -50,14 +44,17 @@ function anchorize(src, settingsOverride) {
|
|
|
50
44
|
all: all
|
|
51
45
|
};
|
|
52
46
|
}
|
|
53
|
-
|
|
54
47
|
if (tocLevel) {
|
|
55
48
|
// @ts-ignore
|
|
56
49
|
headers.push(data);
|
|
57
|
-
}
|
|
58
|
-
|
|
50
|
+
}
|
|
51
|
+
if (anchorLevel) {
|
|
52
|
+
// @ts-ignore
|
|
53
|
+
return (0, _getDataWithoutNestedAnchors.getDataWithoutNestedAnchors)(data, headerTemplate);
|
|
54
|
+
}
|
|
59
55
|
|
|
60
|
-
|
|
56
|
+
// @ts-ignore
|
|
57
|
+
return all;
|
|
61
58
|
});
|
|
62
59
|
return {
|
|
63
60
|
src: src,
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getDataWithoutNestedAnchors = void 0;
|
|
7
|
+
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
8
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
9
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
10
|
+
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
11
|
+
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
12
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
13
|
+
var parser = new DOMParser();
|
|
14
|
+
var hasAnchorTagsInHeader = function hasAnchorTagsInHeader(data) {
|
|
15
|
+
var doc = parser.parseFromString(data.header, 'text/xml');
|
|
16
|
+
|
|
17
|
+
// Extract any existing anchor tags from the header variable
|
|
18
|
+
var anchorElement = doc.querySelector('a');
|
|
19
|
+
return anchorElement === null || anchorElement === void 0 ? void 0 : anchorElement.outerHTML;
|
|
20
|
+
};
|
|
21
|
+
var getDataWithoutNestedAnchors = exports.getDataWithoutNestedAnchors = function getDataWithoutNestedAnchors(data, headerTemplate) {
|
|
22
|
+
var _firstAnchorElement$c;
|
|
23
|
+
var results = headerTemplate(data);
|
|
24
|
+
if (!hasAnchorTagsInHeader(data)) {
|
|
25
|
+
return headerTemplate(data);
|
|
26
|
+
}
|
|
27
|
+
var doc = parser.parseFromString(results, 'text/xml');
|
|
28
|
+
|
|
29
|
+
// get Toc pointer anchor node
|
|
30
|
+
var firstAnchorElement = doc.querySelector("a[href=\"#".concat(data.anchor, "\"]"));
|
|
31
|
+
|
|
32
|
+
// get all content nodes from Toc pointer anchor node
|
|
33
|
+
var contentArray = Array.from((_firstAnchorElement$c = firstAnchorElement === null || firstAnchorElement === void 0 ? void 0 : firstAnchorElement.childNodes) !== null && _firstAnchorElement$c !== void 0 ? _firstAnchorElement$c : []);
|
|
34
|
+
var parentNode = firstAnchorElement === null || firstAnchorElement === void 0 ? void 0 : firstAnchorElement.parentElement;
|
|
35
|
+
|
|
36
|
+
// remove all content nodes from Toc pointer anchor node
|
|
37
|
+
contentArray.forEach(function (node) {
|
|
38
|
+
firstAnchorElement === null || firstAnchorElement === void 0 ? void 0 : firstAnchorElement.removeChild(node);
|
|
39
|
+
});
|
|
40
|
+
var newContentArray = [firstAnchorElement].concat(contentArray);
|
|
41
|
+
parentNode === null || parentNode === void 0 ? void 0 : parentNode.replaceChildren.apply(parentNode, _toConsumableArray(newContentArray));
|
|
42
|
+
return (parentNode === null || parentNode === void 0 ? void 0 : parentNode.outerHTML) || results;
|
|
43
|
+
};
|
package/lib/helpers/process.js
CHANGED
|
@@ -4,19 +4,17 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.process = process;
|
|
7
|
-
|
|
7
|
+
var _defaultSettings = require("../default-settings");
|
|
8
8
|
var _anchorize = require("./anchorize");
|
|
9
|
-
|
|
10
9
|
var _toc = require("./toc");
|
|
11
|
-
|
|
12
|
-
var _defaultSettings = require("../default-settings");
|
|
13
|
-
|
|
14
10
|
// Anchorize all headers and inline a generated TOC, returning processed HTML.
|
|
11
|
+
|
|
15
12
|
function process(src, settingsOverride) {
|
|
16
13
|
// Get anchorized HTML and headers array.
|
|
17
|
-
var anchorized = (0, _anchorize.anchorize)(src, settingsOverride);
|
|
18
|
-
|
|
19
|
-
var tocHtml = (0, _toc.toc)(anchorized.headers);
|
|
14
|
+
var anchorized = (0, _anchorize.anchorize)(src, settingsOverride);
|
|
15
|
+
// Generate TOC from headers array.
|
|
16
|
+
var tocHtml = (0, _toc.toc)(anchorized.headers);
|
|
20
17
|
|
|
18
|
+
// Insert the generated TOC into the anchorized HTML.
|
|
21
19
|
return anchorized.html.replace((0, _defaultSettings.getSettings)(settingsOverride).placeholder, tocHtml);
|
|
22
20
|
}
|
package/lib/helpers/toc.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { Header, Settings } from '../types';
|
|
1
|
+
import type { Header, Settings } from '../types';
|
|
2
2
|
export declare function toc(headers: Header[], settingsOverride?: Partial<Settings>): string;
|
package/lib/helpers/toc.js
CHANGED
|
@@ -4,13 +4,9 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.toc = toc;
|
|
7
|
-
|
|
8
7
|
var _lodash = _interopRequireDefault(require("lodash.template"));
|
|
9
|
-
|
|
10
8
|
var _defaultSettings = require("../default-settings");
|
|
11
|
-
|
|
12
9
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
|
13
|
-
|
|
14
10
|
function toc(headers, settingsOverride) {
|
|
15
11
|
settingsOverride = (0, _defaultSettings.getSettings)(settingsOverride);
|
|
16
12
|
var templates = {
|
|
@@ -19,8 +15,9 @@ function toc(headers, settingsOverride) {
|
|
|
19
15
|
closeUL: (0, _lodash["default"])(settingsOverride.closeUL),
|
|
20
16
|
openLI: (0, _lodash["default"])(settingsOverride.openLI),
|
|
21
17
|
closeLI: (0, _lodash["default"])(settingsOverride.closeLI)
|
|
22
|
-
};
|
|
18
|
+
};
|
|
23
19
|
|
|
20
|
+
// Build TOC
|
|
24
21
|
var cursor = 0;
|
|
25
22
|
var levels = [];
|
|
26
23
|
var tocs = [''];
|
|
@@ -29,7 +26,6 @@ function toc(headers, settingsOverride) {
|
|
|
29
26
|
levels.shift();
|
|
30
27
|
cursor++;
|
|
31
28
|
}
|
|
32
|
-
|
|
33
29
|
if (levels.length === 0 || header.level > levels[0]) {
|
|
34
30
|
levels.unshift(header.level);
|
|
35
31
|
header.depth = levels.length;
|
|
@@ -39,9 +35,10 @@ function toc(headers, settingsOverride) {
|
|
|
39
35
|
header.depth = levels.length;
|
|
40
36
|
tocs[cursor] += templates.closeLI(header);
|
|
41
37
|
}
|
|
42
|
-
|
|
43
38
|
tocs[cursor] += templates.openLI(header);
|
|
44
39
|
});
|
|
40
|
+
|
|
41
|
+
// eslint-disable-next-line new-cap
|
|
45
42
|
return templates.TOC({
|
|
46
43
|
toc: tocs.join('')
|
|
47
44
|
});
|
package/lib/helpers/unique.js
CHANGED
|
@@ -4,17 +4,14 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.unique = unique;
|
|
7
|
-
|
|
8
7
|
// Get a unique name and store the returned name in names for future
|
|
9
8
|
// unique-name-gettingness
|
|
10
9
|
function unique(names, name) {
|
|
11
10
|
var result = name;
|
|
12
11
|
var count = 0;
|
|
13
|
-
|
|
14
12
|
while (names[result]) {
|
|
15
13
|
result = name + --count;
|
|
16
14
|
}
|
|
17
|
-
|
|
18
15
|
names[result] = true;
|
|
19
16
|
return result;
|
|
20
17
|
}
|
package/lib/helpers/untag.js
CHANGED
package/lib/index.js
CHANGED
|
@@ -46,21 +46,13 @@ Object.defineProperty(exports, "untag", {
|
|
|
46
46
|
return _untag.untag;
|
|
47
47
|
}
|
|
48
48
|
});
|
|
49
|
-
|
|
50
49
|
var _anchor = require("./helpers/anchor");
|
|
51
|
-
|
|
52
50
|
var _anchorize = require("./helpers/anchorize");
|
|
53
|
-
|
|
54
51
|
var _process = require("./helpers/process");
|
|
55
|
-
|
|
56
52
|
var _toc = require("./helpers/toc");
|
|
57
|
-
|
|
58
53
|
var _unique = require("./helpers/unique");
|
|
59
|
-
|
|
60
54
|
var _untag = require("./helpers/untag");
|
|
61
|
-
|
|
62
55
|
var _defaultSettings = require("./default-settings");
|
|
63
|
-
|
|
64
56
|
var TOC = {
|
|
65
57
|
DEFAULT_SETTINGS: _defaultSettings.DEFAULT_SETTINGS,
|
|
66
58
|
anchor: _anchor.anchor,
|
|
@@ -70,5 +62,4 @@ var TOC = {
|
|
|
70
62
|
unique: _unique.unique,
|
|
71
63
|
untag: _untag.untag
|
|
72
64
|
};
|
|
73
|
-
var _default = TOC;
|
|
74
|
-
exports["default"] = _default;
|
|
65
|
+
var _default = exports["default"] = TOC;
|
package/lib/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export
|
|
1
|
+
export type Settings = {
|
|
2
2
|
placeholder: RegExp;
|
|
3
3
|
headers: RegExp;
|
|
4
4
|
tocMin: number;
|
|
@@ -12,7 +12,7 @@ export declare type Settings = {
|
|
|
12
12
|
closeLI: string;
|
|
13
13
|
TOC: string;
|
|
14
14
|
};
|
|
15
|
-
export
|
|
15
|
+
export type Header = {
|
|
16
16
|
level: number;
|
|
17
17
|
depth?: number;
|
|
18
18
|
attrs: any;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shelf/table-of-contents",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"description": "Fork of node-toc to reduce bundle size & rewritten in TypeScript",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": {
|
|
@@ -27,12 +27,10 @@
|
|
|
27
27
|
},
|
|
28
28
|
"lint-staged": {
|
|
29
29
|
"*.{html,md,yml}": [
|
|
30
|
-
"prettier --write"
|
|
31
|
-
"git add"
|
|
30
|
+
"prettier --write"
|
|
32
31
|
],
|
|
33
32
|
"*.{js,ts,json}": [
|
|
34
|
-
"eslint --fix"
|
|
35
|
-
"git add"
|
|
33
|
+
"eslint --fix"
|
|
36
34
|
]
|
|
37
35
|
},
|
|
38
36
|
"babel": {
|
|
@@ -40,29 +38,30 @@
|
|
|
40
38
|
},
|
|
41
39
|
"prettier": "@shelf/prettier-config",
|
|
42
40
|
"dependencies": {
|
|
43
|
-
"entities": "
|
|
41
|
+
"entities": "4.5.0",
|
|
44
42
|
"lodash.defaults": "4.2.0",
|
|
45
43
|
"lodash.template": "4.5.0",
|
|
46
|
-
"slug": "
|
|
44
|
+
"slug": "8.2.3"
|
|
47
45
|
},
|
|
48
46
|
"devDependencies": {
|
|
49
|
-
"@babel/cli": "7.
|
|
50
|
-
"@babel/core": "7.
|
|
51
|
-
"@shelf/babel-config": "
|
|
52
|
-
"@shelf/eslint-config": "2.
|
|
47
|
+
"@babel/cli": "7.22.10",
|
|
48
|
+
"@babel/core": "7.22.10",
|
|
49
|
+
"@shelf/babel-config": "1.2.0",
|
|
50
|
+
"@shelf/eslint-config": "2.26.0",
|
|
53
51
|
"@shelf/prettier-config": "1.0.0",
|
|
54
|
-
"@shelf/tsconfig": "0.0.
|
|
55
|
-
"@types/jest": "
|
|
56
|
-
"@types/lodash.defaults": "4.2.
|
|
57
|
-
"@types/lodash.template": "4.5.
|
|
58
|
-
"@types/node": "
|
|
59
|
-
"@types/slug": "5.0.
|
|
60
|
-
"eslint": "8.
|
|
61
|
-
"husky": "
|
|
62
|
-
"jest": "
|
|
63
|
-
"
|
|
64
|
-
"
|
|
65
|
-
"
|
|
52
|
+
"@shelf/tsconfig": "0.0.11",
|
|
53
|
+
"@types/jest": "29.5.3",
|
|
54
|
+
"@types/lodash.defaults": "4.2.7",
|
|
55
|
+
"@types/lodash.template": "4.5.1",
|
|
56
|
+
"@types/node": "20.5.0",
|
|
57
|
+
"@types/slug": "5.0.4",
|
|
58
|
+
"eslint": "8.47.0",
|
|
59
|
+
"husky": "8.0.3",
|
|
60
|
+
"jest": "29.6.2",
|
|
61
|
+
"jest-environment-jsdom": "^29.7.0",
|
|
62
|
+
"lint-staged": "14.0.0",
|
|
63
|
+
"prettier": "2.8.3",
|
|
64
|
+
"typescript": "5.1.6"
|
|
66
65
|
},
|
|
67
66
|
"engines": {
|
|
68
67
|
"node": ">=14"
|