Skip to content

Markdown viewer: support <a href> and <a id> anchor links #13725

Description

@fbartho

Pre-submit Checks

Describe the solution you'd like?

Warp's Markdown Viewer should render raw HTML <a href="…"> links as clickable links, and <a id="…"> (or name="…") as named anchor targets that in-page #fragment links can jump to. Both are everyday patterns in hand-built READMEs and docs.

Expected behavior: <a href="https://…"> renders as a clickable external link. <a href="#target-section"> (and the markdown [text](#fragment) equivalent) scrolls to the element carrying a matching <a id="target-section"> (or heading slug, if Warp adds heading-based anchors as part of this work).

Is your feature request related to a problem? Please describe.

Hand-built tables of contents commonly pair <a id="section"> anchor targets with [Jump to Section](#section) links, or use raw <a href> tags directly for external links when an author wants attributes markdown can't express (e.g. title, target). Today neither raw HTML anchors nor anchor-target resolution work in Warp's viewer, so any doc using this pattern loses its navigation.

Concretely, today in Warp's Markdown Viewer (verified on this build):

Screenshot showing anchor tags as raw code

Raw <a href="#target-section">/<a href="https://…"> tags render as literal text instead of clickable links, and the markdown-native [Jump to Target Section](#target-section) link resolves as a plain URL hyperlink rather than scrolling to the heading below it — there's no anchor-target resolution at all, HTML or markdown.

Additional context

Test case:

# Anchor links (`<a href>`, `<a id>`)

Should render: a clickable link to an external URL, a clickable in-page jump to the "Target Section" heading below, and a named anchor target. Currently: expect literal HTML text instead of live links, and the `[Jump to Target Section](#target-section)` markdown link to resolve as a plain URL hyperlink (not scrolled to the heading).

Jump via raw HTML: <a href="#target-section">Jump to Target Section</a>

Jump via markdown link (contrast): [Jump to Target Section](#target-section)

External link via raw HTML: <a href="https://warp.dev">Visit Warp</a>

<a id="target-section"></a>

## Target Section

This is the heading the links above should scroll to.

Code pointers. As far as I can tell:

  • crates/markdown_parser/src/markdown_parser.rs's InlineToken enum has no HTML-tag token at all, so raw <a> tags never get special-cased on the .md render path.
  • The paste-path parser (crates/markdown_parser/src/html_parser.rs) does style <a href> when converting pasted HTML to FormattedText, but that code path is only reachable from Notebooks clipboard paste — it's not wired into .md file rendering.
  • There's no anchor/slug concept anywhere in the content model — FormattedTextHeader has no id/slug field, and I couldn't find any scroll-to-fragment infrastructure. This means both the <a id> half of this request and heading-based anchor resolution for markdown links ([text](#heading)) are new territory, not just a missing tag handler.

Related: this splits out one tag from #13652 (bulk raw-HTML-subset request, since closed in favor of per-feature issues). See also #13083 and #4720 — table-of-contents requests; working in-document anchor links are a prerequisite for any TOC feature. Sibling issues from the same split: #13721 (<img> sizing), #13726 (raw HTML tables), #10259 (<details>/<summary> — pre-existing request), #13732 (<br>), #13733 (<kbd>), #13734 (<sub>/<sup>), #13735 (align on <p>/<div>), #13736 (<picture>/<source>)

Operating system (OS)

macOS

How important is this feature to you?

3

Warp Internal (ignore) - linear-label:39cc6478-1249-4ee7-950b-c428edfeecd1

No response


Scope update (2026-07-18): cross-document fragment links (other-file.md#section) are in scope for the initial implementation PR (#13962) alongside same-document fragments — a fragment link should work regardless of whether its target is in the current document. This surfaced three latent defects in relative-link resolution the PR also addresses: bare file.md targets misclassified as domains (.md is a ccTLD in the public suffix list), #fragment suffixes never stripped before file lookup, and standalone viewer tabs lacking a document-relative resolution base. Explicit <a id>/<a name> anchor targets remain the follow-up phase.

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:editor-notebooksEditors, notebooks, markdown rendering, LSP, and code display.enhancementNew feature or request.ready-to-specThe issue is ready for a product and technical spec.repro:highThe report includes enough evidence that the issue appears highly reproducible.triagedIssue has received an initial automated triage pass.warp:auto-triage-review

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions