223 lines
7.4 KiB
Lua
223 lines
7.4 KiB
Lua
-- ╭─────────────────────────────────────────────────────────╮
|
|
-- │ FUNCS │
|
|
-- ╰─────────────────────────────────────────────────────────╯
|
|
|
|
local M = {}
|
|
|
|
local wezterm = WEZTERM
|
|
local types = require("types")
|
|
|
|
-- Update status event
|
|
wezterm.on("update-status", function(window, pane)
|
|
-- Set the leader icon
|
|
if window:leader_is_active() then
|
|
types.leader.icon = types.leader.on
|
|
else
|
|
types.leader.icon = types.leader.off
|
|
end
|
|
|
|
-- Set the TERM
|
|
local tty = pane:get_tty_name()
|
|
if tty then
|
|
CONFIG.term = "wezterm"
|
|
else
|
|
CONFIG.term = "xterm-256color"
|
|
end
|
|
end)
|
|
|
|
---@function Function to render the leader icon
|
|
---@return string leadericon The leader icon
|
|
function M.leader_component()
|
|
local prefix = types.leader.padding.left or types.leader.prefix or " "
|
|
local suffix = types.leader.padding.right or types.leader.suffix or ""
|
|
local leaderstr = prefix .. types.leader.icon .. suffix
|
|
return leaderstr
|
|
end
|
|
|
|
---@function Function to convert a number to its ordinal string representation
|
|
---@param n string The number to convert
|
|
---@return string The ordinal string representation
|
|
function M.ordinal(n)
|
|
local suffixes = { "th", "st", "nd", "rd" }
|
|
local mod100 = n % 100
|
|
return n .. (suffixes[(mod100 - 20) % 10 + 1] or suffixes[1])
|
|
end
|
|
|
|
---@function Function to format the tab title
|
|
---@param title string The original tab title
|
|
---@return string new_string Formatted string
|
|
function M.format_tab_title(title)
|
|
if title ~= "default" then
|
|
return title .. wezterm.nerdfonts.ple_right_half_circle_thin
|
|
else
|
|
return ""
|
|
end
|
|
end
|
|
|
|
---@function Function to format the tab title
|
|
---@param title string The original tab title
|
|
---@return string new_string Formatted string
|
|
function M.format_inactive_tab_title(title)
|
|
if title ~= "default" then
|
|
return title .. " "
|
|
else
|
|
return ""
|
|
end
|
|
end
|
|
|
|
---@function Function to convert an hour to an angle
|
|
---@param hour string The hour to convert
|
|
---@return number The angle in degrees
|
|
function M.get_hour_angle(hour)
|
|
return (hour / 12) * 360
|
|
end
|
|
|
|
-- Function to convert a hex color to its opposite brightness
|
|
function M.invert_color_brightness(hex_color)
|
|
-- Validate the input hex_color format
|
|
if not hex_color:match("^#%x%x%x%x%x%x$") then
|
|
error("Invalid hex color format. Use #RRGGBB.")
|
|
end
|
|
|
|
-- Remove the hash (#) from the hex color
|
|
local r = tonumber(hex_color:sub(2, 3), 16) -- Red component
|
|
local g = tonumber(hex_color:sub(4, 5), 16) -- Green component
|
|
local b = tonumber(hex_color:sub(6, 7), 16) -- Blue component
|
|
|
|
-- Check for valid RGB values before proceeding
|
|
if not (r and g and b and r >= 0 and r <= 255 and g >= 0 and g <= 255 and b >= 0 and b <= 255) then
|
|
error("Invalid RGB values extracted from hex color.")
|
|
end
|
|
|
|
-- Calculate the brightness of the color using perceived brightness formula
|
|
local brightness = (r * 0.299 + g * 0.587 + b * 0.114)
|
|
|
|
-- Invert the color based on brightness
|
|
if brightness < 128 then
|
|
-- If the color is dark, make it lighter
|
|
r = math.min(r + (255 - r) * 0.33, 255)
|
|
g = math.min(g + (255 - g) * 0.33, 255)
|
|
b = math.min(b + (255 - b) * 0.33, 255)
|
|
else
|
|
-- If the color is light, make it darker
|
|
r = math.max(r - r * 0.66, 0)
|
|
g = math.max(g - g * 0.66, 0)
|
|
b = math.max(b - b * 0.66, 0)
|
|
end
|
|
|
|
-- Convert back to hex format, ensuring components are integers
|
|
return string.format("#%02x%02x%02x", math.floor(r + 0.5), math.floor(g + 0.5), math.floor(b + 0.5))
|
|
end
|
|
|
|
-- Function to get the complementary color of a given hex color
|
|
function M.complementary_color(hex_color)
|
|
-- Validate the input hex_color format
|
|
if not hex_color:match("^#%x%x%x%x%x%x$") then
|
|
error("Invalid hex color format. Use #RRGGBB.")
|
|
end
|
|
|
|
-- Remove the hash (#) from the hex color and extract RGB components
|
|
local r = tonumber(hex_color:sub(2, 3), 16) -- Red component
|
|
local g = tonumber(hex_color:sub(4, 5), 16) -- Green component
|
|
local b = tonumber(hex_color:sub(6, 7), 16) -- Blue component
|
|
|
|
-- Calculate the complementary color by inverting the RGB components
|
|
local complementary_r = 255 - r
|
|
local complementary_g = 255 - g
|
|
local complementary_b = 255 - b
|
|
|
|
-- Convert the inverted RGB values back to hex format
|
|
return string.format("#%02x%02x%02x", complementary_r, complementary_g, complementary_b)
|
|
end
|
|
|
|
---@function Helper function to check if a value exists in a table
|
|
---@param tab table The table to search in
|
|
---@param val any The value to search for in the table
|
|
---@return boolean exists True if the value is found in the table, false otherwise
|
|
function M.has_value(tab, val)
|
|
for _, value in ipairs(tab) do
|
|
if value == val then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
---@function Function to send a notification using toastify
|
|
---@param title string The title of the notification
|
|
---@param body? string The body of the notification
|
|
---@param timeout? number Time in milliseconds before the notification expires
|
|
---@param options? table A table containing additional optional settings for the notification
|
|
function M.notify(title, body, timeout, options)
|
|
-- Default values for optional fields
|
|
-- Initialize 'options' as an empty table if not provided
|
|
options = options or {}
|
|
|
|
-- Retrieve specific options from the 'options' table, or set to nil/default if not provided
|
|
local app_name = options.app_name or nil
|
|
local categories = options.categories or nil
|
|
local icon = options.icon or nil
|
|
local sound_name = options.sound_name or nil
|
|
local urgency = options.urgency or "normal" -- Default urgency is 'normal'
|
|
local hint = options.hint or nil
|
|
local debug = options.debug and "--debug" or nil -- Add '--debug' flag if debug is true
|
|
|
|
-- Allowed urgency levels for validation
|
|
local allowed_urgency = { "low", "normal", "critical" }
|
|
-- If the provided urgency is not one of the allowed values, default to 'normal'
|
|
if not M.has_value(allowed_urgency, urgency) then
|
|
urgency = "normal"
|
|
end
|
|
|
|
-- Start building the command as a table of strings (to execute via wezterm)
|
|
-- 'toastify send' is the base command, with 'title' as a required argument
|
|
local cmd = { "toastify", "send", title }
|
|
|
|
-- Append the body if provided (body is optional)
|
|
if body then
|
|
table.insert(cmd, body)
|
|
end
|
|
|
|
-- Append the timeout if provided (timeout is optional)
|
|
if timeout then
|
|
table.insert(cmd, "--expire-time")
|
|
table.insert(cmd, tostring(timeout)) -- Convert to string for command execution
|
|
end
|
|
|
|
-- Append optional arguments if provided, using the corresponding flag
|
|
if app_name then
|
|
table.insert(cmd, "--app-name")
|
|
table.insert(cmd, app_name)
|
|
end
|
|
if categories then
|
|
table.insert(cmd, "--categories")
|
|
table.insert(cmd, categories)
|
|
end
|
|
if icon then
|
|
table.insert(cmd, "--icon")
|
|
table.insert(cmd, icon)
|
|
end
|
|
if sound_name then
|
|
table.insert(cmd, "--sound-name")
|
|
table.insert(cmd, sound_name)
|
|
end
|
|
if hint then
|
|
table.insert(cmd, "--hint")
|
|
table.insert(cmd, hint)
|
|
end
|
|
-- Append the '--debug' flag if debug mode is enabled
|
|
if debug then
|
|
table.insert(cmd, debug)
|
|
end
|
|
|
|
-- Always include the urgency flag with the validated urgency value
|
|
table.insert(cmd, "--urgency")
|
|
table.insert(cmd, urgency)
|
|
|
|
-- Execute the command using wezterm's built-in child process runner
|
|
-- 'wezterm.run_child_process' takes a table of strings and executes it as a command
|
|
wezterm.run_child_process(cmd)
|
|
end
|
|
|
|
return M
|