Spaces:
Runtime error
Runtime error
#!/usr/bin/env python | |
""" | |
CLI interface to markdown-it-py | |
Parse one or more markdown files, convert each to HTML, and print to stdout. | |
""" | |
from __future__ import annotations | |
import argparse | |
from collections.abc import Iterable, Sequence | |
import sys | |
from markdown_it import __version__ | |
from markdown_it.main import MarkdownIt | |
version_str = "markdown-it-py [version {}]".format(__version__) | |
def main(args: Sequence[str] | None = None) -> int: | |
namespace = parse_args(args) | |
if namespace.filenames: | |
convert(namespace.filenames) | |
else: | |
interactive() | |
return 0 | |
def convert(filenames: Iterable[str]) -> None: | |
for filename in filenames: | |
convert_file(filename) | |
def convert_file(filename: str) -> None: | |
""" | |
Parse a Markdown file and dump the output to stdout. | |
""" | |
try: | |
with open(filename, "r", encoding="utf8", errors="ignore") as fin: | |
rendered = MarkdownIt().render(fin.read()) | |
print(rendered, end="") | |
except OSError: | |
sys.stderr.write(f'Cannot open file "{filename}".\n') | |
sys.exit(1) | |
def interactive() -> None: | |
""" | |
Parse user input, dump to stdout, rinse and repeat. | |
Python REPL style. | |
""" | |
print_heading() | |
contents = [] | |
more = False | |
while True: | |
try: | |
prompt, more = ("... ", True) if more else (">>> ", True) | |
contents.append(input(prompt) + "\n") | |
except EOFError: | |
print("\n" + MarkdownIt().render("\n".join(contents)), end="") | |
more = False | |
contents = [] | |
except KeyboardInterrupt: | |
print("\nExiting.") | |
break | |
def parse_args(args: Sequence[str] | None) -> argparse.Namespace: | |
"""Parse input CLI arguments.""" | |
parser = argparse.ArgumentParser( | |
description="Parse one or more markdown files, " | |
"convert each to HTML, and print to stdout", | |
# NOTE: Remember to update README.md w/ the output of `markdown-it -h` | |
epilog=( | |
f""" | |
Interactive: | |
$ markdown-it | |
markdown-it-py [version {__version__}] (interactive) | |
Type Ctrl-D to complete input, or Ctrl-C to exit. | |
>>> # Example | |
... > markdown *input* | |
... | |
<h1>Example</h1> | |
<blockquote> | |
<p>markdown <em>input</em></p> | |
</blockquote> | |
Batch: | |
$ markdown-it README.md README.footer.md > index.html | |
""" | |
), | |
formatter_class=argparse.RawDescriptionHelpFormatter, | |
) | |
parser.add_argument("-v", "--version", action="version", version=version_str) | |
parser.add_argument( | |
"filenames", nargs="*", help="specify an optional list of files to convert" | |
) | |
return parser.parse_args(args) | |
def print_heading() -> None: | |
print("{} (interactive)".format(version_str)) | |
print("Type Ctrl-D to complete input, or Ctrl-C to exit.") | |
if __name__ == "__main__": | |
exit_code = main(sys.argv[1:]) | |
sys.exit(exit_code) | |