diff --git a/tools/iterm2terminal.swift b/tools/iterm2terminal.swift new file mode 100755 index 0000000..cd495b7 --- /dev/null +++ b/tools/iterm2terminal.swift @@ -0,0 +1,175 @@ +#!/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 [...]") +}