use blitz_dom::DocumentConfig;
use blitz_html::HtmlDocument;
use blitz_traits::shell::{ColorScheme, Viewport};
use parley::FontContext;
use std::sync::Arc;
fn suppress_stdout<F: FnOnce() -> T, T>(f: F) -> T {
use std::io::Write;
let _ = std::io::stdout().flush();
#[cfg(unix)]
{
use std::os::unix::io::AsRawFd;
let devnull = std::fs::OpenOptions::new()
.write(true)
.open("/dev/null")
.ok();
let saved_fd = devnull.as_ref().map(|_| {
let saved = unsafe { libc::dup(1) };
if saved < 0 {
return -1;
}
if let Some(ref dn) = devnull {
unsafe { libc::dup2(dn.as_raw_fd(), 1) };
}
saved
});
let result = f();
if let Some(Some(saved)) = saved_fd.map(|fd| if fd >= 0 { Some(fd) } else { None }) {
let _ = std::io::stdout().flush();
unsafe { libc::dup2(saved, 1) };
unsafe { libc::close(saved) };
}
result
}
#[cfg(not(unix))]
{
f()
}
}
pub fn parse_and_layout(
html: &str,
viewport_width: f32,
_viewport_height: f32,
font_data: &[Arc<Vec<u8>>],
) -> HtmlDocument {
let viewport = Viewport::new(
viewport_width as u32,
10000, 1.0,
ColorScheme::Light,
);
let font_ctx = if font_data.is_empty() {
None
} else {
let mut ctx = FontContext::new();
for data in font_data {
let blob: parley::fontique::Blob<u8> = (**data).clone().into();
ctx.collection.register_fonts(blob, None);
}
Some(ctx)
};
let config = DocumentConfig {
viewport: Some(viewport),
font_ctx,
..DocumentConfig::default()
};
let mut doc = suppress_stdout(|| HtmlDocument::from_html(html, config));
doc.resolve(0.0);
doc
}