{"id":20773113,"url":"https://github.com/delameter/pytermor","last_synced_at":"2026-02-05T05:34:23.789Z","repository":{"id":39982207,"uuid":"466660805","full_name":"delameter/pytermor","owner":"delameter","description":"ANSI formatted terminal output library","archived":false,"fork":false,"pushed_at":"2024-11-22T14:23:20.000Z","size":98422,"stargazers_count":0,"open_issues_count":3,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-30T09:33:49.961Z","etag":null,"topics":["ansi","color","colored-terminal","command-line","console","library","linux","python","python3","sgr","terminal","tmux"],"latest_commit_sha":null,"homepage":"https://pypi.org/p/pytermor","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/delameter.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-03-06T06:55:39.000Z","updated_at":"2024-02-28T15:44:48.000Z","dependencies_parsed_at":"2025-09-28T02:34:36.479Z","dependency_job_id":"6a4eef8f-5467-43f5-8c96-93289ea1491b","html_url":"https://github.com/delameter/pytermor","commit_stats":{"total_commits":50,"total_committers":3,"mean_commits":"16.666666666666668","dds":0.14,"last_synced_commit":"5abc440eb61929b6885b303bdf582077fce4636b"},"previous_names":[],"tags_count":85,"template":false,"template_full_name":null,"purl":"pkg:github/delameter/pytermor","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/delameter%2Fpytermor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/delameter%2Fpytermor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/delameter%2Fpytermor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/delameter%2Fpytermor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/delameter","download_url":"https://codeload.github.com/delameter/pytermor/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/delameter%2Fpytermor/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29113715,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-05T05:31:32.482Z","status":"ssl_error","status_checked_at":"2026-02-05T05:31:29.075Z","response_time":65,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ansi","color","colored-terminal","command-line","console","library","linux","python","python3","sgr","terminal","tmux"],"created_at":"2024-11-17T12:24:29.882Z","updated_at":"2026-02-05T05:34:23.772Z","avatar_url":"https://github.com/delameter.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\n  \u003cimg src=\"https://user-images.githubusercontent.com/50381946/167745623-66bcb825-f787-4f8a-a317-18775d3f104a.png\"\u003e\n  \u003cbr\u003e\n  \u003ccode\u003e\n    pytermor\n  \u003c/code\u003e\n  \u003cbr\u003e\n\u003c/h1\u003e\n\n_(yet another)_ Python library designed for formatting terminal output using ANSI escape codes. Implements automatic \"soft\" format termination. Provides a registry of ready-to-use SGR sequences and formats (=combined sequences).\n\n## Motivation\n\nKey feature of this library is providing necessary abstractions for building complex text sections with lots of formatting, while keeping the application code clear and readable.\n\n## Installation\n\n    pip install pytermor\n\n\n\n## Use cases\n\n_Format_ is a combination of two control sequences; it wraps specified string with pre-defined leading and trailing SGR definitions.\n\n```python3\nfrom pytermor import fmt\n\nprint(fmt.blue('Use'), fmt.cyan('cases'))\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eExamples\u003c/b\u003e \u003ci\u003e(click)\u003c/i\u003e\u003c/summary\u003e\n\n## * ![image](https://user-images.githubusercontent.com/50381946/161387692-4374edcb-c1fe-438f-96f1-dae3c5ad4088.png)\n\nPreset formats can safely overlap with each other (as long as they require different **breaker** sequences to reset).\n\n```python3\nfrom pytermor import fmt\n\nprint(fmt.blue(fmt.underlined('Nested') + fmt.bold(' formats')))\n```\n\n## * ![image](https://user-images.githubusercontent.com/50381946/161387711-23746520-419b-4917-9401-257854ff2d8a.png)\n\nCompose text formats with automatic content-aware format termination.\n\n```python3\nfrom pytermor import autof\n\nfmt1 = autof('hi_cyan', 'bold')\nfmt2 = autof('bg_black', 'inversed', 'underlined', 'italic')\n\nmsg = fmt1(f'Content{fmt2(\"-aware format\")} nesting')\nprint(msg)\n```\n\n## * ![image](https://user-images.githubusercontent.com/50381946/161387734-677d5b10-15c1-4926-933f-b1144b0ce5cb.png)\n\nCreate your own _SGR_ _sequences_ with `build()` method, which accepts color/attribute keys, integer codes and even existing _SGRs_, in any amount and in any order. Key resolving is case-insensitive.\n\n```python3\nfrom pytermor import seq, build\n\nseq1 = build('red', 1)  # keys or integer codes\nseq2 = build(seq1, seq.ITALIC)  # existing SGRs as part of a new one\nseq3 = build('underlined', 'YELLOW')  # case-insensitive\n\nmsg = f'{seq1}Flexible{seq.RESET} ' + \\\n      f'{seq2}sequence{seq.RESET} ' + \\\n      str(seq3) + 'builder' + str(seq.RESET)\nprint(msg)\n```\n\n## * ![image](https://user-images.githubusercontent.com/50381946/161387746-0a94e3d2-8295-478c-828c-333e99e5d50a.png)\n\nUse `build_c256()` to set foreground/background color to any of [↗ xterm-256 colors](https://www.ditig.com/256-colors-cheat-sheet).\n\n```python3\nfrom pytermor import build_c256, seq, autof\n\ntxt = '256 colors support'\nstart_color = 41\nmsg = ''\nfor idx, c in enumerate(range(start_color, start_color+(36*6), 36)):\n    msg += f'{build_c256(c)}{txt[idx*3:(idx+1)*3]}{seq.COLOR_OFF}'\n\nprint(autof(seq.BOLD).wrap(msg))\n```\n\n## * ![image](https://user-images.githubusercontent.com/50381946/161411577-743b9a81-eac3-47c0-9b59-82b289cc0f45.png)\n\nIt's also possible to use 16M-color mode (or True color) \u0026mdash; with `build_rgb()` wrapper method.\n\n```python3\nfrom pytermor import build_rgb, seq, fmt\n\ntxt = 'True color support'\nmsg = ''\nfor idx, c in enumerate(range(0, 256, 256//18)):\n    r = max(0, 255-c)\n    g = max(0, min(255, 127-(c*2)))\n    b = c\n    msg += f'{build_rgb(r, g, b)}{txt[idx:(idx+1)]}{seq.COLOR_OFF}'\n\nprint(fmt.bold(msg))\n```\n\n\u003c/details\u003e\n\n\n## Format soft reset\n\nThere are two ways to manage color and attribute termination:\n\n- hard reset (SGR 0 | `\\e[0m`)\n- soft reset (SGR 22, 23, 24 etc.)\n\nThe main difference between them is that **hard** reset disables all formatting after itself, while **soft** reset disables only actually necessary attributes (i.e. used as opening sequence in _Format_ instance's context) and keeps the other.\n\nThat's what _Format_ class and `autof` method are designed for: to simplify creation of soft-resetting text spans, so that developer doesn't have to restore all previously applied formats after every closing sequence.\n\nExample: we are given a text span which is initially **bold** and \u003cu\u003eunderlined\u003c/u\u003e. We want to recolor a few words inside of this span. By default this will result in losing all the formatting to the right of updated text span (because `RESET`|`\\e[0m` clears all text attributes).\n\nHowever, there is an option to specify what attributes should be disabled or let the library do that for you:\n\n```python3\nfrom pytermor import seq, fmt, autof, Format\n\n# automatically:\nfmt_warn = autof(seq.HI_YELLOW + seq.UNDERLINED)\n# or manually:\nfmt_warn = Format(\n    seq.HI_YELLOW + seq.UNDERLINED,  # sequences can be summed up, remember?\n    seq.COLOR_OFF + seq.UNDERLINED_OFF,  # \"counteractive\" sequences\n    hard_reset_after=False\n)\n\norig_text = fmt.bold(f'this is {seq.BG_GRAY}the original{seq.RESET} string')\nupdated_text = orig_text.replace('original', fmt_warn('updated'), 1)\nprint(orig_text, '\\n', updated_text)\n```\n\u003e ![image](https://user-images.githubusercontent.com/50381946/163714299-1f7d3d52-0b9a-4d3e-91bf-26e8cce9b1f1.png)\n\nAs you can see, the update went well \u0026mdash; we kept all the previously applied formatting. Of course, this method cannot be 100% applicable \u0026mdash; for example, imagine that original text was colored blue. After the update \"string\" word won't be blue anymore, as we used `COLOR_OFF` escape sequence to neutralize our own yellow color. But it still can be helpful for a majority of cases (especially when text is generated and formatted by the same program and in one go).\n\n\n## API: pytermor\n\n### \u0026gt; `autof`\n\nSignature: `autof(*params str|int|SequenceSGR) -\u003e Format`\n\nCreate new _Format_ with specified control sequence(s) as a opening/starter sequence and **automatically compose** closing sequence that will terminate attributes defined in opening sequence while keeping the others (soft reset).\n\nResulting sequence params' order is the same as argument's order.\n\nEach sequence param can be specified as:\n- string key (see [API: Registries](#api-registries))\n- integer param value\n- existing _SequenceSGR_ instance (params will be extracted)\n\n### \u0026gt; `build`\n\nSignature: `build(*params str|int|SequenceSGR) -\u003e SequenceSGR`\n\nCreate new _SequenceSGR_ with specified params. Resulting sequence params order is the same as argument order. Parameter specification is the same as for `autof`.\n\n_SequenceSGR_ with zero params was specifically implemented to translate into empty string and not into `\\e[m`, which wolud make sense, but also would be very entangling, as it's equivavlent of `\\e[0m` \u0026mdash; **hard reset** sequence.\n\n### \u0026gt; `build_c256`\n\nSignature:`build_c256(color: int, bg: bool = False) -\u003e SequenceSGR`\n\nCreate new _SequenceSGR_ that sets foreground color or background color, depending on `bg` value, in 256-color mode. Valid values for `color` are [0; 255], see more at [↗ xterm-256 colors](https://www.ditig.com/256-colors-cheat-sheet) page.\n\n### \u0026gt; `build_rgb`\n\nSignature:`build_rgb(r: int, g: int, b: int, bg: bool = False) -\u003e SequenceSGR`\n\nCreate new _SequenceSGR_ that sets foreground color or background color, depending on `bg` value, in 16M-color mode. Valid values for `r`, `g` and `b` are [0; 255]; this range is linearly translated into [0x00; 0xFF] for each channel; the result value is composed as #RRGGBB.\n\n\n## API: SGR sequences\n\nClass representing SGR-type ANSI escape sequence with varying amount of parameters.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e \u003ci\u003e(click)\u003c/i\u003e\u003c/summary\u003e\n\n### Creating the sequence\n\nYou can use any of predefined sequences from `pytermor.seq` or create your own via standard constructor (see below). Valid argument values as well as preset constants are described in [API: Registries](#api-registries) section.\n\n### Applying the sequence\n\nTo get the resulting sequence chars use `print()` method or cast instance to _str_:\n\n```python3\nfrom pytermor import SequenceSGR\n\nseq = SequenceSGR(4, 7)\nmsg = f'({seq})'\nprint(msg + f'{SequenceSGR(0).print()}', str(msg.encode()), msg.encode().hex(':'))\n```\n\u003e ![image](https://user-images.githubusercontent.com/50381946/161387861-5203fff8-86c8-4c52-8518-63a5525c09f7.png)\n\n1st part is \"applied\" escape sequence; 2nd part shows up a sequence in raw mode, as if it was ignored by the terminal; 3rd part is hexademical sequence byte values.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eSGR sequence structure\u003c/b\u003e \u003ci\u003e(click)\u003c/i\u003e\u003c/summary\u003e\n\n1. `\\x1b`|`1b` is ESC **control character**, which opens a control sequence.\n\n2. `[` is sequence **introducer**, it determines the type of control sequence (in this case it's _CSI_, or \"Control Sequence Introducer\").\n\n3. `4` and `7` are **parameters** of the escape sequence; they mean \"underlined\" and \"inversed\" attributes respectively. Those parameters must be separated by `;`.\n\n4. `m` is sequence **terminator**; it also determines the sub-type of sequence, in our case _SGR_, or \"Select Graphic Rendition\". Sequences of this kind are most commonly encountered.\n\n\u003c/details\u003e\n\n### Combining SGRs\n\nOne instance of _SequenceSGR_ can be added to another. This will result in a new _SequenceSGR_ with combined params.\n\n```python3\nfrom pytermor import seq, SequenceSGR\n\ncombined = SequenceSGR(1, 31) + SequenceSGR(4)\nprint(f'{combined}combined{seq.RESET}', str(combined).encode())\n```\n\u003e ![image](https://user-images.githubusercontent.com/50381946/161387867-808831e5-784b-49ec-9c24-490734ef4eab.png)\n\n\u003c/details\u003e\n\n## API: Formats\n\n_Format_ is a wrapper class that contains starting (i.e. opening) _SequenceSGR_ and (optionally) closing _SequenceSGR_.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e \u003ci\u003e(click)\u003c/i\u003e\u003c/summary\u003e\n\n### Creating the format\n\nYou can define your own reusable \u003ci\u003eFormat\u003c/i\u003es (see below) or import predefined ones from `pytermor.fmt` (see [API: Registries](#api-registries) section).\n\n### Applying the format\n\nUse `wrap()` method of _Format_ instance or call the instance itself to enclose specified string in starting/terminating SGR sequences:\n\n```python3\nfrom pytermor import seq, fmt, Format\n\nfmt_error = Format(seq.BG_HI_RED + seq.UNDERLINED, seq.BG_COLOR_OFF + seq.UNDERLINED_OFF)\nmsg = fmt.italic.wrap('italic might ' + fmt_error('not') + ' work')\nprint(msg)\n```\n\u003e ![image](https://user-images.githubusercontent.com/50381946/161387874-5c25a493-253b-4f9e-8dbf-8328add2e5d5.png)\n\n\u003c/details\u003e\n\n\n## API: strf.StringFilter\n\n_StringFilter_ is common string modifier interface with dynamic configuration support.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e \u003ci\u003e(click)\u003c/i\u003e\u003c/summary\u003e\n\n### Implementations\n\n- ReplaceSGR\n- ReplaceCSI\n- ReplaceNonAsciiBytes\n\n### Standalone usage\n\nCan be applied using `.apply()` method or with direct call.\n\n```python3\nfrom pytermor import fmt, ReplaceSGR\n\nformatted = fmt.red('this text is red')\nreplaced = ReplaceSGR('[LIE]').apply(formatted)\n# replaced = ReplaceSequenceSGRs('[LIE]')(formatted)\n\nprint(formatted, '\\n', replaced)\n```\n\u003e ![image](https://user-images.githubusercontent.com/50381946/161387885-0fc0fcb5-09aa-4258-aa25-312220e7f994.png)\n\n\n### Usage with helper\n\nHelper function `apply_filters` accepts both `StringFilter` instances and types, but latter is not configurable and will be invoked using default settings.\n\n```python3\nfrom pytermor import apply_filters, ReplaceNonAsciiBytes\n\nascii_and_binary = b'\\xc0\\xff\\xeeQWE\\xffRT\\xeb\\x00\\xc0\\xcd\\xed'\nresult = apply_filters(ascii_and_binary, ReplaceNonAsciiBytes)\nprint(ascii_and_binary, '\\n', result)\n```\n\u003e ![image](https://user-images.githubusercontent.com/50381946/161387889-a1920f13-f5fc-4d10-b535-93f1a1b1aa5c.png)\n\n\u003c/details\u003e\n\n\n## API: strf.fmtd\n\nSet of methods to make working with SGR sequences a bit easier.\n\n- `ljust_fmtd()`   SGR-formatting-aware implementation of str.ljust()\n- `rjust_fmtd()`  same, but for _str.rjust()_\n- `center_fmtd()` same, but for _str.center()_\n\n\n## API: numf.*\n\n`pytermor` also includes a few helper formatters for numbers.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eDetails\u003c/b\u003e \u003ci\u003e(click)\u003c/i\u003e\u003c/summary\u003e\n\n### \u0026gt; `format_auto_float`\n\nDynamically adjust decimal digit amount to fill the output string up with significant digits as much as possible. Universal solution for situations when you don't know exaclty what values will be displayed, but have fixed output width. Invocation: `format_auto_float(value, 4)`.\n\n| value       |  result    |\n| ----------: | ---------- |\n| **1\u0026nbsp;234.56** |  `\"1235\"`  |\n| **123.56**  |  `\" 124\"`  |\n| **12.56**   |  `\"12.6\"`  |\n| **1.56**    |  `\"1.56\"`  |\n                               \n\n### \u0026gt; `format_prefixed_unit`\n\nSimilar to previous method, but this one also supports metric prefixes and is highly customizable. Invocation: `format_prefixed_unit(value)`.\n\n| value  | **631**   | **1\u0026nbsp;080**    | **45\u0026nbsp;200**    | **1\u0026nbsp;257\u0026nbsp;800** |  4,31×10⁷ | 7,00×10⁸ | 2,50×10⁹ | \n| :------: | :--------: | :--------: | :--------: | :--------: |  :--------: | :--------: | :--------: | \n| result | \u003ccode\u003e631\u0026nbsp;b\u003c/code\u003e | \u003ccode\u003e1.05\u0026nbsp;kb\u003c/code\u003e | \u003ccode\u003e44.14\u0026nbsp;kb\u003c/code\u003e | \u003ccode\u003e1.20\u0026nbsp;Mb\u003c/code\u003e |  \u003ccode\u003e41.11\u0026nbsp;Mb\u003c/code\u003e | \u003ccode\u003e668.0\u0026nbsp;Mb\u003c/code\u003e  | \u003ccode\u003e2.33\u0026nbsp;Gb\u003c/code\u003e    |\n\nSettings:\n```python\nPrefixedUnitPreset(\n    max_value_len=5, integer_input=True,\n    unit='b', unit_separator=' ',\n    mcoef=1024.0,\n    prefixes=[None, 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'],\n    prefix_zero_idx=0,\n)\n```\n\nExample #2 illustrating small numbers: \n\n| value  | **-1.2345×10⁻¹¹**   | **1.2345×10⁻⁸**    |  **1.2345×10⁻⁴** | **0.01234** | **1.23456** | **123.456** | **−12 345** |\n| :------: | :--------: | :--------: |  :---: | :---: | :---: | :---: | :---: |\n| result | \u003ccode\u003e-0.012nm\u003c/code\u003e | \u003ccode\u003e0.0123μm\u003c/code\u003e | \u003ccode\u003e0.1235mm\u003c/code\u003e | \u003ccode\u003e0.0123m\u003c/code\u003e | \u003ccode\u003e1.2346m\u003c/code\u003e | \u003ccode\u003e123.46m\u003c/code\u003e | \u003ccode\u003e-12.35km\u003c/code\u003e\n\n```python\nPrefixedUnitPreset(\n    max_value_len=6, integer_input=False,\n    unit='m', unit_separator='',\n    mcoef=1000.0,\n    prefixes=['y', 'z', 'a', 'f', 'p', 'n', 'μ', 'm', None],\n    prefix_zero_idx=8,\n)\n```\n\n### \u0026gt; `format_time_delta`\n\nFormats time interval in 4 different variants - 3-char, 4-char, 6-char and 10-char width output. Usage: `format_time_delta(seconds, max_len)`.\n\n| width   | 2 | 10 | 60 | 2700 | 32\u0026nbsp;340 | 273\u0026nbsp;600 | 4\u0026nbsp;752\u0026nbsp;000 | 8,64×10⁸ |\n| ------:  | --- | --- | --- | --- | --- | --- | --- | --- |\n| **3\u0026nbsp;chars**  | \u003ccode\u003e2s\u003c/code\u003e| \u003ccode\u003e10s\u003c/code\u003e| \u003ccode\u003e1m\u003c/code\u003e| \u003ccode\u003e45m\u003c/code\u003e| \u003ccode\u003e8h\u003c/code\u003e| \u003ccode\u003e3d\u003c/code\u003e| \u003ccode\u003e55d\u003c/code\u003e| -- |\n| **4\u0026nbsp;chars**  | \u003ccode\u003e2\u0026nbsp;s \u003c/code\u003e| \u003ccode\u003e10\u0026nbsp;s \u003c/code\u003e| \u003ccode\u003e1\u0026nbsp;m \u003c/code\u003e| \u003ccode\u003e45\u0026nbsp;m \u003c/code\u003e| \u003ccode\u003e8\u0026nbsp;h \u003c/code\u003e| \u003ccode\u003e3\u0026nbsp;d \u003c/code\u003e| \u003ccode\u003e1\u0026nbsp;M \u003c/code\u003e| \u003ccode\u003e27\u0026nbsp;y \u003c/code\u003e|                  \n| **6\u0026nbsp;chars**  | \u003ccode\u003e2\u0026nbsp;sec \u003c/code\u003e| \u003ccode\u003e10\u0026nbsp;sec \u003c/code\u003e| \u003ccode\u003e1\u0026nbsp;min \u003c/code\u003e| \u003ccode\u003e45\u0026nbsp;min\u003c/code\u003e| \u003ccode\u003e8h\u0026nbsp;59m \u003c/code\u003e| \u003ccode\u003e3d\u0026nbsp;4h \u003c/code\u003e| \u003ccode\u003e1\u0026nbsp;mon \u003c/code\u003e| \u003ccode\u003e27\u0026nbsp;yr \u003c/code\u003e|\n| **10\u0026nbsp;chars** | \u003ccode\u003e2\u0026nbsp;secs \u003c/code\u003e| \u003ccode\u003e10\u0026nbsp;secs \u003c/code\u003e| \u003ccode\u003e1\u0026nbsp;min\u003c/code\u003e | \u003ccode\u003e45\u0026nbsp;mins\u003c/code\u003e| \u003ccode\u003e8h\u0026nbsp;59m \u003c/code\u003e| \u003ccode\u003e3d\u0026nbsp;4h \u003c/code\u003e| \u003ccode\u003e1\u0026nbsp;months \u003c/code\u003e| \u003ccode\u003e27\u0026nbsp;years \u003c/code\u003e|\n\nSettings example (for 10-char mode):\n```python\nTimeDeltaPreset([\n    TimeUnit('sec', 60), \n    TimeUnit('min', 60, custom_short='min'), \n    TimeUnit('hour', 24, collapsible_after=24),\n    TimeUnit('day', 30, collapsible_after=10),\n    TimeUnit('month', 12),\n    TimeUnit('year', overflow_afer=999),\n], allow_negative=True,\n    unit_separator=' ',\n    plural_suffix='s',\n    overflow_msg='OVERFLOW',\n),\n```\n\n\u003c/details\u003e\n\n## API: Registries\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eSequences\u003c/b\u003e \u003ci\u003e(click)\u003c/i\u003e\u003c/summary\u003e\n\n\n- **code** \u0026mdash; SGR integer code(s) for specified sequence (order is important)\n- **name** \u0026mdash; variable name; usage: `from pytermor.seq import RESET`\n- **key** \u0026mdash; string that will be recognised by `build()`|`autof()` etc.\n- **description** \u0026mdash; effect of applying the sequence / additional notes\n\nAs a rule of a thumb, **key** equals to **name** in lower case.\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003cth\u003ecode\u003c/th\u003e\n    \u003cth\u003ename\u003c/th\u003e\n    \u003cth\u003ekey\u003c/th\u003e\n    \u003cth\u003edescription\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e0\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eRESET\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ereset\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eReset all attributes and colors\u003c/td\u003e\n  \u003c/tr\u003e\n\n  \u003ctr\u003e\u003ctd colspan=\"4\"\u003e\u003cbr\u003e\u003cb\u003eattributes\u003c/b\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e1\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBOLD\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ebold\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eBold or increased intensity\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e2\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eDIM\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003edim\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eFaint, decreased intensity\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e3\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eITALIC\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eitalic\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eItalic; not widely supported\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e4\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eUNDERLINED\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eunderlined\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eUnderline\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e5\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBLINK_SLOW\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eblink_slow\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSets blinking to \u0026lt; 150 cpm\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e6\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBLINK_FAST\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eblink_fast\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e150+ cpm; not widely supported\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e7\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eINVERSED\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003einversed\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSwap foreground and background colors\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e8\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eHIDDEN\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ehidden\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eConceal characters; not widely supported\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e9\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eCROSSLINED\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ecrosslined\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eStrikethrough\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e21\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eDOUBLE_UNDERLINED\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003edouble_underlined\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eDouble-underline; on several terminals disables \u003ccode\u003eBOLD\u003c/code\u003e instead\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e53\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eOVERLINED\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eoverlined\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eNot widely supported\u003c/td\u003e\n  \u003c/tr\u003e\n\n  \u003ctr\u003e\u003ctd colspan=\"4\"\u003e\u003cbr\u003e\u003cb\u003ebreakers\u003c/b\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e22\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBOLD_DIM_OFF\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ebold_dim_off\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eDisable \u003ccode\u003eBOLD\u003c/code\u003e and \u003ccode\u003eDIM\u003c/code\u003e attributes. \u003ci\u003eSpecial aspects... It's impossible to reliably disable them on a separate basis.\u003c/i\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e23\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eITALIC_OFF\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eitalic_off\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eDisable italic\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e24\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eUNDERLINED_OFF\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eunderlined_off\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eDisable underlining\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e25\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBLINK_OFF\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eblink_off\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eDisable blinking\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e27\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eINVERSED_OFF\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003einversed_off\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eDisable inversing\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e28\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eHIDDEN_OFF\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ehidden_off\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eDisable conecaling\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e29\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eCROSSLINED_OFF\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ecrosslined_off\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eDisable strikethrough\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e39\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eCOLOR_OFF\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ecolor_off\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eReset foreground color\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e49\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBG_COLOR_OFF\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ebg_color_off\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eReset bg color\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e55\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eOVERLINED_OFF\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eoverlined_off\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eDisable overlining\u003c/td\u003e\n  \u003c/tr\u003e\n\n  \u003ctr\u003e\u003ctd colspan=\"4\"\u003e\u003cbr\u003e\u003cb\u003e[foreground] colors\u003c/b\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e30\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBLACK\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eblack\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSet foreground color to black\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e31\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eRED\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ered\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSet foreground color to red\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e32\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eGREEN\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003egreen\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSet foreground color to green\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e33\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eYELLOW\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eyellow\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSet foreground color to yellow\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e34\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBLUE\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eblue\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSet foreground color to blue\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e35\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eMAGENTA\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003emagenta\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSet foreground color to magneta\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e36\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eCYAN\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ecyan\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSet foreground color to cyan\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e37\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eWHITE\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ewhite\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSet foreground color to white\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e\u003cs\u003e38;5\u003c/s\u003e\u003c/td\u003e\n    \u003ctd colspan=\"2\" align=\"center\"\u003e\n        Use \u003ccode\u003ecolor_c256()\u003c/code\u003e instead\n    \u003c/td\u003e\n    \u003ctd\u003eSet foreground color [256 mode]\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e\u003cs\u003e38;2\u003c/s\u003e\u003c/td\u003e\n    \u003ctd colspan=\"2\" align=\"center\"\u003e\n        Use \u003ccode\u003ecolor_rgb()\u003c/code\u003e instead\n    \u003c/td\u003e\n    \u003ctd\u003eSet foreground color [16M mode]\u003c/td\u003e\n  \u003c/tr\u003e\n\n  \u003ctr\u003e\u003ctd colspan=\"4\"\u003e\u003cbr\u003e\u003cb\u003ebackground colors\u003c/b\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e40\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBG_BLACK\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ebg_black\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSet background color to black\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e41\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBG_RED\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ebg_red\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSet background color to red\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e42\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBG_GREEN\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ebg_green\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSet background color to green\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e43\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBG_YELLOW\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ebg_yellow\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSet background color to yellow\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e44\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBG_BLUE\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ebg_blue\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSet background color to blue\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e45\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBG_MAGENTA\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ebg_magenta\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSet background color to magenta\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e46\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBG_CYAN\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ebg_cyan\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSet background color to cyan\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e47\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBG_WHITE\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ebg_white\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSet background color to white\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e\u003cs\u003e48;5\u003c/s\u003e\u003c/td\u003e\n    \u003ctd colspan=\"2\" align=\"center\"\u003e\n        Use \u003ccode\u003ecolor_c256()\u003c/code\u003e instead\n    \u003c/td\u003e\n    \u003ctd\u003eSet background color [256 mode]\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e\u003cs\u003e48;2\u003c/s\u003e\u003c/td\u003e\n    \u003ctd colspan=\"2\" align=\"center\"\u003e\n        Use \u003ccode\u003ecolor_rgb()\u003c/code\u003e instead\n    \u003c/td\u003e\n    \u003ctd\u003eSet background color [16M mode]\u003c/td\u003e\n  \u003c/tr\u003e\n\n  \u003ctr\u003e\u003ctd colspan=\"4\"\u003e\u003cbr\u003e\u003cb\u003ehigh-intensity [foreground] colors\u003c/b\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e90\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eGRAY\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003egray\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSet foreground color to bright black/gray\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e91\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eHI_RED\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ehi_red\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSet foreground color to bright red\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e92\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eHI_GREEN\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ehi_green\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSet foreground color to bright green\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e93\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eHI_YELLOW\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ehi_yellow\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSet foreground color to bright yellow\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e94\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eHI_BLUE\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ehi_blue\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSet foreground color to bright blue\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e95\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eHI_MAGENTA\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ehi_magenta\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSet foreground color to bright magenta\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e96\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eHI_CYAN\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ehi_cyan\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSet foreground color to bright cyan\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e97\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eHI_WHITE\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ehi_white\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSet foreground color to bright white\u003c/td\u003e\n  \u003c/tr\u003e\n\n  \u003ctr\u003e\u003ctd colspan=\"4\"\u003e\u003cbr\u003e\u003cb\u003ehigh-intensity background colors\u003c/b\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e100\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBG_GRAY\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ebg_gray\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSet background color to bright black/gray\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e101\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBG_HI_RED\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ebg_hi_red\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSet background color to bright red\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e102\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBG_HI_GREEN\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ebg_hi_green\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSet background color to bright green\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e103\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBG_HI_YELLOW\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ebg_hi_yellow\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSet background color to bright yellow\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e104\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBG_HI_BLUE\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ebg_hi_blue\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSet background color to bright blue\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e105\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBG_HI_MAGENTA\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ebg_hi_magenta\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSet background color to bright magenta\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e106\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBG_HI_CYAN\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ebg_hi_cyan\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSet background color to bright cyan\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=center\u003e107\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBG_HI_WHITE\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003ebg_hi_white\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSet background color to bright white\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eFormats\u003c/b\u003e \u003ci\u003e(click)\u003c/i\u003e\u003c/summary\u003e\n\n- **name** \u0026mdash; variable name; usage: `from pytermor.fmt import bold`\n- **opening seq**, **closing seq** \u0026mdash; corresponding \u003ci\u003eSGR\u003c/i\u003es\n\nAs a rule of a thumb, **name** equals to **opening seq** in lower case.\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003cth\u003ename\u003c/th\u003e\n    \u003cth\u003eopening seq\u003c/th\u003e\n    \u003cth\u003eclosing seq\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\u003ctd colspan=\"3\"\u003e\u003cbr\u003e\u003cb\u003eattributes\u003c/b\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003ebold\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBOLD\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBOLD_DIM_OFF\u003c/code\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003edim\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eDIM\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBOLD_DIM_OFF\u003c/code\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003eitalic\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eITALIC\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eITALIC_OFF\u003c/code\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003eunderlined\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eUNDERLINED\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eUNDERLINED_OFF\u003c/code\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003einversed\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eINVERSED\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eINVERSED_OFF\u003c/code\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003eoverlined\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eOVERLINED\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eOVERLINED_OFF\u003c/code\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\n  \u003ctr\u003e\u003ctd colspan=\"3\"\u003e\u003cbr\u003e\u003cb\u003e[foreground] colors\u003c/b\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003ered\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eRED\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eCOLOR_OFF\u003c/code\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003egreen\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eGREEN\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eCOLOR_OFF\u003c/code\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003eyellow\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eYELLOW\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eCOLOR_OFF\u003c/code\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003eblue\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBLUE\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eCOLOR_OFF\u003c/code\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003emagenta\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eMAGENTA\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eCOLOR_OFF\u003c/code\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003ecyan\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eCYAN\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eCOLOR_OFF\u003c/code\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003egray\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eGRAY\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eCOLOR_OFF\u003c/code\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\n  \u003ctr\u003e\u003ctd colspan=\"3\"\u003e\u003cbr\u003e\u003cb\u003ebackground colors\u003c/b\u003e\u003c/td\u003e\u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003ebg_black\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBG_BLACK\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBG_COLOR_OFF\u003c/code\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003ebg_red\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBG_RED\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBG_COLOR_OFF\u003c/code\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003ebg_green\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBG_GREEN\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBG_COLOR_OFF\u003c/code\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003ebg_yellow\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBG_YELLOW\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBG_COLOR_OFF\u003c/code\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003ebg_blue\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBG_BLUE\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBG_COLOR_OFF\u003c/code\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003ebg_magenta\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBG_MAGENTA\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBG_COLOR_OFF\u003c/code\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003ebg_cyan\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBG_CYAN\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBG_COLOR_OFF\u003c/code\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003ebg_gray\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBG_GRAY\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ccode\u003eBG_COLOR_OFF\u003c/code\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003c/details\u003e\n\nYou can of course create your own sequences and formats, but with one limitation \u0026mdash; autoformatting will not work with custom defined sequences; unless you add the corresponding rule to `pytermor.registry.sgr_parity_registry`.\n\n## Changelog\n\n### v1.8.0\n\n- `format_prefixed_unit` extended for working with decimal and binary metric prefixes;\n- `format_time_delta` extended with new settings;\n- Value rounding transferred from  `format_auto_float` to `format_prefixed_unit`;\n- Utility classes reorganization;\n- Unit tests output formatting;\n- `noop` SGR sequence and `noop` format;\n- Max decimal points for `auto_float` extended from (2) to (max-2).\n- \n### v1.7.4\n\n- Added 3 formatters: `fmt_prefixed_unit`, `fmt_time_delta`, `fmt_auto_float`.\n\n### v1.7.3\n\n- Added `bg_black` format.\n\n### v1.7.2\n\n- Added `ljust_fmtd`, `rjust_fmtd`, `center_fmtd` util functions to align strings with SGRs correctly.\n\n### v1.7.1\n\n- Print reset sequence as `\\e[m` instead of `\\e[0m`.\n\n### v1.7.0\n\n- `Format()` constructor can be called without arguments.\n- Added SGR code lists.\n\n### v1.6.2\n\n- Excluded `tests` dir from distribution package.\n\n### v1.6.1\n\n- Ridded of _EmptyFormat_ and _AbstractFormat_ classes.\n- Renamed `code` module to `sgr` because of conflicts in PyCharm debugger (`pydevd_console_integration.py`).\n\n### v1.5.0\n\n- Removed excessive _EmptySequenceSGR_ \u0026mdash; default _SGR_ class without params was specifically implemented to print out as empty string instead of `\\e[m`.\n\n### v1.4.0\n\n- `Format.wrap()` now accepts any type of argument, not only _str_.\n- Rebuilt _Sequence_ inheritance tree.\n- Added equality methods for _Sequence_ and _Format_ classes/subclasses.\n- Added some tests for `fmt.*` and `seq.*` classes.\n\n### v1.3.2\n\n- Added `gray` and `bg_gray` format presets. \n\n### v1.3.1\n\n- Interface revisioning.\n\n### v1.2.1\n\n- `opening_seq` and `closing_seq` properties for _Format_ class.\n\n### v1.2.0\n\n- _EmptySequenceSGR_ and _EmptyFormat_ classes.\n\n### v1.1.0\n\n- Autoformat feature.\n\n### v1.0.0\n\n- First public version.\n\n## References\n\n- https://en.wikipedia.org/wiki/ANSI_escape_code\n- [ANSI Escape Sequences](https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdelameter%2Fpytermor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdelameter%2Fpytermor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdelameter%2Fpytermor/lists"}