local key_template = [[
$k Color
]]
local color_template = [[
Alpha Component
1
Blue Component
$b
Color Space
sRGB
Green Component
$g
Red Component
$r
]]
local start_template = [[
]]
local end_template = [[
]]
local helpers = require "shipwright.transform.helpers"
local function hex_to_rgb(hex)
local _, r, g, b = hex:match "(.)(..)(..)(..)"
r, g, b =
string.format("%0.16f", (tonumber(r, 16) / 255)),
string.format("%0.16f", (tonumber(g, 16) / 255)),
string.format("%0.16f", (tonumber(b, 16) / 255))
return { r = r, g = g, b = b }
end
local function key_to_xml(key, color)
local xml = helpers.apply_template(key_template, { k = key })
local rgb = hex_to_rgb(color.hex)
xml = xml .. helpers.apply_template(color_template, rgb)
return xml
end
local function to_iterm(colorscheme)
local specs, term = unpack(colorscheme)
local colors = {
["Ansi 0"] = term.black,
["Ansi 1"] = term.red,
["Ansi 2"] = term.green,
["Ansi 3"] = term.yellow,
["Ansi 4"] = term.blue,
["Ansi 5"] = term.magenta,
["Ansi 6"] = term.cyan,
["Ansi 7"] = term.white,
["Ansi 8"] = term.bright_black,
["Ansi 9"] = term.bright_red,
["Ansi 10"] = term.bright_green,
["Ansi 11"] = term.bright_yellow,
["Ansi 12"] = term.bright_blue,
["Ansi 13"] = term.bright_magenta,
["Ansi 14"] = term.bright_cyan,
["Ansi 15"] = term.bright_white,
["Foreground"] = specs.Normal.fg,
["Background"] = specs.Normal.bg,
["Bold"] = term.bright_black,
["Cursor"] = specs.Cursor.bg,
["Cursor Text"] = specs.Cursor.fg,
["Cursor Guide"] = specs.CursorLine.bg,
["Link"] = term.bright_blue,
["Selection"] = specs.Visual.bg,
["Selected Text"] = specs.Normal.fg,
["Badge"] = specs.Comment.fg,
["Tab"] = specs.Normal.bg,
}
local template = start_template
local xml_compiled = {}
for k, c in pairs(colors) do
table.insert(xml_compiled, key_to_xml(k, c))
end
template = template .. table.concat(vim.fn.sort(xml_compiled), "\n")
template = template .. end_template
return { template }
end
---@diagnostic disable: undefined-global
-- selene: allow(undefined_variable)
run({ specs, term }, to_iterm, { overwrite, string.format("extras/iterm/%s.itermcolors", name) })
-- selene: deny(undefined_variable)
---@diagnostic enable: undefined-global