生成带有类似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第三方库


热门话题
java如何在Android Wifi中筛选相同的SSID?   Java中重写接口中异常处理的泛型   java“无效转义序列(有效的是\b\t\n\f\r\”\“\”\)”语法错误   使用JNDI的java NameReadyBoundException   java如何在这个程序上执行算法   java为什么我的应用程序在调试时崩溃而应用程序停止?   Java:while循环未检测到中断条件,但如果块检测到   java如何快速使用jfreechart创建的折线图   java将输入放入JSTL会话变量,以便稍后在屏幕上显示   java在spring boot中加载外部JAR   java Apache NiFi无法使用ojdbc6连接到Oracle 12c。jar或ojdbc8。罐子   java解释StringToWordVector()Weka的输出   java charAt()找不到符号   使用mpjexpress的java阅读控制台输入