From ffd57bf56b6d23cd5f81c4d9473adfbc24c61274 Mon Sep 17 00:00:00 2001 From: Ilia <43654815+istudyatuni@users.noreply.github.com> Date: Fri, 23 Feb 2024 17:14:07 +0300 Subject: [PATCH] Sort languages when writing XMP metadata for reproducible builds (#3469) --- crates/typst-pdf/src/lib.rs | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/crates/typst-pdf/src/lib.rs b/crates/typst-pdf/src/lib.rs index 467b4ffb6..cc2edba24 100644 --- a/crates/typst-pdf/src/lib.rs +++ b/crates/typst-pdf/src/lib.rs @@ -85,7 +85,8 @@ struct PdfContext<'a> { glyph_sets: HashMap>, /// The number of glyphs for all referenced languages in the document. /// We keep track of this to determine the main document language. - languages: HashMap, + /// BTreeMap is used to write sorted list of languages to metadata. + languages: BTreeMap, /// Allocator for indirect reference IDs. alloc: Ref, @@ -134,7 +135,7 @@ impl<'a> PdfContext<'a> { pdf: Pdf::new(), pages: vec![], glyph_sets: HashMap::new(), - languages: HashMap::new(), + languages: BTreeMap::new(), alloc, page_tree_ref, page_refs: vec![], @@ -158,11 +159,7 @@ impl<'a> PdfContext<'a> { /// Write the document catalog. fn write_catalog(ctx: &mut PdfContext, ident: Option<&str>, timestamp: Option) { - let lang = ctx - .languages - .iter() - .max_by_key(|(&lang, &count)| (count, lang)) - .map(|(&k, _)| k); + let lang = ctx.languages.iter().max_by_key(|(_, &count)| count).map(|(&l, _)| l); let dir = if lang.map(Lang::dir) == Some(Dir::RTL) { Direction::R2L