Skip to content

Text Styles

craftable.styles.NoBorderScreenStyle

Bases: TableStyle

Minimal, whitespace-delimited with a simple header separator.

Source code in src/craftable/styles/no_border_screen_style.py
class NoBorderScreenStyle(TableStyle):
    """Minimal, whitespace-delimited with a simple header separator."""

    def __init__(self):
        super().__init__()
        self.top_border = False
        self.bottom_border = False
        self.header_left = ""
        self.header_right = ""
        self.header_bottom_left = ""
        self.header_bottom_right = ""
        self.values_left = ""
        self.values_right = ""
        self.values_bottom_left = ""
        self.values_bottom_right = ""
        self.row_separator_line = "◦"
        self.row_separator_left = ""
        self.row_separator_right = ""

craftable.styles.BasicScreenStyle

Bases: TableStyle

Classic box drawing with Unicode characters (│ ─ ┌ ┐ └ ┘ ├ ┤ ┬ ┴ ┼).

Source code in src/craftable/styles/basic_screen_style.py
6
7
8
9
class BasicScreenStyle(TableStyle):
    """Classic box drawing with Unicode characters (│ ─ ┌ ┐ └ ┘ ├ ┤ ┬ ┴ ┼)."""

    pass

craftable.styles.RoundedBorderScreenStyle

Bases: TableStyle

Rounded corners for a softer look (╭ ╮ ╰ ╯ │ ─).

Source code in src/craftable/styles/rounded_border_screen_style.py
class RoundedBorderScreenStyle(TableStyle):
    """Rounded corners for a softer look (╭ ╮ ╰ ╯ │ ─)."""

    def __init__(self):
        super().__init__()
        self.header_top_left = BoxChars.SINGLE_ARC_DOWN_AND_RIGHT
        self.header_top_right = BoxChars.SINGLE_ARC_DOWN_AND_LEFT
        self.no_header_top_left = BoxChars.SINGLE_ARC_DOWN_AND_RIGHT
        self.no_header_top_right = BoxChars.SINGLE_ARC_DOWN_AND_LEFT
        self.values_bottom_left = BoxChars.SINGLE_ARC_UP_AND_RIGHT
        self.values_bottom_right = BoxChars.SINGLE_ARC_UP_AND_LEFT

craftable.styles.MarkdownStyle

Bases: TableStyle

GitHub-flavored Markdown tables for documentation.

Source code in src/craftable/styles/markdown_style.py
class MarkdownStyle(TableStyle):
    """GitHub-flavored Markdown tables for documentation."""

    def __init__(self):
        super().__init__()
        self.top_border = False
        self.bottom_border = False
        self.terminal_style = False
        self.allow_lazy_header = False
        self.force_header = True
        self.align_char = ":"

        self.min_width = 3

        self.header_delimiter = "|"
        self.header_left = "|"
        self.header_right = "|"

        self.header_bottom_line = "-"
        self.header_bottom_delimiter = "|"
        self.header_bottom_left = "|"
        self.header_bottom_right = "|"

        self.values_delimiter = "|"
        self.values_left = "|"
        self.values_right = "|"

        self.row_separator_line = ""
        self.row_separator_delimiter = ""
        self.row_separator_left = ""
        self.row_separator_right = ""

craftable.styles.ASCIIStyle

Bases: TableStyle

ASCII-only style for plain terminals and logs (uses + - |).

Source code in src/craftable/styles/ascii_style.py
class ASCIIStyle(TableStyle):
    """ASCII-only style for plain terminals and logs (uses + - |)."""

    def __init__(self):
        super().__init__()
        self.terminal_style = False

        # Outer borders
        self.top_border = True
        self.bottom_border = True

        # Header borders
        self.header_top_line = "-"
        self.header_top_delimiter = "+"
        self.header_top_left = "+"
        self.header_top_right = "+"

        self.header_delimiter = "|"
        self.header_left = "|"
        self.header_right = "|"

        self.header_bottom_line = "-"
        self.header_bottom_delimiter = "+"
        self.header_bottom_left = "+"
        self.header_bottom_right = "+"

        # Data borders
        self.values_delimiter = "|"
        self.values_left = "|"
        self.values_right = "|"

        self.values_bottom_line = "-"
        self.values_bottom_delimiter = "+"
        self.values_bottom_left = "+"
        self.values_bottom_right = "+"

        # Row separator
        self.row_separator_line = "-"
        self.row_separator_left = "|"
        self.row_separator_right = "|"

