Package: grblcom
Ansimarkup is an XML-like markup for producing colored terminal text.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>")InstallationThe latest stable version of ansimarkup can be installed from pypi:$pipinstallansimarkupUsageBasicfromansimarkupimportparse,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 and styles# 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>")For a list of markup tags, please refer totags.py.User-defined tagsCustom tags or overrides for existing tags may be defined by creating a newAnsiMarkupinstance: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>")Other featuresThe default tag separators can be changed by passing thetag_separgument toAnsiMarkup:fromansimarkupimportAnsiMarkupam=AnsiMarkup(tag_sep="{}")am.parse("{b}{r}bold red{/b}{/r}")Markup tags can be removed using thestrip()method:fromansimarkupimportAnsiMarkupam=AnsiMarkup()am.strip("<b><r>bold red</b></r>")Command-lineAnsimarkup may also be used as a command-line script. This works as if all
arguments were passed toansiprint():$ python -m ansimarkup "<b>bold</b>" "<red>red</red>"Logging formatterAnsimarkup also comes with a formatter for the standard libraryloggingmodule. It can be used as:importloggingfromansimarkup.logformatterimportAnsiMarkupFormatterlog=logging.getLogger()hdl=logging.StreamHandler()fmt=AnsiMarkupFormatter()hdl.setFormatter(fmt)log.addHandler(hdl)log.info("<b>bold text</b>")WindowsAnsimarkup uses thecoloramalibrary internally, which means that Windows
support for ansi escape sequences is available by first running:importcoloramacolorama.init()For more information on Windows support, consult the “Usage” section of thecoloramadocumentation.PerformanceWhile the focus of ansimarkup is convenience, it does try to keep processing to
a minimum. Thebenchmark.pyscript attempts to benchmark different ansi
escape code libraries: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 μsLimitationsAnsimarkup is a simple wrapper around colorama. It does very little in the way
of validating that markup strings are well-formed. This is a conscious decision
with the goal of keeping things simple and fast.Unbalanced nesting, such as in the following example, will produce incorrect
output:<r><Y>1</r>2</Y>TodoMany corner cases remain to be fixed.More elaborate testing. The current test suite mostly covers the
“happy paths”.Replacetag_list.indexinsub_endwith something more
efficient (i.e. something like an ordered MultiDict).Similar librariespastel: bring colors to your terminalplumbum.colors: small yet feature-rich library for shell script-like programs in Pythoncolr: easy terminal colors, with chainable methodsLicenseAnsimarkup is released under the terms of theRevised BSD License.