mirror of
https://github.com/typst/typst
synced 2025-07-01 09:42:53 +08:00
Expose the formatted page in outline.entry (#1506)
This commit is contained in:
parent
53775b5f07
commit
57d4b8b751
@ -209,7 +209,12 @@ impl Show for OutlineElem {
|
|||||||
let elems = vt.introspector.query(&self.target(styles).0);
|
let elems = vt.introspector.query(&self.target(styles).0);
|
||||||
|
|
||||||
for elem in &elems {
|
for elem in &elems {
|
||||||
let Some(entry) = OutlineEntry::from_outlinable(vt, self.span(), elem.clone().into_inner(), self.fill(styles))? else {
|
let Some(entry) = OutlineEntry::from_outlinable(
|
||||||
|
vt,
|
||||||
|
self.span(),
|
||||||
|
elem.clone().into_inner(),
|
||||||
|
self.fill(styles),
|
||||||
|
)? else {
|
||||||
continue;
|
continue;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -409,7 +414,7 @@ cast! {
|
|||||||
/// ```
|
/// ```
|
||||||
///
|
///
|
||||||
/// To completely customize an entry's line, you can also build it from scratch
|
/// To completely customize an entry's line, you can also build it from scratch
|
||||||
/// by accessing the `level`, `element`, `body`, and `fill` fields on the entry.
|
/// by accessing the `level`, `element`, `body`, `fill` and `page` fields on the entry.
|
||||||
///
|
///
|
||||||
/// Display: Outline Entry
|
/// Display: Outline Entry
|
||||||
/// Category: meta
|
/// Category: meta
|
||||||
@ -442,13 +447,18 @@ pub struct OutlineEntry {
|
|||||||
/// precisely as many `-` characters as necessary to fill a particular gap.
|
/// precisely as many `-` characters as necessary to fill a particular gap.
|
||||||
#[required]
|
#[required]
|
||||||
pub fill: Option<Content>,
|
pub fill: Option<Content>,
|
||||||
|
|
||||||
|
/// The page number of the element this entry links to, formatted with the
|
||||||
|
/// numbering set for the referenced page.
|
||||||
|
#[required]
|
||||||
|
pub page: Content,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl OutlineEntry {
|
impl OutlineEntry {
|
||||||
/// Generates an OutlineEntry from the given element, if possible
|
/// Generates an OutlineEntry from the given element, if possible (errors if
|
||||||
/// (errors if the element does not implement Outlinable).
|
/// the element does not implement `Outlinable`). If the element should not
|
||||||
/// If the element cannot be outlined (e.g. heading with 'outlined: false'),
|
/// be outlined (e.g. heading with 'outlined: false'), does not generate an
|
||||||
/// does not generate an entry instance (returns Ok(None)).
|
/// entry instance (returns `Ok(None)`).
|
||||||
fn from_outlinable(
|
fn from_outlinable(
|
||||||
vt: &mut Vt,
|
vt: &mut Vt,
|
||||||
span: Span,
|
span: Span,
|
||||||
@ -463,12 +473,26 @@ impl OutlineEntry {
|
|||||||
return Ok(None);
|
return Ok(None);
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(Some(Self::new(outlinable.level(), elem, body, fill)))
|
let location = elem.location().unwrap();
|
||||||
|
let page_numbering = vt
|
||||||
|
.introspector
|
||||||
|
.page_numbering(location)
|
||||||
|
.cast::<Option<Numbering>>()
|
||||||
|
.unwrap()
|
||||||
|
.unwrap_or_else(|| {
|
||||||
|
Numbering::Pattern(NumberingPattern::from_str("1").unwrap())
|
||||||
|
});
|
||||||
|
|
||||||
|
let page = Counter::new(CounterKey::Page)
|
||||||
|
.at(vt, location)?
|
||||||
|
.display(vt, &page_numbering)?;
|
||||||
|
|
||||||
|
Ok(Some(Self::new(outlinable.level(), elem, body, fill, page)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Show for OutlineEntry {
|
impl Show for OutlineEntry {
|
||||||
fn show(&self, vt: &mut Vt, _: StyleChain) -> SourceResult<Content> {
|
fn show(&self, _vt: &mut Vt, _: StyleChain) -> SourceResult<Content> {
|
||||||
let mut seq = vec![];
|
let mut seq = vec![];
|
||||||
let elem = self.element();
|
let elem = self.element();
|
||||||
|
|
||||||
@ -494,21 +518,9 @@ impl Show for OutlineEntry {
|
|||||||
seq.push(HElem::new(Fr::one().into()).pack());
|
seq.push(HElem::new(Fr::one().into()).pack());
|
||||||
}
|
}
|
||||||
|
|
||||||
let page_numbering = vt
|
|
||||||
.introspector
|
|
||||||
.page_numbering(location)
|
|
||||||
.cast::<Option<Numbering>>()
|
|
||||||
.unwrap()
|
|
||||||
.unwrap_or_else(|| {
|
|
||||||
Numbering::Pattern(NumberingPattern::from_str("1").unwrap())
|
|
||||||
});
|
|
||||||
|
|
||||||
let page = Counter::new(CounterKey::Page)
|
|
||||||
.at(vt, location)?
|
|
||||||
.display(vt, &page_numbering)?;
|
|
||||||
|
|
||||||
// Add the page number.
|
// Add the page number.
|
||||||
seq.push(page.linked(Destination::Location(location)));
|
let page = self.page().linked(Destination::Location(location));
|
||||||
|
seq.push(page);
|
||||||
|
|
||||||
Ok(Content::sequence(seq))
|
Ok(Content::sequence(seq))
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user