diff --git a/.changeset/fix-dollar-replacement.md b/.changeset/fix-dollar-replacement.md new file mode 100644 index 00000000..26d88d4d --- /dev/null +++ b/.changeset/fix-dollar-replacement.md @@ -0,0 +1,7 @@ +--- +'@node-core/doc-kit-legacy': patch +'@node-core/doc-kit': patch +'@doc-kit/generator-react': patch +--- + +Fix `$$`, `$&`, `` $` `` and `$'` in page content being treated as `String.prototype.replace` replacement patterns instead of literal text. This affected the legacy HTML generator's page and navigation content, the man page generator's options/environment sections, and the sitemap generator's URL entries. diff --git a/packages/node-legacy/src/legacy-html/utils/__tests__/replaceTemplateValues.test.mjs b/packages/node-legacy/src/legacy-html/utils/__tests__/replaceTemplateValues.test.mjs new file mode 100644 index 00000000..1cb51bbf --- /dev/null +++ b/packages/node-legacy/src/legacy-html/utils/__tests__/replaceTemplateValues.test.mjs @@ -0,0 +1,57 @@ +'use strict'; + +import assert from 'node:assert/strict'; +import { before, describe, it } from 'node:test'; + +import { setConfig } from '@doc-kit/core/utils/configuration/index.mjs'; + +import { replaceTemplateValues } from '../replaceTemplateValues.mjs'; + +describe('replaceTemplateValues', () => { + before(() => setConfig({})); + + const baseValues = { + path: '/test', + api: 'test', + added: undefined, + section: 'section', + toc: [], + nav: 'nav', + content: 'content', + }; + + const config = { version: { version: '1.0.0' }, changelog: [] }; + + it('does not treat `$$`, `$&`, "$`" and `$\'` in content as replacement patterns', () => { + const template = '
__CONTENT__
'; + + const dollarContent = 'dirname "$$(command -v node)" $& $` $\''; + + const output = replaceTemplateValues( + template, + { ...baseValues, content: dollarContent }, + config, + { skipGitHub: true } + ); + + assert.match( + output, + /
dirname "\$\$\(command -v node\)" \$& \$` \$'<\/main>/ + ); + }); + + it('does not treat `$$`, `$&`, "$`" and `$\'` in nav as replacement patterns', () => { + const template = '
__CONTENT__
'; + + const dollarNav = "nav $$ $& $` $'"; + + const output = replaceTemplateValues( + template, + { ...baseValues, nav: dollarNav }, + config, + { skipGitHub: true } + ); + + assert.match(output, /