需要将输出的日志信息显示出来,几经周折终于实现了。

问题

由于某个模块需要将 fastlane 输出的日志在 TextView 中显示出来,其中主要的问题是:

输出的日志含有标明文本颜色的信息,需要将其转换为可以在 TextView 中正常显示的格式化文本。


[10:05:37]: \u{1B}[33mfastlane detected a Gemfile in the current directory\u{1B}[0m\n[10:05:37]: \u{1B}[33mhowever it seems like you don\'t use `bundle exec`\u{1B}[0m\n[10:05:37]: \u{1B}[33mto launch fastlane faster, please use\u{1B}[0m\n[10:05:37]: \n[10:05:37]: \u{1B}[36m$ bundle exec fastlane beta\u{1B}[0m\n[10:05:37]: \n[10:05:37]: \u{1B}[33mGet started using a Gemfile for fastlane https://docs.fastlane.tools/getting-started/ios/setup/#use-a-gemfile\u{1B}[0m\n[10:05:37]: \u{1B}[31mWARNING: fastlane requires your locale to be set to UTF-8. To learn more go to https://docs.fastlane.tools/getting-started/ios/setup/#set-up-environment-variables\u{1B}[0m\n[10:05:39]: \u{1B}[32m------------------------------\u{1B}[0m\n[10:05:39]: \u{1B}[32m--- Step: default_platform ---\u{1B}[0m\n[10:05:39]: \u{1B}[32m------------------------------\u{1B}[0m\n[10:05:39]: \u{1B}[32mDriving the lane \'ios beta\' 🚀\u{1B}[0m\n
.....

解决过程

  • 开始寻找解决方案,google 之,没发现原生功能中有相关信息或现成可用的轮子。
  • 查阅资料,知道了这种文本叫 ANSI Escape Code (维基百科)
  • 寻思着只能将其先转换为 NSAttributedStringHTML ,然后再显示出来。
  • 找到一个可转换为 HTML 的 JS 组件,但需要用 WebView 来展示,作为 Plan B,继续找。
  • 终于找到一个远古的库 https://github.com/ali-rantakari/ANSIEscapeHelper,可将 ANSI Escape Code 转为 NSAttributedString,测试可用,🎉🎉🎉。

p1

改进

  • 首先发现的问题是在白色背景下浅色字体很难看清 p2 修改了 ANSIEscapeHelper 的源码,将显示文本颜色变暗,顺便改了下默认的颜色:

#import <Cocoa/Cocoa.h>
@implementation NSColor  (LightAndDark)

- (NSColor *)lighterColor
{
	CGFloat h, s, b, a;
	[self getHue:&h saturation:&s brightness:&b alpha:&a];
	return [NSColor colorWithHue:h
					  saturation:s
					  brightness:MIN(b * 1.3, 1.0)
						   alpha:a];
}

- (NSColor *)darkerColor
{
	CGFloat h, s, b, a;
	[self getHue:&h saturation:&s brightness:&b alpha:&a];
	return [NSColor colorWithHue:h
					  saturation:s
					  brightness:b * 0.75
						   alpha:a];
}
@end

...

#define kDefaultANSIColorFgRed      [NSColor.redColor darkerColor]
#define kDefaultANSIColorFgGreen    [NSColor.greenColor darkerColor]
#define kDefaultANSIColorFgYellow   [NSColor.yellowColor darkerColor]
#define kDefaultANSIColorFgBlue     [NSColor.blueColor darkerColor]
#define kDefaultANSIColorFgMagenta  [NSColor.magentaColor darkerColor]
#define kDefaultANSIColorFgCyan     [NSColor.cyanColor darkerColor]

...

#define kDefaultForegroundColor NSColor.textColor

...

基本解决: p4

  • 然后发现使用空格格式化的文本错位 p3

猜测是默认字体不是等宽的问题,换了等宽字体:


textView.font = NSFont(name: "Menlo", size: 12)

解决: p5