Compare commits

..

1 Commits

3 changed files with 17 additions and 35 deletions

View File

@ -222,10 +222,9 @@ const LINK_MARKER_RULE: ShowFn<LinkMarker> = |elem, _, _| Ok(elem.body.clone());
const LINK_RULE: ShowFn<LinkElem> = |elem, engine, styles| { const LINK_RULE: ShowFn<LinkElem> = |elem, engine, styles| {
let body = elem.body.clone(); let body = elem.body.clone();
let dest = elem.dest.resolve(engine.introspector).at(elem.span())?; let dest = elem.dest.resolve(engine.introspector).at(elem.span())?;
let alt = match elem.alt.get_cloned(styles) { let url = || dest.as_url().map(|url| url.clone().into_inner());
Some(alt) => Some(alt), // TODO(accessibility): remove custom alt field and generate alt text
None => dest.alt_text(engine, styles)?, let alt = elem.alt.get_cloned(styles).or_else(url);
};
Ok(body.linked(dest, alt)) Ok(body.linked(dest, alt))
}; };

View File

@ -795,8 +795,8 @@ impl<'a> Generator<'a> {
renderer.display_elem_child(elem, &mut None, false)?; renderer.display_elem_child(elem, &mut None, false)?;
if let Some(location) = first_occurrences.get(item.key.as_str()) { if let Some(location) = first_occurrences.get(item.key.as_str()) {
let dest = Destination::Location(*location); let dest = Destination::Location(*location);
let alt = content.plain_text(); // TODO(accessibility): generate alt text
content = content.linked(dest, Some(alt)); content = content.linked(dest, None);
} }
StrResult::Ok(content) StrResult::Ok(content)
}) })
@ -931,8 +931,8 @@ impl ElemRenderer<'_> {
if let Some(hayagriva::ElemMeta::Entry(i)) = elem.meta { if let Some(hayagriva::ElemMeta::Entry(i)) = elem.meta {
if let Some(location) = (self.link)(i) { if let Some(location) = (self.link)(i) {
let dest = Destination::Location(location); let dest = Destination::Location(location);
let alt = content.plain_text(); // TODO(accessibility): generate alt text
content = content.linked(dest, Some(alt)); content = content.linked(dest, None);
} }
} }

View File

@ -1,18 +1,15 @@
use std::ops::Deref; use std::ops::Deref;
use std::str::FromStr;
use comemo::Tracked; use comemo::Tracked;
use ecow::{eco_format, EcoString}; use ecow::{eco_format, EcoString};
use crate::diag::{bail, SourceResult, StrResult}; use crate::diag::{bail, StrResult};
use crate::engine::Engine;
use crate::foundations::{ use crate::foundations::{
cast, elem, Content, Label, Packed, Repr, ShowSet, Smart, StyleChain, Styles, cast, elem, Content, Label, Packed, Repr, ShowSet, Smart, StyleChain, Styles,
}; };
use crate::introspection::{Counter, CounterKey, Introspector, Locatable, Location}; use crate::introspection::{Introspector, Locatable, Location};
use crate::layout::{PageElem, Position}; use crate::layout::Position;
use crate::model::NumberingPattern; use crate::text::TextElem;
use crate::text::{LocalName, TextElem};
/// Links to a URL or a location in the document. /// Links to a URL or a location in the document.
/// ///
@ -219,26 +216,12 @@ pub enum Destination {
} }
impl Destination { impl Destination {
pub fn alt_text( pub fn as_url(&self) -> Option<&Url> {
&self, if let Self::Url(v) = self {
engine: &mut Engine, Some(v)
styles: StyleChain, } else {
) -> SourceResult<Option<EcoString>> { None
let alt = match self { }
Destination::Url(url) => Some(url.clone().into_inner()),
Destination::Position(_) => None,
&Destination::Location(loc) => {
let numbering = loc
.page_numbering(engine)
.unwrap_or_else(|| NumberingPattern::from_str("1").unwrap().into());
let content = Counter::new(CounterKey::Page)
.display_at_loc(engine, loc, styles, &numbering)?;
let page_nr = content.plain_text();
let page_str = PageElem::local_name_in(styles);
Some(eco_format!("{page_str} {page_nr}"))
}
};
Ok(alt)
} }
} }