fastapi / typer

Typer, build great CLIs. Easy to code. Based on Python type hints.
https://typer.tiangolo.com/
MIT License
15.37k stars 655 forks source link

Get the typer output with html format to provide it to termynal #538

Open GreNait opened 1 year ago

GreNait commented 1 year ago

First Check

Commit to Help

Example Code

script -q -c "python data_stream_measurement/main.py --help" test.out
cat test.out | ./ansi2html.sh test.html

Description

Within the typer documentation, termynal is used to interactively show the typer features etc. They are also all styled like the typical terminal output. It would be awesome, if I could replicate this for my typer app documentation.

I tried to capture the terminal styling with several approaches:

Is there a way, to get the typer output saved into a file, with the html styling? So I could copy that to my markdown?

Operating System

Linux

Operating System Details

Ubuntu 20.04

Typer Version

0.7.0

Python Version

3.8.10

Additional Context

No response

heiskane commented 11 months ago

This should work

script -q -c "python /tmp/asd.py --help" | ansi2html > asd.html

That being said i guess it would be nice to have something like --color-always option like with the ls-command:

ls -la --color=always | ansi2html > asd.html
NikosAlexandris commented 10 months ago

That being said i guess it would be nice to have something like --color-always option like with the ls-command:

Colors appear just fine here, after script -q -c "clitool --help" | ansi2html > clitoolhelp.html and viewing the latter file in a browser.

bckohan commented 8 months ago

Another approach is to use the rich export functions:

If you're using sphinx-doc with reStructuredText, I wrote a directive extension to do this for you. Unfortunately typer has no official way to access the console object, so a monkey patch is involved.

NikosAlexandris commented 8 months ago

If you're using sphinx-doc with reStructuredText, I wrote a directive extension to do this for you. Unfortunately typer has no official way to access the console object, so a monkey patch is involved.

Nice work! Pity, I am trying out Material MkDocs :-/

daneah commented 3 months ago

In case anyone wants to integrate this kind of thing directly into their application, here's an example of a command I created for our Typer application to get the full help output as HTML:

import typer
from typer.cli import docs, state

help = typer.Typer()

@help.command()
def view(ctx: typer.Context):
    """View HTML help for this tool."""

    state.module = HELP_DOCS_TARGET  # e.g. "myapp.main"

    help_docs_gen_dir = Path(tempfile.mkdtemp())
    markdown = help_docs_gen_dir / "help.md"
    html = help_docs_gen_dir / "help.html"

    docs(ctx, name=COMMAND_NAME, title=MAIN_TITLE, output=markdown)

    # Convert Markdown containing Rich console syntax to HTML
    markdown_content = markdown.read_text()
    rich_text = Text.from_markup(markdown_content)
    formatted_markdown_content = Markdown(str(rich_text))

    console = Console(record=True, file=open(os.devnull, "w"))
    console.print(formatted_markdown_content)
    console.save_html(str(html))

    print(f"Docs saved to: {html}")
    typer.launch(f"file://{html}")

It's possible this will be greatly simplified and improved with #819