diff --git a/lib/theme.cr b/lib/theme.cr new file mode 100644 index 00000000..0c94e4c8 --- /dev/null +++ b/lib/theme.cr @@ -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 diff --git a/src/theme.cr b/src/theme.cr new file mode 100644 index 00000000..be683bad --- /dev/null +++ b/src/theme.cr @@ -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