diff --git a/src/vaev-driver/render.cpp b/src/vaev-driver/render.cpp index 3c57439..6b047e4 100644 --- a/src/vaev-driver/render.cpp +++ b/src/vaev-driver/render.cpp @@ -109,6 +109,7 @@ RenderResult render(Markup::Document const &dom, Style::Media const &media, Vec2 logDebugIf(DEBUG_RENDER, "layout tree paint time: {}", elapsed); return { + std::move(stylebook), makeStrong(std::move(tree.root)), paintRoot, }; @@ -156,6 +157,7 @@ RenderResult render(Markup::Document &dom, Style::Media const &media, Print::Pap paintRoot->prepare(); return { + std::move(stylebook), makeStrong(std::move(tree.root)), paintRoot, }; diff --git a/src/vaev-driver/render.h b/src/vaev-driver/render.h index ceb4d40..fa8d96a 100644 --- a/src/vaev-driver/render.h +++ b/src/vaev-driver/render.h @@ -9,6 +9,7 @@ namespace Vaev::Driver { struct RenderResult { + Style::StyleBook style; Strong layout; Strong paint; }; diff --git a/src/vaev-tools/main.cpp b/src/vaev-tools/main.cpp index f5302d4..5cca0b5 100644 --- a/src/vaev-tools/main.cpp +++ b/src/vaev-tools/main.cpp @@ -131,25 +131,40 @@ Vaev::Style::Media constructMedia(Print::PaperStock paper) { }; } -Res<> html2pdf(Mime::Url const &input, Mime::Url const &output) { - auto dom = try$(Vaev::Driver::fetchDocument(input)); +struct Html2PdfOption { + bool dumpStyle = false; + bool dumpDom = false; + bool dumpLayout = false; + bool dumpPaint = false; +}; + +Res<> html2pdf(Mime::Url const &input, Io::Writer &output, Html2PdfOption options = {}) { + auto start = Sys::now(); + auto dom = try$(Vaev::Driver::fetchDocument(input)); auto paper = Print::A4; auto media = constructMedia(paper); - - auto start = Sys::now(); - auto [layout, paint] = Vaev::Driver::render(*dom, media, paper); + auto [style, layout, paint] = Vaev::Driver::render(*dom, media, paper); auto elapsed = Sys::now() - start; logInfo("render time: {}", elapsed); - logDebug("layout tree: {}", layout); - logDebug("paint tree: {}", paint); + + if (options.dumpDom) + Sys::println("--- START OF DOM ---\n{}\n--- END OF DOM ---\n", dom); + + if (options.dumpStyle) + Sys::println("--- START OF STYLE ---\n{}\n--- END OF STYLE ---\n", style); + + if (options.dumpLayout) + Sys::println("--- START OF LAYOUT ---\n{}\n--- END OF LAYOUT ---\n", layout); + + if (options.dumpPaint) + Sys::println("--- START OF PAINT ---\n{}\n--- END OF PAINT ---\n", paint); Print::PdfPrinter printer{Print::A4, Print::Density::DEFAULT}; paint->print(printer); - auto file = try$(Sys::File::create(output)); - Io::TextEncoder<> encoder{file}; + Io::TextEncoder<> encoder{output}; Io::Emit e{encoder}; printer.write(e); try$(e.flush()); @@ -256,23 +271,38 @@ Async::Task<> entryPointAsync(Sys::Context &ctx) { } ); + Cli::Flag dumpStyleArg = Cli::flag('s', "dump-style"s, "Dump the stylesheet"s); + Cli::Flag dumpDomArg = Cli::flag('d', "dump-dom"s, "Dump the DOM tree"s); + Cli::Flag dumpLayoutArg = Cli::flag('l', "dump-layout"s, "Dump the layout tree"s); + Cli::Flag dumpPaintArg = Cli::flag('p', "dump-paint"s, "Dump the paint tree"s); + cmd.subCommand( "html2pdf"s, 'r', "Convert HTML to PDF"s, - {inputArg, outputArg - }, - [inputArg, outputArg](Sys::Context &) -> Async::Task<> { + {inputArg, outputArg, dumpStyleArg, dumpDomArg, dumpLayoutArg, dumpPaintArg}, + [inputArg, outputArg, dumpStyleArg, dumpDomArg, dumpLayoutArg, dumpPaintArg](Sys::Context &) -> Async::Task<> { + Vaev::Tools::Html2PdfOption options{ + .dumpStyle = dumpStyleArg, + .dumpDom = dumpDomArg, + .dumpLayout = dumpLayoutArg, + .dumpPaint = dumpPaintArg, + }; + auto input = co_try$(Mime::parseUrlOrPath(inputArg)); - auto output = co_try$(Mime::parseUrlOrPath(outputArg)); - co_return Vaev::Tools::html2pdf(input, output); + if (outputArg.unwrap() == "-"s) + co_return Vaev::Tools::html2pdf(input, Sys::out(), options); + + auto outputUrl = co_try$(Mime::parseUrlOrPath(outputArg)); + auto outputFile = co_try$(Sys::File::create(outputUrl)); + co_return Vaev::Tools::html2pdf(input, outputFile, options); } ); auto &inspectorCmd = cmd.subCommand( "inspector"s, 'i', - "Inspect a document"s, + "View a document in the inspector for debugging"s, {inputArg} ); diff --git a/src/vaev-view/view.cpp b/src/vaev-view/view.cpp index 26c7983..58e52c6 100644 --- a/src/vaev-view/view.cpp +++ b/src/vaev-view/view.cpp @@ -62,7 +62,7 @@ struct View : public Ui::View { g.origin(bound().xy.cast()); g.clip(viewport); - auto [layout, paint] = *_renderResult; + auto [_, layout, paint] = *_renderResult; g.clear(rect, Gfx::WHITE); paint->paint(g); @@ -83,7 +83,7 @@ struct View : public Ui::View { Math::Vec2i size(Math::Vec2i size, Ui::Hint) override { // FIXME: This is wasteful, we should cache the result auto media = _constructMedia(size); - auto [layout, _] = Driver::render(*_dom, media, size.cast()); + auto [_, layout, _] = Driver::render(*_dom, media, size.cast()); return { layout->layout.borderBox().width.cast(),