diff options
| -rw-r--r-- | Cargo.lock | 1 | ||||
| -rw-r--r-- | server/tools/Cargo.toml | 1 | ||||
| -rw-r--r-- | server/tools/src/book.rs | 15 | ||||
| -rw-r--r-- | server/tools/src/book_html.css | 23 | ||||
| -rw-r--r-- | server/tools/src/book_html.rs | 76 | ||||
| -rw-r--r-- | server/tools/src/diagram_layout.rs | 4 | ||||
| -rw-r--r-- | server/tools/src/main.rs | 16 | ||||
| -rw-r--r-- | server/tools/src/recipe_diagram.rs | 21 | 
8 files changed, 134 insertions, 23 deletions
@@ -1381,6 +1381,7 @@ dependencies = [   "hurrycurry-protocol",   "hurrycurry-server",   "log", + "markup",   "serde",   "serde_json",  ] diff --git a/server/tools/Cargo.toml b/server/tools/Cargo.toml index 1a6d6aa3..8c26cdfe 100644 --- a/server/tools/Cargo.toml +++ b/server/tools/Cargo.toml @@ -12,3 +12,4 @@ hurrycurry-protocol = { path = "../protocol" }  hurrycurry-server = { path = ".." }  serde_json = "1.0.145"  serde = { version = "1.0.225", features = ["derive"] } +markup = "0.15.0" 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<Book> { -    let mut diagram = recipe_diagram(&["plate:cheese-leek-soup".to_owned()])?; +pub fn book(data: &Gamedata, serverdata: &Serverdata) -> Result<Book> { +    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<Diagram> { -    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<Diagram> {      let ambient_items = serverdata          .initial_map          .iter()  |