d-0026-font-awesome-as-a-crate: generate SVG data from packaged font
authorFabian Grünbichler <f.gruenbichler@proxmox.com>
Thu, 9 Apr 2026 12:33:10 +0000 (14:33 +0200)
committerFabian Grünbichler <debian@fabian.gruenbichler.email>
Thu, 16 Apr 2026 08:00:20 +0000 (10:00 +0200)
based on upstream's build.rs, which uses a bundled copy of the font that is
stripped when publishing.

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
Gbp-Pq: Topic prune
Gbp-Pq: Name d-0026-font-awesome-as-a-crate-generate-SVG-data-from-pac.patch

vendor/font-awesome-as-a-crate-0.3.0/build.rs [new file with mode: 0644]

diff --git a/vendor/font-awesome-as-a-crate-0.3.0/build.rs b/vendor/font-awesome-as-a-crate-0.3.0/build.rs
new file mode 100644 (file)
index 0000000..044ac82
--- /dev/null
@@ -0,0 +1,59 @@
+use std::{
+    env,
+    fs::{read_dir, File},
+    io::{Read, Write},
+    path::Path,
+};
+
+fn main() {
+    println!("cargo:rustc-cfg=font_awesome_out_dir");
+    write_fontawesome_sprite();
+}
+
+fn write_fontawesome_sprite() {
+    let dest_path = Path::new(&env::var("OUT_DIR").unwrap()).join("fontawesome.rs");
+    let mut dest_file = File::create(&dest_path).unwrap();
+    dest_file
+        .write_all(b"const fn fontawesome_svg(dir:&str,file:&str)->&'static str{match(dir.as_bytes(),file.as_bytes()){")
+        .expect("fontawesome fn write");
+    for dirname in &["brands", "regular", "solid"] {
+        let dir = read_dir(
+            Path::new("/usr/share/nodejs/@fortawesome/fontawesome-free/svgs/").join(dirname),
+        )
+        .expect("fontawesome directory exists");
+        let mut data = String::new();
+        for file in dir {
+            let file = file.expect("fontawesome directory access");
+            data.clear();
+            let filename = file
+                .file_name()
+                .into_string()
+                .expect("fontawesome filenames are unicode");
+            if !filename.ends_with(".svg") {
+                continue;
+            }
+            let mut file = File::open(file.path()).expect("fontawesome file access");
+            file.read_to_string(&mut data)
+                .expect("fontawesome file read");
+            if data.is_empty() {
+                panic!("encountered invalid fontawesome data in {}", filename);
+            }
+            // if this assert goes off, add more hashes here and in the format! below
+            assert!(!data.contains("###"), "file {} breaks raw string", filename);
+            dest_file
+                .write_all(
+                    format!(
+                        r####"(b"{dirname}",b"{filename}")=>r###"{data}"###,"####,
+                        data = data,
+                        dirname = dirname,
+                        filename = filename.replace(".svg", ""),
+                    )
+                    .as_bytes(),
+                )
+                .expect("write fontawesome file");
+        }
+    }
+    dest_file
+        .write_all(b"_=>\"\"}}")
+        .expect("fontawesome fn write");
+}