实际上只有两种可能性:将 ANSI 序列解析为curses
可以接受的东西,或者按原样使用 ANSI 序列。
起初,后者可能看起来更有吸引力。大多数限制要么与您无关,要么易于处理:
- 它仅适用于静态 ANSI 艺术,不适用于动画文件。这是相当合理的,因为在动画文件中“向上滚动”没有多大意义。(你当然可以将它即时渲染到画布上,然后在其中上下滚动一个窗口,但是一旦你开始思考渲染和窗口化意味着什么……你正在解析 ANSI 艺术。)但这听起来像你只需要静态ANSI艺术。
- 它仅在您的终端(足够接近)ANSI 兼容的情况下才有效……但它是(或可以如此)或者您的
cat
命令不起作用。(您可能仍然对颜色设置有疑问,但我假设您也知道如何解决这个问题。)
- 它仅在您的终端是 cp437 时才有效,这可能是一个更大的问题……但这很容易解决;然后在您
decode('cp437')
的代码中进行适当的编码;转义序列将通过不变。
- 您可能需要原始键盘输入。但这
tty.setraw(sys.stdin.fileno())
就像将标准输入作为无缓冲文件读取一样简单。(嗯,你可能想把原件藏起来,tcgetattr
以便以后恢复它,但这并不难。)
- 您必须自己解析键盘输入转义序列。这通常需要做很多工作……但只需处理与 ANSI-art 兼容的终端的向上和向下箭头就很容易了。
- 您必须知道如何将 ANS 文件映射到实际行。
最后一个听起来很容易,但事实并非如此。例如,我抓取了一个随机文件GR-BANT;它只有 33 行长,但里面有 154 个换行符。这将非常普遍。在许多情况下,它只是以 esc-[-A 开头的“覆盖线”,您必须将其视为前一行的一部分,这并不难,但会有很多情况需要不止于此。
因此,无论如何,您都必须至少进行一些ANSI 解析。
一旦你开始这样做,我认为你会发现你的“最后手段”会更容易进行完整的解析并手动绘制到诅咒垫。(当然,这有一些副作用,可以处理动画文件,在非 ANSI 终端上工作,更轻松地在所有终端上处理“键盘”键,......)
但是,如果您想采用第二种方式,这里有一个快速的技巧可以帮助您入门。