craftable.styles.TableStyle

Bases: ABC

Abstract base class for table styles.

Defines all the visual attributes that control how a table is rendered, including borders, delimiters, padding, and special characters.

Source code in src/craftable/styles/table_style.py
class TableStyle(ABC):
    """Abstract base class for table styles.

    Defines all the visual attributes that control how a table is rendered,
    including borders, delimiters, padding, and special characters.
    """

    def __init__(self):
        self.top_border = True
        self.bottom_border = True
        self.terminal_style = True
        self.string_output = True  # False for binary formats (DOCX/XLSX/ODF/RTF)
        self.allow_lazy_header = True
        self.force_header = False
        self.align_char = None

        self.cell_padding = 1
        self.min_width = 1

        self.no_header_top_line = BoxChars.SINGLE_HORIZONTAL
        self.no_header_top_delimiter = BoxChars.SINGLE_DOWN_AND_HORIZONTAL
        self.no_header_top_left = BoxChars.SINGLE_DOWN_AND_RIGHT
        self.no_header_top_right = BoxChars.SINGLE_DOWN_AND_LEFT

        self.header_top_line = BoxChars.SINGLE_HORIZONTAL
        self.header_top_delimiter = BoxChars.SINGLE_DOWN_AND_HORIZONTAL
        self.header_top_left = BoxChars.SINGLE_DOWN_AND_RIGHT
        self.header_top_right = BoxChars.SINGLE_DOWN_AND_LEFT

        self.header_delimiter = BoxChars.SINGLE_VERTICAL
        self.header_left = BoxChars.SINGLE_VERTICAL
        self.header_right = BoxChars.SINGLE_VERTICAL

        self.header_bottom_line = BoxChars.SINGLE_HORIZONTAL
        self.header_bottom_delimiter = BoxChars.SINGLE_VERTICAL_AND_HORIZONTAL
        self.header_bottom_left = BoxChars.SINGLE_VERTICAL_AND_RIGHT
        self.header_bottom_right = BoxChars.SINGLE_VERTICAL_AND_LEFT

        self.values_delimiter = BoxChars.SINGLE_VERTICAL
        self.values_left = BoxChars.SINGLE_VERTICAL
        self.values_right = BoxChars.SINGLE_VERTICAL

        self.values_bottom_line = BoxChars.SINGLE_HORIZONTAL
        self.values_bottom_delimiter = BoxChars.SINGLE_UP_AND_HORIZONTAL
        self.values_bottom_left = BoxChars.SINGLE_UP_AND_RIGHT
        self.values_bottom_right = BoxChars.SINGLE_UP_AND_LEFT

        self.row_separator_line = "◦"
        self.row_separator_delimiter = BoxChars.SINGLE_VERTICAL
        self.row_separator_left = BoxChars.SINGLE_VERTICAL
        self.row_separator_right = BoxChars.SINGLE_VERTICAL

craftable.styles.BoxChars

Bases: Enum

Unicode box drawing characters

Naming convention (normalized for consistency):

  • SINGLE_* : thin single lines (Unicode: "LIGHT")
  • HEAVY_* : thick single lines (Unicode: "HEAVY")
  • DOUBLE_* : parallel double lines (Unicode: "DOUBLE")
  • Mixed lines use pattern: WEIGHT_DIR_AND_WEIGHT_DIR
