st-mine/iterm2colors/tools/iterm2terminal.swift
2017-04-25 18:42:51 +03:00

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 [...]")
}