From 8ed1f63520bbfb20540004242353e87dd143824b Mon Sep 17 00:00:00 2001
From: James Thompson
Date: Sat, 13 Dec 2025 22:48:01 +1100
Subject: [PATCH 1/7] add in special character tests
---
.../readme-with-special-characters.md | 59 +++++++++++++++++++
test/transform-weird-headers.js | 34 +++++++++++
test/transform.js | 2 +-
3 files changed, 94 insertions(+), 1 deletion(-)
create mode 100644 test/fixtures/readme-with-special-characters.md
diff --git a/test/fixtures/readme-with-special-characters.md b/test/fixtures/readme-with-special-characters.md
new file mode 100644
index 00000000..03ff1428
--- /dev/null
+++ b/test/fixtures/readme-with-special-characters.md
@@ -0,0 +1,59 @@
+## Title with backslash `\`
+test
+
+## 4 § Toimielimet
+Special char
+
+## Урок 8. Кроссплатформенность и виртуализация
+text
+
+## Interface: SOME\_NAME<\>
+method
+
+## Version 1.10.5
+bugs
+
+## Version 1.10.6
+features
+
+## `TEXT 1`
+
+- item 1
+
+## `TEXT 2 ...`
+
+TEXT 2.1 ...
+
+## MikroTik hAP ac²
+
+The [hAP ac²](https://mikrotik.com/product/hap_ac2) is
+
+## acclk dac %d:[0,acclk_dac_max):dac
+description
+
+## Övningsuppgifter
+swedish
+
+## Sections
+This readme causes an error `` text `
` more text (`
`)
+
+## Тест
+cyrillic
+
+## There's an error here
+bad
+
+## Replace .gitlab-ci.yml
+file name
+
+## `this identifier`
+text
+
+## Header & noise
+ampersand
+
+## CJK。
+CJK Symbols
+
+## ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿Latin 1
+Latin 1
diff --git a/test/transform-weird-headers.js b/test/transform-weird-headers.js
index 51544297..c7511f17 100644
--- a/test/transform-weird-headers.js
+++ b/test/transform-weird-headers.js
@@ -80,3 +80,37 @@ test('\nformatted headers', function (t) {
t.end()
})
+
+test('\nrandom md characters', function (t) {
+ var content = require('fs').readFileSync(__dirname + '/fixtures/readme-with-special-characters.md', 'utf8');
+ var headers = transform(content);
+
+ t.deepEqual(
+ headers.toc.split('\n')
+ , [ '**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)*',
+ '',
+ '- [Title with backslash `\\`](#title-with-backslash-)',
+ '- [4 § Toimielimet](#4-%C2%A7-toimielimet)',
+ '- [Урок 8. Кроссплатформенность и виртуализация](#%D1%83%D1%80%D0%BE%D0%BA-8-%D0%BA%D1%80%D0%BE%D1%81%D1%81%D0%BF%D0%BB%D0%B0%D1%82%D1%84%D0%BE%D1%80%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D1%8C-%D0%B8-%D0%B2%D0%B8%D1%80%D1%82%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F)',
+ '- [Interface: SOME\\_NAME<\\>](#interface-some_name)',
+ '- [Version 1.10.5](#version-1105)',
+ '- [Version 1.10.6](#version-1106)',
+ '- [`TEXT 1`](#text-1)',
+ '- [`TEXT 2 ...`](#text-2-)',
+ '- [MikroTik hAP ac²](#mikrotik-hap-ac)',
+ '- [acclk dac %d:[0,acclk_dac_max):dac](#acclk-dac-d0acclk_dac_maxdac)',
+ '- [Övningsuppgifter](#%C3%B6vningsuppgifter)',
+ '- [Sections](#sections)',
+ '- [Тест](#%D1%82%D0%B5%D1%81%D1%82)',
+ '- [There\'s an error here](#theres-an-error-here)',
+ '- [Replace .gitlab-ci.yml](#replace-gitlab-ciyml)',
+ '- [`this identifier`](#this-identifier)',
+ '- [Header & noise](#header--noise)',
+ '- [CJK。](#cjk)',
+ '- [¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿Latin 1](#%C2%AA%C2%B5%C2%BAlatin-1)',
+ '' ]
+ , 'generates a correct toc when readme has nameless table headers'
+ )
+
+ t.end()
+})
diff --git a/test/transform.js b/test/transform.js
index ef591f2f..7996d4e0 100644
--- a/test/transform.js
+++ b/test/transform.js
@@ -69,7 +69,7 @@ check(
, 'some main usage here'
].join('\r\n')
, [ '**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)*\n\n'
- , '- [My Module using \\r\\n line endings](#my-module-using-%5Cr%5Cn-line-endings)\n'
+ , '- [My Module using \\r\\n line endings](#my-module-using-rn-line-endings)\n'
, ' - [API](#api)\n'
, ' - [Method One](#method-one)\n'
, ' - [Method Two](#method-two)\n'
From a6549cd94e64d410d64125a06b004ac261fd9bca Mon Sep 17 00:00:00 2001
From: James Thompson
Date: Fri, 19 Dec 2025 13:19:10 +1100
Subject: [PATCH 2/7] Header with link
---
test/fixtures/readme-with-special-characters.md | 3 +++
test/transform-weird-headers.js | 1 +
2 files changed, 4 insertions(+)
diff --git a/test/fixtures/readme-with-special-characters.md b/test/fixtures/readme-with-special-characters.md
index 03ff1428..19c7f1d0 100644
--- a/test/fixtures/readme-with-special-characters.md
+++ b/test/fixtures/readme-with-special-characters.md
@@ -57,3 +57,6 @@ CJK Symbols
## ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿Latin 1
Latin 1
+
+## Instance properties inherited from [`EventEmitter`](http://nodejs.org/api/events.html)
+Text
\ No newline at end of file
diff --git a/test/transform-weird-headers.js b/test/transform-weird-headers.js
index c7511f17..28f8563c 100644
--- a/test/transform-weird-headers.js
+++ b/test/transform-weird-headers.js
@@ -108,6 +108,7 @@ test('\nrandom md characters', function (t) {
'- [Header & noise](#header--noise)',
'- [CJK。](#cjk)',
'- [¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿Latin 1](#%C2%AA%C2%B5%C2%BAlatin-1)',
+ '- [Instance properties inherited from `EventEmitter`](#instance-properties-inherited-from-eventemitter)',
'' ]
, 'generates a correct toc when readme has nameless table headers'
)
From de0220f5ae8a908c4a29bf4e80a791b2eda89832 Mon Sep 17 00:00:00 2001
From: James Thompson
Date: Sun, 1 Feb 2026 20:44:11 +1100
Subject: [PATCH 3/7] Update transform-weird-headers.js
---
test/transform-weird-headers.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/test/transform-weird-headers.js b/test/transform-weird-headers.js
index 28f8563c..78182524 100644
--- a/test/transform-weird-headers.js
+++ b/test/transform-weird-headers.js
@@ -110,7 +110,7 @@ test('\nrandom md characters', function (t) {
'- [¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿Latin 1](#%C2%AA%C2%B5%C2%BAlatin-1)',
'- [Instance properties inherited from `EventEmitter`](#instance-properties-inherited-from-eventemitter)',
'' ]
- , 'generates a correct toc when readme has nameless table headers'
+ , 'generates a correct toc when readme has special characters in table headers'
)
t.end()
From a3b2196744ea5e70df7bd861bd94edd4537d952b Mon Sep 17 00:00:00 2001
From: James Thompson
Date: Thu, 5 Feb 2026 23:33:30 +1100
Subject: [PATCH 4/7] Update anchor-markdown-header dependency version
---
package-lock.json | 32 ++++++++++++++++----------------
package.json | 2 +-
2 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 68448f91..d69ba43c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -5,11 +5,12 @@
"requires": true,
"packages": {
"": {
+ "name": "doctoc",
"version": "0.0.0-development",
"license": "MIT",
"dependencies": {
"@textlint/markdown-to-ast": "^12.1.1",
- "anchor-markdown-header": "^0.7.0",
+ "anchor-markdown-header": "^0.8.1",
"htmlparser2": "^7.2.0",
"minimist": "^1.2.6",
"underscore": "^1.13.2",
@@ -60,7 +61,6 @@
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz",
"integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==",
"dev": true,
- "peer": true,
"dependencies": {
"@ampproject/remapping": "^2.1.0",
"@babel/code-frame": "^7.16.7",
@@ -676,12 +676,13 @@
}
},
"node_modules/anchor-markdown-header": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/anchor-markdown-header/-/anchor-markdown-header-0.7.0.tgz",
- "integrity": "sha512-OYUgo5tYN+WipGB2R3sZUvXLpTzqSnm0b3AXRqN9Rhi2Z+uCQsFSguDDgpoSdhDrnu/aCYHFGHosdL9hbaWSHA==",
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/anchor-markdown-header/-/anchor-markdown-header-0.8.1.tgz",
+ "integrity": "sha512-x4BeGLWZLC+HZZ5edpmIEg96L/gIcBDtNlNSotCKpLE3Ky5eXgQ6G7iUmEoYSeTI0Y4fDq6IGOQ9u0Ue/N/H9w==",
+ "license": "MIT",
"dependencies": {
- "emoji-regex": "~10.1.0",
- "remove-markdown": "^0.5.0"
+ "emoji-regex": "~10.6.0",
+ "remove-markdown": "^0.6.2"
}
},
"node_modules/ansi-regex": {
@@ -1211,9 +1212,10 @@
"dev": true
},
"node_modules/emoji-regex": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.1.0.tgz",
- "integrity": "sha512-xAEnNCT3w2Tg6MA7ly6QqYJvEoY1tm9iIjJ3yMKK9JPlWuRHAMoe5iETwQnx3M9TVbFMfsrBgWKR+IsmswwNjg=="
+ "version": "10.6.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz",
+ "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==",
+ "license": "MIT"
},
"node_modules/entities": {
"version": "3.0.1",
@@ -2622,9 +2624,10 @@
}
},
"node_modules/remove-markdown": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/remove-markdown/-/remove-markdown-0.5.0.tgz",
- "integrity": "sha512-x917M80K97K5IN1L8lUvFehsfhR8cYjGQ/yAMRI9E7JIKivtl5Emo5iD13DhMr+VojzMCiYk8V2byNPwT/oapg=="
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/remove-markdown/-/remove-markdown-0.6.3.tgz",
+ "integrity": "sha512-Qvp2p0Q1irE7AaJO7QemJe04HdObHylJrG+q4hszvPlYp7q4EvfINpEIaIEFdB+3XTDp1h6fiyT60ae00gmRow==",
+ "license": "MIT"
},
"node_modules/repeat-string": {
"version": "1.6.1",
@@ -2994,7 +2997,6 @@
"dev": true,
"inBundle": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"@ampproject/remapping": "^2.1.0",
"@babel/code-frame": "^7.16.7",
@@ -3435,7 +3437,6 @@
"dev": true,
"inBundle": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"@types/prop-types": "*",
"@types/scheduler": "*",
@@ -4315,7 +4316,6 @@
"dev": true,
"inBundle": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"loose-envify": "^1.1.0",
"object-assign": "^4.1.1"
diff --git a/package.json b/package.json
index b61e07d7..ffd7421a 100644
--- a/package.json
+++ b/package.json
@@ -18,7 +18,7 @@
"bin": "doctoc.js",
"dependencies": {
"@textlint/markdown-to-ast": "^12.1.1",
- "anchor-markdown-header": "^0.7.0",
+ "anchor-markdown-header": "^0.8.1",
"htmlparser2": "^7.2.0",
"minimist": "^1.2.6",
"underscore": "^1.13.2",
From 79f7c77d80ecce08809462820196c6b5fb19b69e Mon Sep 17 00:00:00 2001
From: James Thompson
Date: Fri, 6 Feb 2026 13:00:37 +1100
Subject: [PATCH 5/7] Fix test
---
test/transform-weird-headers.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/test/transform-weird-headers.js b/test/transform-weird-headers.js
index 78182524..8cce9cfd 100644
--- a/test/transform-weird-headers.js
+++ b/test/transform-weird-headers.js
@@ -90,7 +90,7 @@ test('\nrandom md characters', function (t) {
, [ '**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)*',
'',
'- [Title with backslash `\\`](#title-with-backslash-)',
- '- [4 § Toimielimet](#4-%C2%A7-toimielimet)',
+ '- [4 § Toimielimet](#4--toimielimet)',
'- [Урок 8. Кроссплатформенность и виртуализация](#%D1%83%D1%80%D0%BE%D0%BA-8-%D0%BA%D1%80%D0%BE%D1%81%D1%81%D0%BF%D0%BB%D0%B0%D1%82%D1%84%D0%BE%D1%80%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D1%8C-%D0%B8-%D0%B2%D0%B8%D1%80%D1%82%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F)',
'- [Interface: SOME\\_NAME<\\>](#interface-some_name)',
'- [Version 1.10.5](#version-1105)',
@@ -107,7 +107,7 @@ test('\nrandom md characters', function (t) {
'- [`this identifier`](#this-identifier)',
'- [Header & noise](#header--noise)',
'- [CJK。](#cjk)',
- '- [¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿Latin 1](#%C2%AA%C2%B5%C2%BAlatin-1)',
+ '- [¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿Latin 1](#%C2%AA%C2%B5%C2%BAlatin-1)', //#ªµºLatin 1
'- [Instance properties inherited from `EventEmitter`](#instance-properties-inherited-from-eventemitter)',
'' ]
, 'generates a correct toc when readme has special characters in table headers'
From 61d1f45c4c4a223c1de6d8bbc011aa422947099a Mon Sep 17 00:00:00 2001
From: James Thompson
Date: Tue, 10 Feb 2026 10:09:05 +1100
Subject: [PATCH 6/7] bump dependency
---
package-lock.json | 6 +++---
package.json | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index d69ba43c..b343d1b4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,7 +10,7 @@
"license": "MIT",
"dependencies": {
"@textlint/markdown-to-ast": "^12.1.1",
- "anchor-markdown-header": "^0.8.1",
+ "anchor-markdown-header": "^0.8.2",
"htmlparser2": "^7.2.0",
"minimist": "^1.2.6",
"underscore": "^1.13.2",
@@ -676,8 +676,8 @@
}
},
"node_modules/anchor-markdown-header": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/anchor-markdown-header/-/anchor-markdown-header-0.8.1.tgz",
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/anchor-markdown-header/-/anchor-markdown-header-0.8.2.tgz",
"integrity": "sha512-x4BeGLWZLC+HZZ5edpmIEg96L/gIcBDtNlNSotCKpLE3Ky5eXgQ6G7iUmEoYSeTI0Y4fDq6IGOQ9u0Ue/N/H9w==",
"license": "MIT",
"dependencies": {
diff --git a/package.json b/package.json
index ffd7421a..a33666c4 100644
--- a/package.json
+++ b/package.json
@@ -18,7 +18,7 @@
"bin": "doctoc.js",
"dependencies": {
"@textlint/markdown-to-ast": "^12.1.1",
- "anchor-markdown-header": "^0.8.1",
+ "anchor-markdown-header": "^0.8.2",
"htmlparser2": "^7.2.0",
"minimist": "^1.2.6",
"underscore": "^1.13.2",
From 476f1e5f16cc1935b137d738b2a4f0a5fcaa6ef6 Mon Sep 17 00:00:00 2001
From: James Thompson
Date: Tue, 10 Feb 2026 10:14:56 +1100
Subject: [PATCH 7/7] Update integrity hash for anchor-markdown-header
Updated integrity hash for anchor-markdown-header package.
---
package-lock.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package-lock.json b/package-lock.json
index b343d1b4..ae9c81ea 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -678,7 +678,7 @@
"node_modules/anchor-markdown-header": {
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/anchor-markdown-header/-/anchor-markdown-header-0.8.2.tgz",
- "integrity": "sha512-x4BeGLWZLC+HZZ5edpmIEg96L/gIcBDtNlNSotCKpLE3Ky5eXgQ6G7iUmEoYSeTI0Y4fDq6IGOQ9u0Ue/N/H9w==",
+ "integrity": "sha512-ix0Hx6ARkHOsQRmt1++ZmjURq4Pr5MGXQJjh0lQ/l5jTpTURn4aqhbZ+AJMpZ/Sd3JiyNwi7KaeiF64OsMGCPg==",
"license": "MIT",
"dependencies": {
"emoji-regex": "~10.6.0",