Source code in src/craftable/styles/box_chars.py
class BoxChars(Enum):
    """Unicode box drawing characters

    Naming convention (normalized for consistency):

    - SINGLE_* : thin single lines (Unicode: "LIGHT")
    - HEAVY_* : thick single lines (Unicode: "HEAVY")
    - DOUBLE_* : parallel double lines (Unicode: "DOUBLE")
    - Mixed lines use pattern: WEIGHT_DIR_AND_WEIGHT_DIR
    """

    # SINGLE (thin single-line) characters
    # BOX DRAWINGS LIGHT HORIZONTAL
    SINGLE_HORIZONTAL = "\u2500"  # ─
    # BOX DRAWINGS LIGHT VERTICAL
    SINGLE_VERTICAL = "\u2502"  # │
    # BOX DRAWINGS LIGHT DOWN AND RIGHT
    SINGLE_DOWN_AND_RIGHT = "\u250c"  # ┌
    # BOX DRAWINGS LIGHT DOWN AND LEFT
    SINGLE_DOWN_AND_LEFT = "\u2510"  # ┐
    # BOX DRAWINGS LIGHT UP AND RIGHT
    SINGLE_UP_AND_RIGHT = "\u2514"  # └
    # BOX DRAWINGS LIGHT UP AND LEFT
    SINGLE_UP_AND_LEFT = "\u2518"  # ┘
    # BOX DRAWINGS LIGHT VERTICAL AND RIGHT
    SINGLE_VERTICAL_AND_RIGHT = "\u251c"  # ├
    # BOX DRAWINGS LIGHT VERTICAL AND LEFT
    SINGLE_VERTICAL_AND_LEFT = "\u2524"  # ┤
    # BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
    SINGLE_DOWN_AND_HORIZONTAL = "\u252c"  # ┬
    # BOX DRAWINGS LIGHT UP AND HORIZONTAL
    SINGLE_UP_AND_HORIZONTAL = "\u2534"  # ┴
    # BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
    SINGLE_VERTICAL_AND_HORIZONTAL = "\u253c"  # ┼
    # BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL
    SINGLE_DOUBLE_DASH_HORIZONTAL = "\u254c"  # ╌
    # BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL
    SINGLE_DOUBLE_DASH_VERTICAL = "\u254e"  # ╎

    # ARC characters
    # BOX DRAWINGS LIGHT ARC DOWN AND RIGHT
    SINGLE_ARC_DOWN_AND_RIGHT = "\u256d"  # ╭
    # BOX DRAWINGS LIGHT ARC DOWN AND LEFT
    SINGLE_ARC_DOWN_AND_LEFT = "\u256e"  # ╮
    # BOX DRAWINGS LIGHT ARC UP AND LEFT
    SINGLE_ARC_UP_AND_LEFT = "\u256f"  # ╯
    # BOX DRAWINGS LIGHT ARC UP AND RIGHT
    SINGLE_ARC_UP_AND_RIGHT = "\u2570"  # ╰

    # HEAVY (thick single-line) characters
    # BOX DRAWINGS HEAVY HORIZONTAL
    HEAVY_HORIZONTAL = "\u2501"  # ━
    # BOX DRAWINGS HEAVY VERTICAL
    HEAVY_VERTICAL = "\u2503"  # ┃
    # BOX DRAWINGS HEAVY DOWN AND RIGHT
    HEAVY_DOWN_AND_RIGHT = "\u250f"  # ┏
    # BOX DRAWINGS HEAVY DOWN AND LEFT
    HEAVY_DOWN_AND_LEFT = "\u2513"  # ┓
    # BOX DRAWINGS HEAVY UP AND RIGHT
    HEAVY_UP_AND_RIGHT = "\u2517"  # ┗
    # BOX DRAWINGS HEAVY UP AND LEFT
    HEAVY_UP_AND_LEFT = "\u251b"  # ┛
    # BOX DRAWINGS HEAVY VERTICAL AND RIGHT
    HEAVY_VERTICAL_AND_RIGHT = "\u2523"  # ┣
    # BOX DRAWINGS HEAVY VERTICAL AND LEFT
    HEAVY_VERTICAL_AND_LEFT = "\u252b"  # ┫
    # BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
    HEAVY_DOWN_AND_HORIZONTAL = "\u2533"  # ┳
    # BOX DRAWINGS HEAVY_UP_AND_HORIZONTAL (Unicode: BOX DRAWINGS HEAVY UP AND HORIZONTAL)
    HEAVY_UP_AND_HORIZONTAL = "\u253b"  # ┻
    # BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
    HEAVY_VERTICAL_AND_HORIZONTAL = "\u254b"  # ╋
    # BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL
    HEAVY_DOUBLE_DASH_HORIZONTAL = "\u254d"  # ╍
    # BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL
    HEAVY_DOUBLE_DASH_VERTICAL = "\u254f"  # ╏

    # DOUBLE (parallel line) characters
    # BOX DRAWINGS DOUBLE HORIZONTAL
    DOUBLE_HORIZONTAL = "\u2550"  # ═
    # BOX DRAWINGS DOUBLE VERTICAL
    DOUBLE_VERTICAL = "\u2551"  # ║
    # BOX DRAWINGS DOUBLE DOWN AND RIGHT
    DOUBLE_DOWN_AND_RIGHT = "\u2554"  # ╔
    # BOX DRAWINGS DOUBLE DOWN AND LEFT
    DOUBLE_DOWN_AND_LEFT = "\u2557"  # ╗
    # BOX DRAWINGS DOUBLE UP AND RIGHT
    DOUBLE_UP_AND_RIGHT = "\u255a"  # ╚
    # BOX DRAWINGS DOUBLE UP AND LEFT
    DOUBLE_UP_AND_LEFT = "\u255d"  # ╝
    # BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
    DOUBLE_VERTICAL_AND_RIGHT = "\u2560"  # ╠
    # BOX DRAWINGS DOUBLE VERTICAL AND LEFT
    DOUBLE_VERTICAL_AND_LEFT = "\u2563"  # ╣
    # BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
    DOUBLE_DOWN_AND_HORIZONTAL = "\u2566"  # ╦
    # BOX DRAWINGS DOUBLE UP AND HORIZONTAL
    DOUBLE_UP_AND_HORIZONTAL = "\u2569"  # ╩
    # BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
    DOUBLE_VERTICAL_AND_HORIZONTAL = "\u256c"  # ╬

    # MIXED single and double line characters
    # BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
    DOUBLE_RIGHT_AND_SINGLE_DOWN = "\u2552"  # ╒
    # BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
    SINGLE_RIGHT_AND_DOUBLE_DOWN = "\u2553"  # ╓
    # BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
    DOUBLE_LEFT_AND_SINGLE_DOWN = "\u2555"  # ╕
    # BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
    SINGLE_LEFT_AND_DOUBLE_DOWN = "\u2556"  # ╖
    # BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
    DOUBLE_RIGHT_AND_SINGLE_UP = "\u2558"  # ╘
    # BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
    SINGLE_RIGHT_AND_DOUBLE_UP = "\u2559"  # ╙
    # BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
    DOUBLE_LEFT_AND_SINGLE_UP = "\u255b"  # ╛
    # BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
    SINGLE_LEFT_AND_DOUBLE_UP = "\u255c"  # ╜
    # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
    DOUBLE_VERTICAL_AND_SINGLE_RIGHT = "\u255e"  # ╞
    # BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
    SINGLE_VERTICAL_AND_DOUBLE_RIGHT = "\u255f"  # ╟
    # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
    DOUBLE_VERTICAL_AND_SINGLE_LEFT = "\u2561"  # ╡
    # BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
    SINGLE_VERTICAL_AND_DOUBLE_LEFT = "\u2562"  # ╢
    # BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
    DOUBLE_HORIZONTAL_AND_SINGLE_DOWN = "\u2564"  # ╤
    # BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
    SINGLE_HORIZONTAL_AND_DOUBLE_DOWN = "\u2565"  # ╥
    # BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
    DOUBLE_HORIZONTAL_AND_SINGLE_UP = "\u2567"  # ╧
    # BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
    SINGLE_HORIZONTAL_AND_DOUBLE_UP = "\u2568"  # ╨
    # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
    DOUBLE_HORIZONTAL_AND_SINGLE_VERTICAL = "\u256a"  # ╪
    # BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
    SINGLE_HORIZONTAL_AND_DOUBLE_VERTICAL = "\u256b"  # ╫

    def __str__(self):
        return self.value

    def __repr__(self):
        return self.value