Skip to content

Instantly share code, notes, and snippets.

@dorentus
Last active August 29, 2015 14:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dorentus/f12294c7de7f4ed0e3d2 to your computer and use it in GitHub Desktop.
Save dorentus/f12294c7de7f4ed0e3d2 to your computer and use it in GitHub Desktop.
//
// ansi.swift
//
// DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
// Version 2, December 2004
//
// Copyright (C) 2015 Zhang Yi <zhangyi.cn@gmail.com>
//
// Everyone is permitted to copy and distribute verbatim or modified
// copies of this license document, and changing it is allowed as long
// as the name is changed.
//
// DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
// TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
//
// 0. You just DO WHAT THE FUCK YOU WANT TO.
protocol AnsiColorEscaped {
func ansi(code: Int) -> AnsiColorEscaped
}
extension AnsiColorEscaped {
var bold: AnsiColorEscaped { return ansi(1) }
var underline: AnsiColorEscaped { return ansi(4) }
var blink: AnsiColorEscaped { return ansi(5) }
var black: AnsiColorEscaped { return ansi(30) }
var red: AnsiColorEscaped { return ansi(31) }
var green: AnsiColorEscaped { return ansi(32) }
var yellow: AnsiColorEscaped { return ansi(33) }
var blue: AnsiColorEscaped { return ansi(34) }
var magenta: AnsiColorEscaped { return ansi(35) }
var cyan: AnsiColorEscaped { return ansi(36) }
var whhite: AnsiColorEscaped { return ansi(37) }
var bgblack: AnsiColorEscaped { return ansi(40) }
var bgred: AnsiColorEscaped { return ansi(41) }
var bggreen: AnsiColorEscaped { return ansi(42) }
var bgyellow: AnsiColorEscaped { return ansi(43) }
var bgblue: AnsiColorEscaped { return ansi(44) }
var bgmagenta: AnsiColorEscaped { return ansi(45) }
var bgcyan: AnsiColorEscaped { return ansi(46) }
var bgwhite: AnsiColorEscaped { return ansi(47) }
}
struct AnsiColorEscapedString: AnsiColorEscaped, CustomStringConvertible {
private let string: String
private let codes: Set<Int>
func ansi(code: Int) -> AnsiColorEscaped {
var codes = self.codes
codes.insert(code)
return AnsiColorEscapedString(string: string, codes: codes)
}
var description: String {
return "\u{001B}[" + ";".join(codes.map { "\($0)" }) + "m" + string + "\u{001B}[0m"
}
}
extension String: AnsiColorEscaped {
func ansi(code: Int) -> AnsiColorEscaped {
return AnsiColorEscapedString(string: self, codes: Set([code]))
}
}
func +(lhs: AnsiColorEscaped, rhs: AnsiColorEscaped) -> AnsiColorEscaped {
return "\(lhs)\(rhs)"
}
@dorentus
Copy link
Author

print("Hello".red.bgcyan + " " + "World".underline)

https://asciinema.org/a/dcy6zbdaletuibypz12fcdwlw

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment