forked from EduCraft/curriculum-project-hub
feat(cph): add outline export command
This commit is contained in:
@@ -39,10 +39,10 @@ mod embedded;
|
||||
mod manifest;
|
||||
mod world;
|
||||
|
||||
use cph_diag::{DiagCode, Diagnostic};
|
||||
use std::path::PathBuf;
|
||||
|
||||
use cph_diag::{DiagCode, Diagnostic};
|
||||
use cph_model::{Artifact, Bundle, Lesson, Step, TargetConfig};
|
||||
use cph_model::{Artifact, Bundle, Lesson, OutlineDocument, Step, TargetConfig};
|
||||
use typst_kit::fonts::{self, FontStore};
|
||||
use typst_layout::PagedDocument;
|
||||
use typst_pdf::PdfOptions;
|
||||
@@ -139,6 +139,34 @@ impl Engine {
|
||||
typst_pdf::pdf(&doc, &PdfOptions::default()).map_err(|errors| map_all(&world, &errors))
|
||||
}
|
||||
|
||||
/// Build a PDF for an outline document without creating files in the lesson.
|
||||
///
|
||||
/// The outline entrypoint and its TOML data are served by an in-memory
|
||||
/// [`LessonWorld`]. This keeps outline generation independent of any
|
||||
/// declared lesson export target while reusing the embedded fonts and PDF
|
||||
/// backend.
|
||||
pub fn build_outline_pdf(&self, outline: &OutlineDocument) -> Result<Vec<u8>, Vec<Diagnostic>> {
|
||||
const SOURCE: &str = r#"#import "@local/cph-render:0.1.0": render-outline
|
||||
#let outline = toml(sys.inputs.outline)
|
||||
#render-outline(outline)
|
||||
"#;
|
||||
|
||||
let outline_src = toml::to_string(outline).expect("outline serializes to TOML");
|
||||
let world = LessonWorld::new_outline(
|
||||
PathBuf::from("."),
|
||||
self.render_dir.clone(),
|
||||
SOURCE.to_owned(),
|
||||
outline_src,
|
||||
self.fonts.clone(),
|
||||
);
|
||||
let warned = typst::compile::<PagedDocument>(&world);
|
||||
let doc = match warned.output {
|
||||
Ok(doc) => doc,
|
||||
Err(errors) => return Err(map_all(&world, &errors)),
|
||||
};
|
||||
typst_pdf::pdf(&doc, &PdfOptions::default()).map_err(|errors| map_all(&world, &errors))
|
||||
}
|
||||
|
||||
/// Build the [`LessonWorld`] for `(lesson, target)`, or `Err(blocking)` when
|
||||
/// the request cannot be honored (see [`target_precheck`]).
|
||||
fn world_for(&self, lesson: &Lesson, target: &str) -> Result<LessonWorld, Vec<Diagnostic>> {
|
||||
|
||||
Reference in New Issue
Block a user