Skip to content

Fix inline markup leaking into docs heading anchors#18197

Draft
pauldambra wants to merge 3 commits into
masterfrom
posthog-code/fix-heading-anchor-markup-leak
Draft

Fix inline markup leaking into docs heading anchors#18197
pauldambra wants to merge 3 commits into
masterfrom
posthog-code/fix-heading-anchor-markup-leak

Conversation

@pauldambra

Copy link
Copy Markdown
Member

Changes

Fixes docs section links where inline heading markup leaked into the anchor. Headings like the ones on PostHog AI example prompts put an icon <span> before the text, and gatsby-remark-autolink-headers slugged the whole thing — so ## <span>…<IconToggle /></span> Feature flags became an ID like #span-classnameinline-block…-feature-flags instead of #feature-flags.

  • Adds a small local remark plugin (plugins/gatsby-remark-heading-slug) that assigns a clean anchor ID to every heading before autolink-headers runs (which, with icon: false, only patches the ID and won't overwrite an existing one).
  • Centralizes the slug logic in gatsby/utils/headingSlug.js and reuses it for the sidebar table of contents (formatToc) and the Algolia search index, so the element ID, ToC links, and search fragments all agree. Also trims a leading space that previously slugged to a leading hyphen.

Why: section links on affected docs pages were broken because the heading markup was leaking into the URL fragment. Reported via a docs support ticket.

Checklist

  • I've read the docs and/or content style guides.
  • Words are spelled using American English
  • Use relative URLs for internal links
  • I've checked the pages added or changed in the Vercel preview build
  • If I moved a page, I added a redirect in vercel.json

Created with PostHog from a Slack thread

Headings that embed inline markup (e.g. an icon <span> before the text) had that
markup leak into their generated anchor ID, producing broken section links.

Adds a local remark plugin that assigns a clean anchor ID to every heading before
gatsby-remark-autolink-headers runs, stripping inline markup so it never reaches
the URL. A shared helper centralizes the slug logic and is reused by the sidebar
table of contents and the Algolia search index so all three agree (and trims a
leading space that previously slugged to a leading hyphen).

Generated-By: PostHog Code
Task-Id: 43f6aaf6-0c09-48da-8061-ebb543dc7318
@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

Deploy preview

Status Details Updated (UTC)
🟢 Ready View preview Jul 06, 2026 03:34PM

Comment thread gatsby/utils/headingSlug.js Fixed
@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

Bundle report

Total JS (gzip)

6.29 MiB (-0.0 KiB / -0.0%)

Eager graph (static-import closure per entrypoint)

Entrypoint Eager size Budget Modules
app 24.22 MiB (+0.3 KiB / +0.0%) report-only 5516
Largest modules in the app closure
Module Size
css ./node_modules/.pnpm/css-loader@5.2.7_webpack@5.101.3/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[8].oneOf[1].use[1]!./node_modules/.pnpm/postcss-loader@4.3.0_postcss@8.5.6_webpack@5.101.3/node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[8].oneOf[1].use[2]!./src/styles/global.css 707.7 KiB
./src/components/Stickers/Stickers.tsx 696.4 KiB
./.cache/caches/gatsby-plugin-mdx/mdx-scopes-dir/31a094f140f119e73085d847ae81b99b.js + 2 modules 585.5 KiB
./node_modules/.pnpm/@radix-ui+react-icons@1.3.2_react@18.3.1/node_modules/@radix-ui/react-icons/dist/react-icons.esm.js 481.4 KiB
./node_modules/.pnpm/@codemirror+view@6.38.2/node_modules/@codemirror/view/dist/index.js 458.1 KiB
./node_modules/.pnpm/rehype-raw@7.0.0/node_modules/rehype-raw/lib/index.js + 29 modules 395.1 KiB
./node_modules/.pnpm/@posthog+icons@0.36.6_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.cjs.js 364.8 KiB
./node_modules/.pnpm/@posthog+icons@0.36.6_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js 354.8 KiB
./src/hooks/useCustomers.tsx + 54 modules 353.9 KiB
./node_modules/.pnpm/react-markdown@8.0.7_@types+react@16.14.66_react@18.3.1/node_modules/react-markdown/lib/react-markdown.js + 88 modules 351.4 KiB
./node_modules/.pnpm/cloudinary-core@2.14.0_lodash@4.17.21/node_modules/cloudinary-core/cloudinary-core.js 281.9 KiB
./src/components/ProductComparisonTable/index.tsx + 116 modules 267.6 KiB
./node_modules/.pnpm/@codesandbox+sandpack-react@2.20.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@codesandbox/sandpack-react/dist/index.mjs 266.6 KiB
./node_modules/.pnpm/d3@7.9.0/node_modules/d3/src/index.js + 208 modules 247.4 KiB
./src/components/Pricing/PricingSlider/Slider.tsx + 87 modules 239.9 KiB

Eager-graph budgets are report-only until a baseline is established. Sizes are gzip of public/**/*.js; eager size is webpack module source bytes.

@pauldambra pauldambra added the stamphog Request AI approval (no full review) label Jul 6, 2026
CodeQL flagged the tag-stripping regex as incomplete multi-character
sanitization. Drop any leftover angle brackets after removing balanced tag
pairs so no partial tag can survive. Output for real headings is unchanged
(the icon spans are fully removed either way); this only hardens the helper
against malformed/unmatched markup.

Generated-By: PostHog Code
Task-Id: 43f6aaf6-0c09-48da-8061-ebb543dc7318
Comment thread gatsby/utils/headingSlug.js Fixed
CodeQL's "incomplete multi-character sanitization" query flags the tag-strip
regex on its shape, so the earlier bracket-removal follow-up didn't clear it.
Apply the removal repeatedly until the string stops changing — the remediation
CodeQL documents for this query. Output for real headings is unchanged.

Generated-By: PostHog Code
Task-Id: 43f6aaf6-0c09-48da-8061-ebb543dc7318
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

stamphog Request AI approval (no full review)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants