Rainbow
在 Swift 中为控制台和命令行输出添加文本颜色、背景颜色和样式。它为终端中的跨平台软件日志记录而生,可在 Apple 平台和 Linux 中工作。
巧妙的方式,使用 String
扩展,并打印彩色字符串。
import Rainbow
print("Red text".red)
print("Blue background".onBlue)
print("Light green text on white background".lightGreen.onWhite)
print("Underline".underline)
print("Cyan with bold and blinking".cyan.bold.blink)
print("Plain text".red.onYellow.bold.clearColor.clearBackgroundColor.clearStyles)
它会给你这样的效果
如果您正在 Swift 中开发跨平台软件,Swift Package Manager 可能是您进行包管理的选择。只需将此仓库的 url 作为依赖项添加到您的 Package.swift
文件中
import PackageDescription
let package = Package(
name: "YourAwesomeSoftware",
dependencies: [
.package(url: "https://github.com/onevcat/Rainbow", .upToNextMajor(from: "4.0.0"))
],
targets: [
.target(
name: "MyApp",
dependencies: ["Rainbow"]
)
]
)
然后,在您准备就绪时运行 swift build
。
您可以在 Apple 的 官方页面 上了解更多关于如何使用 Swift Package Manager 的信息。
支持 Swift 字符串插值。为字符串的一部分定义颜色。甚至可以创建嵌套的彩色字符串。内部颜色样式将被保留
print("接天莲叶\("无穷碧".green),映日荷花\("别样红".red)")
print("\("两只黄鹂".yellow)鸣翠柳,一行白鹭\("上青天".lightBlue)。".lightGreen.underline)
完全支持 8 位颜色,包括文本颜色和背景颜色
print("停车坐爱\("枫林晚".bit8(31)),\("霜叶".bit8(160))红于\("二月花".bit8(198))。")
print("\("一道残阳".bit8(202))铺水中,\("半江瑟瑟".bit8(30).onBit8(226))半江红。")
它也接受十六进制颜色。Rainbow 尝试将其转换为最接近的 .bit8
颜色
print("黑云压城\("城欲摧".hex("#666")),甲光向日\("金鳞开".hex("000000").onHex("#E6B422"))。")
print("日出江花\("红胜火".hex(0xd11a2d)),春来江水\("绿如蓝".hex(0x10aec2))")
有效格式:
"FFF"
、"#FFF"
、"FFFFFF"
、"#FFFFFF"
、0xFFFFFF
一些终端模拟器支持 24 位真彩色。如果您确定 24 位颜色可以在用户的终端中显示,Rainbow 没有理由拒绝它们!
print("疏影横斜\("水清浅".bit24(36,116,181)),暗香浮动\("月黄昏".bit24(254,215,26))")
print("\("春色满园".hex("#ea517f", to: .bit24))关不住,\("一枝红杏".hex("#f43e06", to: .bit24))出墙来。")
默认情况下,Rainbow 应该足够智能来检测输出目标,以确定它是否是 tty。例如,如果写入文件,它会自动输出纯文本
// main.swift
print("Hello Rainbow".red)
$ .build/debug/RainbowDemo > output.txt
// output.txt
Hello Rainbow
这对于共享相同的代码以记录到控制台和日志文件非常有用。
您可以手动更改此行为。Rainbow 遵循以下优先级规则
Rainbow.enabled
。FORCE_COLOR=1
以启用颜色,即使输出不是 tty。(FORCE_COLOR
比 NO_COLOR
具有更高的优先级)NO_COLOR=1
作为环境变量以禁用颜色。Rainbow.outputTarget
。如果您愿意,也可以使用更冗长的方式
import Rainbow
let output = "The quick brown fox jumps over the lazy dog"
.applyingCodes(Color.red, BackgroundColor.yellow, Style.bold)
print(output) // Red text on yellow, bold of course :)
甚至从头开始构建一切
let entry = Rainbow.Entry(
segments: [
.init(text: "Hello ", color: .named(.magenta)),
.init(text: "Rainbow", color: .bit8(214), backgroundColor: .named(.lightBlue), styles: [.underline]),
]
)
print(Rainbow.generateString(for: entry))
请记住,字符串扩展(例如 "Hello".red
)是 O(n)
。因此,如果您正在处理巨大的字符串或非常复杂的嵌套,则可能会出现性能问题或难以进行流式处理。手动方式是这些情况的补救方法。
感谢 Swift 的开源,开发人员现在可以使用相同的语言编写跨平台程序。我相信命令行软件将成为 Swift 的下一个伟大平台。彩色且组织良好的输出始终有助于我们理解发生了什么。它确实是创建出色软件的必要实用程序。
Rainbow
应该在 OS X 和 Linux 终端中都能良好工作。它足够智能,可以检查输出是否连接到有效的文本终端,以决定是否应修改日志。当您想将日志发送到文件而不是控制台时,这可能很有用。
在 Twitter 或 新浪微博 上关注并联系我。如果您发现问题,请在上面 打开一个 issue。也非常欢迎 Pull Request。
没有您的帮助,开源项目无法长久生存。如果您觉得 Kingfisher 有用,请考虑成为赞助商来支持这个项目。您的用户图标或公司徽标会显示在 我的博客 上,并链接到您的主页。
通过 GitHub Sponsors 成为赞助商。❤️
Rainbow 在 MIT 许可证下发布。有关详细信息,请参阅 LICENSE。