use crate::asset_snapshot::AssetSnapshot;
use crate::resolve::embed_renderer::{file_stem, html_escape_attr};
use crate::resolve::title_params::TitleParams;
#[allow(unused_variables)]
pub fn synthesize_pdf_html(
params: &TitleParams,
src: &str,
assets: &AssetSnapshot,
) -> String {
let mut data_url = String::from(src);
if let Some(q) = params.get("query") {
data_url.push('?');
data_url.push_str(q);
}
if let Some(f) = params.get("fragment") {
data_url.push('#');
data_url.push_str(f);
}
let data_width_attr = match params.get("data-width") {
Some(w) => format!(r#" data-width="{}""#, html_escape_attr(w)),
None => String::new(),
};
let html_width_attr = match params.get("width") {
Some(w) => format!(r#" width="{}""#, html_escape_attr(w)),
None => String::new(),
};
let html_height_attr = match params.get("height") {
Some(h) => format!(r#" height="{}""#, html_escape_attr(h)),
None => String::new(),
};
let name = file_stem(src);
format!(
"<object class=\"moss-embed\" data-type=\"pdf\"{} type=\"application/pdf\" data=\"{}\"{}{}><a href=\"{}\">Download {}</a></object>",
data_width_attr,
html_escape_attr(&data_url),
html_width_attr,
html_height_attr,
html_escape_attr(src),
html_escape_attr(&name),
)
}
#[cfg(test)]
mod tests {
use super::*;
fn empty_snapshot() -> AssetSnapshot {
AssetSnapshot::new()
}
fn params_with(kvs: &[(&str, &str)]) -> TitleParams {
let mut p = TitleParams::default();
for (k, v) in kvs {
p.insert(*k, *v);
}
p
}
#[test]
fn pdf_basic_shape() {
let p = params_with(&[("kind", "pdf")]);
let out = synthesize_pdf_html(&p, "doc.pdf", &empty_snapshot());
assert!(
out.contains(r#"<object class="moss-embed" data-type="pdf""#),
"got: {}",
out
);
assert!(
out.contains(r#"type="application/pdf""#),
"got: {}",
out
);
assert!(out.contains(r#"data="doc.pdf""#), "got: {}", out);
assert!(
out.contains(r#"<a href="doc.pdf">Download doc</a>"#),
"got: {}",
out
);
}
#[test]
fn pdf_with_height_param() {
let p = params_with(&[("kind", "pdf"), ("width", "400px"), ("height", "800px")]);
let out = synthesize_pdf_html(&p, "doc.pdf", &empty_snapshot());
assert!(out.contains(r#"width="400px""#), "got: {}", out);
assert!(out.contains(r#"height="800px""#), "got: {}", out);
}
#[test]
fn pdf_escapes_url_specials() {
let p = params_with(&[("kind", "pdf")]);
let out = synthesize_pdf_html(
&p,
r#"file with "quotes".pdf"#,
&empty_snapshot(),
);
assert!(
out.contains(r#"data="file with "quotes".pdf""#),
"expected escaped data= attr, got: {}",
out
);
assert!(
out.contains(r#"href="file with "quotes".pdf""#),
"expected escaped href= attr, got: {}",
out
);
assert!(
!out.contains(r#"data="file with ""#),
"raw quote leaked into data= attr, got: {}",
out
);
}
#[test]
fn pdf_query_and_fragment_appended_to_url() {
let p = params_with(&[("kind", "pdf"), ("fragment", "page=5")]);
let out = synthesize_pdf_html(&p, "report.pdf", &empty_snapshot());
assert!(out.contains(r#"data="report.pdf#page=5""#), "got: {}", out);
assert!(out.contains(r#"<a href="report.pdf">"#), "got: {}", out);
}
#[test]
fn pdf_query_before_fragment() {
let p = params_with(&[
("kind", "pdf"),
("query", "version=2"),
("fragment", "page=5"),
]);
let out = synthesize_pdf_html(&p, "report.pdf", &empty_snapshot());
assert!(
out.contains(r#"data="report.pdf?version=2#page=5""#),
"got: {}",
out
);
}
#[test]
fn pdf_data_width_attr_when_present() {
let p = params_with(&[("kind", "pdf"), ("data-width", "wide")]);
let out = synthesize_pdf_html(&p, "doc.pdf", &empty_snapshot());
assert!(out.contains(r#"data-width="wide""#), "got: {}", out);
}
#[test]
fn pdf_no_data_width_when_absent() {
let p = params_with(&[("kind", "pdf")]);
let out = synthesize_pdf_html(&p, "doc.pdf", &empty_snapshot());
assert!(!out.contains("data-width"), "got: {}", out);
}
#[test]
fn pdf_stem_strips_directory_and_extension() {
let p = params_with(&[("kind", "pdf")]);
let out = synthesize_pdf_html(&p, "papers/2024/big-report.pdf", &empty_snapshot());
assert!(out.contains("Download big-report</a>"), "got: {}", out);
}
}