From 61800793069029dbd618757b64e49fe1b34fa772 Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Mon, 25 Dec 2023 15:55:47 +0000 Subject: [PATCH] FileHeader text implementation --- src/text.rs | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/src/text.rs b/src/text.rs index 54e3aaa..20e7399 100644 --- a/src/text.rs +++ b/src/text.rs @@ -399,5 +399,78 @@ fn test_para_wrap() { ColouredString::plain(" jumps over"), ColouredString::plain(" the lazy dog"), }); +} + +pub struct FileHeader { + text: ColouredString, +} + +pub fn fileheader(text: ColouredString) -> Box { + Box::new(FileHeader{ + text: text, + }) +} + +impl TextFragment for FileHeader { + fn render(&self, width: usize) -> Vec { + let elephants = width >= 16; + let twidth = if elephants { width - 9 } else { width - 1 }; + let title = self.text.truncate(twidth); + let tspace = twidth - title.width(); + let tleft = tspace / 2; + let tright = tspace - tleft; + let titlepad = ColouredString::plain(" ").repeat(tleft) + + title + ColouredString::plain(" ").repeat(tright); + let underline = ColouredString::uniform("~", '~').repeat(twidth); + if elephants { + vec! { + (ColouredString::general("(o) ", "JJJ ") + titlepad + + ColouredString::general(" (o)", " JJJ")), + (ColouredString::general("/J\\ ", "JJJ ") + underline + + ColouredString::general(" /J\\", " JJJ")), + } + } else { + vec! { titlepad, underline } + } + } +} + +#[test] +fn test_fileheader() { + assert_eq!(fileheader(ColouredString::uniform("hello, world", 'H')) + .render(40), + vec! { + ColouredString::general("(o) hello, world (o)", + "JJJ HHHHHHHHHHHH JJJ"), + ColouredString::general("/J\\ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /J\\", + "JJJ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ JJJ"), + }); + assert_eq!(fileheader(ColouredString::uniform("hello, world", 'H')) + .render(21), + vec! { + ColouredString::general("(o) hello, world (o)", + "JJJ HHHHHHHHHHHH JJJ"), + ColouredString::general("/J\\ ~~~~~~~~~~~~ /J\\", + "JJJ ~~~~~~~~~~~~ JJJ"), + }); + + assert_eq!(fileheader(ColouredString::uniform("hello, world", 'H')) + .render(20), + vec! { + ColouredString::general("(o) hello, worl (o)", + "JJJ HHHHHHHHHHH JJJ"), + ColouredString::general("/J\\ ~~~~~~~~~~~ /J\\", + "JJJ ~~~~~~~~~~~ JJJ"), + }); + + assert_eq!(fileheader(ColouredString::uniform("hello, world", 'H')) + .render(10), + vec! { + ColouredString::general("hello, wo", + "HHHHHHHHH"), + ColouredString::general("~~~~~~~~~", + "~~~~~~~~~"), + }); } + -- 2.30.2