forked from lysyi3m/macos-terminal-themes
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
175 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 [...]") | ||
} |