@shelf/table-of-contents 1.3.1 → 1.3.2

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,10 +1,10 @@
1
- import { decode } from 'entities';
1
+ import { decodeHTML } from 'entities';
2
2
  import slug from 'slug';
3
3
  import { untag } from './untag.js';
4
4
  export function anchor(s) {
5
5
  s = untag(s);
6
6
  s = s.toLowerCase();
7
- s = decode(s);
7
+ s = decodeHTML(s);
8
8
  s = s.replace(/['"!]|[\\.]+$/g, '');
9
9
  s = slug(s);
10
10
  s = s.replace(/[:\\(\\)]+/gi, '-');
@@ -1,12 +1,15 @@
1
- import { template } from 'lodash-es';
1
+ import { escape as escapeHtml, template } from 'lodash-es';
2
+ import { decodeHTML } from 'entities';
2
3
  import { getSettings } from '../default-settings.js';
3
4
  import { untag } from './untag.js';
4
5
  import { unique } from './unique.js';
5
6
  import { anchor } from './anchor.js';
6
- import { decode } from 'entities';
7
- function normalizeHeaderText(text) {
8
- // Decode HTML entities, convert NBSP to regular spaces, collapse inner whitespace, and trim.
9
- return decode(text).replace(/\u00a0/g, ' ').replace(/\s+/g, ' ').trim();
7
+ function normalizeAnchorText(text) {
8
+ // Convert NBSP to regular spaces, collapse inner whitespace for anchor stability, and trim.
9
+ return text
10
+ .replace(/\u00a0/g, ' ')
11
+ .replace(/\s+/g, ' ')
12
+ .trim();
10
13
  }
11
14
  // Parse HTML, returning an array of header objects and anchorized HTML.
12
15
  export function anchorize(src, settingsOverride) {
@@ -24,9 +27,11 @@ export function anchorize(src, settingsOverride) {
24
27
  // @ts-ignore
25
28
  const anchorLevel = level >= settingsOverride.anchorMin && level <= settingsOverride.anchorMax;
26
29
  const untaggedHeader = untag(header);
27
- const decodedHeader = decode(untaggedHeader).replace(/\u00a0/g, ' ');
28
- const normalizedText = normalizeHeaderText(untaggedHeader);
29
- const anchorSource = normalizedText || decodedHeader.trim() || untaggedHeader || 'section';
30
+ const decodedHeader = decodeHTML(untaggedHeader);
31
+ const normalizedHeader = decodedHeader.replace(/\u00a0/g, ' ');
32
+ const displayText = escapeHtml(normalizedHeader);
33
+ const normalizedText = normalizeAnchorText(normalizedHeader);
34
+ const anchorSource = normalizedText || normalizedHeader.trim();
30
35
  let data;
31
36
  if (tocLevel || anchorLevel) {
32
37
  // This data is passed into the specified "header" template function.
@@ -38,7 +43,7 @@ export function anchorize(src, settingsOverride) {
38
43
  // Header HTML contents.
39
44
  header: header,
40
45
  // Un-tagged header HTML contents.
41
- text: normalizedText,
46
+ text: displayText,
42
47
  // Unique anchor name for this header.
43
48
  anchor: unique(names, anchor(anchorSource)),
44
49
  // All HTML (including tags) matched by the "headers" RegExp.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shelf/table-of-contents",
3
- "version": "1.3.1",
3
+ "version": "1.3.2",
4
4
  "description": "Fork of node-toc to reduce bundle size & rewritten in TypeScript",
5
5
  "license": "MIT",
6
6
  "author": {