1use 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}