astanin / python-tabulate

Pretty-print tabular data in Python, a library and a command-line utility. Repository migrated from bitbucket.org/astanin/python-tabulate.
https://pypi.org/project/tabulate/
MIT License
2.08k stars 162 forks source link

Feature Request: MarkupHeader #301

Open WolfgangFahl opened 9 months ago

WolfgangFahl commented 9 months ago

To output multiple tables in different formats i often need a MarkupHeader - i created the following helper class today to streamline the process:

"""
Created on 19.11.2023

@author: wf
"""
class MarkupHeader:
    """
    Helper to generate tabulate compatible markup header lines.
    """
    @classmethod
    def get_markup(cls, title: str, markup_format: str, level: int = 1) -> str:
        """
        Generates a formatted header string based on the specified markup format.

        Args:
            title (str): The title to be formatted as the header.
            markup_format (str): The markup format for the header.
            level (int): The section level to generate a header for.

        Returns:
            str: The formatted header string.
        """
        if markup_format == "github":
            return f"{'#' * level} {title}\n"
        elif markup_format == "mediawiki":
            return f"{'=' * level} {title} {'=' * level}\n"
        elif markup_format == "html" or markup_format=="unsafehtml":
            return f"<h{level}>{title}</h{level}>"
        elif markup_format == "latex":
            if level == 1:
                return f"\\section{{{title}}}"
            elif level == 2:
                return f"\\subsection{{{title}}}"
            elif level == 3:
                return f"\\subsubsection{{{title}}}"
        elif markup_format == "textile":
            return f"h{level}. {title}"
        elif markup_format == "plain":
            return title
        else:
            # Default case for other formats
            return title

Here is the unit test for it:

"""
Created on 2023-11-19

@author: wf
"""
from ngwidgets.markup_header import MarkupHeader
from ngwidgets.basetest import Basetest

class TestsMarkupHeader(Basetest):
    """
    Test markup header handling.
    """

    def test_markup_header(self):
        """
        Test all available tabulate markup formats to create
        valid headers for different levels.
        """
        test_title = "Test Title"
        formats = [
            ("plain", 1, f"{test_title}"),
            ("simple", 1, f"{test_title}"),
            ("github", 1, f"# {test_title}"),
            ("github", 2, f"## {test_title}"),
            ("github", 3, f"### {test_title}"),
            ("grid", 1, f"{test_title}"),
            ("simple_grid", 1, f"{test_title}"),
            ("rounded_grid", 1, f"{test_title}"),
            ("heavy_grid", 1, f"{test_title}"),
            ("mixed_grid", 1, f"{test_title}"),
            ("double_grid", 1, f"{test_title}"),
            ("fancy_grid", 1, f"{test_title}"),
            ("outline", 1, f"{test_title}"),
            ("simple_outline", 1, f"{test_title}"),
            ("rounded_outline", 1, f"{test_title}"),
            ("heavy_outline", 1, f"{test_title}"),
            ("mixed_outline", 1, f"{test_title}"),
            ("double_outline", 1, f"{test_title}"),
            ("fancy_outline", 1, f"{test_title}"),
            ("pipe", 1, f"{test_title}"),
            ("orgtbl", 1, f"{test_title}"),
            ("asciidoc", 1, f"{test_title}"),
            ("jira", 1, f"{test_title}"),
            ("presto", 1, f"{test_title}"),
            ("pretty", 1, f"{test_title}"),
            ("psql", 1, f"{test_title}"),
            ("rst", 1, f"{test_title}"),
            ("mediawiki", 1, f"= {test_title} ="),
            ("mediawiki", 2, f"== {test_title} =="),
            ("mediawiki", 3, f"=== {test_title} ==="),
            ("moinmoin", 1, f"{test_title}"),
            ("youtrack", 1, f"{test_title}"),
            ("html", 1, f"<h1>{test_title}</h1>"),
            ("html", 2, f"<h2>{test_title}</h2>"),
            ("html", 3, f"<h3>{test_title}</h3>"),
            ("unsafehtml", 1, f"<h1>{test_title}</h1>"),
            ("unsafehtml", 2, f"<h2>{test_title}</h2>"),
            ("unsafehtml", 3, f"<h3>{test_title}</h3>"),
            ("latex", 1, f"\\section{{{test_title}}}"),
            ("latex", 2, f"\\subsection{{{test_title}}}"),
            ("latex", 3, f"\\subsubsection{{{test_title}}}"),
            ("latex_raw", 1, f"{test_title}"),
            ("latex_booktabs", 1, f"{test_title}"),
            ("latex_longtable", 1, f"{test_title}"),
            ("textile", 1, f"h1. {test_title}"),
            ("textile", 2, f"h2. {test_title}"),
            ("textile", 3, f"h3. {test_title}"),
            ("tsv", 1, f"{test_title}")
        ]

        for markup_format, level, expected_content in formats:
            with self.subTest(f"Testing format: {markup_format}, level: {level}"):
                header = MarkupHeader.get_markup(test_title, markup_format, level)
                self.assertEqual(header.strip(), expected_content)