Skip to main content

custom_ir/
custom_ir.rs

1//! Create one SVG page directly from the public IR and SVG modules.
2
3use std::fs::{self, File};
4use std::io::BufWriter;
5use std::path::PathBuf;
6
7use document_svg::ir::{IDENTITY, Node, Page, Paint, SourceMeta, Stroke, TextAnchor, TextRun};
8use document_svg::svg::{SvgOptions, write_page};
9use document_svg::{Error, Result};
10
11fn main() -> Result<()> {
12    let output_path = std::env::args_os()
13        .nth(1)
14        .map(PathBuf::from)
15        .unwrap_or_else(|| PathBuf::from("output/custom.svg"));
16    if let Some(parent) = output_path.parent() {
17        fs::create_dir_all(parent)?;
18    }
19
20    let mut page = Page::new(1, 320.0, 180.0, "custom");
21    page.title = "Public IR example".into();
22    page.description = "A path and editable text generated by document-svg".into();
23
24    page.nodes.push(Node::Path {
25        id: "card".into(),
26        d: "M 20 20 H 300 V 160 H 20 Z".into(),
27        fill_rule: "nonzero".into(),
28        fill: Paint::solid("#E8F1FF"),
29        stroke: Stroke {
30            paint: Paint::solid("#246BCE"),
31            width: 2.0,
32            ..Stroke::default()
33        },
34        transform: IDENTITY,
35        clip_id: None,
36        meta: SourceMeta {
37            kind: "shape".into(),
38            source_id: "example-card".into(),
39            semantic_role: "background".into(),
40            ..SourceMeta::default()
41        },
42    });
43
44    page.nodes.push(Node::Text {
45        id: "message".into(),
46        x: 160.0,
47        y: 98.0,
48        runs: vec![TextRun {
49            text: "Hello, SVG!".into(),
50            font_size: 24.0,
51            bold: true,
52            fill: Paint::solid("#123B72"),
53            ..TextRun::default()
54        }],
55        anchor: TextAnchor::Middle,
56        transform: IDENTITY,
57        opacity: 1.0,
58        stroke: Stroke::default(),
59        clip_id: None,
60        meta: SourceMeta {
61            kind: "text".into(),
62            source_id: "example-message".into(),
63            semantic_role: "heading".into(),
64            alt_text: "Hello, SVG!".into(),
65            ..SourceMeta::default()
66        },
67    });
68
69    let file = File::create(&output_path).map_err(Error::from)?;
70    write_page(&page, BufWriter::new(file), SvgOptions::default())?;
71    println!("wrote {}", output_path.display());
72    Ok(())
73}