| //! This example demonstrates how hyperlinks can be embedded into a [`Table`] display. |
| //! |
| //! While not a [`tabled`] specific implementation, it is helpful to know that |
| //! most users expect certain elements of interactivity based on the purpose of your display. |
| //! |
| //! * 🚩 This example requires the `color` feature. |
| //! |
| //! * ⚠️ Terminal interfaces may differ in how they parse links or make them interactive. |
| //! [`tabled`] doesn't have the final say on whether a link is clickable or not. |
| |
| use tabled::{ |
| settings::{object::Segment, Alignment, Modify, Style, Width}, |
| Table, Tabled, |
| }; |
| |
| fn main() { |
| let multicolored_debian = "\x1b[30mDebian\x1b[0m\ |
| \x1b[31m Debian\x1b[0m\ |
| \x1b[32m Debian\x1b[0m\ |
| \x1b[33m Debian\x1b[0m\ |
| \x1b[34m Debian\x1b[0m\ |
| \x1b[35m Debian\x1b[0m\ |
| \x1b[36m Debian\x1b[0m\ |
| \x1b[37m Debian\x1b[0m\ |
| \x1b[40m Debian\x1b[0m\ |
| \x1b[41m Debian\x1b[0m\ |
| \x1b[42m Debian\x1b[0m\ |
| \x1b[43m Debian\x1b[0m\ |
| \x1b[44m Debian\x1b[0m"; |
| |
| let debian_repeat = |
| "DebianDebianDebianDebianDebianDebianDebianDebianDebianDebianDebianDebianDebianDebian" |
| .to_string(); |
| |
| let debian_colored_link = format_osc8_hyperlink("https://www.debian.org/", multicolored_debian); |
| let debian_link = format_osc8_hyperlink("https://www.debian.org/", "Debian"); |
| let wiki_link = format_osc8_hyperlink("https://www.wikipedia.org/", "Debian"); |
| |
| let data = [ |
| Distribution::new("Debian".into(), false), |
| Distribution::new(debian_link.clone(), true), |
| Distribution::new(format!("{debian_link} a link followed by text"), true), |
| Distribution::new( |
| format!("{debian_link} links with intervening text {wiki_link}"), |
| true, |
| ), |
| Distribution::new(format!("a link surrounded {debian_link} by text"), true), |
| Distribution::new(debian_colored_link, true), |
| Distribution::new(debian_repeat, false), |
| ]; |
| |
| let mut table = Table::new(&data); |
| table |
| .with(Style::ascii_rounded()) |
| .with(Alignment::left()) |
| .with(Modify::new(Segment::all()).with(Width::wrap(16).keep_words())); |
| |
| println!("{table}"); |
| |
| let mut table = Table::new(&data); |
| table |
| .with(Style::ascii_rounded()) |
| .with(Alignment::left()) |
| .with(Modify::new(Segment::all()).with(Width::wrap(16))); |
| |
| println!("{table}"); |
| } |
| |
| #[derive(Tabled)] |
| struct Distribution { |
| name: String, |
| is_hyperlink: bool, |
| } |
| |
| impl Distribution { |
| fn new(name: String, is_hyperlink: bool) -> Self { |
| Self { name, is_hyperlink } |
| } |
| } |
| |
| fn format_osc8_hyperlink(url: &str, text: &str) -> String { |
| format!("\x1b]8;;{url}\x1b\\{text}\x1b]8;;\x1b\\",) |
| } |