forked from lysyi3m/macos-terminal-themes
-
Notifications
You must be signed in to change notification settings - Fork 0
/
iterm2terminal.swift
162 lines (151 loc) · 6.06 KB
/
iterm2terminal.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#!/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 = "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,
"type" : "Window Settings",
"ProfileCurrentVersion" : 2.04,
"columnCount": 90,
"rowCount": 50,
]
if let font = archivedFontWithName("PragmataPro", size: 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
}
func convertToTerminalColors(itermFileURL: NSURL, terminalFileURL: NSURL) {
if let itermScheme = NSDictionary(contentsOfURL: itermFileURL) {
print("converting \(itermFileURL) -> \(terminalFileURL)")
let terminalName = terminalFileURL.URLByDeletingPathExtension!.lastPathComponent!
let terminalScheme = itermColorSchemeToTerminalColorScheme(itermScheme, name: terminalName)
terminalScheme.writeToURL(terminalFileURL, atomically: true)
} else {
print("unable to load \(itermFileURL)")
}
}
let args = arguments()
if args.count > 0 {
for itermFile in args {
let absoluteURL = NSURL(fileURLWithPath: itermFile).absoluteURL
let folder = absoluteURL.URLByDeletingLastPathComponent!
let schemeName = absoluteURL.URLByDeletingPathExtension!.lastPathComponent!
let terminalFileURL = folder.URLByAppendingPathComponent("\(schemeName).terminal")
convertToTerminalColors(absoluteURL, terminalFileURL: terminalFileURL)
}
} else {
print("usage: iTermColorsToTerminalColors FILE.itermcolors [...]")
}