pub mod assets;
pub mod backends;
pub mod brand;
pub mod images;
pub mod pages;
pub mod preprocessor;
use std::path::{Path, PathBuf};
use anyhow::Result;
use serde::{Deserialize, Serialize};
pub use assets::{AssetProvider, BoxFuture, EmbeddedAssets, LayeredAssets, async_provider, sync_provider};
pub use brand::{AutoLayout, BrandSpec};
pub use pages::splitter::{DefaultSplitter, PageSplitter};
pub use pages::{Page, PageOrigin, RawPage};
pub use preprocessor::{Chain, HtmlImageTags, Identity, MarkdownPreprocessor};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum Target {
Docx,
Odt,
Pdf,
PdfPresentation,
Pptx,
HtmlReveal,
}
impl Target {
pub fn as_str(&self) -> &'static str {
match self {
Target::Docx => "docx",
Target::Odt => "odt",
Target::Pdf => "pdf",
Target::PdfPresentation => "pdf-presentation",
Target::Pptx => "pptx",
Target::HtmlReveal => "html-reveal",
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct DocMeta {
pub title: Option<String>,
pub author: Option<String>,
pub date: Option<String>,
#[serde(default)]
pub extra: std::collections::BTreeMap<String, String>,
}
#[derive(Debug, Clone)]
pub struct BrandHandle(pub std::sync::Arc<BrandSpec>);
#[derive(Debug, Clone)]
pub struct AssetRef {
pub key: String,
}
#[derive(Debug, Clone)]
pub struct ResolvedDoc {
pub pages: Vec<Page>,
pub meta: DocMeta,
pub brand: BrandHandle,
pub assets: Vec<AssetRef>,
}
pub struct RenderRequest<'a> {
pub doc: &'a ResolvedDoc,
pub assets: &'a dyn AssetProvider,
pub out: &'a Path,
}
#[derive(Debug, Clone)]
pub struct Artifact {
pub primary: PathBuf,
pub extras: Vec<PathBuf>,
}
pub trait Backend: Send + Sync {
fn target(&self) -> Target;
fn render<'a>(
&'a self,
req: &'a RenderRequest<'a>,
) -> BoxFuture<'a, Result<Artifact>>;
}