forked from extern/nushell
table refactor for readability (#5555)
This commit is contained in:
parent
2b96c93b8d
commit
d1e7884d19
@ -1,14 +1,13 @@
|
||||
use lscolors::{LsColors, Style};
|
||||
use nu_color_config::{get_color_config, style_primitive};
|
||||
use nu_engine::column::get_columns;
|
||||
use nu_engine::{env_to_string, CallExt};
|
||||
use nu_protocol::ast::{Call, PathMember};
|
||||
use nu_protocol::engine::{Command, EngineState, Stack, StateWorkingSet};
|
||||
use nu_engine::{column::get_columns, env_to_string, CallExt};
|
||||
use nu_protocol::{
|
||||
ast::{Call, PathMember},
|
||||
engine::{Command, EngineState, Stack, StateWorkingSet},
|
||||
format_error, Category, Config, DataSource, Example, IntoPipelineData, ListStream,
|
||||
PipelineData, PipelineMetadata, RawStream, ShellError, Signature, Span, SyntaxShape, Value,
|
||||
};
|
||||
use nu_table::{StyledString, TextStyle, Theme};
|
||||
use nu_table::{StyledString, TableTheme, TextStyle};
|
||||
use std::sync::atomic::{AtomicBool, Ordering};
|
||||
use std::sync::Arc;
|
||||
use std::time::Instant;
|
||||
@ -536,17 +535,17 @@ impl Iterator for PagingTableCreator {
|
||||
}
|
||||
}
|
||||
|
||||
fn load_theme_from_config(config: &Config) -> Theme {
|
||||
fn load_theme_from_config(config: &Config) -> TableTheme {
|
||||
match config.table_mode.as_str() {
|
||||
"basic" => nu_table::Theme::basic(),
|
||||
"compact" => nu_table::Theme::compact(),
|
||||
"compact_double" => nu_table::Theme::compact_double(),
|
||||
"light" => nu_table::Theme::light(),
|
||||
"with_love" => nu_table::Theme::with_love(),
|
||||
"rounded" => nu_table::Theme::rounded(),
|
||||
"reinforced" => nu_table::Theme::reinforced(),
|
||||
"heavy" => nu_table::Theme::heavy(),
|
||||
"none" => nu_table::Theme::none(),
|
||||
_ => nu_table::Theme::rounded(),
|
||||
"basic" => nu_table::TableTheme::basic(),
|
||||
"compact" => nu_table::TableTheme::compact(),
|
||||
"compact_double" => nu_table::TableTheme::compact_double(),
|
||||
"light" => nu_table::TableTheme::light(),
|
||||
"with_love" => nu_table::TableTheme::with_love(),
|
||||
"rounded" => nu_table::TableTheme::rounded(),
|
||||
"reinforced" => nu_table::TableTheme::reinforced(),
|
||||
"heavy" => nu_table::TableTheme::heavy(),
|
||||
"none" => nu_table::TableTheme::none(),
|
||||
_ => nu_table::TableTheme::rounded(),
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,9 @@
|
||||
mod table;
|
||||
mod table_theme;
|
||||
mod textstyle;
|
||||
mod wrap;
|
||||
|
||||
pub use table::{draw_table, StyledString, Table, TextStyle, Theme};
|
||||
pub use table::{draw_table, Table};
|
||||
pub use table_theme::TableTheme;
|
||||
pub use textstyle::{StyledString, TextStyle};
|
||||
pub use wrap::Alignment;
|
||||
|
@ -1,5 +1,5 @@
|
||||
use nu_protocol::Config;
|
||||
use nu_table::{draw_table, StyledString, Table, TextStyle, Theme};
|
||||
use nu_table::{draw_table, StyledString, Table, TableTheme, TextStyle};
|
||||
use std::collections::HashMap;
|
||||
|
||||
fn main() {
|
||||
@ -23,7 +23,7 @@ fn main() {
|
||||
// The table rows
|
||||
let rows = vec_of_str_to_vec_of_styledstr(&row_data, false);
|
||||
// The table itself
|
||||
let table = Table::new(headers, vec![rows; 3], Theme::rounded());
|
||||
let table = Table::new(headers, vec![rows; 3], TableTheme::rounded());
|
||||
// FIXME: Config isn't available from here so just put these here to compile
|
||||
let color_hm: HashMap<String, nu_ansi_term::Style> = HashMap::new();
|
||||
// get the default config
|
||||
|
@ -1,5 +1,7 @@
|
||||
use crate::table_theme::TableTheme;
|
||||
use crate::wrap::{column_width, split_sublines, wrap, Alignment, Subline, WrappedCell};
|
||||
use nu_ansi_term::{Color, Style};
|
||||
use crate::{StyledString, TextStyle};
|
||||
use nu_ansi_term::Style;
|
||||
use nu_protocol::{Config, FooterMode};
|
||||
use std::collections::HashMap;
|
||||
use std::fmt::Write;
|
||||
@ -14,595 +16,15 @@ enum SeparatorPosition {
|
||||
pub struct Table {
|
||||
pub headers: Vec<StyledString>,
|
||||
pub data: Vec<Vec<StyledString>>,
|
||||
pub theme: Theme,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct StyledString {
|
||||
pub contents: String,
|
||||
pub style: TextStyle,
|
||||
}
|
||||
|
||||
impl StyledString {
|
||||
pub fn new(contents: String, style: TextStyle) -> StyledString {
|
||||
StyledString { contents, style }
|
||||
}
|
||||
|
||||
pub fn set_style(&mut self, style: TextStyle) {
|
||||
self.style = style;
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
pub struct TextStyle {
|
||||
pub alignment: Alignment,
|
||||
pub color_style: Option<Style>,
|
||||
}
|
||||
|
||||
impl TextStyle {
|
||||
pub fn new() -> TextStyle {
|
||||
TextStyle {
|
||||
alignment: Alignment::Left,
|
||||
color_style: Some(Style::default()),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn bold(&self, bool_value: Option<bool>) -> TextStyle {
|
||||
let bv = bool_value.unwrap_or(false);
|
||||
|
||||
TextStyle {
|
||||
alignment: self.alignment,
|
||||
color_style: Some(Style {
|
||||
is_bold: bv,
|
||||
..self.color_style.unwrap_or_default()
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_bold(&self) -> bool {
|
||||
self.color_style.unwrap_or_default().is_bold
|
||||
}
|
||||
|
||||
pub fn dimmed(&self) -> TextStyle {
|
||||
TextStyle {
|
||||
alignment: self.alignment,
|
||||
color_style: Some(Style {
|
||||
is_dimmed: true,
|
||||
..self.color_style.unwrap_or_default()
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_dimmed(&self) -> bool {
|
||||
self.color_style.unwrap_or_default().is_dimmed
|
||||
}
|
||||
|
||||
pub fn italic(&self) -> TextStyle {
|
||||
TextStyle {
|
||||
alignment: self.alignment,
|
||||
color_style: Some(Style {
|
||||
is_italic: true,
|
||||
..self.color_style.unwrap_or_default()
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_italic(&self) -> bool {
|
||||
self.color_style.unwrap_or_default().is_italic
|
||||
}
|
||||
|
||||
pub fn underline(&self) -> TextStyle {
|
||||
TextStyle {
|
||||
alignment: self.alignment,
|
||||
color_style: Some(Style {
|
||||
is_underline: true,
|
||||
..self.color_style.unwrap_or_default()
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_underline(&self) -> bool {
|
||||
self.color_style.unwrap_or_default().is_underline
|
||||
}
|
||||
|
||||
pub fn blink(&self) -> TextStyle {
|
||||
TextStyle {
|
||||
alignment: self.alignment,
|
||||
color_style: Some(Style {
|
||||
is_blink: true,
|
||||
..self.color_style.unwrap_or_default()
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_blink(&self) -> bool {
|
||||
self.color_style.unwrap_or_default().is_blink
|
||||
}
|
||||
|
||||
pub fn reverse(&self) -> TextStyle {
|
||||
TextStyle {
|
||||
alignment: self.alignment,
|
||||
color_style: Some(Style {
|
||||
is_reverse: true,
|
||||
..self.color_style.unwrap_or_default()
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_reverse(&self) -> bool {
|
||||
self.color_style.unwrap_or_default().is_reverse
|
||||
}
|
||||
|
||||
pub fn hidden(&self) -> TextStyle {
|
||||
TextStyle {
|
||||
alignment: self.alignment,
|
||||
color_style: Some(Style {
|
||||
is_hidden: true,
|
||||
..self.color_style.unwrap_or_default()
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_hidden(&self) -> bool {
|
||||
self.color_style.unwrap_or_default().is_hidden
|
||||
}
|
||||
|
||||
pub fn strikethrough(&self) -> TextStyle {
|
||||
TextStyle {
|
||||
alignment: self.alignment,
|
||||
color_style: Some(Style {
|
||||
is_strikethrough: true,
|
||||
..self.color_style.unwrap_or_default()
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_strikethrough(&self) -> bool {
|
||||
self.color_style.unwrap_or_default().is_strikethrough
|
||||
}
|
||||
|
||||
pub fn fg(&self, foreground: Color) -> TextStyle {
|
||||
TextStyle {
|
||||
alignment: self.alignment,
|
||||
color_style: Some(Style {
|
||||
foreground: Some(foreground),
|
||||
..self.color_style.unwrap_or_default()
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn on(&self, background: Color) -> TextStyle {
|
||||
TextStyle {
|
||||
alignment: self.alignment,
|
||||
color_style: Some(Style {
|
||||
background: Some(background),
|
||||
..self.color_style.unwrap_or_default()
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn bg(&self, background: Color) -> TextStyle {
|
||||
TextStyle {
|
||||
alignment: self.alignment,
|
||||
color_style: Some(Style {
|
||||
background: Some(background),
|
||||
..self.color_style.unwrap_or_default()
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn alignment(&self, align: Alignment) -> TextStyle {
|
||||
TextStyle {
|
||||
alignment: align,
|
||||
color_style: self.color_style,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn style(&self, style: Style) -> TextStyle {
|
||||
TextStyle {
|
||||
alignment: self.alignment,
|
||||
color_style: Some(Style {
|
||||
foreground: style.foreground,
|
||||
background: style.background,
|
||||
is_bold: style.is_bold,
|
||||
is_dimmed: style.is_dimmed,
|
||||
is_italic: style.is_italic,
|
||||
is_underline: style.is_underline,
|
||||
is_blink: style.is_blink,
|
||||
is_reverse: style.is_reverse,
|
||||
is_hidden: style.is_hidden,
|
||||
is_strikethrough: style.is_strikethrough,
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn basic_center() -> TextStyle {
|
||||
TextStyle::new()
|
||||
.alignment(Alignment::Center)
|
||||
.style(Style::default())
|
||||
}
|
||||
|
||||
pub fn basic_right() -> TextStyle {
|
||||
TextStyle::new()
|
||||
.alignment(Alignment::Right)
|
||||
.style(Style::default())
|
||||
}
|
||||
|
||||
pub fn basic_left() -> TextStyle {
|
||||
TextStyle::new()
|
||||
.alignment(Alignment::Left)
|
||||
.style(Style::default())
|
||||
}
|
||||
|
||||
pub fn default_header() -> TextStyle {
|
||||
TextStyle::new()
|
||||
.alignment(Alignment::Center)
|
||||
.fg(Color::Green)
|
||||
.bold(Some(true))
|
||||
}
|
||||
|
||||
pub fn default_field() -> TextStyle {
|
||||
TextStyle::new().fg(Color::Green).bold(Some(true))
|
||||
}
|
||||
|
||||
pub fn with_attributes(bo: bool, al: Alignment, co: Color) -> TextStyle {
|
||||
TextStyle::new().alignment(al).fg(co).bold(Some(bo))
|
||||
}
|
||||
|
||||
pub fn with_style(al: Alignment, style: Style) -> TextStyle {
|
||||
TextStyle::new().alignment(al).style(Style {
|
||||
foreground: style.foreground,
|
||||
background: style.background,
|
||||
is_bold: style.is_bold,
|
||||
is_dimmed: style.is_dimmed,
|
||||
is_italic: style.is_italic,
|
||||
is_underline: style.is_underline,
|
||||
is_blink: style.is_blink,
|
||||
is_reverse: style.is_reverse,
|
||||
is_hidden: style.is_hidden,
|
||||
is_strikethrough: style.is_strikethrough,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for TextStyle {
|
||||
fn default() -> Self {
|
||||
Self::new()
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct Theme {
|
||||
pub top_left: char,
|
||||
pub middle_left: char,
|
||||
pub bottom_left: char,
|
||||
pub top_center: char,
|
||||
pub center: char,
|
||||
pub bottom_center: char,
|
||||
pub top_right: char,
|
||||
pub middle_right: char,
|
||||
pub bottom_right: char,
|
||||
pub top_horizontal: char,
|
||||
pub middle_horizontal: char,
|
||||
pub bottom_horizontal: char,
|
||||
pub left_vertical: char,
|
||||
pub center_vertical: char,
|
||||
pub right_vertical: char,
|
||||
|
||||
pub separate_header: bool,
|
||||
pub separate_rows: bool,
|
||||
|
||||
pub print_left_border: bool,
|
||||
pub print_right_border: bool,
|
||||
pub print_top_border: bool,
|
||||
pub print_bottom_border: bool,
|
||||
}
|
||||
|
||||
impl Theme {
|
||||
#[allow(unused)]
|
||||
pub fn basic() -> Theme {
|
||||
Theme {
|
||||
top_left: '+',
|
||||
middle_left: '+',
|
||||
bottom_left: '+',
|
||||
top_center: '+',
|
||||
center: '+',
|
||||
bottom_center: '+',
|
||||
top_right: '+',
|
||||
middle_right: '+',
|
||||
bottom_right: '+',
|
||||
top_horizontal: '-',
|
||||
middle_horizontal: '-',
|
||||
bottom_horizontal: '-',
|
||||
left_vertical: '|',
|
||||
center_vertical: '|',
|
||||
right_vertical: '|',
|
||||
|
||||
separate_header: true,
|
||||
separate_rows: true,
|
||||
|
||||
print_left_border: true,
|
||||
print_right_border: true,
|
||||
print_top_border: true,
|
||||
print_bottom_border: true,
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
pub fn thin() -> Theme {
|
||||
Theme {
|
||||
top_left: '┌',
|
||||
middle_left: '├',
|
||||
bottom_left: '└',
|
||||
top_center: '┬',
|
||||
center: '┼',
|
||||
bottom_center: '┴',
|
||||
top_right: '┐',
|
||||
middle_right: '┤',
|
||||
bottom_right: '┘',
|
||||
|
||||
top_horizontal: '─',
|
||||
middle_horizontal: '─',
|
||||
bottom_horizontal: '─',
|
||||
|
||||
left_vertical: '│',
|
||||
center_vertical: '│',
|
||||
right_vertical: '│',
|
||||
|
||||
separate_header: true,
|
||||
separate_rows: true,
|
||||
|
||||
print_left_border: true,
|
||||
print_right_border: true,
|
||||
print_top_border: true,
|
||||
print_bottom_border: true,
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
pub fn light() -> Theme {
|
||||
Theme {
|
||||
top_left: ' ',
|
||||
middle_left: '─',
|
||||
bottom_left: ' ',
|
||||
top_center: ' ',
|
||||
center: '─',
|
||||
bottom_center: ' ',
|
||||
top_right: ' ',
|
||||
middle_right: '─',
|
||||
bottom_right: ' ',
|
||||
|
||||
top_horizontal: ' ',
|
||||
middle_horizontal: '─',
|
||||
bottom_horizontal: ' ',
|
||||
|
||||
left_vertical: ' ',
|
||||
center_vertical: ' ',
|
||||
right_vertical: ' ',
|
||||
|
||||
separate_header: true,
|
||||
separate_rows: false,
|
||||
|
||||
print_left_border: true,
|
||||
print_right_border: true,
|
||||
print_top_border: false,
|
||||
print_bottom_border: true,
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
pub fn compact() -> Theme {
|
||||
Theme {
|
||||
top_left: '─',
|
||||
middle_left: '─',
|
||||
bottom_left: '─',
|
||||
top_center: '┬',
|
||||
center: '┼',
|
||||
bottom_center: '┴',
|
||||
top_right: '─',
|
||||
middle_right: '─',
|
||||
bottom_right: '─',
|
||||
top_horizontal: '─',
|
||||
middle_horizontal: '─',
|
||||
bottom_horizontal: '─',
|
||||
|
||||
left_vertical: ' ',
|
||||
center_vertical: '│',
|
||||
right_vertical: ' ',
|
||||
|
||||
separate_header: true,
|
||||
separate_rows: false,
|
||||
|
||||
print_left_border: false,
|
||||
print_right_border: false,
|
||||
print_top_border: true,
|
||||
print_bottom_border: true,
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
pub fn with_love() -> Theme {
|
||||
Theme {
|
||||
top_left: '❤',
|
||||
middle_left: '❤',
|
||||
bottom_left: '❤',
|
||||
top_center: '❤',
|
||||
center: '❤',
|
||||
bottom_center: '❤',
|
||||
top_right: '❤',
|
||||
middle_right: '❤',
|
||||
bottom_right: '❤',
|
||||
top_horizontal: '❤',
|
||||
middle_horizontal: '❤',
|
||||
bottom_horizontal: '❤',
|
||||
|
||||
left_vertical: ' ',
|
||||
center_vertical: '❤',
|
||||
right_vertical: ' ',
|
||||
|
||||
separate_header: true,
|
||||
separate_rows: false,
|
||||
|
||||
print_left_border: false,
|
||||
print_right_border: false,
|
||||
print_top_border: true,
|
||||
print_bottom_border: true,
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
pub fn compact_double() -> Theme {
|
||||
Theme {
|
||||
top_left: '═',
|
||||
middle_left: '═',
|
||||
bottom_left: '═',
|
||||
top_center: '╦',
|
||||
center: '╬',
|
||||
bottom_center: '╩',
|
||||
top_right: '═',
|
||||
middle_right: '═',
|
||||
bottom_right: '═',
|
||||
top_horizontal: '═',
|
||||
middle_horizontal: '═',
|
||||
bottom_horizontal: '═',
|
||||
|
||||
left_vertical: ' ',
|
||||
center_vertical: '║',
|
||||
right_vertical: ' ',
|
||||
|
||||
separate_header: true,
|
||||
separate_rows: false,
|
||||
|
||||
print_left_border: false,
|
||||
print_right_border: false,
|
||||
print_top_border: true,
|
||||
print_bottom_border: true,
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
pub fn rounded() -> Theme {
|
||||
Theme {
|
||||
top_left: '╭',
|
||||
middle_left: '├',
|
||||
bottom_left: '╰',
|
||||
top_center: '┬',
|
||||
center: '┼',
|
||||
bottom_center: '┴',
|
||||
top_right: '╮',
|
||||
middle_right: '┤',
|
||||
bottom_right: '╯',
|
||||
top_horizontal: '─',
|
||||
middle_horizontal: '─',
|
||||
bottom_horizontal: '─',
|
||||
|
||||
left_vertical: '│',
|
||||
center_vertical: '│',
|
||||
right_vertical: '│',
|
||||
|
||||
separate_header: true,
|
||||
separate_rows: false,
|
||||
|
||||
print_left_border: true,
|
||||
print_right_border: true,
|
||||
print_top_border: true,
|
||||
print_bottom_border: true,
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
pub fn reinforced() -> Theme {
|
||||
Theme {
|
||||
top_left: '┏',
|
||||
middle_left: '├',
|
||||
bottom_left: '┗',
|
||||
top_center: '┬',
|
||||
center: '┼',
|
||||
bottom_center: '┴',
|
||||
top_right: '┓',
|
||||
middle_right: '┤',
|
||||
bottom_right: '┛',
|
||||
top_horizontal: '─',
|
||||
middle_horizontal: '─',
|
||||
bottom_horizontal: '─',
|
||||
|
||||
left_vertical: '│',
|
||||
center_vertical: '│',
|
||||
right_vertical: '│',
|
||||
|
||||
separate_header: true,
|
||||
separate_rows: false,
|
||||
|
||||
print_left_border: true,
|
||||
print_right_border: true,
|
||||
print_top_border: true,
|
||||
print_bottom_border: true,
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
pub fn heavy() -> Theme {
|
||||
Theme {
|
||||
top_left: '┏',
|
||||
middle_left: '┣',
|
||||
bottom_left: '┗',
|
||||
top_center: '┳',
|
||||
center: '╋',
|
||||
bottom_center: '┻',
|
||||
top_right: '┓',
|
||||
middle_right: '┫',
|
||||
bottom_right: '┛',
|
||||
top_horizontal: '━',
|
||||
middle_horizontal: '━',
|
||||
bottom_horizontal: '━',
|
||||
|
||||
left_vertical: '┃',
|
||||
center_vertical: '┃',
|
||||
right_vertical: '┃',
|
||||
|
||||
separate_header: true,
|
||||
separate_rows: false,
|
||||
|
||||
print_left_border: true,
|
||||
print_right_border: true,
|
||||
print_top_border: true,
|
||||
print_bottom_border: true,
|
||||
}
|
||||
}
|
||||
#[allow(unused)]
|
||||
pub fn none() -> Theme {
|
||||
Theme {
|
||||
top_left: ' ',
|
||||
middle_left: ' ',
|
||||
bottom_left: ' ',
|
||||
top_center: ' ',
|
||||
center: ' ',
|
||||
bottom_center: ' ',
|
||||
top_right: ' ',
|
||||
middle_right: ' ',
|
||||
bottom_right: ' ',
|
||||
|
||||
top_horizontal: ' ',
|
||||
middle_horizontal: ' ',
|
||||
bottom_horizontal: ' ',
|
||||
|
||||
left_vertical: ' ',
|
||||
center_vertical: ' ',
|
||||
right_vertical: ' ',
|
||||
|
||||
separate_header: false,
|
||||
separate_rows: false,
|
||||
|
||||
print_left_border: false,
|
||||
print_right_border: false,
|
||||
print_top_border: false,
|
||||
print_bottom_border: false,
|
||||
}
|
||||
}
|
||||
pub theme: TableTheme,
|
||||
}
|
||||
|
||||
impl Table {
|
||||
pub fn new(headers: Vec<StyledString>, data: Vec<Vec<StyledString>>, theme: Theme) -> Table {
|
||||
pub fn new(
|
||||
headers: Vec<StyledString>,
|
||||
data: Vec<Vec<StyledString>>,
|
||||
theme: TableTheme,
|
||||
) -> Table {
|
||||
Table {
|
||||
headers,
|
||||
data,
|
||||
@ -615,7 +37,7 @@ impl Table {
|
||||
pub struct ProcessedTable {
|
||||
pub headers: Vec<ProcessedCell>,
|
||||
pub data: Vec<Vec<ProcessedCell>>,
|
||||
pub theme: Theme,
|
||||
pub theme: TableTheme,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
@ -629,7 +51,7 @@ pub struct WrappedTable {
|
||||
pub column_widths: Vec<usize>,
|
||||
pub headers: Vec<WrappedCell>,
|
||||
pub data: Vec<Vec<WrappedCell>>,
|
||||
pub theme: Theme,
|
||||
pub theme: TableTheme,
|
||||
pub footer: Vec<WrappedCell>,
|
||||
}
|
||||
|
||||
|
329
crates/nu-table/src/table_theme.rs
Normal file
329
crates/nu-table/src/table_theme.rs
Normal file
@ -0,0 +1,329 @@
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct TableTheme {
|
||||
pub top_left: char,
|
||||
pub middle_left: char,
|
||||
pub bottom_left: char,
|
||||
pub top_center: char,
|
||||
pub center: char,
|
||||
pub bottom_center: char,
|
||||
pub top_right: char,
|
||||
pub middle_right: char,
|
||||
pub bottom_right: char,
|
||||
pub top_horizontal: char,
|
||||
pub middle_horizontal: char,
|
||||
pub bottom_horizontal: char,
|
||||
pub left_vertical: char,
|
||||
pub center_vertical: char,
|
||||
pub right_vertical: char,
|
||||
|
||||
pub separate_header: bool,
|
||||
pub separate_rows: bool,
|
||||
|
||||
pub print_left_border: bool,
|
||||
pub print_right_border: bool,
|
||||
pub print_top_border: bool,
|
||||
pub print_bottom_border: bool,
|
||||
}
|
||||
|
||||
impl TableTheme {
|
||||
#[allow(unused)]
|
||||
pub fn basic() -> TableTheme {
|
||||
TableTheme {
|
||||
top_left: '+',
|
||||
middle_left: '+',
|
||||
bottom_left: '+',
|
||||
top_center: '+',
|
||||
center: '+',
|
||||
bottom_center: '+',
|
||||
top_right: '+',
|
||||
middle_right: '+',
|
||||
bottom_right: '+',
|
||||
top_horizontal: '-',
|
||||
middle_horizontal: '-',
|
||||
bottom_horizontal: '-',
|
||||
left_vertical: '|',
|
||||
center_vertical: '|',
|
||||
right_vertical: '|',
|
||||
|
||||
separate_header: true,
|
||||
separate_rows: true,
|
||||
|
||||
print_left_border: true,
|
||||
print_right_border: true,
|
||||
print_top_border: true,
|
||||
print_bottom_border: true,
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
pub fn thin() -> TableTheme {
|
||||
TableTheme {
|
||||
top_left: '┌',
|
||||
middle_left: '├',
|
||||
bottom_left: '└',
|
||||
top_center: '┬',
|
||||
center: '┼',
|
||||
bottom_center: '┴',
|
||||
top_right: '┐',
|
||||
middle_right: '┤',
|
||||
bottom_right: '┘',
|
||||
|
||||
top_horizontal: '─',
|
||||
middle_horizontal: '─',
|
||||
bottom_horizontal: '─',
|
||||
|
||||
left_vertical: '│',
|
||||
center_vertical: '│',
|
||||
right_vertical: '│',
|
||||
|
||||
separate_header: true,
|
||||
separate_rows: true,
|
||||
|
||||
print_left_border: true,
|
||||
print_right_border: true,
|
||||
print_top_border: true,
|
||||
print_bottom_border: true,
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
pub fn light() -> TableTheme {
|
||||
TableTheme {
|
||||
top_left: ' ',
|
||||
middle_left: '─',
|
||||
bottom_left: ' ',
|
||||
top_center: ' ',
|
||||
center: '─',
|
||||
bottom_center: ' ',
|
||||
top_right: ' ',
|
||||
middle_right: '─',
|
||||
bottom_right: ' ',
|
||||
|
||||
top_horizontal: ' ',
|
||||
middle_horizontal: '─',
|
||||
bottom_horizontal: ' ',
|
||||
|
||||
left_vertical: ' ',
|
||||
center_vertical: ' ',
|
||||
right_vertical: ' ',
|
||||
|
||||
separate_header: true,
|
||||
separate_rows: false,
|
||||
|
||||
print_left_border: true,
|
||||
print_right_border: true,
|
||||
print_top_border: false,
|
||||
print_bottom_border: true,
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
pub fn compact() -> TableTheme {
|
||||
TableTheme {
|
||||
top_left: '─',
|
||||
middle_left: '─',
|
||||
bottom_left: '─',
|
||||
top_center: '┬',
|
||||
center: '┼',
|
||||
bottom_center: '┴',
|
||||
top_right: '─',
|
||||
middle_right: '─',
|
||||
bottom_right: '─',
|
||||
top_horizontal: '─',
|
||||
middle_horizontal: '─',
|
||||
bottom_horizontal: '─',
|
||||
|
||||
left_vertical: ' ',
|
||||
center_vertical: '│',
|
||||
right_vertical: ' ',
|
||||
|
||||
separate_header: true,
|
||||
separate_rows: false,
|
||||
|
||||
print_left_border: false,
|
||||
print_right_border: false,
|
||||
print_top_border: true,
|
||||
print_bottom_border: true,
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
pub fn with_love() -> TableTheme {
|
||||
TableTheme {
|
||||
top_left: '❤',
|
||||
middle_left: '❤',
|
||||
bottom_left: '❤',
|
||||
top_center: '❤',
|
||||
center: '❤',
|
||||
bottom_center: '❤',
|
||||
top_right: '❤',
|
||||
middle_right: '❤',
|
||||
bottom_right: '❤',
|
||||
top_horizontal: '❤',
|
||||
middle_horizontal: '❤',
|
||||
bottom_horizontal: '❤',
|
||||
|
||||
left_vertical: ' ',
|
||||
center_vertical: '❤',
|
||||
right_vertical: ' ',
|
||||
|
||||
separate_header: true,
|
||||
separate_rows: false,
|
||||
|
||||
print_left_border: false,
|
||||
print_right_border: false,
|
||||
print_top_border: true,
|
||||
print_bottom_border: true,
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
pub fn compact_double() -> TableTheme {
|
||||
TableTheme {
|
||||
top_left: '═',
|
||||
middle_left: '═',
|
||||
bottom_left: '═',
|
||||
top_center: '╦',
|
||||
center: '╬',
|
||||
bottom_center: '╩',
|
||||
top_right: '═',
|
||||
middle_right: '═',
|
||||
bottom_right: '═',
|
||||
top_horizontal: '═',
|
||||
middle_horizontal: '═',
|
||||
bottom_horizontal: '═',
|
||||
|
||||
left_vertical: ' ',
|
||||
center_vertical: '║',
|
||||
right_vertical: ' ',
|
||||
|
||||
separate_header: true,
|
||||
separate_rows: false,
|
||||
|
||||
print_left_border: false,
|
||||
print_right_border: false,
|
||||
print_top_border: true,
|
||||
print_bottom_border: true,
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
pub fn rounded() -> TableTheme {
|
||||
TableTheme {
|
||||
top_left: '╭',
|
||||
middle_left: '├',
|
||||
bottom_left: '╰',
|
||||
top_center: '┬',
|
||||
center: '┼',
|
||||
bottom_center: '┴',
|
||||
top_right: '╮',
|
||||
middle_right: '┤',
|
||||
bottom_right: '╯',
|
||||
top_horizontal: '─',
|
||||
middle_horizontal: '─',
|
||||
bottom_horizontal: '─',
|
||||
|
||||
left_vertical: '│',
|
||||
center_vertical: '│',
|
||||
right_vertical: '│',
|
||||
|
||||
separate_header: true,
|
||||
separate_rows: false,
|
||||
|
||||
print_left_border: true,
|
||||
print_right_border: true,
|
||||
print_top_border: true,
|
||||
print_bottom_border: true,
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
pub fn reinforced() -> TableTheme {
|
||||
TableTheme {
|
||||
top_left: '┏',
|
||||
middle_left: '├',
|
||||
bottom_left: '┗',
|
||||
top_center: '┬',
|
||||
center: '┼',
|
||||
bottom_center: '┴',
|
||||
top_right: '┓',
|
||||
middle_right: '┤',
|
||||
bottom_right: '┛',
|
||||
top_horizontal: '─',
|
||||
middle_horizontal: '─',
|
||||
bottom_horizontal: '─',
|
||||
|
||||
left_vertical: '│',
|
||||
center_vertical: '│',
|
||||
right_vertical: '│',
|
||||
|
||||
separate_header: true,
|
||||
separate_rows: false,
|
||||
|
||||
print_left_border: true,
|
||||
print_right_border: true,
|
||||
print_top_border: true,
|
||||
print_bottom_border: true,
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
pub fn heavy() -> TableTheme {
|
||||
TableTheme {
|
||||
top_left: '┏',
|
||||
middle_left: '┣',
|
||||
bottom_left: '┗',
|
||||
top_center: '┳',
|
||||
center: '╋',
|
||||
bottom_center: '┻',
|
||||
top_right: '┓',
|
||||
middle_right: '┫',
|
||||
bottom_right: '┛',
|
||||
top_horizontal: '━',
|
||||
middle_horizontal: '━',
|
||||
bottom_horizontal: '━',
|
||||
|
||||
left_vertical: '┃',
|
||||
center_vertical: '┃',
|
||||
right_vertical: '┃',
|
||||
|
||||
separate_header: true,
|
||||
separate_rows: false,
|
||||
|
||||
print_left_border: true,
|
||||
print_right_border: true,
|
||||
print_top_border: true,
|
||||
print_bottom_border: true,
|
||||
}
|
||||
}
|
||||
#[allow(unused)]
|
||||
pub fn none() -> TableTheme {
|
||||
TableTheme {
|
||||
top_left: ' ',
|
||||
middle_left: ' ',
|
||||
bottom_left: ' ',
|
||||
top_center: ' ',
|
||||
center: ' ',
|
||||
bottom_center: ' ',
|
||||
top_right: ' ',
|
||||
middle_right: ' ',
|
||||
bottom_right: ' ',
|
||||
|
||||
top_horizontal: ' ',
|
||||
middle_horizontal: ' ',
|
||||
bottom_horizontal: ' ',
|
||||
|
||||
left_vertical: ' ',
|
||||
center_vertical: ' ',
|
||||
right_vertical: ' ',
|
||||
|
||||
separate_header: false,
|
||||
separate_rows: false,
|
||||
|
||||
print_left_border: false,
|
||||
print_right_border: false,
|
||||
print_top_border: false,
|
||||
print_bottom_border: false,
|
||||
}
|
||||
}
|
||||
}
|
256
crates/nu-table/src/textstyle.rs
Normal file
256
crates/nu-table/src/textstyle.rs
Normal file
@ -0,0 +1,256 @@
|
||||
use crate::wrap::Alignment;
|
||||
use nu_ansi_term::{Color, Style};
|
||||
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
pub struct TextStyle {
|
||||
pub alignment: Alignment,
|
||||
pub color_style: Option<Style>,
|
||||
}
|
||||
|
||||
impl TextStyle {
|
||||
pub fn new() -> TextStyle {
|
||||
TextStyle {
|
||||
alignment: Alignment::Left,
|
||||
color_style: Some(Style::default()),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn bold(&self, bool_value: Option<bool>) -> TextStyle {
|
||||
let bv = bool_value.unwrap_or(false);
|
||||
|
||||
TextStyle {
|
||||
alignment: self.alignment,
|
||||
color_style: Some(Style {
|
||||
is_bold: bv,
|
||||
..self.color_style.unwrap_or_default()
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_bold(&self) -> bool {
|
||||
self.color_style.unwrap_or_default().is_bold
|
||||
}
|
||||
|
||||
pub fn dimmed(&self) -> TextStyle {
|
||||
TextStyle {
|
||||
alignment: self.alignment,
|
||||
color_style: Some(Style {
|
||||
is_dimmed: true,
|
||||
..self.color_style.unwrap_or_default()
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_dimmed(&self) -> bool {
|
||||
self.color_style.unwrap_or_default().is_dimmed
|
||||
}
|
||||
|
||||
pub fn italic(&self) -> TextStyle {
|
||||
TextStyle {
|
||||
alignment: self.alignment,
|
||||
color_style: Some(Style {
|
||||
is_italic: true,
|
||||
..self.color_style.unwrap_or_default()
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_italic(&self) -> bool {
|
||||
self.color_style.unwrap_or_default().is_italic
|
||||
}
|
||||
|
||||
pub fn underline(&self) -> TextStyle {
|
||||
TextStyle {
|
||||
alignment: self.alignment,
|
||||
color_style: Some(Style {
|
||||
is_underline: true,
|
||||
..self.color_style.unwrap_or_default()
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_underline(&self) -> bool {
|
||||
self.color_style.unwrap_or_default().is_underline
|
||||
}
|
||||
|
||||
pub fn blink(&self) -> TextStyle {
|
||||
TextStyle {
|
||||
alignment: self.alignment,
|
||||
color_style: Some(Style {
|
||||
is_blink: true,
|
||||
..self.color_style.unwrap_or_default()
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_blink(&self) -> bool {
|
||||
self.color_style.unwrap_or_default().is_blink
|
||||
}
|
||||
|
||||
pub fn reverse(&self) -> TextStyle {
|
||||
TextStyle {
|
||||
alignment: self.alignment,
|
||||
color_style: Some(Style {
|
||||
is_reverse: true,
|
||||
..self.color_style.unwrap_or_default()
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_reverse(&self) -> bool {
|
||||
self.color_style.unwrap_or_default().is_reverse
|
||||
}
|
||||
|
||||
pub fn hidden(&self) -> TextStyle {
|
||||
TextStyle {
|
||||
alignment: self.alignment,
|
||||
color_style: Some(Style {
|
||||
is_hidden: true,
|
||||
..self.color_style.unwrap_or_default()
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_hidden(&self) -> bool {
|
||||
self.color_style.unwrap_or_default().is_hidden
|
||||
}
|
||||
|
||||
pub fn strikethrough(&self) -> TextStyle {
|
||||
TextStyle {
|
||||
alignment: self.alignment,
|
||||
color_style: Some(Style {
|
||||
is_strikethrough: true,
|
||||
..self.color_style.unwrap_or_default()
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_strikethrough(&self) -> bool {
|
||||
self.color_style.unwrap_or_default().is_strikethrough
|
||||
}
|
||||
|
||||
pub fn fg(&self, foreground: Color) -> TextStyle {
|
||||
TextStyle {
|
||||
alignment: self.alignment,
|
||||
color_style: Some(Style {
|
||||
foreground: Some(foreground),
|
||||
..self.color_style.unwrap_or_default()
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn on(&self, background: Color) -> TextStyle {
|
||||
TextStyle {
|
||||
alignment: self.alignment,
|
||||
color_style: Some(Style {
|
||||
background: Some(background),
|
||||
..self.color_style.unwrap_or_default()
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn bg(&self, background: Color) -> TextStyle {
|
||||
TextStyle {
|
||||
alignment: self.alignment,
|
||||
color_style: Some(Style {
|
||||
background: Some(background),
|
||||
..self.color_style.unwrap_or_default()
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn alignment(&self, align: Alignment) -> TextStyle {
|
||||
TextStyle {
|
||||
alignment: align,
|
||||
color_style: self.color_style,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn style(&self, style: Style) -> TextStyle {
|
||||
TextStyle {
|
||||
alignment: self.alignment,
|
||||
color_style: Some(Style {
|
||||
foreground: style.foreground,
|
||||
background: style.background,
|
||||
is_bold: style.is_bold,
|
||||
is_dimmed: style.is_dimmed,
|
||||
is_italic: style.is_italic,
|
||||
is_underline: style.is_underline,
|
||||
is_blink: style.is_blink,
|
||||
is_reverse: style.is_reverse,
|
||||
is_hidden: style.is_hidden,
|
||||
is_strikethrough: style.is_strikethrough,
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn basic_center() -> TextStyle {
|
||||
TextStyle::new()
|
||||
.alignment(Alignment::Center)
|
||||
.style(Style::default())
|
||||
}
|
||||
|
||||
pub fn basic_right() -> TextStyle {
|
||||
TextStyle::new()
|
||||
.alignment(Alignment::Right)
|
||||
.style(Style::default())
|
||||
}
|
||||
|
||||
pub fn basic_left() -> TextStyle {
|
||||
TextStyle::new()
|
||||
.alignment(Alignment::Left)
|
||||
.style(Style::default())
|
||||
}
|
||||
|
||||
pub fn default_header() -> TextStyle {
|
||||
TextStyle::new()
|
||||
.alignment(Alignment::Center)
|
||||
.fg(Color::Green)
|
||||
.bold(Some(true))
|
||||
}
|
||||
|
||||
pub fn default_field() -> TextStyle {
|
||||
TextStyle::new().fg(Color::Green).bold(Some(true))
|
||||
}
|
||||
|
||||
pub fn with_attributes(bo: bool, al: Alignment, co: Color) -> TextStyle {
|
||||
TextStyle::new().alignment(al).fg(co).bold(Some(bo))
|
||||
}
|
||||
|
||||
pub fn with_style(al: Alignment, style: Style) -> TextStyle {
|
||||
TextStyle::new().alignment(al).style(Style {
|
||||
foreground: style.foreground,
|
||||
background: style.background,
|
||||
is_bold: style.is_bold,
|
||||
is_dimmed: style.is_dimmed,
|
||||
is_italic: style.is_italic,
|
||||
is_underline: style.is_underline,
|
||||
is_blink: style.is_blink,
|
||||
is_reverse: style.is_reverse,
|
||||
is_hidden: style.is_hidden,
|
||||
is_strikethrough: style.is_strikethrough,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for TextStyle {
|
||||
fn default() -> Self {
|
||||
Self::new()
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct StyledString {
|
||||
pub contents: String,
|
||||
pub style: TextStyle,
|
||||
}
|
||||
|
||||
impl StyledString {
|
||||
pub fn new(contents: String, style: TextStyle) -> StyledString {
|
||||
StyledString { contents, style }
|
||||
}
|
||||
|
||||
pub fn set_style(&mut self, style: TextStyle) {
|
||||
self.style = style;
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
use crate::table::TextStyle;
|
||||
use crate::textstyle::TextStyle;
|
||||
use ansi_str::AnsiStr;
|
||||
use nu_ansi_term::Style;
|
||||
use std::borrow::Cow;
|
||||
|
Loading…
Reference in New Issue
Block a user