Show formatted challenge content text

rust
Elnu 1 year ago
parent 0620607c6d
commit e54ce5b52e

11
Cargo.lock generated

@ -1120,6 +1120,16 @@ dependencies = [
"encoding", "encoding",
] ]
[[package]]
name = "gh-emoji"
version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "30ad64b43d48c1745c0059e5ba223816eb599eec8956c668fc0a31f6b9cd799e"
dependencies = [
"phf",
"regex",
]
[[package]] [[package]]
name = "ghash" name = "ghash"
version = "0.5.0" version = "0.5.0"
@ -3276,6 +3286,7 @@ dependencies = [
"derive_more", "derive_more",
"dotenv", "dotenv",
"gettext", "gettext",
"gh-emoji",
"poise", "poise",
"r2d2", "r2d2",
"r2d2_sqlite", "r2d2_sqlite",

@ -13,6 +13,7 @@ comrak = "0.18.0"
derive_more = "0.99.17" derive_more = "0.99.17"
dotenv = "0.15.0" dotenv = "0.15.0"
gettext = "0.4.0" gettext = "0.4.0"
gh-emoji = "1.0.7"
poise = "0.5.5" poise = "0.5.5"
r2d2 = "0.8.10" r2d2 = "0.8.10"
r2d2_sqlite = "0.22.0" r2d2_sqlite = "0.22.0"

@ -1,13 +1,15 @@
use core::panic; use core::panic;
use std::str::FromStr; use std::str::FromStr;
use comrak::format_html;
use serde::{Deserialize, Deserializer, Serialize}; use serde::{Deserialize, Deserializer, Serialize};
use serde_yaml::Value; use serde_yaml::Value;
use crate::{prelude::*}; use crate::{prelude::*, utils::furigana_to_html};
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
pub struct Challenge { pub struct Challenge {
pub text: Option<String>,
pub japanese: Option<Vec<Vec<Vec<ChallengeWord>>>>, pub japanese: Option<Vec<Vec<Vec<ChallengeWord>>>>,
pub english: Option<Vec<String>>, pub english: Option<Vec<String>>,
pub song: Option<Song>, pub song: Option<Song>,
@ -29,10 +31,11 @@ impl Challenge {
options options
}; };
let arena = Arena::new(); let arena = Arena::new();
let challenge_text = fs::read_to_string(format!("content/challenges/{number}.md"))
.expect("Couldn't find challenge file");
let root = parse_document( let root = parse_document(
&arena, &arena,
& (fs::read_to_string(format!("content/challenges/{number}.md")) &(challenge_text.clone()
.expect("Couldn't find challenge file")
// comrak can't find frontmatter if there's only frontmatter and no newline at end // comrak can't find frontmatter if there's only frontmatter and no newline at end
// TODO: Open issue in comrak // TODO: Open issue in comrak
+ "\n"), + "\n"),
@ -45,7 +48,13 @@ impl Challenge {
let lines: Vec<&str> = frontmatter.trim().lines().collect(); let lines: Vec<&str> = frontmatter.trim().lines().collect();
lines[1..lines.len() - 1].join("\n") lines[1..lines.len() - 1].join("\n")
}; };
let challenge: Challenge = serde_yaml::from_str(&frontmatter).unwrap(); let mut challenge: Challenge = serde_yaml::from_str(&frontmatter).unwrap();
//challenge.text = Some(challenge_text.replace(&frontmatter, "").trim().to_owned());
let mut html = vec![];
format_html(root, &ComrakOptions::default(), &mut html)
.expect("Failed to format HTML");
challenge.text = Some(furigana_to_html(&gh_emoji::Replacer::new()
.replace_all(&String::from_utf8(html).unwrap())));
challenge challenge
} else { } else {
panic!("No frontmatter!") panic!("No frontmatter!")

@ -100,6 +100,7 @@
{% endfor %} {% endfor %}
</div> </div>
{% endif %} {% endif %}
{{ content.text | safe }}
{% if content.translation %} {% if content.translation %}
<p> <p>
Translation Translation

Loading…
Cancel
Save