From 728d37efa06265f9d1dde811200f7ef7b773daeb Mon Sep 17 00:00:00 2001 From: Tobias Schmitz Date: Tue, 15 Jul 2025 16:54:15 +0200 Subject: [PATCH] feat: generate tags for footnotes --- crates/typst-layout/src/rules.rs | 14 ++++++-------- crates/typst-pdf/src/tags/mod.rs | 6 ++++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/crates/typst-layout/src/rules.rs b/crates/typst-layout/src/rules.rs index 77aa8034f..e0945a708 100644 --- a/crates/typst-layout/src/rules.rs +++ b/crates/typst-layout/src/rules.rs @@ -394,11 +394,11 @@ const FOOTNOTE_RULE: ShowFn = |elem, engine, styles| { let numbering = elem.numbering.get_ref(styles); let counter = Counter::of(FootnoteElem::ELEM); let num = counter.display_at_loc(engine, loc, styles, numbering)?; - let sup = SuperElem::new(num).pack().spanned(span); + let alt = num.plain_text(); + let sup = PdfMarkerTag::Label(SuperElem::new(num).pack().spanned(span)); let loc = loc.variant(1); // Add zero-width weak spacing to make the footnote "sticky". - // TODO(accessibility): generate alt text - Ok(HElem::hole().pack() + sup.linked(Destination::Location(loc), None)) + Ok(HElem::hole().pack() + sup.linked(Destination::Location(loc), Some(alt))) }; const FOOTNOTE_ENTRY_RULE: ShowFn = |elem, engine, styles| { @@ -415,11 +415,9 @@ const FOOTNOTE_ENTRY_RULE: ShowFn = |elem, engine, styles| { }; let num = counter.display_at_loc(engine, loc, styles, numbering)?; - let sup = SuperElem::new(num) - .pack() - .spanned(span) - // TODO(accessibility): generate alt text - .linked(Destination::Location(loc), None) + let alt = num.plain_text(); + let sup = PdfMarkerTag::Label(SuperElem::new(num).pack().spanned(span)) + .linked(Destination::Location(loc), Some(alt)) .located(loc.variant(1)); Ok(Content::sequence([ diff --git a/crates/typst-pdf/src/tags/mod.rs b/crates/typst-pdf/src/tags/mod.rs index d8eeb6faf..299a0261a 100644 --- a/crates/typst-pdf/src/tags/mod.rs +++ b/crates/typst-pdf/src/tags/mod.rs @@ -17,8 +17,8 @@ use typst_library::foundations::{ use typst_library::introspection::Location; use typst_library::layout::RepeatElem; use typst_library::model::{ - Destination, EnumElem, FigureCaption, FigureElem, HeadingElem, ListElem, Outlinable, - OutlineEntry, TableCell, TableElem, TermsElem, + Destination, EnumElem, FigureCaption, FigureElem, FootnoteEntry, HeadingElem, + ListElem, Outlinable, OutlineEntry, TableCell, TableElem, TermsElem, }; use typst_library::pdf::{ArtifactElem, ArtifactKind, PdfMarkerTag, PdfMarkerTagKind}; use typst_library::visualize::ImageElem; @@ -141,6 +141,8 @@ pub(crate) fn handle_start( let link_id = gc.tags.next_link_id(); push_stack(gc, loc, StackEntryKind::Link(link_id, link.clone()))?; return Ok(()); + } else if let Some(_) = elem.to_packed::() { + TagKind::Note.into() } else { return Ok(()); };