Name | table2string JSON |
Version |
2.0.1
JSON |
| download |
home_page | None |
Summary | A library to convert tables to string with full support for line breaks and formatting |
upload_time | 2024-09-30 00:22:16 |
maintainer | None |
docs_url | None |
author | None |
requires_python | >=3.7 |
license | GPL2 |
keywords |
string
table
tools
|
VCS |
|
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
# table2string
[![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/EgorKhabarov/table2string/tests.yml?style=flat&logo=GitHub&label=Tests)](https://github.com/EgorKhabarov/table2string/actions/workflows/tests.yml)
[![Publish Python Package to PyPI](https://img.shields.io/github/actions/workflow/status/EgorKhabarov/table2string/publish.yml?style=flat&logo=GitHub&label=Publish%20to%20PyPI)](https://github.com/EgorKhabarov/table2string/actions/workflows/publish.yml)
[![PyPi Package Version](https://img.shields.io/pypi/v/table2string.svg?style=flat&logo=pypi)](https://pypi.python.org/pypi/table2string)
[![Supported Python versions](https://img.shields.io/pypi/pyversions/table2string.svg?style=flat&logo=pypi)](https://pypi.python.org/pypi/table2string)
[![PyPi status](https://img.shields.io/pypi/status/table2string.svg?style=flat&logo=pypi)](https://pypi.python.org/pypi/table2string)
[![PyPi downloads](https://img.shields.io/pypi/dm/table2string.svg?style=flat&logo=pypi)](https://pypi.org/project/table2string/)
[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
[![mypy checked](https://img.shields.io/badge/mypy-checked-blue)](https://github.com/python/mypy)
[![Linting: Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
## Convert table to string
While there are several libraries available for converting tables to strings in Python, none seemed to meet my specific requirements.
- **Line Break Support**: Easily include line breaks within cells for enhanced readability.
- **Subtable Support**: Easily include a table within a table for a more flexible presentation.
- **Alignment**: Easily align text in a cell in any direction.
- **Emoji Integration**: Effortlessly incorporate emoji characters into your tables to add visual appeal and context.
---
# Install
## PyPI
```shell
pip install -U table2string
```
## GitHub
```shell
pip install -U git+https://github.com/EgorKhabarov/table2string.git@master
```
---
# Usage example
```pycon
>>> from table2string import Table, Themes, HorizontalAlignment, VerticalAlignment
>>> Table([("1", "2", "3"), ("qwe", "rty\nuio", "")], name="Table Name", column_names=("c1", "c2", "c3")).print()
+----------------+
| Table Name |
+-----+-----+----+
| c1 | c2 | c3 |
+-----+-----+----+
| 1 | 2 | 3 |
+-----+-----+----+
| qwe | rty | |
| | uio | |
+-----+-----+----+
>>> from io import StringIO
>>> Table.from_csv(StringIO('c1,c2,c3\n1,2,3\nqwe,"rty\nuio",'), name="Table Name").print()
+----------------+
| Table Name |
+-----+-----+----+
| c1 | c2 | c3 |
+-----+-----+----+
| 1 | 2 | 3 |
+-----+-----+----+
| qwe | rty | |
| | uio | |
+-----+-----+----+
>>> import sqlite3
>>> cursor = sqlite3.connect(":memory:").cursor().execute(
... "CREATE TABLE data (c1 TEXT, c2 TEXT, c3 TEXT);"
... ).executemany(
... "INSERT INTO data (c1, c2, c3) VALUES (?, ?, ?);",
... [("1", "2", "3"), ("qwe", "rty\nuio", "")],
... ).execute(
... "SELECT c1, c2, c3 FROM data;"
... )
>>> Table.from_db_cursor(
... cursor,
... name="Table Name",
... column_names=True,
... ).print()
+----------------+
| Table Name |
+-----+-----+----+
| c1 | c2 | c3 |
+-----+-----+----+
| 1 | 2 | 3 |
+-----+-----+----+
| qwe | rty | |
| | uio | |
+-----+-----+----+
>>> Table(
... [("c1", Table([("1", "2"), ("3", "4")], name="SubTable"))],
... name="Table Name",
... ).print(v_align=("-",), max_width=(2, 8))
+---------------+
| Table Name |
+----+----------+
| | SubTable |
| +-----+----+
| c1 | 1 | 2 |
| +-----+----+
| | 3 | 4 |
+----+-----+----+
```
## Arguments
| Argument | Type | Example | Description |
|:-------------------------|:--------------------------------------------------------------------------------------------------|:--------------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `table` | `Sequence[Sequence[Any]]` | `[("1", "2"), ("3", "4")]` | A two-dimensional matrix |
| `h_align` | <code>tuple[HorizontalAlignment | str, ...]</code> | `HorizontalAlignment` | `str` | `HorizontalAlignment.CENTER` | Allows you to align text in a cell horizontally |
| `v_align` | <code>tuple[VerticalAlignment | str, ...]</code> | `VerticalAlignment` | `str` | `VerticalAlignment.MIDDLE` | Allows you to align text in a cell vertically |
| `name` | `str` | `None` | `"Table Name"` | Table name |
| `name_h_align` | `HorizontalAlignment` | `str` | `HorizontalAlignment.CENTER` | Allows you to align table name horizontally |
| `name_v_align` | `VerticalAlignment` | `str` | `VerticalAlignment.MIDDLE` | Allows you to align table name vertically |
| `column_names` | `Sequence[str]` | `None` | `("c1", "c2", ...column_count)` | Sets the names for the table columns |
| `column_names_h_align` | <code>tuple[HorizontalAlignment | str, ...]</code> | `HorizontalAlignment` | `str` | `HorizontalAlignment.CENTER` | Allows you to align column names horizontally |
| `column_names_v_align` | <code>tuple[VerticalAlignment | str, ...]</code> | `VerticalAlignment` | `str` | `VerticalAlignment.MIDDLE` | Allows you to align column names vertically |
| `max_width` | `int` | `Tuple[int, ...]` | `None` | `120` | Allows you to set the width of the entire table or individually for each column |
| `max_height` | `int` | `None` | `10` | Specifies the maximum height for rows |
| `maximize_height` | `bool` | `True` | Force height to be taken from max_height |
| `line_break_symbol` | `str` | `"\\"` | Line break symbol |
| `cell_break_symbol` | `str` | `"…"` | Symbol indicating the end of text when there is not enough height |
| `sep` | `bool` | `range` | `tuple` | `(1, 3, 6)` | Handles the separators between table rows and can be either a boolean type or possess a `__contains__` method |
| `end` | `str` | `None` | `"\n"` | Behaves the same as `print(end=)` |
| `file` | `TextIOWrapper` | `None` | `sys.stdout` or `io.StringIO()` | Behaves the same as `print(file=)` |
| `theme` | `Theme` | `Themes.rounded_thick` | Allows you to set a specific theme for the table. For example, the border style |
| `ignore_width_errors` | `bool` | `False` | Fixes errors in max_width if they exist |
| `proportion_coefficient` | `float` | `0.5` | Affects the width distribution of the columns. A value of `0.0` corresponds to proportional distribution, `1.0` averages the values, and `2.0` inverts them |
## Text alignment
| Align | Example | Description |
|:------------------------------------------|:------------------|:-------------------------------------------------------------------------------------------------------------------------------|
| `"<align>"` or `("<align>",)` | `"^"` or `("^",)` | Setting `align` (`"^"`) for all columns |
| `("<align_1>", "<align_2>")` | `("^", "<")` | Setting `align_1` (`"^"`) for the first column and `align_2` (`"<"`) for all other columns |
| `("<align_1>", "<align_2>", "<align_3>")` | `("^", "<", ">")` | Setting `align_1` (`"^"`) for the first column and `align_2` (`"<"`) for the second and `align_3` (`">"`) for the third column |
You can also use the corresponding `HorizontalAlignment` or `VerticalAlignment` type
For `name_h_align` and `name_v_align` only the `str` type or the corresponding `HorizontalAlignment` or `VerticalAlignment` type is valid
### HorizontalAlignment
| Align | Description |
|:-------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------|
| `AUTO` or `AUTO_AUTO` or `*` or `**` | Alignment depends on the type. If this is a number and there are no line breaks in this cell, then align to the right; otherwise, align to the left. |
| `LEFT` or `LEFT_LEFT` or `<` or `<<` | All lines are left aligned |
| `CENTER` or `CENTER_CENTER` or `^` or `^^` | All lines are center aligned |
| `RIGHT` or `RIGHT_RIGHT` or `>` or `>>` | All lines are right aligned |
| `LEFT_CENTER` or `<^` | The first line is left aligned and the remaining lines are centered |
| `LEFT_RIGHT` or `<>` | The first line is left aligned and the remaining lines are right aligned |
| `CENTER_LEFT` or `^<` | The first line is aligned to the center, and the remaining lines are aligned to the left of the first line. |
| `CENTER_RIGHT` or `^>` | The first line is aligned to the center, and the remaining lines are aligned to the right of the first line. |
| `RIGHT_LEFT` or `><` | The first line is right aligned and the remaining lines are left aligned |
| `RIGHT_CENTER` or `>^` | The first line is right aligned and the remaining lines are centered |
### VerticalAlignment
| Align | Description |
|:----------------|:------------------------|
| `TOP` or `^` | Text are top aligned |
| `MIDDLE` or `-` | Text are centered |
| `BOTTOM` or `_` | Text are bottom aligned |
<details>
<summary>Example</summary>
```pycon
>>> from functools import partial
>>> sub_table_auto_func = partial(Table, [("123", "text",)], max_height=4, maximize_height=True)
>>> sub_table_func = partial(Table, [("first line\ntext",)], max_height=4, maximize_height=True)
>>> Table(
... [
... *(
... [v_align, sub_table_auto_func(h_align="*", v_align=v_align)] + [
... sub_table_func(h_align=h_align, v_align=v_align)
... for h_align in ("<", ">", "^", "^<", "^>")
... ]
... for v_align in ("^", "-", "_")
... )
... ],
... column_names=(" ", "*", "<", ">", "^", "^<", "^>"),
... ).print(max_width=(1, len("first line")+4), v_align=("-",))
+---+----------------+----------------+----------------+----------------+----------------+----------------+
| | * | < | > | ^ | ^< | ^> |
+---+-------+--------+----------------+----------------+----------------+----------------+----------------+
| | 123 | text | first line | first line | first line | first line | first line |
| ^ | | | text | text | text | text | text |
| | | | | | | | |
| | | | | | | | |
+---+-------+--------+----------------+----------------+----------------+----------------+----------------+
| | | | | | | | |
| - | 123 | text | first line | first line | first line | first line | first line |
| | | | text | text | text | text | text |
| | | | | | | | |
+---+-------+--------+----------------+----------------+----------------+----------------+----------------+
| | | | | | | | |
| _ | | | | | | | |
| | | | first line | first line | first line | first line | first line |
| | 123 | text | text | text | text | text | text |
+---+-------+--------+----------------+----------------+----------------+----------------+----------------+
```
</details>
## Custom width and height settings
| Width | Example | Description |
|-------------------------------------|----------------|-----------------------------------------------------------------------------------------------------------------------------|
| `<width>` | `10` | Setting `width` (`10`) for the whole table |
| `(<width>,)` | `(10,)` | Setting `width_1` (`10`) for all column |
| `(<width_1>, <width_2>)` | `(10, 20)` | Setting `width_1` (`10`) for the first column and `width_2` (`20`) for all other columns |
| `(<width_1>, <width_2>, <width_3>)` | `(10, 20, 30)` | Setting `width_1` (`10`) for the first column and `width_2` (`20`) for the second and `width_3` (`30`) for the third column |
<details>
<summary>Example</summary>
```pycon
>>> # Width of the entire table with borders
>>> Table([(1, 12345, "example")]).print(max_width=30)
+-----+----------+-----------+
| 1 | 12345 | example |
+-----+----------+-----------+
>>> # Width of each column individually
>>> Table([(1, 12345, "example")]).print(max_width=(10,))
+------------+------------+------------+
| 1 | 12345 | example |
+------------+------------+------------+
>>> Table([(1, 12345, "example")]).print(max_width=(1, 8, 6))
+---+----------+--------+
| 1 | 12345 | exampl\|
| | | e |
+---+----------+--------+
>>> Table([(1, 12345, "example")]).print(max_width=(1, 5, 7))
+---+-------+---------+
| 1 | 12345 | example |
+---+-------+---------+
>>> Table([("123456\n\n789000", "example")]).print(max_width=(3, 4), max_height=4)
+-----+------+
| 123\| exam\|
| 456 | ple |
| | |
| 789…| |
+-----+------+
>>> Table([("123456789",)]).print(max_width=(1,), max_height=1)
+---+
| 1…|
+---+
>>> Table([("123\n456\n789",)]).print(
... max_width=(3,),
... max_height=4,
... maximize_height=True,
... )
+-----+
| 123 |
| 456 |
| 789 |
| |
+-----+
>>> Table([("123456789",)]).print(
... max_width=(3,),
... max_height=4,
... maximize_height=True,
... )
+-----+
| 123\|
| 456\|
| 789 |
| |
+-----+
```
</details>
## Separator settings
| Separator | Description |
|------------------------|--------------------------------------------|
| `sep=True` | All horizontal dividers included |
| `sep=False` | All horizontal dividers are disabled |
| `sep=(1,)` | Only first delimiter |
| `sep=(1, 3, 5)` | Only first third and fifth separator |
| `sep=range(1, 100, 5)` | Delimiter every five lines first 100 lines |
<details>
<summary>Example</summary>
```pycon
>>> table_1 = Table([("qwe", "rty\nuio"), ("123456\n\n789000", "example")])
>>> kwargs = {
... "max_width": (3, 4),
... "max_height": 4,
... }
>>> table_1.print(**kwargs, sep=True)
+-----+------+
| qwe | rty |
| | uio |
+-----+------+
| 123\| exam\|
| 456 | ple |
| | |
| 789…| |
+-----+------+
>>> table_1.print(**kwargs, sep=False)
+-----+------+
| qwe | rty |
| | uio |
| 123\| exam\|
| 456 | ple |
| | |
| 789…| |
+-----+------+
>>> table_2 = Table([("1", "2"), ("3", "4")], name="Name")
>>> table_2.print(sep=True)
+-------+
| Name |
+---+---+
| 1 | 2 |
+---+---+
| 3 | 4 |
+---+---+
>>> table_2.print(sep=False)
+-------+
| Name |
+---+---+
| 1 | 2 |
| 3 | 4 |
+---+---+
>>> table_3 = Table([("1", "2"), ("3", "4"), ("5", "6"), ("7", "8")])
>>> table_3.print(sep=(1,))
+---+---+
| 1 | 2 |
+---+---+
| 3 | 4 |
| 5 | 6 |
| 7 | 8 |
+---+---+
>>> table_3.print(sep=(2,))
+---+---+
| 1 | 2 |
| 3 | 4 |
+---+---+
| 5 | 6 |
| 7 | 8 |
+---+---+
>>> table_3.print(sep=(1, 3))
+---+---+
| 1 | 2 |
+---+---+
| 3 | 4 |
| 5 | 6 |
+---+---+
| 7 | 8 |
+---+---+
>>> table_4 = Table([("1", "2"), ("3", "4"), ("5", "6"), ("7", "8")], name="Name")
>>> table_4.print(sep=(1,))
+-------+
| Name |
+---+---+
| 1 | 2 |
+---+---+
| 3 | 4 |
| 5 | 6 |
| 7 | 8 |
+---+---+
>>> table_4.print(sep=(2,))
+-------+
| Name |
+---+---+
| 1 | 2 |
| 3 | 4 |
+---+---+
| 5 | 6 |
| 7 | 8 |
+---+---+
>>> table_4.print(sep=(1, 3))
+-------+
| Name |
+---+---+
| 1 | 2 |
+---+---+
| 3 | 4 |
| 5 | 6 |
+---+---+
| 7 | 8 |
+---+---+
```
</details>
## Themes
### Borders
<details>
<summary>Border types</summary>
```pycon
>>> from table2string import Themes, HorizontalAlignment
>>> table = []
>>> example_table = Table([(" ", " "), (" ", " "), (" ", " ")])
>>> theme_names = (
... ("ascii_thin", "ascii_thin_double"),
... ("ascii_double", "ascii_double_thin"),
... ("thin", "thin_thick"),
... ("thin_double", "rounded_double"),
... ("rounded", "rounded_thick"),
... ("thick", "thick_thin"),
... ("double", "double_thin"),
... ("booktabs", "ascii_booktabs"),
... ("markdown", "None"),
... )
>>> for names in theme_names:
... table.append([])
... for name in names:
... string_table = example_table.stringify(
... theme=getattr(Themes, name, Themes.ascii_thin)
... )
... table[-1].append(f"{name}\n{string_table}")
>>> Table(table).print(theme=Themes.thin, h_align=HorizontalAlignment.CENTER)
┌──────────────┬───────────────────┐
│ ascii_thin │ ascii_thin_double │
│ +---+---+ │ +---+---+ │
│ | | | │ | | | │
│ +---+---+ │ +===+===+ │
│ | | | │ | | | │
│ +---+---+ │ +---+---+ │
│ | | | │ | | | │
│ +---+---+ │ +---+---+ │
├──────────────┼───────────────────┤
│ ascii_double │ ascii_double_thin │
│ +===+===+ │ +===+===+ │
│ ‖ ‖ ‖ │ ‖ ‖ ‖ │
│ +===+===+ │ +---+---+ │
│ ‖ ‖ ‖ │ ‖ ‖ ‖ │
│ +===+===+ │ +===+===+ │
│ ‖ ‖ ‖ │ ‖ ‖ ‖ │
│ +===+===+ │ +===+===+ │
├──────────────┼───────────────────┤
│ thin │ thin_thick │
│ ┌───┬───┐ │ ┌───┬───┐ │
│ │ │ │ │ │ │ │ │
│ ├───┼───┤ │ ┝━━━┿━━━┥ │
│ │ │ │ │ │ │ │ │
│ ├───┼───┤ │ ├───┼───┤ │
│ │ │ │ │ │ │ │ │
│ └───┴───┘ │ └───┴───┘ │
├──────────────┼───────────────────┤
│ thin_double │ rounded_double │
│ ┌───┬───┐ │ ╭───┬───╮ │
│ │ │ │ │ │ │ │ │
│ ╞═══╪═══╡ │ ╞═══╪═══╡ │
│ │ │ │ │ │ │ │ │
│ ├───┼───┤ │ ├───┼───┤ │
│ │ │ │ │ │ │ │ │
│ └───┴───┘ │ ╰───┴───╯ │
├──────────────┼───────────────────┤
│ rounded │ rounded_thick │
│ ╭───┬───╮ │ ╭───┬───╮ │
│ │ │ │ │ │ │ │ │
│ ├───┼───┤ │ ┝━━━┿━━━┥ │
│ │ │ │ │ │ │ │ │
│ ├───┼───┤ │ ├───┼───┤ │
│ │ │ │ │ │ │ │ │
│ ╰───┴───╯ │ ╰───┴───╯ │
├──────────────┼───────────────────┤
│ thick │ thick_thin │
│ ┏━━━┳━━━┓ │ ┏━━━┳━━━┓ │
│ ┃ ┃ ┃ │ ┃ ┃ ┃ │
│ ┣━━━╋━━━┫ │ ┠───╂───┨ │
│ ┃ ┃ ┃ │ ┃ ┃ ┃ │
│ ┣━━━╋━━━┫ │ ┣━━━╋━━━┫ │
│ ┃ ┃ ┃ │ ┃ ┃ ┃ │
│ ┗━━━┻━━━┛ │ ┗━━━┻━━━┛ │
├──────────────┼───────────────────┤
│ double │ double_thin │
│ ╔═══╦═══╗ │ ╔═══╦═══╗ │
│ ║ ║ ║ │ ║ ║ ║ │
│ ╠═══╬═══╣ │ ╟───╫───╢ │
│ ║ ║ ║ │ ║ ║ ║ │
│ ╠═══╬═══╣ │ ╠═══╬═══╣ │
│ ║ ║ ║ │ ║ ║ ║ │
│ ╚═══╩═══╝ │ ╚═══╩═══╝ │
├──────────────┼───────────────────┤
│ booktabs │ ascii_booktabs │
│ ─────── │ ------- │
│ │ │
│ ━━━━━━━ │ ======= │
│ │ │
│ ─────── │ ------- │
│ │ │
│ ─────── │ ------- │
├──────────────┼───────────────────┤
│ markdown │ None │
│ | | | │ +---+---+ │
│ |---|---| │ | | | │
│ | | | │ +---+---+ │
│ | | | │ | | | │
│ │ +---+---+ │
│ │ | | | │
│ │ +---+---+ │
└──────────────┴───────────────────┘
```
</details>
<details>
<summary>Example</summary>
```pycon
>>> from table2string import Table, Themes
>>> name = "Table Name"
>>> column_names = ("c1", "c2", "3")
>>> table = [("1", "2", "3"), ("qwe", "rty\nuio", "")]
>>> t = Table(table)
>>> t_name = Table(table, name=name)
>>> t_column_names = Table(table, column_names=column_names)
>>> t_name_column_names = Table(table, name=name, column_names=column_names)
```
<details>
<summary>Themes.ascii_thin</summary>
```pycon
>>> t.print(theme=Themes.ascii_thin)
+-----+-----+---+
| 1 | 2 | 3 |
+-----+-----+---+
| qwe | rty | |
| | uio | |
+-----+-----+---+
>>> t_column_names.print(theme=Themes.ascii_thin)
+-----+-----+---+
| c1 | c2 | 3 |
+-----+-----+---+
| 1 | 2 | 3 |
+-----+-----+---+
| qwe | rty | |
| | uio | |
+-----+-----+---+
>>> t_name.print(theme=Themes.ascii_thin)
+---------------+
| Table Name |
+-----+-----+---+
| 1 | 2 | 3 |
+-----+-----+---+
| qwe | rty | |
| | uio | |
+-----+-----+---+
>>> t_name_column_names.print(theme=Themes.ascii_thin)
+---------------+
| Table Name |
+-----+-----+---+
| c1 | c2 | 3 |
+-----+-----+---+
| 1 | 2 | 3 |
+-----+-----+---+
| qwe | rty | |
| | uio | |
+-----+-----+---+
```
</details>
<details>
<summary>Themes.ascii_thin_double</summary>
```pycon
>>> t.print(theme=Themes.ascii_thin_double)
+-----+-----+---+
| 1 | 2 | 3 |
+=====+=====+===+
| qwe | rty | |
| | uio | |
+-----+-----+---+
>>> t_column_names.print(theme=Themes.ascii_thin_double)
+-----+-----+---+
| c1 | c2 | 3 |
+=====+=====+===+
| 1 | 2 | 3 |
+-----+-----+---+
| qwe | rty | |
| | uio | |
+-----+-----+---+
>>> t_name.print(theme=Themes.ascii_thin_double)
+---------------+
| Table Name |
+-----+-----+---+
| 1 | 2 | 3 |
+=====+=====+===+
| qwe | rty | |
| | uio | |
+-----+-----+---+
>>> t_name_column_names.print(theme=Themes.ascii_thin_double)
+---------------+
| Table Name |
+-----+-----+---+
| c1 | c2 | 3 |
+=====+=====+===+
| 1 | 2 | 3 |
+-----+-----+---+
| qwe | rty | |
| | uio | |
+-----+-----+---+
```
</details>
<details>
<summary>Themes.ascii_double</summary>
```pycon
>>> t.print(theme=Themes.ascii_double)
+=====+=====+===+
‖ 1 ‖ 2 ‖ 3 ‖
+=====+=====+===+
‖ qwe ‖ rty ‖ ‖
‖ ‖ uio ‖ ‖
+=====+=====+===+
>>> t_column_names.print(theme=Themes.ascii_double)
+=====+=====+===+
‖ c1 ‖ c2 ‖ 3 ‖
+=====+=====+===+
‖ 1 ‖ 2 ‖ 3 ‖
+=====+=====+===+
‖ qwe ‖ rty ‖ ‖
‖ ‖ uio ‖ ‖
+=====+=====+===+
>>> t_name.print(theme=Themes.ascii_double)
+===============+
‖ Table Name ‖
+=====+=====+===+
‖ 1 ‖ 2 ‖ 3 ‖
+=====+=====+===+
‖ qwe ‖ rty ‖ ‖
‖ ‖ uio ‖ ‖
+=====+=====+===+
>>> t_name_column_names.print(theme=Themes.ascii_double)
+===============+
‖ Table Name ‖
+=====+=====+===+
‖ c1 ‖ c2 ‖ 3 ‖
+=====+=====+===+
‖ 1 ‖ 2 ‖ 3 ‖
+=====+=====+===+
‖ qwe ‖ rty ‖ ‖
‖ ‖ uio ‖ ‖
+=====+=====+===+
```
</details>
<details>
<summary>Themes.ascii_double_thin</summary>
```pycon
>>> t.print(theme=Themes.ascii_double_thin)
+=====+=====+===+
‖ 1 ‖ 2 ‖ 3 ‖
+-----+-----+---+
‖ qwe ‖ rty ‖ ‖
‖ ‖ uio ‖ ‖
+=====+=====+===+
>>> t_column_names.print(theme=Themes.ascii_double_thin)
+=====+=====+===+
‖ c1 ‖ c2 ‖ 3 ‖
+-----+-----+---+
‖ 1 ‖ 2 ‖ 3 ‖
+=====+=====+===+
‖ qwe ‖ rty ‖ ‖
‖ ‖ uio ‖ ‖
+=====+=====+===+
>>> t_name.print(theme=Themes.ascii_double_thin)
+===============+
‖ Table Name ‖
+=====+=====+===+
‖ 1 ‖ 2 ‖ 3 ‖
+-----+-----+---+
‖ qwe ‖ rty ‖ ‖
‖ ‖ uio ‖ ‖
+=====+=====+===+
>>> t_name_column_names.print(theme=Themes.ascii_double_thin)
+===============+
‖ Table Name ‖
+=====+=====+===+
‖ c1 ‖ c2 ‖ 3 ‖
+-----+-----+---+
‖ 1 ‖ 2 ‖ 3 ‖
+=====+=====+===+
‖ qwe ‖ rty ‖ ‖
‖ ‖ uio ‖ ‖
+=====+=====+===+
```
</details>
<details>
<summary>Themes.ascii_booktabs</summary>
```pycon
>>> t.print(theme=Themes.ascii_booktabs)
---------------
1 2 3
===============
qwe rty
uio
---------------
>>> t_column_names.print(theme=Themes.ascii_booktabs)
---------------
c1 c2 3
===============
1 2 3
---------------
qwe rty
uio
---------------
>>> t_name.print(theme=Themes.ascii_booktabs)
---------------
Table Name
---------------
1 2 3
===============
qwe rty
uio
---------------
>>> t_name_column_names.print(theme=Themes.ascii_booktabs)
---------------
Table Name
---------------
c1 c2 3
===============
1 2 3
---------------
qwe rty
uio
---------------
```
</details>
<details>
<summary>Themes.thin</summary>
```pycon
>>> t.print(theme=Themes.thin)
┌─────┬─────┬───┐
│ 1 │ 2 │ 3 │
├─────┼─────┼───┤
│ qwe │ rty │ │
│ │ uio │ │
└─────┴─────┴───┘
>>> t_column_names.print(theme=Themes.thin)
┌─────┬─────┬───┐
│ c1 │ c2 │ 3 │
├─────┼─────┼───┤
│ 1 │ 2 │ 3 │
├─────┼─────┼───┤
│ qwe │ rty │ │
│ │ uio │ │
└─────┴─────┴───┘
>>> t_name.print(theme=Themes.thin)
┌───────────────┐
│ Table Name │
├─────┬─────┬───┤
│ 1 │ 2 │ 3 │
├─────┼─────┼───┤
│ qwe │ rty │ │
│ │ uio │ │
└─────┴─────┴───┘
>>> t_name_column_names.print(theme=Themes.thin)
┌───────────────┐
│ Table Name │
├─────┬─────┬───┤
│ c1 │ c2 │ 3 │
├─────┼─────┼───┤
│ 1 │ 2 │ 3 │
├─────┼─────┼───┤
│ qwe │ rty │ │
│ │ uio │ │
└─────┴─────┴───┘
```
</details>
<details>
<summary>Themes.thin_thick</summary>
```pycon
>>> t.print(theme=Themes.thin_thick)
┌─────┬─────┬───┐
│ 1 │ 2 │ 3 │
┝━━━━━┿━━━━━┿━━━┥
│ qwe │ rty │ │
│ │ uio │ │
└─────┴─────┴───┘
>>> t_column_names.print(theme=Themes.thin_thick)
┌─────┬─────┬───┐
│ c1 │ c2 │ 3 │
┝━━━━━┿━━━━━┿━━━┥
│ 1 │ 2 │ 3 │
├─────┼─────┼───┤
│ qwe │ rty │ │
│ │ uio │ │
└─────┴─────┴───┘
>>> t_name.print(theme=Themes.thin_thick)
┌───────────────┐
│ Table Name │
├─────┬─────┬───┤
│ 1 │ 2 │ 3 │
┝━━━━━┿━━━━━┿━━━┥
│ qwe │ rty │ │
│ │ uio │ │
└─────┴─────┴───┘
>>> t_name_column_names.print(theme=Themes.thin_thick)
┌───────────────┐
│ Table Name │
├─────┬─────┬───┤
│ c1 │ c2 │ 3 │
┝━━━━━┿━━━━━┿━━━┥
│ 1 │ 2 │ 3 │
├─────┼─────┼───┤
│ qwe │ rty │ │
│ │ uio │ │
└─────┴─────┴───┘
```
</details>
<details>
<summary>Themes.thin_double</summary>
```pycon
>>> t.print(theme=Themes.thin_double)
┌─────┬─────┬───┐
│ 1 │ 2 │ 3 │
╞═════╪═════╪═══╡
│ qwe │ rty │ │
│ │ uio │ │
└─────┴─────┴───┘
>>> t_column_names.print(theme=Themes.thin_double)
┌─────┬─────┬───┐
│ c1 │ c2 │ 3 │
╞═════╪═════╪═══╡
│ 1 │ 2 │ 3 │
├─────┼─────┼───┤
│ qwe │ rty │ │
│ │ uio │ │
└─────┴─────┴───┘
>>> t_name.print(theme=Themes.thin_double)
┌───────────────┐
│ Table Name │
├─────┬─────┬───┤
│ 1 │ 2 │ 3 │
╞═════╪═════╪═══╡
│ qwe │ rty │ │
│ │ uio │ │
└─────┴─────┴───┘
>>> t_name_column_names.print(theme=Themes.thin_double)
┌───────────────┐
│ Table Name │
├─────┬─────┬───┤
│ c1 │ c2 │ 3 │
╞═════╪═════╪═══╡
│ 1 │ 2 │ 3 │
├─────┼─────┼───┤
│ qwe │ rty │ │
│ │ uio │ │
└─────┴─────┴───┘
```
</details>
<details>
<summary>Themes.rounded</summary>
```pycon
>>> t.print(theme=Themes.rounded)
╭─────┬─────┬───╮
│ 1 │ 2 │ 3 │
├─────┼─────┼───┤
│ qwe │ rty │ │
│ │ uio │ │
╰─────┴─────┴───╯
>>> t_column_names.print(theme=Themes.rounded)
╭─────┬─────┬───╮
│ c1 │ c2 │ 3 │
├─────┼─────┼───┤
│ 1 │ 2 │ 3 │
├─────┼─────┼───┤
│ qwe │ rty │ │
│ │ uio │ │
╰─────┴─────┴───╯
>>> t_name.print(theme=Themes.rounded)
╭───────────────╮
│ Table Name │
├─────┬─────┬───┤
│ 1 │ 2 │ 3 │
├─────┼─────┼───┤
│ qwe │ rty │ │
│ │ uio │ │
╰─────┴─────┴───╯
>>> t_name_column_names.print(theme=Themes.rounded)
╭───────────────╮
│ Table Name │
├─────┬─────┬───┤
│ c1 │ c2 │ 3 │
├─────┼─────┼───┤
│ 1 │ 2 │ 3 │
├─────┼─────┼───┤
│ qwe │ rty │ │
│ │ uio │ │
╰─────┴─────┴───╯
```
</details>
<details>
<summary>Themes.rounded_thick</summary>
```pycon
>>> t.print(theme=Themes.rounded_thick)
╭─────┬─────┬───╮
│ 1 │ 2 │ 3 │
┝━━━━━┿━━━━━┿━━━┥
│ qwe │ rty │ │
│ │ uio │ │
╰─────┴─────┴───╯
>>> t_column_names.print(theme=Themes.rounded_thick)
╭─────┬─────┬───╮
│ c1 │ c2 │ 3 │
┝━━━━━┿━━━━━┿━━━┥
│ 1 │ 2 │ 3 │
├─────┼─────┼───┤
│ qwe │ rty │ │
│ │ uio │ │
╰─────┴─────┴───╯
>>> t_name.print(theme=Themes.rounded_thick)
╭───────────────╮
│ Table Name │
├─────┬─────┬───┤
│ 1 │ 2 │ 3 │
┝━━━━━┿━━━━━┿━━━┥
│ qwe │ rty │ │
│ │ uio │ │
╰─────┴─────┴───╯
>>> t_name_column_names.print(theme=Themes.rounded_thick)
╭───────────────╮
│ Table Name │
├─────┬─────┬───┤
│ c1 │ c2 │ 3 │
┝━━━━━┿━━━━━┿━━━┥
│ 1 │ 2 │ 3 │
├─────┼─────┼───┤
│ qwe │ rty │ │
│ │ uio │ │
╰─────┴─────┴───╯
```
</details>
<details>
<summary>Themes.rounded_double</summary>
```pycon
>>> t.print(theme=Themes.rounded_double)
╭─────┬─────┬───╮
│ 1 │ 2 │ 3 │
╞═════╪═════╪═══╡
│ qwe │ rty │ │
│ │ uio │ │
╰─────┴─────┴───╯
>>> t_column_names.print(theme=Themes.rounded_double)
╭─────┬─────┬───╮
│ c1 │ c2 │ 3 │
╞═════╪═════╪═══╡
│ 1 │ 2 │ 3 │
├─────┼─────┼───┤
│ qwe │ rty │ │
│ │ uio │ │
╰─────┴─────┴───╯
>>> t_name.print(theme=Themes.rounded_double)
╭───────────────╮
│ Table Name │
├─────┬─────┬───┤
│ 1 │ 2 │ 3 │
╞═════╪═════╪═══╡
│ qwe │ rty │ │
│ │ uio │ │
╰─────┴─────┴───╯
>>> t_name_column_names.print(theme=Themes.rounded_double)
╭───────────────╮
│ Table Name │
├─────┬─────┬───┤
│ c1 │ c2 │ 3 │
╞═════╪═════╪═══╡
│ 1 │ 2 │ 3 │
├─────┼─────┼───┤
│ qwe │ rty │ │
│ │ uio │ │
╰─────┴─────┴───╯
```
</details>
<details>
<summary>Themes.thick</summary>
```pycon
>>> t.print(theme=Themes.thick)
┏━━━━━┳━━━━━┳━━━┓
┃ 1 ┃ 2 ┃ 3 ┃
┣━━━━━╋━━━━━╋━━━┫
┃ qwe ┃ rty ┃ ┃
┃ ┃ uio ┃ ┃
┗━━━━━┻━━━━━┻━━━┛
>>> t_column_names.print(theme=Themes.thick)
┏━━━━━┳━━━━━┳━━━┓
┃ c1 ┃ c2 ┃ 3 ┃
┣━━━━━╋━━━━━╋━━━┫
┃ 1 ┃ 2 ┃ 3 ┃
┣━━━━━╋━━━━━╋━━━┫
┃ qwe ┃ rty ┃ ┃
┃ ┃ uio ┃ ┃
┗━━━━━┻━━━━━┻━━━┛
>>> t_name.print(theme=Themes.thick)
┏━━━━━━━━━━━━━━━┓
┃ Table Name ┃
┣━━━━━┳━━━━━┳━━━┫
┃ 1 ┃ 2 ┃ 3 ┃
┣━━━━━╋━━━━━╋━━━┫
┃ qwe ┃ rty ┃ ┃
┃ ┃ uio ┃ ┃
┗━━━━━┻━━━━━┻━━━┛
>>> t_name_column_names.print(theme=Themes.thick)
┏━━━━━━━━━━━━━━━┓
┃ Table Name ┃
┣━━━━━┳━━━━━┳━━━┫
┃ c1 ┃ c2 ┃ 3 ┃
┣━━━━━╋━━━━━╋━━━┫
┃ 1 ┃ 2 ┃ 3 ┃
┣━━━━━╋━━━━━╋━━━┫
┃ qwe ┃ rty ┃ ┃
┃ ┃ uio ┃ ┃
┗━━━━━┻━━━━━┻━━━┛
```
</details>
<details>
<summary>Themes.thick_thin</summary>
```pycon
>>> t.print(theme=Themes.thick_thin)
┏━━━━━┳━━━━━┳━━━┓
┃ 1 ┃ 2 ┃ 3 ┃
┠─────╂─────╂───┨
┃ qwe ┃ rty ┃ ┃
┃ ┃ uio ┃ ┃
┗━━━━━┻━━━━━┻━━━┛
>>> t_column_names.print(theme=Themes.thick_thin)
┏━━━━━┳━━━━━┳━━━┓
┃ c1 ┃ c2 ┃ 3 ┃
┠─────╂─────╂───┨
┃ 1 ┃ 2 ┃ 3 ┃
┣━━━━━╋━━━━━╋━━━┫
┃ qwe ┃ rty ┃ ┃
┃ ┃ uio ┃ ┃
┗━━━━━┻━━━━━┻━━━┛
>>> t_name.print(theme=Themes.thick_thin)
┏━━━━━━━━━━━━━━━┓
┃ Table Name ┃
┣━━━━━┳━━━━━┳━━━┫
┃ 1 ┃ 2 ┃ 3 ┃
┠─────╂─────╂───┨
┃ qwe ┃ rty ┃ ┃
┃ ┃ uio ┃ ┃
┗━━━━━┻━━━━━┻━━━┛
>>> t_name_column_names.print(theme=Themes.thick_thin)
┏━━━━━━━━━━━━━━━┓
┃ Table Name ┃
┣━━━━━┳━━━━━┳━━━┫
┃ c1 ┃ c2 ┃ 3 ┃
┠─────╂─────╂───┨
┃ 1 ┃ 2 ┃ 3 ┃
┣━━━━━╋━━━━━╋━━━┫
┃ qwe ┃ rty ┃ ┃
┃ ┃ uio ┃ ┃
┗━━━━━┻━━━━━┻━━━┛
```
</details>
<details>
<summary>Themes.double</summary>
```pycon
>>> t.print(theme=Themes.double)
╔═════╦═════╦═══╗
║ 1 ║ 2 ║ 3 ║
╠═════╬═════╬═══╣
║ qwe ║ rty ║ ║
║ ║ uio ║ ║
╚═════╩═════╩═══╝
>>> t_column_names.print(theme=Themes.double)
╔═════╦═════╦═══╗
║ c1 ║ c2 ║ 3 ║
╠═════╬═════╬═══╣
║ 1 ║ 2 ║ 3 ║
╠═════╬═════╬═══╣
║ qwe ║ rty ║ ║
║ ║ uio ║ ║
╚═════╩═════╩═══╝
>>> t_name.print(theme=Themes.double)
╔═══════════════╗
║ Table Name ║
╠═════╦═════╦═══╣
║ 1 ║ 2 ║ 3 ║
╠═════╬═════╬═══╣
║ qwe ║ rty ║ ║
║ ║ uio ║ ║
╚═════╩═════╩═══╝
>>> t_name_column_names.print(theme=Themes.double)
╔═══════════════╗
║ Table Name ║
╠═════╦═════╦═══╣
║ c1 ║ c2 ║ 3 ║
╠═════╬═════╬═══╣
║ 1 ║ 2 ║ 3 ║
╠═════╬═════╬═══╣
║ qwe ║ rty ║ ║
║ ║ uio ║ ║
╚═════╩═════╩═══╝
```
</details>
<details>
<summary>Themes.double_thin</summary>
```pycon
>>> t.print(theme=Themes.double_thin)
╔═════╦═════╦═══╗
║ 1 ║ 2 ║ 3 ║
╟─────╫─────╫───╢
║ qwe ║ rty ║ ║
║ ║ uio ║ ║
╚═════╩═════╩═══╝
>>> t_column_names.print(theme=Themes.double_thin)
╔═════╦═════╦═══╗
║ c1 ║ c2 ║ 3 ║
╟─────╫─────╫───╢
║ 1 ║ 2 ║ 3 ║
╠═════╬═════╬═══╣
║ qwe ║ rty ║ ║
║ ║ uio ║ ║
╚═════╩═════╩═══╝
>>> t_name.print(theme=Themes.double_thin)
╔═══════════════╗
║ Table Name ║
╠═════╦═════╦═══╣
║ 1 ║ 2 ║ 3 ║
╟─────╫─────╫───╢
║ qwe ║ rty ║ ║
║ ║ uio ║ ║
╚═════╩═════╩═══╝
>>> t_name_column_names.print(theme=Themes.double_thin)
╔═══════════════╗
║ Table Name ║
╠═════╦═════╦═══╣
║ c1 ║ c2 ║ 3 ║
╟─────╫─────╫───╢
║ 1 ║ 2 ║ 3 ║
╠═════╬═════╬═══╣
║ qwe ║ rty ║ ║
║ ║ uio ║ ║
╚═════╩═════╩═══╝
```
</details>
<details>
<summary>Themes.booktabs</summary>
```pycon
>>> t.print(theme=Themes.booktabs)
───────────────
1 2 3
━━━━━━━━━━━━━━━
qwe rty
uio
───────────────
>>> t_column_names.print(theme=Themes.booktabs)
───────────────
c1 c2 3
━━━━━━━━━━━━━━━
1 2 3
───────────────
qwe rty
uio
───────────────
>>> t_name.print(theme=Themes.booktabs)
───────────────
Table Name
───────────────
1 2 3
━━━━━━━━━━━━━━━
qwe rty
uio
───────────────
>>> t_name_column_names.print(theme=Themes.booktabs)
───────────────
Table Name
───────────────
c1 c2 3
━━━━━━━━━━━━━━━
1 2 3
───────────────
qwe rty
uio
───────────────
```
</details>
<details>
<summary>Themes.markdown</summary>
```pycon
>>> t.print(theme=Themes.markdown)
| 1 | 2 | 3 |
|-----|-----|---|
| qwe | rty | |
| | uio | |
>>> t_column_names.print(theme=Themes.markdown)
| c1 | c2 | 3 |
|-----|-----|---|
| 1 | 2 | 3 |
| qwe | rty | |
| | uio | |
>>> t_name.print(theme=Themes.markdown)
| Table Name |
| 1 | 2 | 3 |
|-----|-----|---|
| qwe | rty | |
| | uio | |
>>> t_name_column_names.print(theme=Themes.markdown)
| Table Name |
| c1 | c2 | 3 |
|-----|-----|---|
| 1 | 2 | 3 |
| qwe | rty | |
| | uio | |
```
</details>
</details>
## Emojis
<details>
<summary>Example</summary>
```python
from prettytable import PrettyTable
from table2string import Table
names = ("plain text", "emoji")
table = [
(
"text\ntext",
"👨👩👧👦👨👩👦👦👨👩👧👧\n"
"👨👨👧👦👨👨👧👧👨👩👧👩❤️👨\n"
"👨❤️👨👯👩🦼👭👨👩👧👦\n"
"👨👨👧👦👨👨👦👩👩👧\n"
"👨👨👧👧👨👩👦👦",
),
]
t = PrettyTable(title="prettytable", field_names=names, h_align="c")
t.add_rows(table)
print(t)
t = Table(table, name="table2string", column_names=names)
t.print(h_align="^", sep=(1,))
```
<details>
<summary>Windows Terminal</summary>
![emoji_example_1.png](images/emoji_example_Windows_Terminal.png)
</details>
<details>
<summary>Windows 10</summary>
![emoji_example_windows_10_terminal.png](images/emoji_example_windows_10_terminal.png)
</details>
<details>
<summary>Windows 11</summary>
![emoji_example_windows_11_terminal.png](images/emoji_example_windows_11_terminal.png)
</details>
<details>
<summary>VT100 terminal emulator</summary>
![emoji_example_VT100_terminal_emulator.png](images/emoji_example_VT100_terminal_emulator.png)
</details>
</details>
## Subtable
<details>
<summary>Example</summary>
```pycon
>>> Table(
... [
... ("1",),
... (Table([("2", "3")]),),
... ]
... ).print()
+-------+
| 1 |
+---+---+
| 2 | 3 |
+---+---+
>>> Table([(
... Table([(
... Table([(
... Table([(
... Table([(
... Table([(
... Table([(
... Table(
... [
... ("1",),
... (Table([("2", "3")]),),
... ]
... ),
... )]),
... )]),
... )]),
... )]),
... )]),
... )]),
... )]).print()
+-------+
| 1 |
+---+---+
| 2 | 3 |
+---+---+
>>> Table(
... [
... (
... "123",
... Table(
... [
... ("456",),
... (Table([("789", "101")]),),
... ]
... ),
... ),
... ]
... ).print()
+-----+-----------+
| 123 | 456 |
| +-----+-----+
| | 789 | 101 |
+-----+-----+-----+
```
</details>
Raw data
{
"_id": null,
"home_page": null,
"name": "table2string",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": null,
"keywords": "string, table, tools",
"author": null,
"author_email": "EgorKhabarov <not.a.fan.of.broccoli@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/37/da/975e339714ad97703965972766bb12857d26f8a4a7f1f18819cdbba6fad9/table2string-2.0.1.tar.gz",
"platform": null,
"description": "# table2string\n\n[![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/EgorKhabarov/table2string/tests.yml?style=flat&logo=GitHub&label=Tests)](https://github.com/EgorKhabarov/table2string/actions/workflows/tests.yml)\n[![Publish Python Package to PyPI](https://img.shields.io/github/actions/workflow/status/EgorKhabarov/table2string/publish.yml?style=flat&logo=GitHub&label=Publish%20to%20PyPI)](https://github.com/EgorKhabarov/table2string/actions/workflows/publish.yml)\n\n[![PyPi Package Version](https://img.shields.io/pypi/v/table2string.svg?style=flat&logo=pypi)](https://pypi.python.org/pypi/table2string)\n[![Supported Python versions](https://img.shields.io/pypi/pyversions/table2string.svg?style=flat&logo=pypi)](https://pypi.python.org/pypi/table2string)\n[![PyPi status](https://img.shields.io/pypi/status/table2string.svg?style=flat&logo=pypi)](https://pypi.python.org/pypi/table2string)\n[![PyPi downloads](https://img.shields.io/pypi/dm/table2string.svg?style=flat&logo=pypi)](https://pypi.org/project/table2string/)\n\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)\n[![mypy checked](https://img.shields.io/badge/mypy-checked-blue)](https://github.com/python/mypy)\n[![Linting: Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)\n\n\n## Convert table to string\n\nWhile there are several libraries available for converting tables to strings in Python, none seemed to meet my specific requirements. \n\n- **Line Break Support**: Easily include line breaks within cells for enhanced readability.\n- **Subtable Support**: Easily include a table within a table for a more flexible presentation.\n- **Alignment**: Easily align text in a cell in any direction.\n- **Emoji Integration**: Effortlessly incorporate emoji characters into your tables to add visual appeal and context.\n\n---\n\n# Install\n\n## PyPI\n\n```shell\npip install -U table2string\n```\n\n## GitHub\n\n```shell\npip install -U git+https://github.com/EgorKhabarov/table2string.git@master\n```\n\n---\n\n# Usage example\n\n```pycon\n>>> from table2string import Table, Themes, HorizontalAlignment, VerticalAlignment\n>>> Table([(\"1\", \"2\", \"3\"), (\"qwe\", \"rty\\nuio\", \"\")], name=\"Table Name\", column_names=(\"c1\", \"c2\", \"c3\")).print()\n+----------------+\n| Table Name |\n+-----+-----+----+\n| c1 | c2 | c3 |\n+-----+-----+----+\n| 1 | 2 | 3 |\n+-----+-----+----+\n| qwe | rty | |\n| | uio | |\n+-----+-----+----+\n>>> from io import StringIO\n>>> Table.from_csv(StringIO('c1,c2,c3\\n1,2,3\\nqwe,\"rty\\nuio\",'), name=\"Table Name\").print()\n+----------------+\n| Table Name |\n+-----+-----+----+\n| c1 | c2 | c3 |\n+-----+-----+----+\n| 1 | 2 | 3 |\n+-----+-----+----+\n| qwe | rty | |\n| | uio | |\n+-----+-----+----+\n>>> import sqlite3\n>>> cursor = sqlite3.connect(\":memory:\").cursor().execute(\n... \"CREATE TABLE data (c1 TEXT, c2 TEXT, c3 TEXT);\"\n... ).executemany(\n... \"INSERT INTO data (c1, c2, c3) VALUES (?, ?, ?);\",\n... [(\"1\", \"2\", \"3\"), (\"qwe\", \"rty\\nuio\", \"\")],\n... ).execute(\n... \"SELECT c1, c2, c3 FROM data;\"\n... )\n>>> Table.from_db_cursor(\n... cursor,\n... name=\"Table Name\",\n... column_names=True,\n... ).print()\n+----------------+\n| Table Name |\n+-----+-----+----+\n| c1 | c2 | c3 |\n+-----+-----+----+\n| 1 | 2 | 3 |\n+-----+-----+----+\n| qwe | rty | |\n| | uio | |\n+-----+-----+----+\n>>> Table(\n... [(\"c1\", Table([(\"1\", \"2\"), (\"3\", \"4\")], name=\"SubTable\"))],\n... name=\"Table Name\",\n... ).print(v_align=(\"-\",), max_width=(2, 8))\n+---------------+\n| Table Name |\n+----+----------+\n| | SubTable |\n| +-----+----+\n| c1 | 1 | 2 |\n| +-----+----+\n| | 3 | 4 |\n+----+-----+----+\n\n```\n\n## Arguments\n\n| Argument | Type | Example | Description |\n|:-------------------------|:--------------------------------------------------------------------------------------------------|:--------------------------------|:------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `table` | `Sequence[Sequence[Any]]` | `[(\"1\", \"2\"), (\"3\", \"4\")]` | A two-dimensional matrix |\n| `h_align` | <code>tuple[HorizontalAlignment | str, ...]</code> | `HorizontalAlignment` | `str` | `HorizontalAlignment.CENTER` | Allows you to align text in a cell horizontally |\n| `v_align` | <code>tuple[VerticalAlignment | str, ...]</code> | `VerticalAlignment` | `str` | `VerticalAlignment.MIDDLE` | Allows you to align text in a cell vertically |\n| `name` | `str` | `None` | `\"Table Name\"` | Table name |\n| `name_h_align` | `HorizontalAlignment` | `str` | `HorizontalAlignment.CENTER` | Allows you to align table name horizontally |\n| `name_v_align` | `VerticalAlignment` | `str` | `VerticalAlignment.MIDDLE` | Allows you to align table name vertically |\n| `column_names` | `Sequence[str]` | `None` | `(\"c1\", \"c2\", ...column_count)` | Sets the names for the table columns |\n| `column_names_h_align` | <code>tuple[HorizontalAlignment | str, ...]</code> | `HorizontalAlignment` | `str` | `HorizontalAlignment.CENTER` | Allows you to align column names horizontally |\n| `column_names_v_align` | <code>tuple[VerticalAlignment | str, ...]</code> | `VerticalAlignment` | `str` | `VerticalAlignment.MIDDLE` | Allows you to align column names vertically |\n| `max_width` | `int` | `Tuple[int, ...]` | `None` | `120` | Allows you to set the width of the entire table or individually for each column |\n| `max_height` | `int` | `None` | `10` | Specifies the maximum height for rows |\n| `maximize_height` | `bool` | `True` | Force height to be taken from max_height |\n| `line_break_symbol` | `str` | `\"\\\\\"` | Line break symbol |\n| `cell_break_symbol` | `str` | `\"\u2026\"` | Symbol indicating the end of text when there is not enough height |\n| `sep` | `bool` | `range` | `tuple` | `(1, 3, 6)` | Handles the separators between table rows and can be either a boolean type or possess a `__contains__` method |\n| `end` | `str` | `None` | `\"\\n\"` | Behaves the same as `print(end=)` |\n| `file` | `TextIOWrapper` | `None` | `sys.stdout` or `io.StringIO()` | Behaves the same as `print(file=)` |\n| `theme` | `Theme` | `Themes.rounded_thick` | Allows you to set a specific theme for the table. For example, the border style |\n| `ignore_width_errors` | `bool` | `False` | Fixes errors in max_width if they exist |\n| `proportion_coefficient` | `float` | `0.5` | Affects the width distribution of the columns. A value of `0.0` corresponds to proportional distribution, `1.0` averages the values, and `2.0` inverts them |\n\n\n## Text alignment\n\n| Align | Example | Description |\n|:------------------------------------------|:------------------|:-------------------------------------------------------------------------------------------------------------------------------|\n| `\"<align>\"` or `(\"<align>\",)` | `\"^\"` or `(\"^\",)` | Setting `align` (`\"^\"`) for all columns |\n| `(\"<align_1>\", \"<align_2>\")` | `(\"^\", \"<\")` | Setting `align_1` (`\"^\"`) for the first column and `align_2` (`\"<\"`) for all other columns |\n| `(\"<align_1>\", \"<align_2>\", \"<align_3>\")` | `(\"^\", \"<\", \">\")` | Setting `align_1` (`\"^\"`) for the first column and `align_2` (`\"<\"`) for the second and `align_3` (`\">\"`) for the third column |\n\nYou can also use the corresponding `HorizontalAlignment` or `VerticalAlignment` type\n\nFor `name_h_align` and `name_v_align` only the `str` type or the corresponding `HorizontalAlignment` or `VerticalAlignment` type is valid\n\n### HorizontalAlignment\n\n| Align | Description |\n|:-------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------|\n| `AUTO` or `AUTO_AUTO` or `*` or `**` | Alignment depends on the type. If this is a number and there are no line breaks in this cell, then align to the right; otherwise, align to the left. |\n| `LEFT` or `LEFT_LEFT` or `<` or `<<` | All lines are left aligned |\n| `CENTER` or `CENTER_CENTER` or `^` or `^^` | All lines are center aligned |\n| `RIGHT` or `RIGHT_RIGHT` or `>` or `>>` | All lines are right aligned |\n| `LEFT_CENTER` or `<^` | The first line is left aligned and the remaining lines are centered |\n| `LEFT_RIGHT` or `<>` | The first line is left aligned and the remaining lines are right aligned |\n| `CENTER_LEFT` or `^<` | The first line is aligned to the center, and the remaining lines are aligned to the left of the first line. |\n| `CENTER_RIGHT` or `^>` | The first line is aligned to the center, and the remaining lines are aligned to the right of the first line. |\n| `RIGHT_LEFT` or `><` | The first line is right aligned and the remaining lines are left aligned |\n| `RIGHT_CENTER` or `>^` | The first line is right aligned and the remaining lines are centered |\n\n### VerticalAlignment\n\n| Align | Description |\n|:----------------|:------------------------|\n| `TOP` or `^` | Text are top aligned |\n| `MIDDLE` or `-` | Text are centered |\n| `BOTTOM` or `_` | Text are bottom aligned |\n\n\n<details>\n<summary>Example</summary>\n\n```pycon\n>>> from functools import partial\n>>> sub_table_auto_func = partial(Table, [(\"123\", \"text\",)], max_height=4, maximize_height=True)\n>>> sub_table_func = partial(Table, [(\"first line\\ntext\",)], max_height=4, maximize_height=True)\n>>> Table(\n... [\n... *(\n... [v_align, sub_table_auto_func(h_align=\"*\", v_align=v_align)] + [\n... sub_table_func(h_align=h_align, v_align=v_align)\n... for h_align in (\"<\", \">\", \"^\", \"^<\", \"^>\")\n... ]\n... for v_align in (\"^\", \"-\", \"_\")\n... )\n... ],\n... column_names=(\" \", \"*\", \"<\", \">\", \"^\", \"^<\", \"^>\"),\n... ).print(max_width=(1, len(\"first line\")+4), v_align=(\"-\",))\n+---+----------------+----------------+----------------+----------------+----------------+----------------+\n| | * | < | > | ^ | ^< | ^> |\n+---+-------+--------+----------------+----------------+----------------+----------------+----------------+\n| | 123 | text | first line | first line | first line | first line | first line |\n| ^ | | | text | text | text | text | text |\n| | | | | | | | |\n| | | | | | | | |\n+---+-------+--------+----------------+----------------+----------------+----------------+----------------+\n| | | | | | | | |\n| - | 123 | text | first line | first line | first line | first line | first line |\n| | | | text | text | text | text | text |\n| | | | | | | | |\n+---+-------+--------+----------------+----------------+----------------+----------------+----------------+\n| | | | | | | | |\n| _ | | | | | | | |\n| | | | first line | first line | first line | first line | first line |\n| | 123 | text | text | text | text | text | text |\n+---+-------+--------+----------------+----------------+----------------+----------------+----------------+\n\n```\n</details>\n\n## Custom width and height settings\n\n| Width | Example | Description |\n|-------------------------------------|----------------|-----------------------------------------------------------------------------------------------------------------------------|\n| `<width>` | `10` | Setting `width` (`10`) for the whole table |\n| `(<width>,)` | `(10,)` | Setting `width_1` (`10`) for all column |\n| `(<width_1>, <width_2>)` | `(10, 20)` | Setting `width_1` (`10`) for the first column and `width_2` (`20`) for all other columns |\n| `(<width_1>, <width_2>, <width_3>)` | `(10, 20, 30)` | Setting `width_1` (`10`) for the first column and `width_2` (`20`) for the second and `width_3` (`30`) for the third column |\n\n<details>\n<summary>Example</summary>\n\n```pycon\n>>> # Width of the entire table with borders\n>>> Table([(1, 12345, \"example\")]).print(max_width=30)\n+-----+----------+-----------+\n| 1 | 12345 | example |\n+-----+----------+-----------+\n>>> # Width of each column individually\n>>> Table([(1, 12345, \"example\")]).print(max_width=(10,))\n+------------+------------+------------+\n| 1 | 12345 | example |\n+------------+------------+------------+\n>>> Table([(1, 12345, \"example\")]).print(max_width=(1, 8, 6))\n+---+----------+--------+\n| 1 | 12345 | exampl\\|\n| | | e |\n+---+----------+--------+\n>>> Table([(1, 12345, \"example\")]).print(max_width=(1, 5, 7))\n+---+-------+---------+\n| 1 | 12345 | example |\n+---+-------+---------+\n>>> Table([(\"123456\\n\\n789000\", \"example\")]).print(max_width=(3, 4), max_height=4)\n+-----+------+\n| 123\\| exam\\|\n| 456 | ple |\n| | |\n| 789\u2026| |\n+-----+------+\n>>> Table([(\"123456789\",)]).print(max_width=(1,), max_height=1)\n+---+\n| 1\u2026|\n+---+\n>>> Table([(\"123\\n456\\n789\",)]).print(\n... max_width=(3,),\n... max_height=4,\n... maximize_height=True,\n... )\n+-----+\n| 123 |\n| 456 |\n| 789 |\n| |\n+-----+\n>>> Table([(\"123456789\",)]).print(\n... max_width=(3,),\n... max_height=4,\n... maximize_height=True,\n... )\n+-----+\n| 123\\|\n| 456\\|\n| 789 |\n| |\n+-----+\n\n```\n</details>\n\n## Separator settings\n\n| Separator | Description |\n|------------------------|--------------------------------------------|\n| `sep=True` | All horizontal dividers included |\n| `sep=False` | All horizontal dividers are disabled |\n| `sep=(1,)` | Only first delimiter |\n| `sep=(1, 3, 5)` | Only first third and fifth separator |\n| `sep=range(1, 100, 5)` | Delimiter every five lines first 100 lines |\n\n<details>\n<summary>Example</summary>\n\n```pycon\n>>> table_1 = Table([(\"qwe\", \"rty\\nuio\"), (\"123456\\n\\n789000\", \"example\")])\n>>> kwargs = {\n... \"max_width\": (3, 4),\n... \"max_height\": 4,\n... }\n>>> table_1.print(**kwargs, sep=True)\n+-----+------+\n| qwe | rty |\n| | uio |\n+-----+------+\n| 123\\| exam\\|\n| 456 | ple |\n| | |\n| 789\u2026| |\n+-----+------+\n>>> table_1.print(**kwargs, sep=False)\n+-----+------+\n| qwe | rty |\n| | uio |\n| 123\\| exam\\|\n| 456 | ple |\n| | |\n| 789\u2026| |\n+-----+------+\n>>> table_2 = Table([(\"1\", \"2\"), (\"3\", \"4\")], name=\"Name\")\n>>> table_2.print(sep=True)\n+-------+\n| Name |\n+---+---+\n| 1 | 2 |\n+---+---+\n| 3 | 4 |\n+---+---+\n>>> table_2.print(sep=False)\n+-------+\n| Name |\n+---+---+\n| 1 | 2 |\n| 3 | 4 |\n+---+---+\n>>> table_3 = Table([(\"1\", \"2\"), (\"3\", \"4\"), (\"5\", \"6\"), (\"7\", \"8\")])\n>>> table_3.print(sep=(1,))\n+---+---+\n| 1 | 2 |\n+---+---+\n| 3 | 4 |\n| 5 | 6 |\n| 7 | 8 |\n+---+---+\n>>> table_3.print(sep=(2,))\n+---+---+\n| 1 | 2 |\n| 3 | 4 |\n+---+---+\n| 5 | 6 |\n| 7 | 8 |\n+---+---+\n>>> table_3.print(sep=(1, 3))\n+---+---+\n| 1 | 2 |\n+---+---+\n| 3 | 4 |\n| 5 | 6 |\n+---+---+\n| 7 | 8 |\n+---+---+\n>>> table_4 = Table([(\"1\", \"2\"), (\"3\", \"4\"), (\"5\", \"6\"), (\"7\", \"8\")], name=\"Name\")\n>>> table_4.print(sep=(1,))\n+-------+\n| Name |\n+---+---+\n| 1 | 2 |\n+---+---+\n| 3 | 4 |\n| 5 | 6 |\n| 7 | 8 |\n+---+---+\n>>> table_4.print(sep=(2,))\n+-------+\n| Name |\n+---+---+\n| 1 | 2 |\n| 3 | 4 |\n+---+---+\n| 5 | 6 |\n| 7 | 8 |\n+---+---+\n>>> table_4.print(sep=(1, 3))\n+-------+\n| Name |\n+---+---+\n| 1 | 2 |\n+---+---+\n| 3 | 4 |\n| 5 | 6 |\n+---+---+\n| 7 | 8 |\n+---+---+\n\n```\n</details>\n\n## Themes\n\n### Borders\n\n<details>\n<summary>Border types</summary>\n\n```pycon\n>>> from table2string import Themes, HorizontalAlignment\n>>> table = []\n>>> example_table = Table([(\" \", \" \"), (\" \", \" \"), (\" \", \" \")])\n>>> theme_names = (\n... (\"ascii_thin\", \"ascii_thin_double\"),\n... (\"ascii_double\", \"ascii_double_thin\"),\n... (\"thin\", \"thin_thick\"),\n... (\"thin_double\", \"rounded_double\"),\n... (\"rounded\", \"rounded_thick\"),\n... (\"thick\", \"thick_thin\"),\n... (\"double\", \"double_thin\"),\n... (\"booktabs\", \"ascii_booktabs\"),\n... (\"markdown\", \"None\"),\n... )\n>>> for names in theme_names:\n... table.append([])\n... for name in names:\n... string_table = example_table.stringify(\n... theme=getattr(Themes, name, Themes.ascii_thin)\n... )\n... table[-1].append(f\"{name}\\n{string_table}\")\n>>> Table(table).print(theme=Themes.thin, h_align=HorizontalAlignment.CENTER)\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 ascii_thin \u2502 ascii_thin_double \u2502\n\u2502 +---+---+ \u2502 +---+---+ \u2502\n\u2502 | | | \u2502 | | | \u2502\n\u2502 +---+---+ \u2502 +===+===+ \u2502\n\u2502 | | | \u2502 | | | \u2502\n\u2502 +---+---+ \u2502 +---+---+ \u2502\n\u2502 | | | \u2502 | | | \u2502\n\u2502 +---+---+ \u2502 +---+---+ \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 ascii_double \u2502 ascii_double_thin \u2502\n\u2502 +===+===+ \u2502 +===+===+ \u2502\n\u2502 \u2016 \u2016 \u2016 \u2502 \u2016 \u2016 \u2016 \u2502\n\u2502 +===+===+ \u2502 +---+---+ \u2502\n\u2502 \u2016 \u2016 \u2016 \u2502 \u2016 \u2016 \u2016 \u2502\n\u2502 +===+===+ \u2502 +===+===+ \u2502\n\u2502 \u2016 \u2016 \u2016 \u2502 \u2016 \u2016 \u2016 \u2502\n\u2502 +===+===+ \u2502 +===+===+ \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 thin \u2502 thin_thick \u2502\n\u2502 \u250c\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2510 \u2502 \u250c\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2510 \u2502\n\u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502\n\u2502 \u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524 \u2502 \u251d\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2525 \u2502\n\u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502\n\u2502 \u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524 \u2502 \u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524 \u2502\n\u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502\n\u2502 \u2514\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2518 \u2502 \u2514\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2518 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 thin_double \u2502 rounded_double \u2502\n\u2502 \u250c\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2510 \u2502 \u256d\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u256e \u2502\n\u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502\n\u2502 \u255e\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2561 \u2502 \u255e\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2561 \u2502\n\u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502\n\u2502 \u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524 \u2502 \u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524 \u2502\n\u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502\n\u2502 \u2514\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2518 \u2502 \u2570\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u256f \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 rounded \u2502 rounded_thick \u2502\n\u2502 \u256d\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u256e \u2502 \u256d\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u256e \u2502\n\u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502\n\u2502 \u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524 \u2502 \u251d\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2525 \u2502\n\u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502\n\u2502 \u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524 \u2502 \u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524 \u2502\n\u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502\n\u2502 \u2570\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u256f \u2502 \u2570\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u256f \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 thick \u2502 thick_thin \u2502\n\u2502 \u250f\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2513 \u2502 \u250f\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2513 \u2502\n\u2502 \u2503 \u2503 \u2503 \u2502 \u2503 \u2503 \u2503 \u2502\n\u2502 \u2523\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u252b \u2502 \u2520\u2500\u2500\u2500\u2542\u2500\u2500\u2500\u2528 \u2502\n\u2502 \u2503 \u2503 \u2503 \u2502 \u2503 \u2503 \u2503 \u2502\n\u2502 \u2523\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u252b \u2502 \u2523\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u252b \u2502\n\u2502 \u2503 \u2503 \u2503 \u2502 \u2503 \u2503 \u2503 \u2502\n\u2502 \u2517\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u251b \u2502 \u2517\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u251b \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 double \u2502 double_thin \u2502\n\u2502 \u2554\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2557 \u2502 \u2554\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2557 \u2502\n\u2502 \u2551 \u2551 \u2551 \u2502 \u2551 \u2551 \u2551 \u2502\n\u2502 \u2560\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2563 \u2502 \u255f\u2500\u2500\u2500\u256b\u2500\u2500\u2500\u2562 \u2502\n\u2502 \u2551 \u2551 \u2551 \u2502 \u2551 \u2551 \u2551 \u2502\n\u2502 \u2560\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2563 \u2502 \u2560\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2563 \u2502\n\u2502 \u2551 \u2551 \u2551 \u2502 \u2551 \u2551 \u2551 \u2502\n\u2502 \u255a\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u255d \u2502 \u255a\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u255d \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 booktabs \u2502 ascii_booktabs \u2502\n\u2502 \u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2502 ------- \u2502\n\u2502 \u2502 \u2502\n\u2502 \u2501\u2501\u2501\u2501\u2501\u2501\u2501 \u2502 ======= \u2502\n\u2502 \u2502 \u2502\n\u2502 \u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2502 ------- \u2502\n\u2502 \u2502 \u2502\n\u2502 \u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2502 ------- \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 markdown \u2502 None \u2502\n\u2502 | | | \u2502 +---+---+ \u2502\n\u2502 |---|---| \u2502 | | | \u2502\n\u2502 | | | \u2502 +---+---+ \u2502\n\u2502 | | | \u2502 | | | \u2502\n\u2502 \u2502 +---+---+ \u2502\n\u2502 \u2502 | | | \u2502\n\u2502 \u2502 +---+---+ \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\n```\n</details>\n\n<details>\n<summary>Example</summary>\n\n```pycon\n>>> from table2string import Table, Themes\n>>> name = \"Table Name\"\n>>> column_names = (\"c1\", \"c2\", \"3\")\n>>> table = [(\"1\", \"2\", \"3\"), (\"qwe\", \"rty\\nuio\", \"\")]\n>>> t = Table(table)\n>>> t_name = Table(table, name=name)\n>>> t_column_names = Table(table, column_names=column_names)\n>>> t_name_column_names = Table(table, name=name, column_names=column_names)\n\n```\n\n<details>\n<summary>Themes.ascii_thin</summary>\n\n```pycon\n\n>>> t.print(theme=Themes.ascii_thin)\n+-----+-----+---+\n| 1 | 2 | 3 |\n+-----+-----+---+\n| qwe | rty | |\n| | uio | |\n+-----+-----+---+\n>>> t_column_names.print(theme=Themes.ascii_thin)\n+-----+-----+---+\n| c1 | c2 | 3 |\n+-----+-----+---+\n| 1 | 2 | 3 |\n+-----+-----+---+\n| qwe | rty | |\n| | uio | |\n+-----+-----+---+\n>>> t_name.print(theme=Themes.ascii_thin)\n+---------------+\n| Table Name |\n+-----+-----+---+\n| 1 | 2 | 3 |\n+-----+-----+---+\n| qwe | rty | |\n| | uio | |\n+-----+-----+---+\n>>> t_name_column_names.print(theme=Themes.ascii_thin)\n+---------------+\n| Table Name |\n+-----+-----+---+\n| c1 | c2 | 3 |\n+-----+-----+---+\n| 1 | 2 | 3 |\n+-----+-----+---+\n| qwe | rty | |\n| | uio | |\n+-----+-----+---+\n\n```\n</details>\n\n\n<details>\n<summary>Themes.ascii_thin_double</summary>\n\n```pycon\n>>> t.print(theme=Themes.ascii_thin_double)\n+-----+-----+---+\n| 1 | 2 | 3 |\n+=====+=====+===+\n| qwe | rty | |\n| | uio | |\n+-----+-----+---+\n>>> t_column_names.print(theme=Themes.ascii_thin_double)\n+-----+-----+---+\n| c1 | c2 | 3 |\n+=====+=====+===+\n| 1 | 2 | 3 |\n+-----+-----+---+\n| qwe | rty | |\n| | uio | |\n+-----+-----+---+\n>>> t_name.print(theme=Themes.ascii_thin_double)\n+---------------+\n| Table Name |\n+-----+-----+---+\n| 1 | 2 | 3 |\n+=====+=====+===+\n| qwe | rty | |\n| | uio | |\n+-----+-----+---+\n>>> t_name_column_names.print(theme=Themes.ascii_thin_double)\n+---------------+\n| Table Name |\n+-----+-----+---+\n| c1 | c2 | 3 |\n+=====+=====+===+\n| 1 | 2 | 3 |\n+-----+-----+---+\n| qwe | rty | |\n| | uio | |\n+-----+-----+---+\n\n```\n</details>\n\n\n<details>\n<summary>Themes.ascii_double</summary>\n\n```pycon\n>>> t.print(theme=Themes.ascii_double)\n+=====+=====+===+\n\u2016 1 \u2016 2 \u2016 3 \u2016\n+=====+=====+===+\n\u2016 qwe \u2016 rty \u2016 \u2016\n\u2016 \u2016 uio \u2016 \u2016\n+=====+=====+===+\n>>> t_column_names.print(theme=Themes.ascii_double)\n+=====+=====+===+\n\u2016 c1 \u2016 c2 \u2016 3 \u2016\n+=====+=====+===+\n\u2016 1 \u2016 2 \u2016 3 \u2016\n+=====+=====+===+\n\u2016 qwe \u2016 rty \u2016 \u2016\n\u2016 \u2016 uio \u2016 \u2016\n+=====+=====+===+\n>>> t_name.print(theme=Themes.ascii_double)\n+===============+\n\u2016 Table Name \u2016\n+=====+=====+===+\n\u2016 1 \u2016 2 \u2016 3 \u2016\n+=====+=====+===+\n\u2016 qwe \u2016 rty \u2016 \u2016\n\u2016 \u2016 uio \u2016 \u2016\n+=====+=====+===+\n>>> t_name_column_names.print(theme=Themes.ascii_double)\n+===============+\n\u2016 Table Name \u2016\n+=====+=====+===+\n\u2016 c1 \u2016 c2 \u2016 3 \u2016\n+=====+=====+===+\n\u2016 1 \u2016 2 \u2016 3 \u2016\n+=====+=====+===+\n\u2016 qwe \u2016 rty \u2016 \u2016\n\u2016 \u2016 uio \u2016 \u2016\n+=====+=====+===+\n\n```\n</details>\n\n\n<details>\n<summary>Themes.ascii_double_thin</summary>\n\n```pycon\n>>> t.print(theme=Themes.ascii_double_thin)\n+=====+=====+===+\n\u2016 1 \u2016 2 \u2016 3 \u2016\n+-----+-----+---+\n\u2016 qwe \u2016 rty \u2016 \u2016\n\u2016 \u2016 uio \u2016 \u2016\n+=====+=====+===+\n>>> t_column_names.print(theme=Themes.ascii_double_thin)\n+=====+=====+===+\n\u2016 c1 \u2016 c2 \u2016 3 \u2016\n+-----+-----+---+\n\u2016 1 \u2016 2 \u2016 3 \u2016\n+=====+=====+===+\n\u2016 qwe \u2016 rty \u2016 \u2016\n\u2016 \u2016 uio \u2016 \u2016\n+=====+=====+===+\n>>> t_name.print(theme=Themes.ascii_double_thin)\n+===============+\n\u2016 Table Name \u2016\n+=====+=====+===+\n\u2016 1 \u2016 2 \u2016 3 \u2016\n+-----+-----+---+\n\u2016 qwe \u2016 rty \u2016 \u2016\n\u2016 \u2016 uio \u2016 \u2016\n+=====+=====+===+\n>>> t_name_column_names.print(theme=Themes.ascii_double_thin)\n+===============+\n\u2016 Table Name \u2016\n+=====+=====+===+\n\u2016 c1 \u2016 c2 \u2016 3 \u2016\n+-----+-----+---+\n\u2016 1 \u2016 2 \u2016 3 \u2016\n+=====+=====+===+\n\u2016 qwe \u2016 rty \u2016 \u2016\n\u2016 \u2016 uio \u2016 \u2016\n+=====+=====+===+\n\n```\n</details>\n\n\n<details>\n<summary>Themes.ascii_booktabs</summary>\n\n```pycon\n>>> t.print(theme=Themes.ascii_booktabs)\n --------------- \n 1 2 3 \n =============== \n qwe rty \n uio \n --------------- \n>>> t_column_names.print(theme=Themes.ascii_booktabs)\n --------------- \n c1 c2 3 \n =============== \n 1 2 3 \n --------------- \n qwe rty \n uio \n --------------- \n>>> t_name.print(theme=Themes.ascii_booktabs)\n --------------- \n Table Name \n --------------- \n 1 2 3 \n =============== \n qwe rty \n uio \n --------------- \n>>> t_name_column_names.print(theme=Themes.ascii_booktabs)\n --------------- \n Table Name \n --------------- \n c1 c2 3 \n =============== \n 1 2 3 \n --------------- \n qwe rty \n uio \n --------------- \n\n```\n</details>\n\n\n<details>\n<summary>Themes.thin</summary>\n\n```pycon\n>>> t.print(theme=Themes.thin)\n\u250c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2510\n\u2502 1 \u2502 2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 qwe \u2502 rty \u2502 \u2502\n\u2502 \u2502 uio \u2502 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2518\n>>> t_column_names.print(theme=Themes.thin)\n\u250c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2510\n\u2502 c1 \u2502 c2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 1 \u2502 2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 qwe \u2502 rty \u2502 \u2502\n\u2502 \u2502 uio \u2502 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2518\n>>> t_name.print(theme=Themes.thin)\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 Table Name \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2524\n\u2502 1 \u2502 2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 qwe \u2502 rty \u2502 \u2502\n\u2502 \u2502 uio \u2502 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2518\n>>> t_name_column_names.print(theme=Themes.thin)\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 Table Name \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2524\n\u2502 c1 \u2502 c2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 1 \u2502 2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 qwe \u2502 rty \u2502 \u2502\n\u2502 \u2502 uio \u2502 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2518\n\n```\n</details>\n\n\n<details>\n<summary>Themes.thin_thick</summary>\n\n```pycon\n>>> t.print(theme=Themes.thin_thick)\n\u250c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2510\n\u2502 1 \u2502 2 \u2502 3 \u2502\n\u251d\u2501\u2501\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2525\n\u2502 qwe \u2502 rty \u2502 \u2502\n\u2502 \u2502 uio \u2502 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2518\n>>> t_column_names.print(theme=Themes.thin_thick)\n\u250c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2510\n\u2502 c1 \u2502 c2 \u2502 3 \u2502\n\u251d\u2501\u2501\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2525\n\u2502 1 \u2502 2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 qwe \u2502 rty \u2502 \u2502\n\u2502 \u2502 uio \u2502 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2518\n>>> t_name.print(theme=Themes.thin_thick)\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 Table Name \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2524\n\u2502 1 \u2502 2 \u2502 3 \u2502\n\u251d\u2501\u2501\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2525\n\u2502 qwe \u2502 rty \u2502 \u2502\n\u2502 \u2502 uio \u2502 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2518\n>>> t_name_column_names.print(theme=Themes.thin_thick)\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 Table Name \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2524\n\u2502 c1 \u2502 c2 \u2502 3 \u2502\n\u251d\u2501\u2501\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2525\n\u2502 1 \u2502 2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 qwe \u2502 rty \u2502 \u2502\n\u2502 \u2502 uio \u2502 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2518\n\n```\n</details>\n\n\n<details>\n<summary>Themes.thin_double</summary>\n\n```pycon\n>>> t.print(theme=Themes.thin_double)\n\u250c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2510\n\u2502 1 \u2502 2 \u2502 3 \u2502\n\u255e\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2561\n\u2502 qwe \u2502 rty \u2502 \u2502\n\u2502 \u2502 uio \u2502 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2518\n>>> t_column_names.print(theme=Themes.thin_double)\n\u250c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2510\n\u2502 c1 \u2502 c2 \u2502 3 \u2502\n\u255e\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2561\n\u2502 1 \u2502 2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 qwe \u2502 rty \u2502 \u2502\n\u2502 \u2502 uio \u2502 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2518\n>>> t_name.print(theme=Themes.thin_double)\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 Table Name \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2524\n\u2502 1 \u2502 2 \u2502 3 \u2502\n\u255e\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2561\n\u2502 qwe \u2502 rty \u2502 \u2502\n\u2502 \u2502 uio \u2502 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2518\n>>> t_name_column_names.print(theme=Themes.thin_double)\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 Table Name \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2524\n\u2502 c1 \u2502 c2 \u2502 3 \u2502\n\u255e\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2561\n\u2502 1 \u2502 2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 qwe \u2502 rty \u2502 \u2502\n\u2502 \u2502 uio \u2502 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2518\n\n```\n</details>\n\n\n<details>\n<summary>Themes.rounded</summary>\n\n```pycon\n>>> t.print(theme=Themes.rounded)\n\u256d\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u256e\n\u2502 1 \u2502 2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 qwe \u2502 rty \u2502 \u2502\n\u2502 \u2502 uio \u2502 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u256f\n>>> t_column_names.print(theme=Themes.rounded)\n\u256d\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u256e\n\u2502 c1 \u2502 c2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 1 \u2502 2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 qwe \u2502 rty \u2502 \u2502\n\u2502 \u2502 uio \u2502 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u256f\n>>> t_name.print(theme=Themes.rounded)\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 Table Name \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2524\n\u2502 1 \u2502 2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 qwe \u2502 rty \u2502 \u2502\n\u2502 \u2502 uio \u2502 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u256f\n>>> t_name_column_names.print(theme=Themes.rounded)\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 Table Name \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2524\n\u2502 c1 \u2502 c2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 1 \u2502 2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 qwe \u2502 rty \u2502 \u2502\n\u2502 \u2502 uio \u2502 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u256f\n\n```\n</details>\n\n\n<details>\n<summary>Themes.rounded_thick</summary>\n\n```pycon\n>>> t.print(theme=Themes.rounded_thick)\n\u256d\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u256e\n\u2502 1 \u2502 2 \u2502 3 \u2502\n\u251d\u2501\u2501\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2525\n\u2502 qwe \u2502 rty \u2502 \u2502\n\u2502 \u2502 uio \u2502 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u256f\n>>> t_column_names.print(theme=Themes.rounded_thick)\n\u256d\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u256e\n\u2502 c1 \u2502 c2 \u2502 3 \u2502\n\u251d\u2501\u2501\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2525\n\u2502 1 \u2502 2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 qwe \u2502 rty \u2502 \u2502\n\u2502 \u2502 uio \u2502 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u256f\n>>> t_name.print(theme=Themes.rounded_thick)\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 Table Name \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2524\n\u2502 1 \u2502 2 \u2502 3 \u2502\n\u251d\u2501\u2501\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2525\n\u2502 qwe \u2502 rty \u2502 \u2502\n\u2502 \u2502 uio \u2502 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u256f\n>>> t_name_column_names.print(theme=Themes.rounded_thick)\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 Table Name \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2524\n\u2502 c1 \u2502 c2 \u2502 3 \u2502\n\u251d\u2501\u2501\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2501\u2501\u253f\u2501\u2501\u2501\u2525\n\u2502 1 \u2502 2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 qwe \u2502 rty \u2502 \u2502\n\u2502 \u2502 uio \u2502 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u256f\n\n```\n</details>\n\n\n<details>\n<summary>Themes.rounded_double</summary>\n\n```pycon\n>>> t.print(theme=Themes.rounded_double)\n\u256d\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u256e\n\u2502 1 \u2502 2 \u2502 3 \u2502\n\u255e\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2561\n\u2502 qwe \u2502 rty \u2502 \u2502\n\u2502 \u2502 uio \u2502 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u256f\n>>> t_column_names.print(theme=Themes.rounded_double)\n\u256d\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u256e\n\u2502 c1 \u2502 c2 \u2502 3 \u2502\n\u255e\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2561\n\u2502 1 \u2502 2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 qwe \u2502 rty \u2502 \u2502\n\u2502 \u2502 uio \u2502 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u256f\n>>> t_name.print(theme=Themes.rounded_double)\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 Table Name \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2524\n\u2502 1 \u2502 2 \u2502 3 \u2502\n\u255e\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2561\n\u2502 qwe \u2502 rty \u2502 \u2502\n\u2502 \u2502 uio \u2502 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u256f\n>>> t_name_column_names.print(theme=Themes.rounded_double)\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 Table Name \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2524\n\u2502 c1 \u2502 c2 \u2502 3 \u2502\n\u255e\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2561\n\u2502 1 \u2502 2 \u2502 3 \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2524\n\u2502 qwe \u2502 rty \u2502 \u2502\n\u2502 \u2502 uio \u2502 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u256f\n\n```\n</details>\n\n\n<details>\n<summary>Themes.thick</summary>\n\n```pycon\n>>> t.print(theme=Themes.thick)\n\u250f\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2513\n\u2503 1 \u2503 2 \u2503 3 \u2503\n\u2523\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u252b\n\u2503 qwe \u2503 rty \u2503 \u2503\n\u2503 \u2503 uio \u2503 \u2503\n\u2517\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u251b\n>>> t_column_names.print(theme=Themes.thick)\n\u250f\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2513\n\u2503 c1 \u2503 c2 \u2503 3 \u2503\n\u2523\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u252b\n\u2503 1 \u2503 2 \u2503 3 \u2503\n\u2523\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u252b\n\u2503 qwe \u2503 rty \u2503 \u2503\n\u2503 \u2503 uio \u2503 \u2503\n\u2517\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u251b\n>>> t_name.print(theme=Themes.thick)\n\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n\u2503 Table Name \u2503\n\u2523\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u252b\n\u2503 1 \u2503 2 \u2503 3 \u2503\n\u2523\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u252b\n\u2503 qwe \u2503 rty \u2503 \u2503\n\u2503 \u2503 uio \u2503 \u2503\n\u2517\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u251b\n>>> t_name_column_names.print(theme=Themes.thick)\n\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n\u2503 Table Name \u2503\n\u2523\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u252b\n\u2503 c1 \u2503 c2 \u2503 3 \u2503\n\u2523\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u252b\n\u2503 1 \u2503 2 \u2503 3 \u2503\n\u2523\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u252b\n\u2503 qwe \u2503 rty \u2503 \u2503\n\u2503 \u2503 uio \u2503 \u2503\n\u2517\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u251b\n\n```\n</details>\n\n\n<details>\n<summary>Themes.thick_thin</summary>\n\n```pycon\n>>> t.print(theme=Themes.thick_thin)\n\u250f\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2513\n\u2503 1 \u2503 2 \u2503 3 \u2503\n\u2520\u2500\u2500\u2500\u2500\u2500\u2542\u2500\u2500\u2500\u2500\u2500\u2542\u2500\u2500\u2500\u2528\n\u2503 qwe \u2503 rty \u2503 \u2503\n\u2503 \u2503 uio \u2503 \u2503\n\u2517\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u251b\n>>> t_column_names.print(theme=Themes.thick_thin)\n\u250f\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2513\n\u2503 c1 \u2503 c2 \u2503 3 \u2503\n\u2520\u2500\u2500\u2500\u2500\u2500\u2542\u2500\u2500\u2500\u2500\u2500\u2542\u2500\u2500\u2500\u2528\n\u2503 1 \u2503 2 \u2503 3 \u2503\n\u2523\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u252b\n\u2503 qwe \u2503 rty \u2503 \u2503\n\u2503 \u2503 uio \u2503 \u2503\n\u2517\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u251b\n>>> t_name.print(theme=Themes.thick_thin)\n\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n\u2503 Table Name \u2503\n\u2523\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u252b\n\u2503 1 \u2503 2 \u2503 3 \u2503\n\u2520\u2500\u2500\u2500\u2500\u2500\u2542\u2500\u2500\u2500\u2500\u2500\u2542\u2500\u2500\u2500\u2528\n\u2503 qwe \u2503 rty \u2503 \u2503\n\u2503 \u2503 uio \u2503 \u2503\n\u2517\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u251b\n>>> t_name_column_names.print(theme=Themes.thick_thin)\n\u250f\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513\n\u2503 Table Name \u2503\n\u2523\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u2501\u2501\u2533\u2501\u2501\u2501\u252b\n\u2503 c1 \u2503 c2 \u2503 3 \u2503\n\u2520\u2500\u2500\u2500\u2500\u2500\u2542\u2500\u2500\u2500\u2500\u2500\u2542\u2500\u2500\u2500\u2528\n\u2503 1 \u2503 2 \u2503 3 \u2503\n\u2523\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u2501\u2501\u254b\u2501\u2501\u2501\u252b\n\u2503 qwe \u2503 rty \u2503 \u2503\n\u2503 \u2503 uio \u2503 \u2503\n\u2517\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u2501\u2501\u253b\u2501\u2501\u2501\u251b\n\n```\n</details>\n\n\n<details>\n<summary>Themes.double</summary>\n\n```pycon\n>>> t.print(theme=Themes.double)\n\u2554\u2550\u2550\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2557\n\u2551 1 \u2551 2 \u2551 3 \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2563\n\u2551 qwe \u2551 rty \u2551 \u2551\n\u2551 \u2551 uio \u2551 \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u255d\n>>> t_column_names.print(theme=Themes.double)\n\u2554\u2550\u2550\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2557\n\u2551 c1 \u2551 c2 \u2551 3 \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2563\n\u2551 1 \u2551 2 \u2551 3 \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2563\n\u2551 qwe \u2551 rty \u2551 \u2551\n\u2551 \u2551 uio \u2551 \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u255d\n>>> t_name.print(theme=Themes.double)\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551 Table Name \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2563\n\u2551 1 \u2551 2 \u2551 3 \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2563\n\u2551 qwe \u2551 rty \u2551 \u2551\n\u2551 \u2551 uio \u2551 \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u255d\n>>> t_name_column_names.print(theme=Themes.double)\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551 Table Name \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2563\n\u2551 c1 \u2551 c2 \u2551 3 \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2563\n\u2551 1 \u2551 2 \u2551 3 \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2563\n\u2551 qwe \u2551 rty \u2551 \u2551\n\u2551 \u2551 uio \u2551 \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u255d\n\n```\n</details>\n\n\n<details>\n<summary>Themes.double_thin</summary>\n\n```pycon\n>>> t.print(theme=Themes.double_thin)\n\u2554\u2550\u2550\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2557\n\u2551 1 \u2551 2 \u2551 3 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u256b\u2500\u2500\u2500\u2500\u2500\u256b\u2500\u2500\u2500\u2562\n\u2551 qwe \u2551 rty \u2551 \u2551\n\u2551 \u2551 uio \u2551 \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u255d\n>>> t_column_names.print(theme=Themes.double_thin)\n\u2554\u2550\u2550\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2557\n\u2551 c1 \u2551 c2 \u2551 3 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u256b\u2500\u2500\u2500\u2500\u2500\u256b\u2500\u2500\u2500\u2562\n\u2551 1 \u2551 2 \u2551 3 \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2563\n\u2551 qwe \u2551 rty \u2551 \u2551\n\u2551 \u2551 uio \u2551 \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u255d\n>>> t_name.print(theme=Themes.double_thin)\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551 Table Name \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2563\n\u2551 1 \u2551 2 \u2551 3 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u256b\u2500\u2500\u2500\u2500\u2500\u256b\u2500\u2500\u2500\u2562\n\u2551 qwe \u2551 rty \u2551 \u2551\n\u2551 \u2551 uio \u2551 \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u255d\n>>> t_name_column_names.print(theme=Themes.double_thin)\n\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557\n\u2551 Table Name \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2550\u2550\u2566\u2550\u2550\u2550\u2563\n\u2551 c1 \u2551 c2 \u2551 3 \u2551\n\u255f\u2500\u2500\u2500\u2500\u2500\u256b\u2500\u2500\u2500\u2500\u2500\u256b\u2500\u2500\u2500\u2562\n\u2551 1 \u2551 2 \u2551 3 \u2551\n\u2560\u2550\u2550\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2550\u2550\u256c\u2550\u2550\u2550\u2563\n\u2551 qwe \u2551 rty \u2551 \u2551\n\u2551 \u2551 uio \u2551 \u2551\n\u255a\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u255d\n\n```\n</details>\n\n\n<details>\n<summary>Themes.booktabs</summary>\n\n```pycon\n>>> t.print(theme=Themes.booktabs)\n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \n 1 2 3 \n \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \n qwe rty \n uio \n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \n>>> t_column_names.print(theme=Themes.booktabs)\n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \n c1 c2 3 \n \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \n 1 2 3 \n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \n qwe rty \n uio \n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \n>>> t_name.print(theme=Themes.booktabs)\n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \n Table Name \n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \n 1 2 3 \n \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \n qwe rty \n uio \n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \n>>> t_name_column_names.print(theme=Themes.booktabs)\n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \n Table Name \n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \n c1 c2 3 \n \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 \n 1 2 3 \n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \n qwe rty \n uio \n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \n\n```\n</details>\n\n\n<details>\n<summary>Themes.markdown</summary>\n\n```pycon\n>>> t.print(theme=Themes.markdown)\n| 1 | 2 | 3 |\n|-----|-----|---|\n| qwe | rty | |\n| | uio | |\n>>> t_column_names.print(theme=Themes.markdown)\n| c1 | c2 | 3 |\n|-----|-----|---|\n| 1 | 2 | 3 |\n| qwe | rty | |\n| | uio | |\n>>> t_name.print(theme=Themes.markdown)\n| Table Name |\n| 1 | 2 | 3 |\n|-----|-----|---|\n| qwe | rty | |\n| | uio | |\n>>> t_name_column_names.print(theme=Themes.markdown)\n| Table Name |\n| c1 | c2 | 3 |\n|-----|-----|---|\n| 1 | 2 | 3 |\n| qwe | rty | |\n| | uio | |\n\n```\n</details>\n</details>\n\n## Emojis\n\n<details>\n<summary>Example</summary>\n\n```python\nfrom prettytable import PrettyTable\nfrom table2string import Table\n\nnames = (\"plain text\", \"emoji\")\ntable = [\n (\n \"text\\ntext\",\n \"\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67\\n\"\n \"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc68\\n\"\n \"\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68\ud83d\udc6f\ud83d\udc69\u200d\ud83e\uddbc\ud83d\udc6d\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66\\n\"\n \"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc66\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\\n\"\n \"\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d\udc67\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66\",\n ),\n]\nt = PrettyTable(title=\"prettytable\", field_names=names, h_align=\"c\")\nt.add_rows(table)\nprint(t)\n\nt = Table(table, name=\"table2string\", column_names=names)\nt.print(h_align=\"^\", sep=(1,))\n```\n\n<details>\n<summary>Windows Terminal</summary>\n\n![emoji_example_1.png](images/emoji_example_Windows_Terminal.png)\n</details>\n\n<details>\n<summary>Windows 10</summary>\n\n![emoji_example_windows_10_terminal.png](images/emoji_example_windows_10_terminal.png)\n</details>\n\n<details>\n<summary>Windows 11</summary>\n\n![emoji_example_windows_11_terminal.png](images/emoji_example_windows_11_terminal.png)\n</details>\n\n<details>\n<summary>VT100 terminal emulator</summary>\n\n![emoji_example_VT100_terminal_emulator.png](images/emoji_example_VT100_terminal_emulator.png)\n</details>\n</details>\n\n\n## Subtable\n\n<details>\n<summary>Example</summary>\n\n```pycon\n>>> Table(\n... [\n... (\"1\",),\n... (Table([(\"2\", \"3\")]),),\n... ]\n... ).print()\n+-------+\n| 1 |\n+---+---+\n| 2 | 3 |\n+---+---+\n>>> Table([(\n... Table([(\n... Table([(\n... Table([(\n... Table([(\n... Table([(\n... Table([(\n... Table(\n... [\n... (\"1\",),\n... (Table([(\"2\", \"3\")]),),\n... ]\n... ),\n... )]),\n... )]),\n... )]),\n... )]),\n... )]),\n... )]),\n... )]).print()\n+-------+\n| 1 |\n+---+---+\n| 2 | 3 |\n+---+---+\n>>> Table(\n... [\n... (\n... \"123\",\n... Table(\n... [\n... (\"456\",),\n... (Table([(\"789\", \"101\")]),),\n... ]\n... ),\n... ),\n... ]\n... ).print()\n+-----+-----------+\n| 123 | 456 |\n| +-----+-----+\n| | 789 | 101 |\n+-----+-----+-----+\n\n```\n</details>\n",
"bugtrack_url": null,
"license": "GPL2",
"summary": "A library to convert tables to string with full support for line breaks and formatting",
"version": "2.0.1",
"project_urls": {
"Documentation": "https://github.com/EgorKhabarov/table2string",
"Homepage": "https://github.com/EgorKhabarov/table2string",
"Issues": "https://github.com/EgorKhabarov/table2string/issues",
"Repository": "https://github.com/EgorKhabarov/table2string"
},
"split_keywords": [
"string",
" table",
" tools"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "2350c359bd557327d7ff812ebe36957e4c9bd44138104a81266fb6d77f691987",
"md5": "034734df8a6df6f8b5e27d59b7fcf5f8",
"sha256": "47fb19351d1e925cdfdfa9f42b69c1a81954a7189cffc58b4c30fb974d57325f"
},
"downloads": -1,
"filename": "table2string-2.0.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "034734df8a6df6f8b5e27d59b7fcf5f8",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.7",
"size": 28441,
"upload_time": "2024-09-30T00:22:14",
"upload_time_iso_8601": "2024-09-30T00:22:14.296704Z",
"url": "https://files.pythonhosted.org/packages/23/50/c359bd557327d7ff812ebe36957e4c9bd44138104a81266fb6d77f691987/table2string-2.0.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "37da975e339714ad97703965972766bb12857d26f8a4a7f1f18819cdbba6fad9",
"md5": "590a6e73cb29bed4d40c400170e8b2e9",
"sha256": "bae2be24df5a031a55bf5b3f4e0e016d5b45ddfbfb29ff72c21fdc68e517a1c4"
},
"downloads": -1,
"filename": "table2string-2.0.1.tar.gz",
"has_sig": false,
"md5_digest": "590a6e73cb29bed4d40c400170e8b2e9",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 421305,
"upload_time": "2024-09-30T00:22:16",
"upload_time_iso_8601": "2024-09-30T00:22:16.381847Z",
"url": "https://files.pythonhosted.org/packages/37/da/975e339714ad97703965972766bb12857d26f8a4a7f1f18819cdbba6fad9/table2string-2.0.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-09-30 00:22:16",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "EgorKhabarov",
"github_project": "table2string",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "table2string"
}