diff options
Diffstat (limited to 'src/style/colours.rs')
-rw-r--r-- | src/style/colours.rs | 471 |
1 files changed, 0 insertions, 471 deletions
diff --git a/src/style/colours.rs b/src/style/colours.rs deleted file mode 100644 index 4494507..0000000 --- a/src/style/colours.rs +++ /dev/null @@ -1,471 +0,0 @@ -use ansi_term::Colour::{Red, Green, Yellow, Blue, Cyan, Purple, Fixed}; -use ansi_term::Style; - -use crate::output::file_name::Colours as FileNameColours; -use crate::output::render; -use crate::style::lsc::Pair; - - -#[derive(Debug, Default, PartialEq)] -pub struct Colours { - pub colourful: bool, - - pub filekinds: FileKinds, - pub perms: Permissions, - pub size: Size, - pub users: Users, - pub links: Links, - pub git: Git, - - pub punctuation: Style, - pub date: Style, - pub inode: Style, - pub blocks: Style, - pub header: Style, - pub octal: Style, - - pub symlink_path: Style, - pub control_char: Style, - pub broken_symlink: Style, - pub broken_path_overlay: Style, -} - -#[derive(Clone, Copy, Debug, Default, PartialEq)] -pub struct FileKinds { - pub normal: Style, - pub directory: Style, - pub symlink: Style, - pub pipe: Style, - pub block_device: Style, - pub char_device: Style, - pub socket: Style, - pub special: Style, - pub executable: Style, -} - -#[derive(Clone, Copy, Debug, Default, PartialEq)] -pub struct Permissions { - pub user_read: Style, - pub user_write: Style, - pub user_execute_file: Style, - pub user_execute_other: Style, - - pub group_read: Style, - pub group_write: Style, - pub group_execute: Style, - - pub other_read: Style, - pub other_write: Style, - pub other_execute: Style, - - pub special_user_file: Style, - pub special_other: Style, - - pub attribute: Style, -} - -#[derive(Clone, Copy, Debug, Default, PartialEq)] -pub struct Size { - pub major: Style, - pub minor: Style, - - pub number_byte: Style, - pub number_kilo: Style, - pub number_mega: Style, - pub number_giga: Style, - pub number_huge: Style, - - pub unit_byte: Style, - pub unit_kilo: Style, - pub unit_mega: Style, - pub unit_giga: Style, - pub unit_huge: Style, -} - -#[derive(Clone, Copy, Debug, Default, PartialEq)] -pub struct Users { - pub user_you: Style, - pub user_someone_else: Style, - pub group_yours: Style, - pub group_not_yours: Style, -} - -#[derive(Clone, Copy, Debug, Default, PartialEq)] -pub struct Links { - pub normal: Style, - pub multi_link_file: Style, -} - -#[derive(Clone, Copy, Debug, Default, PartialEq)] -pub struct Git { - pub new: Style, - pub modified: Style, - pub deleted: Style, - pub renamed: Style, - pub typechange: Style, - pub ignored: Style, - pub conflicted: Style, -} - -impl Colours { - pub fn plain() -> Self { - Self::default() - } - - pub fn colourful(scale: bool) -> Self { - Self { - colourful: true, - - filekinds: FileKinds { - normal: Style::default(), - directory: Blue.bold(), - symlink: Cyan.normal(), - pipe: Yellow.normal(), - block_device: Yellow.bold(), - char_device: Yellow.bold(), - socket: Red.bold(), - special: Yellow.normal(), - executable: Green.bold(), - }, - - perms: Permissions { - user_read: Yellow.bold(), - user_write: Red.bold(), - user_execute_file: Green.bold().underline(), - user_execute_other: Green.bold(), - - group_read: Yellow.normal(), - group_write: Red.normal(), - group_execute: Green.normal(), - - other_read: Yellow.normal(), - other_write: Red.normal(), - other_execute: Green.normal(), - - special_user_file: Purple.normal(), - special_other: Purple.normal(), - - attribute: Style::default(), - }, - - size: Size::colourful(scale), - - users: Users { - user_you: Yellow.bold(), - user_someone_else: Style::default(), - group_yours: Yellow.bold(), - group_not_yours: Style::default(), - }, - - links: Links { - normal: Red.bold(), - multi_link_file: Red.on(Yellow), - }, - - git: Git { - new: Green.normal(), - modified: Blue.normal(), - deleted: Red.normal(), - renamed: Yellow.normal(), - typechange: Purple.normal(), - ignored: Style::default().dimmed(), - conflicted: Red.normal(), - }, - - punctuation: Fixed(244).normal(), - date: Blue.normal(), - inode: Purple.normal(), - blocks: Cyan.normal(), - octal: Purple.normal(), - header: Style::default().underline(), - - symlink_path: Cyan.normal(), - control_char: Red.normal(), - broken_symlink: Red.normal(), - broken_path_overlay: Style::default().underline(), - } - } -} - -impl Size { - pub fn colourful(scale: bool) -> Self { - if scale { Self::colourful_scale() } - else { Self::colourful_plain() } - } - - fn colourful_plain() -> Self { - Self { - major: Green.bold(), - minor: Green.normal(), - - number_byte: Green.bold(), - number_kilo: Green.bold(), - number_mega: Green.bold(), - number_giga: Green.bold(), - number_huge: Green.bold(), - - unit_byte: Green.normal(), - unit_kilo: Green.normal(), - unit_mega: Green.normal(), - unit_giga: Green.normal(), - unit_huge: Green.normal(), - } - } - - fn colourful_scale() -> Self { - Self { - major: Green.bold(), - minor: Green.normal(), - - number_byte: Fixed(118).normal(), - number_kilo: Fixed(190).normal(), - number_mega: Fixed(226).normal(), - number_giga: Fixed(220).normal(), - number_huge: Fixed(214).normal(), - - unit_byte: Green.normal(), - unit_kilo: Green.normal(), - unit_mega: Green.normal(), - unit_giga: Green.normal(), - unit_huge: Green.normal(), - } - } -} - - -/// Some of the styles are **overlays**: although they have the same attribute -/// set as regular styles (foreground and background colours, bold, underline, -/// etc), they’re intended to be used to *amend* existing styles. -/// -/// For example, the target path of a broken symlink is displayed in a red, -/// underlined style by default. Paths can contain control characters, so -/// these control characters need to be underlined too, otherwise it looks -/// weird. So instead of having four separate configurable styles for “link -/// path”, “broken link path”, “control character” and “broken control -/// character”, there are styles for “link path”, “control character”, and -/// “broken link overlay”, the latter of which is just set to override the -/// underline attribute on the other two. -fn apply_overlay(mut base: Style, overlay: Style) -> Style { - if let Some(fg) = overlay.foreground { base.foreground = Some(fg); } - if let Some(bg) = overlay.background { base.background = Some(bg); } - - if overlay.is_bold { base.is_bold = true; } - if overlay.is_dimmed { base.is_dimmed = true; } - if overlay.is_italic { base.is_italic = true; } - if overlay.is_underline { base.is_underline = true; } - if overlay.is_blink { base.is_blink = true; } - if overlay.is_reverse { base.is_reverse = true; } - if overlay.is_hidden { base.is_hidden = true; } - if overlay.is_strikethrough { base.is_strikethrough = true; } - - base -} -// TODO: move this function to the ansi_term crate - - -impl Colours { - - /// Sets a value on this set of colours using one of the keys understood - /// by the `LS_COLORS` environment variable. Invalid keys set nothing, but - /// return false. - pub fn set_ls(&mut self, pair: &Pair<'_>) -> bool { - match pair.key { - "di" => self.filekinds.directory = pair.to_style(), // DIR - "ex" => self.filekinds.executable = pair.to_style(), // EXEC - "fi" => self.filekinds.normal = pair.to_style(), // FILE - "pi" => self.filekinds.pipe = pair.to_style(), // FIFO - "so" => self.filekinds.socket = pair.to_style(), // SOCK - "bd" => self.filekinds.block_device = pair.to_style(), // BLK - "cd" => self.filekinds.char_device = pair.to_style(), // CHR - "ln" => self.filekinds.symlink = pair.to_style(), // LINK - "or" => self.broken_symlink = pair.to_style(), // ORPHAN - _ => return false, - // Codes we don’t do anything with: - // MULTIHARDLINK, DOOR, SETUID, SETGID, CAPABILITY, - // STICKY_OTHER_WRITABLE, OTHER_WRITABLE, STICKY, MISSING - } - true - } - - /// Sets a value on this set of colours using one of the keys understood - /// by the `EXA_COLORS` environment variable. Invalid keys set nothing, - /// but return false. This doesn’t take the `LS_COLORS` keys into account, - /// so `set_ls` should have been run first. - pub fn set_exa(&mut self, pair: &Pair<'_>) -> bool { - match pair.key { - "ur" => self.perms.user_read = pair.to_style(), - "uw" => self.perms.user_write = pair.to_style(), - "ux" => self.perms.user_execute_file = pair.to_style(), - "ue" => self.perms.user_execute_other = pair.to_style(), - "gr" => self.perms.group_read = pair.to_style(), - "gw" => self.perms.group_write = pair.to_style(), - "gx" => self.perms.group_execute = pair.to_style(), - "tr" => self.perms.other_read = pair.to_style(), - "tw" => self.perms.other_write = pair.to_style(), - "tx" => self.perms.other_execute = pair.to_style(), - "su" => self.perms.special_user_file = pair.to_style(), - "sf" => self.perms.special_other = pair.to_style(), - "xa" => self.perms.attribute = pair.to_style(), - - "sn" => self.set_number_style(pair.to_style()), - "sb" => self.set_unit_style(pair.to_style()), - "nb" => self.size.number_byte = pair.to_style(), - "nk" => self.size.number_kilo = pair.to_style(), - "nm" => self.size.number_mega = pair.to_style(), - "ng" => self.size.number_giga = pair.to_style(), - "nh" => self.size.number_huge = pair.to_style(), - "ub" => self.size.unit_byte = pair.to_style(), - "uk" => self.size.unit_kilo = pair.to_style(), - "um" => self.size.unit_mega = pair.to_style(), - "ug" => self.size.unit_giga = pair.to_style(), - "uh" => self.size.unit_huge = pair.to_style(), - "df" => self.size.major = pair.to_style(), - "ds" => self.size.minor = pair.to_style(), - - "uu" => self.users.user_you = pair.to_style(), - "un" => self.users.user_someone_else = pair.to_style(), - "gu" => self.users.group_yours = pair.to_style(), - "gn" => self.users.group_not_yours = pair.to_style(), - - "lc" => self.links.normal = pair.to_style(), - "lm" => self.links.multi_link_file = pair.to_style(), - - "ga" => self.git.new = pair.to_style(), - "gm" => self.git.modified = pair.to_style(), - "gd" => self.git.deleted = pair.to_style(), - "gv" => self.git.renamed = pair.to_style(), - "gt" => self.git.typechange = pair.to_style(), - - "xx" => self.punctuation = pair.to_style(), - "da" => self.date = pair.to_style(), - "in" => self.inode = pair.to_style(), - "bl" => self.blocks = pair.to_style(), - "hd" => self.header = pair.to_style(), - "lp" => self.symlink_path = pair.to_style(), - "cc" => self.control_char = pair.to_style(), - "bO" => self.broken_path_overlay = pair.to_style(), - - _ => return false, - } - - true - } - - pub fn set_number_style(&mut self, style: Style) { - self.size.number_byte = style; - self.size.number_kilo = style; - self.size.number_mega = style; - self.size.number_giga = style; - self.size.number_huge = style; - } - - pub fn set_unit_style(&mut self, style: Style) { - self.size.unit_byte = style; - self.size.unit_kilo = style; - self.size.unit_mega = style; - self.size.unit_giga = style; - self.size.unit_huge = style; - } -} - - -impl render::BlocksColours for Colours { - fn block_count(&self) -> Style { self.blocks } - fn no_blocks(&self) -> Style { self.punctuation } -} - -impl render::FiletypeColours for Colours { - fn normal(&self) -> Style { self.filekinds.normal } - fn directory(&self) -> Style { self.filekinds.directory } - fn pipe(&self) -> Style { self.filekinds.pipe } - fn symlink(&self) -> Style { self.filekinds.symlink } - fn block_device(&self) -> Style { self.filekinds.block_device } - fn char_device(&self) -> Style { self.filekinds.char_device } - fn socket(&self) -> Style { self.filekinds.socket } - fn special(&self) -> Style { self.filekinds.special } -} - -impl render::GitColours for Colours { - fn not_modified(&self) -> Style { self.punctuation } - #[allow(clippy::new_ret_no_self)] - fn new(&self) -> Style { self.git.new } - fn modified(&self) -> Style { self.git.modified } - fn deleted(&self) -> Style { self.git.deleted } - fn renamed(&self) -> Style { self.git.renamed } - fn type_change(&self) -> Style { self.git.typechange } - fn ignored(&self) -> Style { self.git.ignored } - fn conflicted(&self) -> Style { self.git.conflicted } -} - -impl render::GroupColours for Colours { - fn yours(&self) -> Style { self.users.group_yours } - fn not_yours(&self) -> Style { self.users.group_not_yours } -} - -impl render::LinksColours for Colours { - fn normal(&self) -> Style { self.links.normal } - fn multi_link_file(&self) -> Style { self.links.multi_link_file } -} - -impl render::PermissionsColours for Colours { - fn dash(&self) -> Style { self.punctuation } - fn user_read(&self) -> Style { self.perms.user_read } - fn user_write(&self) -> Style { self.perms.user_write } - fn user_execute_file(&self) -> Style { self.perms.user_execute_file } - fn user_execute_other(&self) -> Style { self.perms.user_execute_other } - fn group_read(&self) -> Style { self.perms.group_read } - fn group_write(&self) -> Style { self.perms.group_write } - fn group_execute(&self) -> Style { self.perms.group_execute } - fn other_read(&self) -> Style { self.perms.other_read } - fn other_write(&self) -> Style { self.perms.other_write } - fn other_execute(&self) -> Style { self.perms.other_execute } - fn special_user_file(&self) -> Style { self.perms.special_user_file } - fn special_other(&self) -> Style { self.perms.special_other } - fn attribute(&self) -> Style { self.perms.attribute } -} - -impl render::SizeColours for Colours { - fn size(&self, prefix: Option<number_prefix::Prefix>) -> Style { - use number_prefix::Prefix::*; - - match prefix { - None => self.size.number_byte, - Some(Kilo) | Some(Kibi) => self.size.number_kilo, - Some(Mega) | Some(Mebi) => self.size.number_mega, - Some(Giga) | Some(Gibi) => self.size.number_giga, - Some(_) => self.size.number_huge, - } - } - - fn unit(&self, prefix: Option<number_prefix::Prefix>) -> Style { - use number_prefix::Prefix::*; - - match prefix { - None => self.size.unit_byte, - Some(Kilo) | Some(Kibi) => self.size.unit_kilo, - Some(Mega) | Some(Mebi) => self.size.unit_mega, - Some(Giga) | Some(Gibi) => self.size.unit_giga, - Some(_) => self.size.unit_huge, - } - } - - fn no_size(&self) -> Style { self.punctuation } - fn major(&self) -> Style { self.size.major } - fn comma(&self) -> Style { self.punctuation } - fn minor(&self) -> Style { self.size.minor } -} - -impl render::UserColours for Colours { - fn you(&self) -> Style { self.users.user_you } - fn someone_else(&self) -> Style { self.users.user_someone_else } -} - -impl FileNameColours for Colours { - fn normal_arrow(&self) -> Style { self.punctuation } - fn broken_symlink(&self) -> Style { self.broken_symlink } - fn broken_filename(&self) -> Style { apply_overlay(self.broken_symlink, self.broken_path_overlay) } - fn broken_control_char(&self) -> Style { apply_overlay(self.control_char, self.broken_path_overlay) } - fn control_char(&self) -> Style { self.control_char } - fn symlink_path(&self) -> Style { self.symlink_path } - fn executable_file(&self) -> Style { self.filekinds.executable } -} |