From 0ac9cedb4bd6a1a9bf3cbc04c3529b7881e1fec8 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Sun, 21 Sep 2025 16:39:46 +0200 Subject: start book html exporter --- server/tools/src/book.rs | 15 ++++---- server/tools/src/book_html.css | 23 ++++++++++++ server/tools/src/book_html.rs | 76 ++++++++++++++++++++++++++++++++++++-- server/tools/src/diagram_layout.rs | 4 ++ server/tools/src/main.rs | 16 +++++++- server/tools/src/recipe_diagram.rs | 21 ++++++----- 6 files changed, 132 insertions(+), 23 deletions(-) create mode 100644 server/tools/src/book_html.css (limited to 'server/tools/src') diff --git a/server/tools/src/book.rs b/server/tools/src/book.rs index b77525af..971859fe 100644 --- a/server/tools/src/book.rs +++ b/server/tools/src/book.rs @@ -19,27 +19,28 @@ use crate::{diagram_layout::diagram_layout, recipe_diagram::recipe_diagram}; use anyhow::Result; use hurrycurry_protocol::{ - ItemIndex, Message, + Gamedata, Message, book::{Book, BookPage}, }; +use hurrycurry_server::data::Serverdata; -pub fn book() -> Result { - let mut diagram = recipe_diagram(&["plate:cheese-leek-soup".to_owned()])?; +pub fn book(data: &Gamedata, serverdata: &Serverdata) -> Result { + let mut diagram = recipe_diagram(data, serverdata, &["plate:cheese-leek-soup".to_owned()])?; diagram_layout(&mut diagram)?; let mut pages = Vec::new(); pages.push(BookPage::Recipe { - description: Message::Item(ItemIndex(0)), - instruction: Message::Item(ItemIndex(0)), + description: Message::Text("Some text goes here...".to_string()), + instruction: Message::Text("Some text goes here...".to_string()), diagram, }); Ok(Book { pages }) } -pub fn print_book() -> Result<()> { - let book = book()?; +pub fn print_book(data: &Gamedata, serverdata: &Serverdata) -> Result<()> { + let book = book(data, serverdata)?; println!("{}", serde_json::to_string_pretty(&book).unwrap()); Ok(()) } diff --git a/server/tools/src/book_html.css b/server/tools/src/book_html.css new file mode 100644 index 00000000..9a67de71 --- /dev/null +++ b/server/tools/src/book_html.css @@ -0,0 +1,23 @@ +body { + margin: 0px; + background-color: rgb(74, 74, 74); +} + +.pagegroup { + margin-left: auto; + margin-right: auto; + display: block; + width: 64em; +} + +.page { + float: left; + display: block; + background-color: antiquewhite; + box-sizing: border-box; + padding: 2em; + margin: 1em; + aspect-ratio: 0.707; + width: 30em; + height: auto; +} \ No newline at end of file diff --git a/server/tools/src/book_html.rs b/server/tools/src/book_html.rs index 370f6901..0af9af06 100644 --- a/server/tools/src/book_html.rs +++ b/server/tools/src/book_html.rs @@ -16,9 +16,77 @@ */ -use anyhow::Result; -use hurrycurry_protocol::book::Book; +use hurrycurry_protocol::{ + Gamedata, Message, + book::{Book, BookPage, Diagram}, +}; -pub fn render_html_book(book: Book) -> Result<()> { - Ok(()) +pub fn render_html_book(data: &Gamedata, book: &Book) -> String { + BookR { book, data }.to_string() +} + +markup::define! { + BookR<'a>(data: &'a Gamedata, book: &'a Book) { + @markup::doctype() + html { + head { + style { @include_str!("book_html.css") } + title { "Recipe Book - Hurry Curry!" } + } + body { + @for page in &book.pages { + @PageR { data, page } + } + } + } + } + PageR<'a>(data: &'a Gamedata, page: &'a BookPage) { + section.pagegroup { + @match page { + BookPage::Cover => { + div.page {} + div.page {} + } + BookPage::Recipe { description, instruction, diagram } => { + div.page { + p { @MessageR { data, message: description } } + p { @MessageR { data, message: instruction } } + } + div.page { + @DiagramR { data, diagram } + } + } + BookPage::Text { .. } => { + div.page {} + div.page {} + } + BookPage::Contents { .. } => { + div.page {} + div.page {} + } + } + } + } + + MessageR<'a>(data: &'a Gamedata, message: &'a Message) { + @match message { + Message::Translation { id, params } => {} + Message::Text(t) => { @t } + Message::Item(i) => { @data.item_name(*i) } + Message::Tile(i) => { @data.tile_name(*i) } + } + } + + DiagramR<'a>(data: &'a Gamedata, diagram: &'a Diagram) { + div.diagram[style="position: absolute;"] { + @for node in &diagram.nodes { + div.node[style=format!("position: relative; left: {}px; top: {}px;", node.position.x, 350. - node.position.y / 2.)] { + @MessageR { data, message: &node.label } + } + } + @for edge in &diagram.edges { + + } + } + } } diff --git a/server/tools/src/diagram_layout.rs b/server/tools/src/diagram_layout.rs index e6ae2d76..73bfcb96 100644 --- a/server/tools/src/diagram_layout.rs +++ b/server/tools/src/diagram_layout.rs @@ -41,10 +41,14 @@ pub fn diagram_layout(diagram: &mut Diagram) -> Result<()> { let mut out = String::new(); writeln!(out, "digraph {{")?; + for (i, _) in diagram.nodes.iter().enumerate() { + writeln!(out, "k{i} [width=2, height=2]")?; + } for edge in &diagram.edges { writeln!(out, "k{} -> k{}", edge.src, edge.dst)?; } writeln!(out, "}}")?; + println!("{out}"); child.stdin.as_mut().unwrap().write_all(out.as_bytes())?; let output = child.wait_with_output()?; diff --git a/server/tools/src/main.rs b/server/tools/src/main.rs index 31da0388..4e5c5787 100644 --- a/server/tools/src/main.rs +++ b/server/tools/src/main.rs @@ -31,6 +31,7 @@ use crate::{ }; use anyhow::Result; use clap::Parser; +use hurrycurry_server::data::DataIndex; #[derive(Parser)] enum Action { @@ -46,8 +47,19 @@ fn main() -> Result<()> { match action { Action::Graph => graph()?, Action::GraphSummary => graph_summary()?, - Action::Book => print_book()?, - Action::BookHtml => render_html_book(book()?)?, + Action::Book => { + let mut index = DataIndex::default(); + index.reload()?; + let (data, serverdata, _) = index.generate("5star")?; + print_book(&data, &serverdata)? + } + Action::BookHtml => { + let mut index = DataIndex::default(); + index.reload()?; + let (data, serverdata, _) = index.generate("5star")?; + let book = book(&data, &serverdata)?; + println!("{}", render_html_book(&data, &book)) + } } Ok(()) diff --git a/server/tools/src/recipe_diagram.rs b/server/tools/src/recipe_diagram.rs index 25f8040c..7dc42c1e 100644 --- a/server/tools/src/recipe_diagram.rs +++ b/server/tools/src/recipe_diagram.rs @@ -17,18 +17,19 @@ */ use anyhow::Result; -use hurrycurry_protocol::book::{Diagram, DiagramEdge, DiagramNode}; -use hurrycurry_protocol::glam::Vec2; -use hurrycurry_protocol::{ItemIndex, Message, RecipeIndex}; -use hurrycurry_server::data::DataIndex; +use hurrycurry_protocol::{ + Gamedata, ItemIndex, Message, RecipeIndex, + book::{Diagram, DiagramEdge, DiagramNode}, + glam::Vec2, +}; +use hurrycurry_server::data::Serverdata; use std::collections::{BTreeMap, BTreeSet, HashSet}; -pub(crate) fn recipe_diagram(target_items: &[String]) -> Result { - let mut index = DataIndex::default(); - index.reload()?; - - let (data, serverdata, _) = index.generate("5star")?; - +pub(crate) fn recipe_diagram( + data: &Gamedata, + serverdata: &Serverdata, + target_items: &[String], +) -> Result { let ambient_items = serverdata .initial_map .iter() -- cgit v1.2.3-70-g09d2