/* Hurry Curry! - a game about cooking Copyright (C) 2025 Hurry Curry! Contributors This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, version 3 of the License only. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ use hurrycurry_protocol::{ Gamedata, Message, book::{Book, BookPage, Diagram}, }; use crate::diagram_svg::diagram_svg; 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").replace(" ", "").replace("\n", "") } title { "Recipe Book - Hurry Curry!" } } body { @for (index, page) in book.pages.iter().enumerate() { @PageR { data, page, index } } } } } PageR<'a>(index: usize, data: &'a Gamedata, page: &'a BookPage) { section.pagegroup[id=format!("page{index}")] { @match page { BookPage::Cover => { div.page {} div.page {} } BookPage::Recipe { title, description, diagram } => { div.page { h1 { @MessageR { data, message: title } } p { @MessageR { data, message: description } } } div.page { @DiagramR { data, diagram } } } BookPage::Text { .. } => { div.page {} div.page {} } BookPage::Contents { table } => { div.page { ol { @for (label, page) in table { li { a[href=format!("#page{page}")] { @MessageR { data, message: label } } } }} } div.page {} } } } } MessageR<'a>(data: &'a Gamedata, message: &'a Message) { @match message { Message::Translation { id, params } => { @format!("{:?}", (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) { @markup::raw(diagram_svg(data, diagram).unwrap()) } }