1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
use super::prelude::*;
use crate::tree::{AttributeMap, FloatAlignment, ImageSource, LinkLocation};
use crate::url::normalize_link;
pub fn render_image(
ctx: &mut HtmlContext,
source: &ImageSource,
link: &Option<LinkLocation>,
alignment: Option<FloatAlignment>,
attributes: &AttributeMap,
) {
info!(
"Rendering image element (source '{}', link {}, alignment {}, float {})",
source.name(),
match link {
Some(link) => format!("{link:?}"),
None => str!("<none>"),
},
match alignment {
Some(image) => image.align.name(),
None => "<default>",
},
match alignment {
Some(image) => image.float,
None => false,
},
);
let source_url = ctx
.handle()
.get_image_link(source, ctx.info(), ctx.settings());
match source_url {
Some(url) => render_image_element(ctx, &url, link, alignment, attributes),
None => render_image_missing(ctx),
}
}
fn render_image_element(
ctx: &mut HtmlContext,
url: &str,
link: &Option<LinkLocation>,
alignment: Option<FloatAlignment>,
attributes: &AttributeMap,
) {
debug!("Found URL, rendering image (value '{url}')");
let (space, align_class) = match alignment {
Some(align) => (" ", align.html_class()),
None => ("", ""),
};
ctx.html()
.div()
.attr(attr!(
"class" => "wj-image-container" space align_class,
))
.inner(|ctx| {
let build_image = |ctx: &mut HtmlContext| {
ctx.html().img().attr(attr!(
"class" => "wj-image",
"src" => url,
"crossorigin";;
attributes
));
};
match link {
Some(link) => {
let url = normalize_link(link, ctx.handle());
ctx.html()
.a()
.attr(attr!("href" => &url))
.inner(build_image);
}
None => build_image(ctx),
};
});
}
fn render_image_missing(ctx: &mut HtmlContext) {
debug!("Image URL unresolved, missing or error");
let message = ctx
.handle()
.get_message(ctx.language(), "image-context-bad");
ctx.html()
.div()
.attr(attr!("class" => "wj-error-block"))
.contents(message);
}