生成带有类似xml标记的彩色终端文本

ansimarkup的Python项目详细描述


Latest version released on PyPiBuild statusBSD 3-Clause

ansimarkup是一种类似xml的标记,用于生成彩色终端文本。

fromansimarkupimportansiprintasprintprint("<b>bold text</b>"))print("<red>red text</red>","<red,green>red text on a green background</red,green>")print("<fg #ffaf00>orange text</fg #ffaf00>")

安装

最新稳定版本的ansimarkup可以从pypi安装:

$ pip install ansimarkup

用法

基本

fromansimarkupimportparse,ansiprint# parse() converts the tags to the corresponding ansi escape sequence.parse("<b>bold</b> <d>dim</d>")# ansiprint() works exactly like print(), but first runs parse() on all arguments.ansiprint("<b>bold</b>","<d>dim</d>")ansiprint("<b>bold</b>","<d>dim</d>",sep=":",file=sys.stderr)

颜色和样式

# Colors may be specified in one of several ways.parse("<red>red foreground</red>")parse("<RED>red background</RED>")parse("<fg red>red foreground</fg red>")parse("<bg red>red background</bg red>")# Xterm, hex and rgb colors are accepted by the <fg> and <bg> tags.parse("<fg 86>aquamarine foreground</fg 86>")parse("<bg #00005f>dark blue background</bg #00005f>")parse("<fg 0,95,0>dark green foreground</fg 0,95,0>")# Tags may be nested.parse("<r><Y>red text on a yellow foreground</Y></r>")# The above may be more concisely written as:parse("<r,y>red text on a yellow background</r,y>")# This shorthand also supports style tags.parse("<b,r,y>bold red text on a yellow background</b,r,y>")parse("<b,r,>bold red text</b,r,>")parse("<b,,y>bold regular text on a yellow background</b,,y>")# Unrecognized tags are left as-is.parse("<b><element1></element1></b>")

有关标记标记的列表,请参阅tags.py

用户定义的标签

<> >现有标记的自定义标记或重写可以通过创建新的标记来定义。 AnsiMarkup实例:

