123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- # -*- test-case-name: twisted.conch.test.test_text -*-
- # Copyright (c) Twisted Matrix Laboratories.
- # See LICENSE for details.
-
- """
- Character attribute manipulation API.
-
- This module provides a domain-specific language (using Python syntax)
- for the creation of text with additional display attributes associated
- with it. It is intended as an alternative to manually building up
- strings containing ECMA 48 character attribute control codes. It
- currently supports foreground and background colors (black, red,
- green, yellow, blue, magenta, cyan, and white), intensity selection,
- underlining, blinking and reverse video. Character set selection
- support is planned.
-
- Character attributes are specified by using two Python operations:
- attribute lookup and indexing. For example, the string \"Hello
- world\" with red foreground and all other attributes set to their
- defaults, assuming the name twisted.conch.insults.text.attributes has
- been imported and bound to the name \"A\" (with the statement C{from
- twisted.conch.insults.text import attributes as A}, for example) one
- uses this expression::
-
- A.fg.red[\"Hello world\"]
-
- Other foreground colors are set by substituting their name for
- \"red\". To set both a foreground and a background color, this
- expression is used::
-
- A.fg.red[A.bg.green[\"Hello world\"]]
-
- Note that either A.bg.green can be nested within A.fg.red or vice
- versa. Also note that multiple items can be nested within a single
- index operation by separating them with commas::
-
- A.bg.green[A.fg.red[\"Hello\"], " ", A.fg.blue[\"world\"]]
-
- Other character attributes are set in a similar fashion. To specify a
- blinking version of the previous expression::
-
- A.blink[A.bg.green[A.fg.red[\"Hello\"], " ", A.fg.blue[\"world\"]]]
-
- C{A.reverseVideo}, C{A.underline}, and C{A.bold} are also valid.
-
- A third operation is actually supported: unary negation. This turns
- off an attribute when an enclosing expression would otherwise have
- caused it to be on. For example::
-
- A.underline[A.fg.red[\"Hello\", -A.underline[\" world\"]]]
-
- A formatting structure can then be serialized into a string containing the
- necessary VT102 control codes with L{assembleFormattedText}.
-
- @see: L{twisted.conch.insults.text._CharacterAttributes}
- @author: Jp Calderone
- """
-
- from incremental import Version
-
- from twisted.conch.insults import helper, insults
- from twisted.python import _textattributes
- from twisted.python.deprecate import deprecatedModuleAttribute
-
- flatten = _textattributes.flatten
-
- deprecatedModuleAttribute(
- Version("Twisted", 13, 1, 0),
- "Use twisted.conch.insults.text.assembleFormattedText instead.",
- "twisted.conch.insults.text",
- "flatten",
- )
-
- _TEXT_COLORS = {
- "black": helper.BLACK,
- "red": helper.RED,
- "green": helper.GREEN,
- "yellow": helper.YELLOW,
- "blue": helper.BLUE,
- "magenta": helper.MAGENTA,
- "cyan": helper.CYAN,
- "white": helper.WHITE,
- }
-
-
- class _CharacterAttributes(_textattributes.CharacterAttributesMixin):
- """
- Factory for character attributes, including foreground and background color
- and non-color attributes such as bold, reverse video and underline.
-
- Character attributes are applied to actual text by using object
- indexing-syntax (C{obj['abc']}) after accessing a factory attribute, for
- example::
-
- attributes.bold['Some text']
-
- These can be nested to mix attributes::
-
- attributes.bold[attributes.underline['Some text']]
-
- And multiple values can be passed::
-
- attributes.normal[attributes.bold['Some'], ' text']
-
- Non-color attributes can be accessed by attribute name, available
- attributes are:
-
- - bold
- - blink
- - reverseVideo
- - underline
-
- Available colors are:
-
- 0. black
- 1. red
- 2. green
- 3. yellow
- 4. blue
- 5. magenta
- 6. cyan
- 7. white
-
- @ivar fg: Foreground colors accessed by attribute name, see above
- for possible names.
-
- @ivar bg: Background colors accessed by attribute name, see above
- for possible names.
- """
-
- fg = _textattributes._ColorAttribute(
- _textattributes._ForegroundColorAttr, _TEXT_COLORS
- )
- bg = _textattributes._ColorAttribute(
- _textattributes._BackgroundColorAttr, _TEXT_COLORS
- )
-
- attrs = {
- "bold": insults.BOLD,
- "blink": insults.BLINK,
- "underline": insults.UNDERLINE,
- "reverseVideo": insults.REVERSE_VIDEO,
- }
-
-
- def assembleFormattedText(formatted):
- """
- Assemble formatted text from structured information.
-
- Currently handled formatting includes: bold, blink, reverse, underline and
- color codes.
-
- For example::
-
- from twisted.conch.insults.text import attributes as A
- assembleFormattedText(
- A.normal[A.bold['Time: '], A.fg.lightRed['Now!']])
-
- Would produce "Time: " in bold formatting, followed by "Now!" with a
- foreground color of light red and without any additional formatting.
-
- @param formatted: Structured text and attributes.
-
- @rtype: L{str}
- @return: String containing VT102 control sequences that mimic those
- specified by C{formatted}.
-
- @see: L{twisted.conch.insults.text._CharacterAttributes}
- @since: 13.1
- """
- return _textattributes.flatten(formatted, helper._FormattingState(), "toVT102")
-
-
- attributes = _CharacterAttributes()
-
- __all__ = ["attributes", "flatten"]
|