1
0
forked from extern/nix-config

Add lib/theme.cr and src/theme.cr

This commit is contained in:
Donovan Glover 2017-12-23 23:24:44 -05:00
parent d5323e6aa3
commit c5884869d7
No known key found for this signature in database
GPG Key ID: 8FC5F7D90A5D8F4D
2 changed files with 143 additions and 0 deletions

120
lib/theme.cr Normal file
View File

@ -0,0 +1,120 @@
require "colorize"
module Theme
extend self
# Sets all the colors in termite.
#
# This is the preferred method of changing your terminal
# colors. It also lets you avoid a few edge cases that
# #set_back and #set_shell are prone to.
#
# The only downside to #set_terminal is that you have to
# open a new window in order for the changes to take effect.
#
# It is also possible to have several windows open each
# with different themes; however, you should really only
# be using one theme at a time.
#
# NOTE: This method assumes that (1) `[color]` is at the
# bottom of your config file. This method will
# overwrite all lines after the `[color]` line.
#
# NOTE: This method assumes that you want `# vim:ft=dosini`
# at the bottom of your config file.
def set_terminal(theme : Hash(YAML::Type, YAML::Type))
file : String = ENV["HOME"] + "/.config/termite/config"
end
# Sets the background color in termite.
#
# NOTE: This is particularly useful to avoid color flashing.
# Color flashing occurs when the terminal background
# gets changed to a different color by the shell
# at startup.
#
# NOTE: You should avoid manually calling #set_back and
# #set_shell. Instead, you should use #set_terminal
# instead as this fixes a lot of edge cases.
def set_back(theme : Hash(YAML::Type, YAML::Type))
file : String = ENV["HOME"] + "/.config/termite/config"
if !File.exists?(file)
_e("The file " + File.expand_path(file) + " doesn't exist!")
end
config : String = ""
File.each_line(file) do |line|
if line.includes?("background = ")
line = "background = #" + theme["base00"].to_s
end
config += line + "\n"
end
File.write(file, config)
end
# Sets the terminal colors in the current shell.
#
# NOTE: To make this apply for all terminals (shells) you
# open, simply call this method in each new instance.
# This is the traditional method used by base16-shell;
# however, it makes more sense to just change the
# config file directly and avoid having to call an
# external script every time you start a new terminal.
#
# NOTE: When using padding with terminals such as termite, the
# background color for the terminal will take priority
# over the background color for the shell. Therefore,
# if you're using termite with padding, you should avoid
# this method and simply use #set_terminal instead.
#
# NOTE: Another downside to using #set_shell is that colors
# will be reset by commands like `tput reset`. Note
# that #set_terminal does not have this issue.
def set_shell(t : Hash(YAML::Type, YAML::Type))
theme = t.clone
theme.each do |key, value|
theme[key] = value.to_s.insert(4, '/').insert(2, '/')
end
add_color 0, theme["base00"] # Black
add_color 1, theme["base08"] # Red
add_color 2, theme["base0B"] # Green
add_color 3, theme["base0A"] # Yellow
add_color 4, theme["base0D"] # Blue
add_color 5, theme["base0E"] # Magenta
add_color 6, theme["base0C"] # Cyan
add_color 7, theme["base05"] # White
add_color 8, theme["base03"] # Bright Black
add_color 9, theme["base08"] # Bright Red
add_color 10, theme["base0B"] # Bright Green
add_color 11, theme["base0A"] # Bright Yellow
add_color 12, theme["base0D"] # Bright Blue
add_color 13, theme["base0E"] # Bright Magenta
add_color 14, theme["base0C"] # Bright Cyan
add_color 15, theme["base07"] # Bright White
add_color 16, theme["base09"]
add_color 17, theme["base0F"]
add_color 18, theme["base01"]
add_color 19, theme["base02"]
add_color 20, theme["base04"]
add_color 21, theme["base06"]
fgbg_color 10, theme["base05"]
fgbg_color 11, theme["base00"]
cursor_color 12, ";7"
end
private def add_color(num : Int32, color : YAML::Type)
print "\033]4;#{num};rgb:#{color.to_s}\033\\"
end
private def fgbg_color(num : Int32, color : YAML::Type)
print "\033]#{num};rgb:#{color.to_s}\033\\"
end
private def cursor_color(num : Int32, color : String)
print "\033]#{num}#{color}\033\\"
end
private def _e(message : String)
puts message.colorize(:red)
exit 1
end
end

23
src/theme.cr Normal file
View File

@ -0,0 +1,23 @@
require "theme"
require "yaml"
require "colorize"
Dir.cd(ENV["HOME"] + "/Home/new-start")
# Testing for now.
file : String = ARGV.size > 0 ? ARGV[0] : "themes/atelier-cave-light.yaml"
if !File.exists?(file)
_e("The file " + File.expand_path(file) + " doesn't exist!")
end
yaml : Hash(YAML::Type, YAML::Type) = YAML.parse(File.read file).as_h
# Theme.set_terminal(yaml)
Theme.set_shell(yaml)
# Theme.set_back(yaml)
private def _e(message)
puts message.colorize(:red)
exit 1
end