@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.
@@ -1,3 +1,3 @@
1
- import { Settings } from './types';
1
+ import type { Settings } from './types';
2
2
  export declare const DEFAULT_SETTINGS: Settings;
3
3
  export declare function getSettings(settingsOverride?: Partial<Settings>): Settings;
@@ -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
  }
@@ -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;
@@ -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); // Process HTML, "anchorizing" headers as-specified.
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); // @ts-ignore
30
-
31
- var tocLevel = level >= settingsOverride.tocMin && level <= settingsOverride.tocMax; // @ts-ignore
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
- } // @ts-ignore
58
-
50
+ }
51
+ if (anchorLevel) {
52
+ // @ts-ignore
53
+ return (0, _getDataWithoutNestedAnchors.getDataWithoutNestedAnchors)(data, headerTemplate);
54
+ }
59
55
 
60
- return anchorLevel ? headerTemplate(data) : all;
56
+ // @ts-ignore
57
+ return all;
61
58
  });
62
59
  return {
63
60
  src: src,
@@ -0,0 +1,3 @@
1
+ import type { TemplateExecutor } from 'lodash';
2
+ import type { Header } from '../types';
3
+ export declare const getDataWithoutNestedAnchors: (data: Header, headerTemplate: TemplateExecutor) => string;
@@ -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
+ };
@@ -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); // Generate TOC from headers array.
18
-
19
- var tocHtml = (0, _toc.toc)(anchorized.headers); // Insert the generated TOC into the anchorized HTML.
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
  }
@@ -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;
@@ -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
- }; // Build TOC
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
  });
@@ -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
  }
@@ -4,7 +4,6 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.untag = untag;
7
-
8
7
  function untag(str) {
9
8
  return str.replace(/<[^>]*>/g, '');
10
9
  }
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 declare type Settings = {
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 declare type Header = {
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.1",
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": "3.0.1",
41
+ "entities": "4.5.0",
44
42
  "lodash.defaults": "4.2.0",
45
43
  "lodash.template": "4.5.0",
46
- "slug": "5.1.0"
44
+ "slug": "8.2.3"
47
45
  },
48
46
  "devDependencies": {
49
- "@babel/cli": "7.16.0",
50
- "@babel/core": "7.16.0",
51
- "@shelf/babel-config": "0.1.4",
52
- "@shelf/eslint-config": "2.5.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.6",
55
- "@types/jest": "27.0.2",
56
- "@types/lodash.defaults": "4.2.6",
57
- "@types/lodash.template": "4.5.0",
58
- "@types/node": "14",
59
- "@types/slug": "5.0.2",
60
- "eslint": "8.1.0",
61
- "husky": "7.0.4",
62
- "jest": "27.3.1",
63
- "lint-staged": "11.2.6",
64
- "prettier": "2.4.1",
65
- "typescript": "4.4.4"
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"