Skip to content

Commit b4d1464

Browse files
committed
Fix GitHub relative SVGs not rendering
1 parent 897e627 commit b4d1464

File tree

1 file changed

+50
-6
lines changed

1 file changed

+50
-6
lines changed

src/render.rs

Lines changed: 50 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -148,15 +148,39 @@ impl SanitizeUrl {
148148
}
149149
}
150150

151+
/// Groups media-related URL info
152+
struct MediaUrl {
153+
is_media: bool,
154+
add_sanitize_query: bool,
155+
}
156+
151157
/// Determine whether the given URL has a media file externsion.
152-
fn is_media_url(url: &str) -> bool {
158+
/// Also check if `sanitize=true` must be added to the query string,
159+
/// which is required to load SVGs properly from GitHub.
160+
fn is_media_url(url: &str) -> MediaUrl {
153161
Path::new(url)
154162
.extension()
155163
.and_then(std::ffi::OsStr::to_str)
156-
.map_or(false, |e| match e {
157-
"png" | "svg" | "jpg" | "jpeg" | "gif" | "mp4" | "webm" | "ogg" => true,
158-
_ => false,
159-
})
164+
.map_or(
165+
MediaUrl {
166+
is_media: false,
167+
add_sanitize_query: false,
168+
},
169+
|e| match e {
170+
"svg" => MediaUrl {
171+
is_media: true,
172+
add_sanitize_query: true,
173+
},
174+
"png" | "jpg" | "jpeg" | "gif" | "mp4" | "webm" | "ogg" => MediaUrl {
175+
is_media: true,
176+
add_sanitize_query: false,
177+
},
178+
_ => MediaUrl {
179+
is_media: false,
180+
add_sanitize_query: false,
181+
},
182+
},
183+
)
160184
}
161185

162186
impl UrlRelativeEvaluate for SanitizeUrl {
@@ -169,7 +193,11 @@ impl UrlRelativeEvaluate for SanitizeUrl {
169193
let mut new_url = base_url.clone();
170194
// Assumes GitHub’s URL scheme. GitHub renders text and markdown
171195
// better in the "blob" view, but images need to be served raw.
172-
new_url += if is_media_url(url) {
196+
let MediaUrl {
197+
is_media,
198+
add_sanitize_query,
199+
} = is_media_url(url);
200+
new_url += if is_media {
173201
"raw/master"
174202
} else {
175203
"blob/master"
@@ -178,6 +206,12 @@ impl UrlRelativeEvaluate for SanitizeUrl {
178206
new_url.push('/');
179207
}
180208
new_url += url;
209+
if add_sanitize_query {
210+
if let Ok(mut parsed_url) = Url::parse(&new_url) {
211+
parsed_url.query_pairs_mut().append_pair("sanitize", "true");
212+
new_url = parsed_url.into_string();
213+
}
214+
}
181215
Cow::Owned(new_url)
182216
})
183217
}
@@ -356,6 +390,7 @@ mod tests {
356390
let absolute = "[hi](/hi)";
357391
let relative = "[there](there)";
358392
let image = "![alt](img.png)";
393+
let svg = "![alt](sanitize.svg)";
359394

360395
for host in &["github.com", "gitlab.com", "bitbucket.org"] {
361396
for (&extra_slash, &dot_git) in [true, false].iter().zip(&[true, false]) {
@@ -392,6 +427,15 @@ mod tests {
392427
host
393428
)
394429
);
430+
431+
let result = markdown_to_html(svg, Some(&url));
432+
assert_eq!(
433+
result,
434+
format!(
435+
"<p><img src=\"https://{}/rust-lang/test/raw/master/sanitize.svg?sanitize=true\" alt=\"alt\"></p>\n",
436+
host
437+
)
438+
);
395439
}
396440
}
397441

0 commit comments

Comments
 (0)