Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save bylatt/f01a559ec465b677f768 to your computer and use it in GitHub Desktop.
Save bylatt/f01a559ec465b677f768 to your computer and use it in GitHub Desktop.
#!/usr/bin/xcrun 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 = "BoldTextColor"
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,
"type" : "Window Settings",
"ProfileCurrentVersion" : 2.04,
"columnCount": 90,
"rowCount": 50,
]
if let font = archivedFontWithName("PragmataPro", 14) {
terminalColorScheme["Font"] = font
}
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? NSDictionary {
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.archivedDataWithRootObject(color)
terminalColorScheme[terminalKey.rawValue] = colorData
}
}
}
}
}
return terminalColorScheme
}
func archivedFontWithName(name: String, size: CGFloat) -> NSData? {
if let font = NSFont(name: name, size: size) {
return NSKeyedArchiver.archivedDataWithRootObject(font)
}
return nil
}
func floatValue(value: AnyObject?) -> CGFloat {
if let num = value as? CGFloat {
return num
}
return 0
}
func arguments() -> [String] {
var args: [String] = []
for i in 1...Process.argc {
if let arg = String.fromCString(Process.unsafeArgv[Int(i)]) {
args.append(arg)
}
}
return args
}
extension String {
var fullPath: String {
get {
let path = stringByStandardizingPath
var directory = path.stringByDeletingLastPathComponent
if count(directory) == 0 {
directory = NSFileManager.defaultManager().currentDirectoryPath
}
return directory.stringByAppendingPathComponent(path)
}
}
}
func convertToTerminalColors(itermFile: String, terminalFile: String) {
if let itermScheme = NSDictionary(contentsOfFile: itermFile) {
println("converting \(itermFile) -> \(terminalFile)")
let terminalName = terminalFile.lastPathComponent.stringByDeletingPathExtension
let terminalScheme = itermColorSchemeToTerminalColorScheme(itermScheme, name: terminalName)
terminalScheme.writeToFile(terminalFile, atomically: true)
} else {
println("unable to load \(itermFile)")
}
}
let args = arguments()
if args.count > 0 {
for itermFile in args {
let path = itermFile.fullPath
let folder = path.stringByDeletingLastPathComponent
let schemeName = path.lastPathComponent.stringByDeletingPathExtension
let terminalPath = "\(folder)/\(schemeName).terminal"
convertToTerminalColors(path, terminalPath)
}
} else {
println("usage: iTermColorsToTerminalColors FILE.itermcolors [...]")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment