From: Simon Tatham Date: Thu, 11 Jan 2024 07:45:28 +0000 (+0000) Subject: More ColouredString streamlining. X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=commitdiff_plain;h=875a0fa3c8d9d1a55b5344a2349bbc63203f4ab5;p=mastodonochrome.git More ColouredString streamlining. By making Paragraph::add() take a general impl ColouredStringCommon, we can get rid of a lot of no-longer-necessary &. --- diff --git a/src/text.rs b/src/text.rs index fdcc67e..0caf31e 100644 --- a/src/text.rs +++ b/src/text.rs @@ -432,7 +432,8 @@ impl Paragraph { self } - pub fn push_text(&mut self, text: &ColouredString, squash_spaces: bool) { + pub fn push_text(&mut self, text: impl ColouredStringCommon, + squash_spaces: bool) { for ch in text.chars() { if let Some(curr_word) = self.words.last_mut() { let is_space = ch.is_space(); @@ -447,7 +448,7 @@ impl Paragraph { } } - pub fn add(mut self, text: &ColouredString) -> Self { + pub fn add(mut self, text: impl ColouredStringCommon) -> Self { self.push_text(text, false); self } @@ -507,7 +508,7 @@ fn test_para_build() { laterindent: 4, wrap: true, }); - assert_eq!(Paragraph::new().add(&ColouredString::plain("foo bar baz")), + assert_eq!(Paragraph::new().add(ColouredString::plain("foo bar baz")), Paragraph { words: vec! { ColouredString::plain("foo"), @@ -521,8 +522,8 @@ fn test_para_build() { wrap: true, }); assert_eq!(Paragraph::new() - .add(&ColouredString::plain("foo ba")) - .add(&ColouredString::plain("r baz")), + .add(ColouredString::plain("foo ba")) + .add(ColouredString::plain("r baz")), Paragraph { words: vec! { ColouredString::plain("foo"), @@ -535,7 +536,7 @@ fn test_para_build() { laterindent: 0, wrap: true, }); - assert_eq!(Paragraph::new().add(&ColouredString::general( + assert_eq!(Paragraph::new().add(ColouredString::general( " foo bar baz ", "abcdefghijklmnopq")), Paragraph { words: vec! { @@ -607,7 +608,7 @@ impl TextFragment for Paragraph { #[test] fn test_para_wrap() { - let p = Paragraph::new().add(&ColouredString::plain( + let p = Paragraph::new().add(ColouredString::plain( "the quick brown fox jumps over the lazy dog")); assert_eq!(p.render(16), vec! { ColouredString::plain("the quick brown"), @@ -615,7 +616,7 @@ fn test_para_wrap() { ColouredString::plain("the lazy dog"), }); - let p = Paragraph::new().add(&ColouredString::plain( + let p = Paragraph::new().add(ColouredString::plain( " one supercalifragilisticexpialidocious word")); assert_eq!(p.render(15), vec! { ColouredString::plain(" one"), @@ -623,21 +624,21 @@ fn test_para_wrap() { ColouredString::plain("word"), }); - let p = Paragraph::new().add(&ColouredString::plain( + let p = Paragraph::new().add(ColouredString::plain( " supercalifragilisticexpialidocious word")); assert_eq!(p.render(15), vec! { ColouredString::plain(" supercalifragilisticexpialidocious"), ColouredString::plain("word"), }); - let p = Paragraph::new().add(&ColouredString::plain( + let p = Paragraph::new().add(ColouredString::plain( "the quick brown fox jumps over the lazy dog")) .set_wrap(false); assert_eq!(p.render(15), vec! { ColouredString::plain("the quick brown fox jumps over the lazy dog"), }); - let p = Paragraph::new().add(&ColouredString::plain( + let p = Paragraph::new().add(ColouredString::plain( "the quick brown fox jumps over the lazy dog")) .set_indent(4, 2); assert_eq!(p.render(15), vec! { @@ -932,7 +933,7 @@ pub struct InReplyToLine { impl InReplyToLine { pub fn new(post: Paragraph) -> Self { - let mut para = Paragraph::new().add(&ColouredString::plain("Re: ")); + let mut para = Paragraph::new().add(ColouredString::plain("Re: ")); let currlen = para.words.len(); para.push_para(&post); para.delete_mention_words_from(currlen); @@ -942,7 +943,7 @@ impl InReplyToLine { pub fn from_id(id: &str, client: &mut Client) -> Self { let parent_text = match client.status_by_id(id) { Ok(st) => Html::new(&st.content).to_para(), - Err(e) => Paragraph::new().add(&ColouredString::plain( + Err(e) => Paragraph::new().add(ColouredString::plain( &format!("[unavailable: {}]", e) )), }; @@ -1143,7 +1144,7 @@ fn test_notification_log() { "%Y-%m-%d %H:%M:%S") .unwrap().and_local_timezone(Local).unwrap().with_timezone(&Utc); - let post = Paragraph::new().add(&ColouredString::general( + let post = Paragraph::new().add(ColouredString::general( "@stoat @weasel take a look at this otter! @badger might also like it", "@@@@@@ @@@@@@@ @@@@@@@ ", )); @@ -1251,7 +1252,7 @@ impl Media { .split('\n') .map(|x| Paragraph::new() .set_indent(2, 2) - .add(&ColouredString::uniform(x, 'm'))) + .add(ColouredString::uniform(x, 'm'))) .collect(); trim_para_list(&mut paras); paras @@ -1789,9 +1790,9 @@ impl StatusDisplay { let warning = if st.sensitive { let mut para = Paragraph::new(); - para = para.add(&ColouredString::uniform("Content note:", 'r')); + para = para.add(ColouredString::uniform("Content note:", 'r')); para.end_word(); - para = para.add(&ColouredString::plain(&st.spoiler_text)); + para = para.add(ColouredString::plain(&st.spoiler_text)); Some(para) } else { None @@ -1929,7 +1930,7 @@ impl TextFragment for StatusDisplay { let option = Paragraph::new().set_indent(0, 2).add( &ColouredString::uniform( if voted {"[X]"} else {"[ ]"}, 'H')) - .add(&desc); + .add(desc); let push_fragment_opt_highlight = if highlighting_this_option { push_fragment_highlighted } else { @@ -2026,36 +2027,36 @@ pub struct DetailedStatusDisplay { impl DetailedStatusDisplay { pub fn new(st: Status, client: &mut Client) -> Self { let id = Paragraph::new() - .add(&ColouredString::plain("Post id: ")) - .add(&ColouredString::plain(&st.id)); + .add(ColouredString::plain("Post id: ")) + .add(ColouredString::plain(&st.id)); let webstatus = st.url.as_ref().map( |s| Paragraph::new() - .add(&ColouredString::plain("On the web: ")) - .add(&ColouredString::uniform(&client.fq(s), 'u'))); + .add(ColouredString::plain("On the web: ")) + .add(ColouredString::uniform(&client.fq(s), 'u'))); let creation = Paragraph::new() - .add(&ColouredString::plain("Creation time: ")) - .add(&ColouredString::plain(&format_date(st.created_at))); + .add(ColouredString::plain("Creation time: ")) + .add(ColouredString::plain(&format_date(st.created_at))); let lastedit = Paragraph::new() - .add(&ColouredString::plain("Last edit time: ")) + .add(ColouredString::plain("Last edit time: ")) .add(&st.edited_at.map_or_else( || ColouredString::uniform("none", '0'), |date| ColouredString::plain(&format_date(date)))); let reply_to = Paragraph::new() - .add(&ColouredString::plain("Reply to post: ")) + .add(ColouredString::plain("Reply to post: ")) .add(&st.in_reply_to_id.as_ref().map_or_else( || ColouredString::uniform("none", '0'), |s| ColouredString::plain(s))); let reply_to_id = st.in_reply_to_id.clone(); let reply_to_user = Paragraph::new() - .add(&ColouredString::plain("Reply to account: ")) + .add(ColouredString::plain("Reply to account: ")) .add(&st.in_reply_to_account_id.as_ref().map_or_else( || ColouredString::uniform("none", '0'), |s| ColouredString::plain(s))); let reply_to_user_id = st.in_reply_to_account_id.clone(); let language = Paragraph::new() - .add(&ColouredString::plain("Language: ")) + .add(ColouredString::plain("Language: ")) .add(&st.language.as_ref().map_or_else( || ColouredString::uniform("none", '0'), |s| ColouredString::plain(s))); @@ -2065,7 +2066,7 @@ impl DetailedStatusDisplay { true => ColouredString::uniform("yes", 'r'), }; let sensitive = Paragraph::new() - .add(&ColouredString::plain("Sensitive: ")) + .add(ColouredString::plain("Sensitive: ")) .add(&sens_str); let opt_spoiler = if st.spoiler_text.is_empty() { None @@ -2073,24 +2074,24 @@ impl DetailedStatusDisplay { Some(&st.spoiler_text) }; let spoiler = Paragraph::new().set_indent(0, 2) - .add(&ColouredString::plain("Spoiler text: ")) + .add(ColouredString::plain("Spoiler text: ")) .add(&opt_spoiler.as_ref().map_or_else( || ColouredString::uniform("none", '0'), |s| ColouredString::plain(s))); let replies = Paragraph::new() - .add(&ColouredString::plain( + .add(ColouredString::plain( &format!("Replies: {}", st.replies_count))); let boosts = Paragraph::new() - .add(&ColouredString::plain( + .add(ColouredString::plain( &format!("Boosts: {}", st.reblogs_count))); let favourites = Paragraph::new() - .add(&ColouredString::plain( + .add(ColouredString::plain( &format!("Favourites: {}", st.favourites_count))); let mentions: Vec<_> = st.mentions.iter().map(|m| { let para = Paragraph::new().set_indent(2, 2) - .add(&ColouredString::uniform(&client.fq(&m.acct), 'f')); + .add(ColouredString::uniform(&client.fq(&m.acct), 'f')); (para, m.id.to_owned()) }).collect(); let mentions_header = if mentions.is_empty() { @@ -2101,12 +2102,12 @@ impl DetailedStatusDisplay { }; let client_name = Paragraph::new() - .add(&ColouredString::plain("Client name: ")) + .add(ColouredString::plain("Client name: ")) .add(&st.application.as_ref().map_or_else( || ColouredString::uniform("none", '0'), |app| ColouredString::plain(&app.name))); let client_url = Paragraph::new() - .add(&ColouredString::plain("Client website: ")) + .add(ColouredString::plain("Client website: ")) .add(&st.application.as_ref() .and_then(|app| app.website.as_ref()) .map_or_else( @@ -2116,7 +2117,7 @@ impl DetailedStatusDisplay { let sd = StatusDisplay::new(st, client); let urls: Vec<_> = sd.list_urls().iter().map(|u| { Paragraph::new().set_indent(2, 4) - .add(&ColouredString::uniform(u, 'u')) + .add(ColouredString::uniform(u, 'u')) }).collect(); let urls_header = if urls.is_empty() { None @@ -2314,58 +2315,58 @@ pub struct ExamineUserDisplay { impl ExamineUserDisplay { pub fn new(ac: Account, client: &mut Client) -> Result { let name = Paragraph::new() - .add(&ColouredString::plain("Account name: ")) - .add(&ColouredString::uniform(&client.fq(&ac.acct), 'f')); + .add(ColouredString::plain("Account name: ")) + .add(ColouredString::uniform(&client.fq(&ac.acct), 'f')); let webaccount = Paragraph::new() - .add(&ColouredString::plain("On the web: ")) - .add(&ColouredString::uniform(&client.fq(&ac.url), 'u')); + .add(ColouredString::plain("On the web: ")) + .add(ColouredString::uniform(&client.fq(&ac.url), 'u')); let dispname = Paragraph::new() - .add(&ColouredString::plain("Display name: ")) - .add(&ColouredString::plain(&ac.display_name)); + .add(ColouredString::plain("Display name: ")) + .add(ColouredString::plain(&ac.display_name)); let bio_header = Paragraph::new() - .add(&ColouredString::plain("Bio:")); + .add(ColouredString::plain("Bio:")); let bio = Html::new(&ac.note); let info_header = Paragraph::new() - .add(&ColouredString::plain("Information:")); + .add(ColouredString::plain("Information:")); let info_fields = ac.fields.iter().map(|field| { let colour = if field.verified_at.is_some() { 'f' } else { ' ' }; let title_text = field.name.trim(); let title_text = title_text.strip_suffix(':').unwrap_or(title_text); let title_text = title_text.to_owned() + ":"; let title = Paragraph::new() - .add(&ColouredString::uniform(&title_text, colour)) + .add(ColouredString::uniform(&title_text, colour)) .set_indent(2, 2); let content = Html::new(&field.value); (title, content) }).collect(); let id = Paragraph::new() - .add(&ColouredString::plain("Account id: ")) - .add(&ColouredString::plain(&ac.id)); + .add(ColouredString::plain("Account id: ")) + .add(ColouredString::plain(&ac.id)); let creation = Paragraph::new() - .add(&ColouredString::plain("Account created: ")) + .add(ColouredString::plain("Account created: ")) .add(&Self::format_option_approx_date(Some(ac.created_at))); let last_post = Paragraph::new() - .add(&ColouredString::plain("Latest post: ")) + .add(ColouredString::plain("Latest post: ")) .add(&Self::format_option_approx_date(ac.last_status_at)); let post_count = Paragraph::new() - .add(&ColouredString::plain( + .add(ColouredString::plain( &format!("Number of posts: {}", ac.statuses_count))); let followers_count = Paragraph::new() - .add(&ColouredString::plain( + .add(ColouredString::plain( &format!("Number of followers: {}", ac.followers_count))); let following_count = Paragraph::new() - .add(&ColouredString::plain( + .add(ColouredString::plain( &format!("Number of users followed: {}", ac.following_count))); let mut flags = Vec::new(); if ac.locked { flags.push(Paragraph::new() - .add(&ColouredString::plain("This account is ")) - .add(&ColouredString::uniform("locked", 'r')) - .add(&ColouredString::plain( + .add(ColouredString::plain("This account is ")) + .add(ColouredString::uniform("locked", 'r')) + .add(ColouredString::plain( " (you can't follow it without its permission)."))); } if ac.suspended.unwrap_or(false) { @@ -2390,9 +2391,9 @@ impl ExamineUserDisplay { } if let Some(moved_to) = ac.moved { flags.push(Paragraph::new() - .add(&ColouredString::uniform( + .add(ColouredString::uniform( "This account has moved to:", 'r')) - .add(&ColouredString::plain( + .add(ColouredString::plain( &format!(" {}", client.fq(&moved_to.acct))))); }