fromansimarkupimportAnsiMarkup,parseuser_tags={# Add a new tag (e.g. we want <info> to expand to "<bold><green>")."info":parse("<b><g>")# The ansi escape sequence can be used directly."info":"e\x1b[32m\x1b[1m",# Tag names may also be callables."err":lambda:parse("<r>")# Colors may also be given convenient tag names."orange":parse("<fg #d78700>"),# User-defined tags always take precedence over existing tags."bold":parse("<dim>")}am=AnsiMarkup(tags=user_tags)am.parse("<info>bold green</info>")am.ansiprint("<err>red</err>")# Calling the instance is equivalent to calling its parse method.am("<b>bold</b>")==am.parse("<b>bold</b>")

对齐和长度

对齐格式化字符串可能很困难,因为呈现的 字符串与可打印字符数不同。考虑这个例子:

>>>a='| {:30} |'.format('abc')>>>b='| {:30} |'.format(parse('<b>abc</b>'))>>>print(a,b,sep='\n')|abc||abc|

可以使用ansistring函数或 AnsiMarkup.string(markup)方法,它具有以下有用的属性:

>>>s=ansistring('<b>abc</b>')>>>print(repr(s),'->',s)<b>abc</b>->abc# abc is printed in bold>>>len(s),len(am.parse('<b>abc</b>'),s.delta3,11,8

delta属性的帮助下,很容易将 以上示例:

>>>s=ansistring('<b>abc</b>')>>>a='| {:{width}} |'.format('abc',width=30)>>>b='| {:{width}} |'.format(s,width=(30+s.delta))>>>print(a,b,sep='\n')|abc||abc|

其他功能

通过将tag_sep参数传递给 AnsiMarkup

fromansimarkupimportAnsiMarkupam=AnsiMarkup(tag_sep="{}")am.parse("{b}{r}bold red{/b}{/r}")

可以使用strip()方法删除标记:

fromansimarkupimportAnsiMarkupam=AnsiMarkup()am.strip("<b><r>bold red</b></r>")

strict选项指示解析器在打开时引发MismatchedTag。 标记没有相应的结束标记:

fromansimarkupimportAnsiMarkupam=AnsiMarkup(strict=True)am.parse("<r><b>bold red")# ansimarkup.MismatchedTag: opening tag "<r>" has no corresponding closing tag

命令行

ansimarkup也可以在命令行上使用。这就好像一切 参数被传递给ansiprint()

$ python -m ansimarkup "<b>bold</b>" "<red>red</red>"

日志格式化程序

ansimarkup还为标准库提供了格式化程序日志记录 模块。它可以用作:

importloggingfromansimarkup.logformatterimportAnsiMarkupFormatterlog=logging.getLogger()hdl=logging.StreamHandler()fmt=AnsiMarkupFormatter()hdl.setFormatter(fmt)log.addHandler(hdl)log.info("<b>bold text</b>")

窗口

ansimarkup在内部使用colorama库,这意味着windows 第一次运行时支持ANSI转义序列:

importcoloramacolorama.init()

有关Windows支持的更多信息,请参阅 colorama文档。

性能

虽然ansimarkup的重点是方便性,但它确实尝试继续处理 最少。benchmark.py脚本尝试对不同的ansi进行基准测试 转义代码库:

Benchmark 1: <r><b>red bold</b></r>
  colorama     0.2998 μs
  termcolor    3.2339 μs
  colr         3.6483 μs
  ansimarkup   6.8679 μs
  pastel       28.8538 μs
  plumbum      53.5004 μs

Benchmark 2: <r><b>red bold</b>red</r><b>bold</b>
  colorama     0.8269 μs
  termcolor    8.9296 μs
  ansimarkup   9.3099 μs
  colr         9.6244 μs
  pastel       62.2018 μs
  plumbum      120.8048 μs

限制

Ansimarkup是Colorama的一个简单包装。它几乎不妨碍 验证标记字符串的格式是否正确。这是一个有意识的决定 以保持简单和快速为目标。

不平衡的嵌套,例如在下面的示例中,将产生不正确的 输出:

<r><Y>1</r>2</Y>

待办事项

  • 许多角落的箱子仍有待修理。
  • 更精细的测试。当前的测试套件主要包括 “幸福之路”。
  • 用更多内容替换sub_end中的tag_list.index。 有效的(例如,像一个有序的多重听写)。

类似库

  • pastel:给终端带来颜色
  • plumbum.colors:python中类似shell脚本的程序的小型但功能丰富的库
  • colr:简单的终端颜色,具有可链接的方法

许可证

ansimarkup是根据Revised BSD License的条款发布的。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
javascript问题:通过URL用网站数据填充Textview   java TabLayout Android,如何用几个标签填充整个屏幕宽度,并用大量标签滚动?   Eclipse Java运行的文件不再存在于我的工作区中   安装两个Java版本时,使用Java的windows链接不起作用   java将多个图形添加到单个JPanel   java Kafka ConsumerFactory,带有两个Desiarizer   使用反射更改java类超类   当一致性测试失败时,java有没有办法让堆栈跟踪显示在控制台中   java映射到基元类型的HashMap的快速替代方案是什么?   java关闭一个jframe所有剩余的打开jframe都将关闭。   java为什么不推荐“使用getString()获取设备标识符”?   java值比较和值赋值之间有什么性能差异吗?   Java实体数组到JavaScript数组   java使用流将一个列表转换为另一个列表   在JTree中保存对象,但更改显示的名称(java swing)?   java“Hello world”Android应用程序,文件尽可能少,没有IDE,只有文本编辑器   java在方法之间传递值   java如何为项目数组创建ParseQuery?