From bf75ab858d7cd21a34595401d2a036afa573244f Mon Sep 17 00:00:00 2001 From: Tobias Schmitz Date: Wed, 16 Jul 2025 13:57:41 +0200 Subject: [PATCH] feat: better alt text for footnote links --- crates/typst-layout/src/rules.rs | 2 +- crates/typst-library/src/model/footnote.rs | 12 +++++++++++- crates/typst-library/src/pdf/accessibility.rs | 3 ++- crates/typst-library/translations/ar.txt | 1 + crates/typst-library/translations/bg.txt | 1 + crates/typst-library/translations/ca.txt | 1 + crates/typst-library/translations/cs.txt | 1 + crates/typst-library/translations/da.txt | 1 + crates/typst-library/translations/de.txt | 1 + crates/typst-library/translations/el.txt | 1 + crates/typst-library/translations/en.txt | 1 + crates/typst-library/translations/es.txt | 1 + crates/typst-library/translations/et.txt | 1 + crates/typst-library/translations/eu.txt | 1 + crates/typst-library/translations/fi.txt | 1 + crates/typst-library/translations/fr.txt | 1 + crates/typst-library/translations/gl.txt | 1 + crates/typst-library/translations/he.txt | 1 + crates/typst-library/translations/hr.txt | 1 + crates/typst-library/translations/hu.txt | 1 + crates/typst-library/translations/id.txt | 1 + crates/typst-library/translations/is.txt | 1 + crates/typst-library/translations/it.txt | 1 + crates/typst-library/translations/ja.txt | 1 + crates/typst-library/translations/la.txt | 1 + crates/typst-library/translations/lv.txt | 1 + crates/typst-library/translations/nb.txt | 1 + crates/typst-library/translations/nl.txt | 1 + crates/typst-library/translations/nn.txt | 1 + crates/typst-library/translations/pl.txt | 1 + crates/typst-library/translations/pt-PT.txt | 1 + crates/typst-library/translations/pt.txt | 1 + crates/typst-library/translations/ro.txt | 1 + crates/typst-library/translations/ru.txt | 1 + crates/typst-library/translations/sl.txt | 1 + crates/typst-library/translations/sq.txt | 1 + crates/typst-library/translations/sr.txt | 1 + crates/typst-library/translations/sv.txt | 1 + crates/typst-library/translations/tl.txt | 1 + crates/typst-library/translations/tr.txt | 1 + crates/typst-library/translations/uk.txt | 1 + crates/typst-library/translations/vi.txt | 1 + crates/typst-library/translations/zh-TW.txt | 1 + crates/typst-library/translations/zh.txt | 1 + 44 files changed, 55 insertions(+), 3 deletions(-) diff --git a/crates/typst-layout/src/rules.rs b/crates/typst-layout/src/rules.rs index 5fa5e7270..09c247e9a 100644 --- a/crates/typst-layout/src/rules.rs +++ b/crates/typst-layout/src/rules.rs @@ -384,7 +384,7 @@ 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 alt = num.plain_text(); + let alt = FootnoteElem::alt_text(styles, &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". diff --git a/crates/typst-library/src/model/footnote.rs b/crates/typst-library/src/model/footnote.rs index 147a3f009..949bd8aba 100644 --- a/crates/typst-library/src/model/footnote.rs +++ b/crates/typst-library/src/model/footnote.rs @@ -1,6 +1,7 @@ use std::num::NonZeroUsize; use std::str::FromStr; +use ecow::{eco_format, EcoString}; use typst_utils::NonZeroExt; use crate::diag::{bail, StrResult}; @@ -12,7 +13,7 @@ use crate::foundations::{ use crate::introspection::{Count, CounterUpdate, Locatable, Location}; use crate::layout::{Abs, Em, Length, Ratio}; use crate::model::{Numbering, NumberingPattern, ParElem}; -use crate::text::{TextElem, TextSize}; +use crate::text::{LocalName, TextElem, TextSize}; use crate::visualize::{LineElem, Stroke}; /// A footnote. @@ -82,7 +83,16 @@ impl FootnoteElem { type FootnoteEntry; } +impl LocalName for Packed { + const KEY: &'static str = "footnote"; +} + impl FootnoteElem { + pub fn alt_text(styles: StyleChain, num: &str) -> EcoString { + let local_name = Packed::::local_name_in(styles); + eco_format!("{local_name} {num}") + } + /// Creates a new footnote that the passed content as its body. pub fn with_content(content: Content) -> Self { Self::new(FootnoteBody::Content(content)) diff --git a/crates/typst-library/src/pdf/accessibility.rs b/crates/typst-library/src/pdf/accessibility.rs index 732bac319..142e7ff50 100644 --- a/crates/typst-library/src/pdf/accessibility.rs +++ b/crates/typst-library/src/pdf/accessibility.rs @@ -122,7 +122,8 @@ macro_rules! pdf_marker_tag { #[doc = $doc] #[allow(non_snake_case)] pub fn $variant(body: Content) -> Content { - Self::new(PdfMarkerTagKind::$variant, body).pack() + let span = body.span(); + Self::new(PdfMarkerTagKind::$variant, body).pack().spanned(span) } )+ } diff --git a/crates/typst-library/translations/ar.txt b/crates/typst-library/translations/ar.txt index 7af2aaa91..a39bf71a6 100644 --- a/crates/typst-library/translations/ar.txt +++ b/crates/typst-library/translations/ar.txt @@ -6,3 +6,4 @@ heading = الفصل outline = المحتويات raw = قائمة page = صفحة +# footnote = diff --git a/crates/typst-library/translations/bg.txt b/crates/typst-library/translations/bg.txt index e377af398..29aa03316 100644 --- a/crates/typst-library/translations/bg.txt +++ b/crates/typst-library/translations/bg.txt @@ -6,3 +6,4 @@ heading = Раздел outline = Съдържание raw = Приложение page = стр. +# footnote = diff --git a/crates/typst-library/translations/ca.txt b/crates/typst-library/translations/ca.txt index f02473293..880f83411 100644 --- a/crates/typst-library/translations/ca.txt +++ b/crates/typst-library/translations/ca.txt @@ -6,3 +6,4 @@ heading = Secció outline = Índex raw = Llistat page = pàgina +# footnote = diff --git a/crates/typst-library/translations/cs.txt b/crates/typst-library/translations/cs.txt index 417f1ab2e..f0986523f 100644 --- a/crates/typst-library/translations/cs.txt +++ b/crates/typst-library/translations/cs.txt @@ -6,3 +6,4 @@ heading = Kapitola outline = Obsah raw = Výpis page = strana +# footnote = diff --git a/crates/typst-library/translations/da.txt b/crates/typst-library/translations/da.txt index 4ceeda065..0ef36f3c2 100644 --- a/crates/typst-library/translations/da.txt +++ b/crates/typst-library/translations/da.txt @@ -6,3 +6,4 @@ heading = Afsnit outline = Indhold raw = Liste page = side +# footnote = diff --git a/crates/typst-library/translations/de.txt b/crates/typst-library/translations/de.txt index a9da1adb4..8d43f6706 100644 --- a/crates/typst-library/translations/de.txt +++ b/crates/typst-library/translations/de.txt @@ -6,3 +6,4 @@ heading = Abschnitt outline = Inhaltsverzeichnis raw = Listing page = Seite +footnote = Fußnote diff --git a/crates/typst-library/translations/el.txt b/crates/typst-library/translations/el.txt index 3853a45bb..05c8dd615 100644 --- a/crates/typst-library/translations/el.txt +++ b/crates/typst-library/translations/el.txt @@ -5,3 +5,4 @@ bibliography = Βιβλιογραφία heading = Κεφάλαιο outline = Περιεχόμενα raw = Παράθεση +# footnote = diff --git a/crates/typst-library/translations/en.txt b/crates/typst-library/translations/en.txt index fa2d65b91..21ae372a5 100644 --- a/crates/typst-library/translations/en.txt +++ b/crates/typst-library/translations/en.txt @@ -6,3 +6,4 @@ heading = Section outline = Contents raw = Listing page = page +footnote = Footnote diff --git a/crates/typst-library/translations/es.txt b/crates/typst-library/translations/es.txt index 8fe9929d8..0d95a3cb4 100644 --- a/crates/typst-library/translations/es.txt +++ b/crates/typst-library/translations/es.txt @@ -6,3 +6,4 @@ heading = Sección outline = Índice raw = Listado page = página +# footnote = diff --git a/crates/typst-library/translations/et.txt b/crates/typst-library/translations/et.txt index 588929052..0f1ea245b 100644 --- a/crates/typst-library/translations/et.txt +++ b/crates/typst-library/translations/et.txt @@ -6,3 +6,4 @@ heading = Peatükk outline = Sisukord raw = List page = lk. +# footnote = diff --git a/crates/typst-library/translations/eu.txt b/crates/typst-library/translations/eu.txt index d89f89b6f..257286873 100644 --- a/crates/typst-library/translations/eu.txt +++ b/crates/typst-library/translations/eu.txt @@ -6,3 +6,4 @@ heading = Atala outline = Aurkibidea raw = Kodea page = orria +# footnote = diff --git a/crates/typst-library/translations/fi.txt b/crates/typst-library/translations/fi.txt index edb88de8d..d0faa5e3d 100644 --- a/crates/typst-library/translations/fi.txt +++ b/crates/typst-library/translations/fi.txt @@ -6,3 +6,4 @@ heading = Osio outline = Sisällys raw = Esimerkki page = sivu +# footnote = diff --git a/crates/typst-library/translations/fr.txt b/crates/typst-library/translations/fr.txt index f8e27c9c0..4d08bf828 100644 --- a/crates/typst-library/translations/fr.txt +++ b/crates/typst-library/translations/fr.txt @@ -6,3 +6,4 @@ heading = Chapitre outline = Table des matières raw = Liste page = page +# footnote = diff --git a/crates/typst-library/translations/gl.txt b/crates/typst-library/translations/gl.txt index 49bf01b74..0f4918bc3 100644 --- a/crates/typst-library/translations/gl.txt +++ b/crates/typst-library/translations/gl.txt @@ -6,3 +6,4 @@ heading = Sección outline = Índice raw = Listado page = páxina +# footnote = diff --git a/crates/typst-library/translations/he.txt b/crates/typst-library/translations/he.txt index 5317c9278..c9b069c0c 100644 --- a/crates/typst-library/translations/he.txt +++ b/crates/typst-library/translations/he.txt @@ -6,3 +6,4 @@ heading = חלק outline = תוכן עניינים raw = קטע מקור page = עמוד +# footnote = diff --git a/crates/typst-library/translations/hr.txt b/crates/typst-library/translations/hr.txt index ea0754592..4243aa6d4 100644 --- a/crates/typst-library/translations/hr.txt +++ b/crates/typst-library/translations/hr.txt @@ -6,3 +6,4 @@ heading = Odjeljak outline = Sadržaj raw = Kôd page = str. +# footnote = diff --git a/crates/typst-library/translations/hu.txt b/crates/typst-library/translations/hu.txt index a88da3e54..fd7cb3485 100644 --- a/crates/typst-library/translations/hu.txt +++ b/crates/typst-library/translations/hu.txt @@ -6,3 +6,4 @@ heading = Fejezet outline = Tartalomjegyzék # raw = page = oldal +# footnote = diff --git a/crates/typst-library/translations/id.txt b/crates/typst-library/translations/id.txt index bea5ee18c..d3ce5818a 100644 --- a/crates/typst-library/translations/id.txt +++ b/crates/typst-library/translations/id.txt @@ -6,3 +6,4 @@ heading = Bagian outline = Daftar Isi raw = Kode page = halaman +# footnote = diff --git a/crates/typst-library/translations/is.txt b/crates/typst-library/translations/is.txt index 756c97700..b1bc8922a 100644 --- a/crates/typst-library/translations/is.txt +++ b/crates/typst-library/translations/is.txt @@ -6,3 +6,4 @@ heading = Kafli outline = Efnisyfirlit raw = Sýnishorn page = blaðsíða +# footnote = diff --git a/crates/typst-library/translations/it.txt b/crates/typst-library/translations/it.txt index 9f3c352db..9e282b0ff 100644 --- a/crates/typst-library/translations/it.txt +++ b/crates/typst-library/translations/it.txt @@ -6,3 +6,4 @@ heading = Sezione outline = Indice raw = Codice page = pag. +# footnote = diff --git a/crates/typst-library/translations/ja.txt b/crates/typst-library/translations/ja.txt index 484b20a62..8c01fb122 100644 --- a/crates/typst-library/translations/ja.txt +++ b/crates/typst-library/translations/ja.txt @@ -6,3 +6,4 @@ heading = 節 outline = 目次 raw = リスト page = ページ +# footnote = diff --git a/crates/typst-library/translations/la.txt b/crates/typst-library/translations/la.txt index d25517c2f..90912bf1a 100644 --- a/crates/typst-library/translations/la.txt +++ b/crates/typst-library/translations/la.txt @@ -6,3 +6,4 @@ heading = Caput outline = Index capitum raw = Exemplum page = charta +# footnote = diff --git a/crates/typst-library/translations/lv.txt b/crates/typst-library/translations/lv.txt index 4c6b86841..8d436fce1 100644 --- a/crates/typst-library/translations/lv.txt +++ b/crates/typst-library/translations/lv.txt @@ -6,3 +6,4 @@ heading = Sadaļa outline = Saturs raw = Saraksts page = lpp. +# footnote = diff --git a/crates/typst-library/translations/nb.txt b/crates/typst-library/translations/nb.txt index edf66b53f..0d718fd27 100644 --- a/crates/typst-library/translations/nb.txt +++ b/crates/typst-library/translations/nb.txt @@ -6,3 +6,4 @@ heading = Kapittel outline = Innhold raw = Utskrift page = side +# footnote = diff --git a/crates/typst-library/translations/nl.txt b/crates/typst-library/translations/nl.txt index 24b8315f0..d707031b5 100644 --- a/crates/typst-library/translations/nl.txt +++ b/crates/typst-library/translations/nl.txt @@ -6,3 +6,4 @@ heading = Hoofdstuk outline = Inhoudsopgave raw = Listing page = pagina +# footnote = diff --git a/crates/typst-library/translations/nn.txt b/crates/typst-library/translations/nn.txt index 2c2a27a76..7ccaae1cd 100644 --- a/crates/typst-library/translations/nn.txt +++ b/crates/typst-library/translations/nn.txt @@ -6,3 +6,4 @@ heading = Kapittel outline = Innhald raw = Utskrift page = side +# footnote = diff --git a/crates/typst-library/translations/pl.txt b/crates/typst-library/translations/pl.txt index cc8f4b36b..31a392b0d 100644 --- a/crates/typst-library/translations/pl.txt +++ b/crates/typst-library/translations/pl.txt @@ -6,3 +6,4 @@ heading = Sekcja outline = Spis treści raw = Program page = strona +# footnote = diff --git a/crates/typst-library/translations/pt-PT.txt b/crates/typst-library/translations/pt-PT.txt index 1d68ab858..56929b488 100644 --- a/crates/typst-library/translations/pt-PT.txt +++ b/crates/typst-library/translations/pt-PT.txt @@ -6,3 +6,4 @@ heading = Secção outline = Índice # raw = page = página +# footnote = diff --git a/crates/typst-library/translations/pt.txt b/crates/typst-library/translations/pt.txt index 398a75f37..3a579c73d 100644 --- a/crates/typst-library/translations/pt.txt +++ b/crates/typst-library/translations/pt.txt @@ -6,3 +6,4 @@ heading = Seção outline = Sumário raw = Listagem page = página +# footnote = diff --git a/crates/typst-library/translations/ro.txt b/crates/typst-library/translations/ro.txt index f5d44f726..89962e76a 100644 --- a/crates/typst-library/translations/ro.txt +++ b/crates/typst-library/translations/ro.txt @@ -7,3 +7,4 @@ outline = Cuprins # may be wrong raw = Listă page = pagina +# footnote = diff --git a/crates/typst-library/translations/ru.txt b/crates/typst-library/translations/ru.txt index 49cb34cb1..a9fab2548 100644 --- a/crates/typst-library/translations/ru.txt +++ b/crates/typst-library/translations/ru.txt @@ -6,3 +6,4 @@ heading = Раздел outline = Содержание raw = Листинг page = с. +# footnote = diff --git a/crates/typst-library/translations/sl.txt b/crates/typst-library/translations/sl.txt index 4c8a568ce..743639b7a 100644 --- a/crates/typst-library/translations/sl.txt +++ b/crates/typst-library/translations/sl.txt @@ -6,3 +6,4 @@ heading = Poglavje outline = Kazalo raw = Program page = stran +# footnote = diff --git a/crates/typst-library/translations/sq.txt b/crates/typst-library/translations/sq.txt index 11ba53212..37c0b2e51 100644 --- a/crates/typst-library/translations/sq.txt +++ b/crates/typst-library/translations/sq.txt @@ -6,3 +6,4 @@ heading = Kapitull outline = Përmbajtja raw = List page = faqe +# footnote = diff --git a/crates/typst-library/translations/sr.txt b/crates/typst-library/translations/sr.txt index e4e8f1272..2b6ee4021 100644 --- a/crates/typst-library/translations/sr.txt +++ b/crates/typst-library/translations/sr.txt @@ -6,3 +6,4 @@ heading = Поглавље outline = Садржај raw = Програм page = страна +# footnote = diff --git a/crates/typst-library/translations/sv.txt b/crates/typst-library/translations/sv.txt index 538f466b0..6ae8a582c 100644 --- a/crates/typst-library/translations/sv.txt +++ b/crates/typst-library/translations/sv.txt @@ -6,3 +6,4 @@ heading = Avsnitt outline = Innehåll raw = Kodlistning page = sida +# footnote = diff --git a/crates/typst-library/translations/tl.txt b/crates/typst-library/translations/tl.txt index 39cff5e36..e269d0289 100644 --- a/crates/typst-library/translations/tl.txt +++ b/crates/typst-library/translations/tl.txt @@ -6,3 +6,4 @@ heading = Seksyon outline = Talaan ng mga Nilalaman raw = Listahan # page = +# footnote = diff --git a/crates/typst-library/translations/tr.txt b/crates/typst-library/translations/tr.txt index f6e2cfe29..3e9b48675 100644 --- a/crates/typst-library/translations/tr.txt +++ b/crates/typst-library/translations/tr.txt @@ -6,3 +6,4 @@ heading = Bölüm outline = İçindekiler raw = Liste page = sayfa +# footnote = diff --git a/crates/typst-library/translations/uk.txt b/crates/typst-library/translations/uk.txt index 4794c3311..e87214bf5 100644 --- a/crates/typst-library/translations/uk.txt +++ b/crates/typst-library/translations/uk.txt @@ -6,3 +6,4 @@ heading = Розділ outline = Зміст raw = Лістинг page = c. +# footnote = diff --git a/crates/typst-library/translations/vi.txt b/crates/typst-library/translations/vi.txt index 8ccfdf02f..7b4aabfa6 100644 --- a/crates/typst-library/translations/vi.txt +++ b/crates/typst-library/translations/vi.txt @@ -7,3 +7,4 @@ outline = Mục lục # may be wrong raw = Chương trình page = trang +# footnote = diff --git a/crates/typst-library/translations/zh-TW.txt b/crates/typst-library/translations/zh-TW.txt index 4407f323e..e88753718 100644 --- a/crates/typst-library/translations/zh-TW.txt +++ b/crates/typst-library/translations/zh-TW.txt @@ -6,3 +6,4 @@ heading = 小節 outline = 目錄 raw = 程式 # page = +# footnote = diff --git a/crates/typst-library/translations/zh.txt b/crates/typst-library/translations/zh.txt index 32dc40107..a6f523ea0 100644 --- a/crates/typst-library/translations/zh.txt +++ b/crates/typst-library/translations/zh.txt @@ -6,3 +6,4 @@ heading = 小节 outline = 目录 raw = 代码 # page = +# footnote =