diff options
Diffstat (limited to 'src/format.rs')
-rw-r--r-- | src/format.rs | 133 |
1 files changed, 76 insertions, 57 deletions
diff --git a/src/format.rs b/src/format.rs index caed70a..3519b13 100644 --- a/src/format.rs +++ b/src/format.rs @@ -1,4 +1,5 @@ use std::fs; +use std::io::Write; use anyhow::Result; @@ -11,18 +12,21 @@ use crate::*; // ===================================================================== pub fn format_batch<'a>(dict_idx: &DictIndex<'a>, count: usize, (i, batch): (usize, &Batch)) { - format_batch_aux(dict_idx, count, i, batch).expect("format batch"); + let mut f = io::BufWriter::new( + fs::File::create(format!("public/{:03}.html", i)).expect("create batch file"), + ); + format_batch_to(&mut f, dict_idx, count, i, batch).expect("format batch"); } -fn format_batch_aux<'a>( +pub fn format_batch_to<'a>( + buf: &mut impl Write, dict_idx: &DictIndex<'a>, count: usize, i: usize, batch: &Batch, ) -> Result<()> { - let mut f = io::BufWriter::new(fs::File::create(format!("public/{:03}.html", i))?); write!( - f, + buf, r#"<!DOCTYPE html> <html> <head> @@ -34,35 +38,35 @@ fn format_batch_aux<'a>( i )?; - writeln!(f, r#"<p><a href="index.html">index</a>"#)?; + writeln!(buf, r#"<p><a href="index.html">index</a>"#)?; for j in 0..count { if j != i { - writeln!(f, r#" <a href="{:03}.html">{:03}</a>"#, j, j)?; + writeln!(buf, r#" <a href="{:03}.html">{:03}</a>"#, j, j)?; } else { - writeln!(f, " {:03}", j)?; + writeln!(buf, " {:03}", j)?; } } - writeln!(f, r#"</p>"#)?; - writeln!(f, "<p>Level: {}</p>", batch.level)?; + writeln!(buf, r#"</p>"#)?; + writeln!(buf, "<p>Level: {}</p>", batch.level)?; - write!(f, r#"<p class="ja">"#)?; + write!(buf, r#"<p class="ja">"#)?; let mut ex_prev = Charset::default(); for ex in batch.examples.iter() { let ex_chars = ex.chars.inter(&batch.chars); for c in ex_chars.diff(&ex_prev).chars().iter() { write!( - f, + buf, r#"<a href="https://jisho.org/search/{}%20%23kanji">{}</a>"#, c, c )?; } ex_prev = ex_prev.union(&ex_chars); } - writeln!(f, r#"</p>"#)?; + writeln!(buf, r#"</p>"#)?; for ex in batch.examples.iter() { - writeln!(f, "<hr />")?; - write!(f, r#"<p class="ja ja_main">"#)?; + writeln!(buf, "<hr />")?; + write!(buf, r#"<p class="ja ja_main">"#)?; let furi = ex.furigana_markup(); for c in furi.chars() { let class = if batch.chars.contains(c) { @@ -78,18 +82,18 @@ fn format_batch_aux<'a>( }; if let Some(cls) = class { write!( - f, + buf, r#"<a href="https://jisho.org/search/{}%20%23kanji" class="{}">{}</a>"#, c, cls, c )?; } else { - write!(f, "{}", c)?; + write!(buf, "{}", c)?; } } - writeln!(f, "</p>")?; - writeln!(f, r#"<p class="en">{}</p>"#, ex.en)?; + writeln!(buf, "</p>")?; + writeln!(buf, r#"<p class="en">{}</p>"#, ex.en)?; - writeln!(f, r#"<details><summary>Explanation</summary>"#)?; + writeln!(buf, r#"<details><summary>Explanation</summary>"#)?; let mut expl_batch = Vec::new(); let mut expl_all = Vec::new(); for word in ex.expl.split(|c| c == ' ' || c == '~') { @@ -111,26 +115,26 @@ fn format_batch_aux<'a>( } } for be in expl_batch { - writeln!(f, r#"<p>{}</p>"#, be)?; + writeln!(buf, r#"<p>{}</p>"#, be)?; } - writeln!(f, r#"<p class="chars">"#)?; + writeln!(buf, r#"<p class="chars">"#)?; for c in ex.chars.inter(&batch.chars).chars().iter() { writeln!( - f, + buf, r#"<a href="https://jisho.org/search/{}%20%23kanji">{}</a>"#, c, c )?; } - writeln!(f, r#"</p>"#)?; + writeln!(buf, r#"</p>"#)?; for be in expl_all { - writeln!(f, r#"<p>{}</p>"#, be)?; + writeln!(buf, r#"<p>{}</p>"#, be)?; } - writeln!(f, r#"</details>"#)?; + writeln!(buf, r#"</details>"#)?; } - writeln!(f, "<hr />")?; + writeln!(buf, "<hr />")?; format_vocab( - &mut f, + buf, &batch .extra_vocab .iter() @@ -139,7 +143,7 @@ fn format_batch_aux<'a>( "Extra vocabulary (this level)", )?; format_vocab( - &mut f, + buf, &batch .extra_vocab .iter() @@ -149,42 +153,42 @@ fn format_batch_aux<'a>( )?; writeln!( - f, + buf, r#"<p><strong>Extra examples (reading practice)</strong></p><table class="extratable">"# )?; for ex in batch.extra_examples.iter() { writeln!( - f, + buf, r#"<tr><td><div class="extra_example"><div class="extra_ja font_ja">{}</div><div class="extra_en">{}</div></div></td></tr>"#, ex.furigana_markup(), ex.en )?; } - writeln!(f, r#"</table>"#)?; + writeln!(buf, r#"</table>"#)?; - writeln!(f, "<hr />")?; - writeln!(f, "<p>\(≧▽≦)/</p>")?; + writeln!(buf, "<hr />")?; + writeln!(buf, "<p>\(≧▽≦)/</p>")?; - write!(f, "<div></body></html>")?; - f.flush()?; + write!(buf, "<div></body></html>")?; + buf.flush()?; Ok(()) } -fn format_vocab(f: &mut impl Write, vocab: &[&JlptVocab], t: &str) -> Result<()> { +fn format_vocab(buf: &mut impl Write, vocab: &[&JlptVocab], t: &str) -> Result<()> { if !vocab.is_empty() { writeln!( - f, + buf, r#"<p><strong>{}</strong></p><table class="vocabtable">"#, t )?; for v in vocab { writeln!( - f, + buf, r#"<tr><td>{}</td><td style="word-break: keep-all"> <span class="tab_large font_ja">{}</span> </td><td>{}</td><td class="font_ja" style="word-break: keep-all">{}</td></tr>"#, v.level, v.kanji, v.en, v.kana )?; } - writeln!(f, "</table>")?; + writeln!(buf, "</table>")?; } Ok(()) } @@ -225,8 +229,16 @@ fn dict_str<'a>(qkeb: &str, qreb: Option<&str>, ent: &roxmltree::Node<'a, 'a>) - pub fn format_index(batches: &[Batch], kanji_levels: &[(String, String)]) -> Result<()> { let mut f = io::BufWriter::new(fs::File::create("public/index.html")?); + format_index_to(&mut f, batches, kanji_levels) +} + +pub fn format_index_to( + buf: &mut impl Write, + batches: &[Batch], + kanji_levels: &[(String, String)], +) -> Result<()> { write!( - f, + buf, r#"<!DOCTYPE html> <html> <head> @@ -237,13 +249,16 @@ pub fn format_index(batches: &[Batch], kanji_levels: &[(String, String)]) -> Res <body><div class="index_page">"# )?; - writeln!(f, r#"<p><a href="about.html">About / How-to</a></p><hr />"#)?; + writeln!( + buf, + r#"<p><a href="about.html">About / How-to</a></p><hr />"# + )?; - writeln!(f, "<table>")?; - writeln!(f, "<tr><th>Num</th><th>Level</th><th>Kanji</th><th>Examples</th><th>Lesson-1</th><th>Lesson-2</th><th>Ignore</th></tr>")?; + writeln!(buf, "<table>")?; + writeln!(buf, "<tr><th>Num</th><th>Level</th><th>Kanji</th><th>Examples</th><th>Lesson-1</th><th>Lesson-2</th><th>Ignore</th></tr>")?; for (i, batch) in batches.iter().enumerate() { writeln!( - f, + buf, r#"<tr><td><a href="{:03}.html">{:03}</a></td><td>{}</td><td class="font_ja">{}</td><td> {}</td><td class="font_ja">{}</td><td class="font_ja">{}</td><td class="font_ja">{}</td></tr>"#, i, i, @@ -255,9 +270,9 @@ pub fn format_index(batches: &[Batch], kanji_levels: &[(String, String)]) -> Res batch.chars_bad.to_string() )?; } - writeln!(f, r#"</table>"#)?; + writeln!(buf, r#"</table>"#)?; - writeln!(f, "<hr />")?; + writeln!(buf, "<hr />")?; let all_chars = Charset::from_iter( batches @@ -265,9 +280,9 @@ pub fn format_index(batches: &[Batch], kanji_levels: &[(String, String)]) -> Res .map(|x| x.chars.chars().iter().copied()) .flatten(), ); - writeln!(f, "<table>")?; + writeln!(buf, "<table>")?; writeln!( - f, + buf, r#"<tr><th>Level</th><th>Count</th><th width="60%">Kanji</th><th>Missing kanji</th></tr>"# )?; for (lvl, chars) in kanji_levels.iter() { @@ -277,7 +292,7 @@ pub fn format_index(batches: &[Batch], kanji_levels: &[(String, String)]) -> Res let chars = Charset::new(chars); let missing = chars.diff(&all_chars); writeln!( - f, + buf, r#"<tr><td>{}</td><td>{}</td><td class="font_ja">{}</td><td><span class="font_ja">{}</span> ({})</td></tr>"#, lvl, chars.len(), @@ -286,17 +301,21 @@ pub fn format_index(batches: &[Batch], kanji_levels: &[(String, String)]) -> Res missing.len() )?; } - writeln!(f, "</table>")?; + writeln!(buf, "</table>")?; - write!(f, "</div></body></html>")?; - f.flush()?; + write!(buf, "</div></body></html>")?; + buf.flush()?; Ok(()) } pub fn format_about() -> Result<()> { let mut f = io::BufWriter::new(fs::File::create("public/about.html")?); + format_about_to(&mut f) +} + +pub fn format_about_to(buf: &mut impl Write) -> Result<()> { write!( - f, + buf, r#"<!DOCTYPE html> <html> <head> @@ -307,19 +326,19 @@ pub fn format_about() -> Result<()> { <body>"# )?; - writeln!(f, r#"<div class="about_page">"#)?; + writeln!(buf, r#"<div class="about_page">"#)?; writeln!( - f, + buf, r#"<p><a href="index.html">Back to lessons</a></p><hr />"# )?; writeln!( - f, + buf, "{}", markdown::to_html(&fs::read_to_string("README.md")?) )?; - writeln!(f, r#"</div></body></html>"#)?; + writeln!(buf, r#"</div></body></html>"#)?; Ok(()) } |