Rainbow

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 中开发跨平台软件,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)

ANSI 256 色模式

完全支持 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 遵循以下优先级规则

冗长的方式

如果您愿意,也可以使用更冗长的方式

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。