149 lines
5.4 KiB
Swift
Executable file
149 lines
5.4 KiB
Swift
Executable file
#!/usr/bin/env swift
|
|
|
|
import AppKit
|
|
|
|
enum iTermColors: String {
|
|
case Ansi0 = "Ansi 0 Color"
|
|
case Ansi1 = "Ansi 1 Color"
|
|
case Ansi2 = "Ansi 2 Color"
|
|
case Ansi3 = "Ansi 3 Color"
|
|
case Ansi4 = "Ansi 4 Color"
|
|
case Ansi5 = "Ansi 5 Color"
|
|
case Ansi6 = "Ansi 6 Color"
|
|
case Ansi7 = "Ansi 7 Color"
|
|
case Ansi8 = "Ansi 8 Color"
|
|
case Ansi9 = "Ansi 9 Color"
|
|
case Ansi10 = "Ansi 10 Color"
|
|
case Ansi11 = "Ansi 11 Color"
|
|
case Ansi12 = "Ansi 12 Color"
|
|
case Ansi13 = "Ansi 13 Color"
|
|
case Ansi14 = "Ansi 14 Color"
|
|
case Ansi15 = "Ansi 15 Color"
|
|
case CursorText = "Cursor Text Color"
|
|
case SelectedText = "Selected Text Color"
|
|
case Foreground = "Foreground Color"
|
|
case Background = "Background Color"
|
|
case Bold = "Bold Color"
|
|
case Selection = "Selection Color"
|
|
case Cursor = "Cursor Color"
|
|
}
|
|
|
|
enum TerminalColors: String {
|
|
case AnsiBlack = "ANSIBlackColor"
|
|
case AnsiRed = "ANSIRedColor"
|
|
case AnsiGreen = "ANSIGreenColor"
|
|
case AnsiYellow = "ANSIYellowColor"
|
|
case AnsiBlue = "ANSIBlueColor"
|
|
case AnsiMagenta = "ANSIMagentaColor"
|
|
case AnsiCyan = "ANSICyanColor"
|
|
case AnsiWhite = "ANSIWhiteColor"
|
|
case AnsiBrightBlack = "ANSIBrightBlackColor"
|
|
case AnsiBrightRed = "ANSIBrightRedColor"
|
|
case AnsiBrightGreen = "ANSIBrightGreenColor"
|
|
case AnsiBrightYellow = "ANSIBrightYellowColor"
|
|
case AnsiBrightBlue = "ANSIBrightBlueColor"
|
|
case AnsiBrightMagenta = "ANSIBrightMagentaColor"
|
|
case AnsiBrightCyan = "ANSIBrightCyanColor"
|
|
case AnsiBrightWhite = "ANSIBrightWhiteColor"
|
|
case Background = "BackgroundColor"
|
|
case Text = "TextColor"
|
|
case BoldText = "TextBoldColor"
|
|
case Selection = "SelectionColor"
|
|
case Cursor = "CursorColor"
|
|
}
|
|
|
|
let iTermColor2TerminalColor = [
|
|
iTermColors.Ansi0: TerminalColors.AnsiBlack,
|
|
iTermColors.Ansi1: TerminalColors.AnsiRed,
|
|
iTermColors.Ansi2: TerminalColors.AnsiGreen,
|
|
iTermColors.Ansi3: TerminalColors.AnsiYellow,
|
|
iTermColors.Ansi4: TerminalColors.AnsiBlue,
|
|
iTermColors.Ansi5: TerminalColors.AnsiMagenta,
|
|
iTermColors.Ansi6: TerminalColors.AnsiCyan,
|
|
iTermColors.Ansi7: TerminalColors.AnsiWhite,
|
|
iTermColors.Ansi8: TerminalColors.AnsiBrightBlack,
|
|
iTermColors.Ansi9: TerminalColors.AnsiBrightRed,
|
|
iTermColors.Ansi10: TerminalColors.AnsiBrightGreen,
|
|
iTermColors.Ansi11: TerminalColors.AnsiBrightYellow,
|
|
iTermColors.Ansi12: TerminalColors.AnsiBrightBlue,
|
|
iTermColors.Ansi13: TerminalColors.AnsiBrightMagenta,
|
|
iTermColors.Ansi14: TerminalColors.AnsiBrightCyan,
|
|
iTermColors.Ansi15: TerminalColors.AnsiBrightWhite,
|
|
iTermColors.Background: TerminalColors.Background,
|
|
iTermColors.Foreground: TerminalColors.Text,
|
|
iTermColors.Selection: TerminalColors.Selection,
|
|
iTermColors.Bold: TerminalColors.BoldText,
|
|
iTermColors.Cursor: TerminalColors.Cursor,
|
|
]
|
|
|
|
struct iTermColorComponent {
|
|
static let Red = "Red Component"
|
|
static let Green = "Green Component"
|
|
static let Blue = "Blue Component"
|
|
}
|
|
|
|
func itermColorSchemeToTerminalColorScheme(_ itermColorScheme: NSDictionary, name: String) -> NSDictionary {
|
|
var terminalColorScheme: [String: AnyObject] = [
|
|
"name" : name as AnyObject,
|
|
"type" : "Window Settings" as AnyObject,
|
|
"ProfileCurrentVersion" : 2.04 as AnyObject,
|
|
"columnCount": 90 as AnyObject,
|
|
"rowCount": 50 as AnyObject,
|
|
]
|
|
if let font = archivedFontWithName("PragmataPro", size: 14) {
|
|
terminalColorScheme["Font"] = font as AnyObject?
|
|
}
|
|
for (rawKey, rawValue) in itermColorScheme {
|
|
if let name = rawKey as? String {
|
|
if let key = iTermColors(rawValue: name) {
|
|
if let terminalKey = iTermColor2TerminalColor[key] {
|
|
if let itermDict = rawValue as? [String: AnyObject] {
|
|
let (r, g, b) = (
|
|
floatValue(itermDict[iTermColorComponent.Red]),
|
|
floatValue(itermDict[iTermColorComponent.Green]),
|
|
floatValue(itermDict[iTermColorComponent.Blue]))
|
|
let color = NSColor(deviceRed: r, green: g, blue: b, alpha: 1)
|
|
let colorData = NSKeyedArchiver.archivedData(withRootObject: color)
|
|
terminalColorScheme[terminalKey.rawValue] = colorData as AnyObject
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return terminalColorScheme as NSDictionary
|
|
}
|
|
|
|
func archivedFontWithName(_ name: String, size: CGFloat) -> Data? {
|
|
if let font = NSFont(name: name, size: size) {
|
|
return NSKeyedArchiver.archivedData(withRootObject: font)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func floatValue(_ value: AnyObject?) -> CGFloat {
|
|
if let num = value as? CGFloat {
|
|
return num
|
|
}
|
|
return 0
|
|
}
|
|
|
|
func convertToTerminalColors(_ itermFile: String, terminalFile: NSString) {
|
|
if let itermScheme = NSDictionary(contentsOfFile: itermFile) {
|
|
print("converting \(itermFile) -> \(terminalFile)")
|
|
let terminalName = ((terminalFile.lastPathComponent) as NSString).deletingPathExtension
|
|
let terminalScheme = itermColorSchemeToTerminalColorScheme(itermScheme, name: terminalName)
|
|
terminalScheme.write(toFile: terminalFile as String, atomically: true)
|
|
} else {
|
|
print("unable to load \(itermFile)")
|
|
}
|
|
}
|
|
|
|
if CommandLine.argc > 1 {
|
|
for itermFile in CommandLine.arguments {
|
|
let terminalFilePath = (itermFile as NSString).deletingPathExtension + ".terminal"
|
|
convertToTerminalColors(itermFile, terminalFile: terminalFilePath as NSString)
|
|
}
|
|
} else {
|
|
print("usage: iTermColorsToTerminalColors FILE.itermcolors [...]")
|
|
}
|
|
|