1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
use std::fmt;
use minimad::Text;
use crate::skin::MadSkin;
use crate::code;
use crate::line::FmtLine;
use crate::tbl;
use crate::wrap;
pub struct FmtText<'k, 's> {
pub skin: &'k MadSkin,
pub lines: Vec<FmtLine<'s>>,
pub width: Option<usize>,
}
impl<'k, 's> FmtText<'k, 's> {
pub fn from(skin: &'k MadSkin, src: &'s str, width: Option<usize>) -> FmtText<'k, 's> {
let mut mt = Text::from(src);
let mut lines = mt.lines.drain(..).map(
|mline| FmtLine::from(mline, skin)
).collect();
tbl::fix_all_tables(&mut lines, width.unwrap_or(std::usize::MAX));
code::justify_blocks(&mut lines);
if let Some(width) = width {
lines = wrap::hard_wrap_lines(lines, width);
}
FmtText {
skin,
lines,
width,
}
}
}
impl fmt::Display for FmtText<'_, '_> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
for line in &self.lines {
self.skin.write_fmt_line(f, line, self.width, false)?;
writeln!(f)?;
}
Ok(())
}
}