You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			136 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			136 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
import argparse
 | 
						|
import sys
 | 
						|
from typing import TYPE_CHECKING, Optional
 | 
						|
 | 
						|
from . import __version__ as version
 | 
						|
from . import create_markdown
 | 
						|
from .renderers.markdown import MarkdownRenderer
 | 
						|
from .renderers.rst import RSTRenderer
 | 
						|
 | 
						|
if TYPE_CHECKING:
 | 
						|
    from .core import BaseRenderer
 | 
						|
    from .markdown import Markdown
 | 
						|
 | 
						|
 | 
						|
def _md(args: argparse.Namespace) -> "Markdown":
 | 
						|
    if args.plugin:
 | 
						|
        plugins = args.plugin
 | 
						|
    else:
 | 
						|
        # default plugins
 | 
						|
        plugins = ["strikethrough", "footnotes", "table", "speedup"]
 | 
						|
 | 
						|
    if args.renderer == "rst":
 | 
						|
        renderer: "BaseRenderer" = RSTRenderer()
 | 
						|
    elif args.renderer == "markdown":
 | 
						|
        renderer = MarkdownRenderer()
 | 
						|
    else:
 | 
						|
        renderer = args.renderer
 | 
						|
    return create_markdown(
 | 
						|
        escape=args.escape,
 | 
						|
        hard_wrap=args.hardwrap,
 | 
						|
        renderer=renderer,
 | 
						|
        plugins=plugins,
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
def _output(text: str, args: argparse.Namespace) -> None:
 | 
						|
    if args.output:
 | 
						|
        with open(args.output, "w") as f:
 | 
						|
            f.write(text)
 | 
						|
    else:
 | 
						|
        print(text)
 | 
						|
 | 
						|
 | 
						|
CMD_HELP = """Mistune, a sane and fast python markdown parser.
 | 
						|
 | 
						|
Here are some use cases of the command line tool:
 | 
						|
 | 
						|
    $ python -m mistune -m "Hi **Markdown**"
 | 
						|
    <p>Hi <strong>Markdown</strong></p>
 | 
						|
 | 
						|
    $ python -m mistune -f README.md
 | 
						|
    <p>...
 | 
						|
 | 
						|
    $ cat README.md | python -m mistune
 | 
						|
    <p>...
 | 
						|
"""
 | 
						|
 | 
						|
 | 
						|
def cli() -> None:
 | 
						|
    parser = argparse.ArgumentParser(
 | 
						|
        prog="python -m mistune",
 | 
						|
        description=CMD_HELP,
 | 
						|
        formatter_class=argparse.RawDescriptionHelpFormatter,
 | 
						|
    )
 | 
						|
    parser.add_argument(
 | 
						|
        "-m",
 | 
						|
        "--message",
 | 
						|
        help="the markdown message to convert",
 | 
						|
    )
 | 
						|
    parser.add_argument(
 | 
						|
        "-f",
 | 
						|
        "--file",
 | 
						|
        help="the markdown file to convert",
 | 
						|
    )
 | 
						|
    parser.add_argument(
 | 
						|
        "-p",
 | 
						|
        "--plugin",
 | 
						|
        metavar="NAME",
 | 
						|
        action="extend",
 | 
						|
        nargs="+",
 | 
						|
        help="specifiy a plugin to use",
 | 
						|
    )
 | 
						|
    parser.add_argument(
 | 
						|
        "--escape",
 | 
						|
        action="store_true",
 | 
						|
        help="turn on escape option",
 | 
						|
    )
 | 
						|
    parser.add_argument(
 | 
						|
        "--hardwrap",
 | 
						|
        action="store_true",
 | 
						|
        help="turn on hardwrap option",
 | 
						|
    )
 | 
						|
    parser.add_argument(
 | 
						|
        "-o",
 | 
						|
        "--output",
 | 
						|
        help="write the rendered result into file",
 | 
						|
    )
 | 
						|
    parser.add_argument(
 | 
						|
        "-r",
 | 
						|
        "--renderer",
 | 
						|
        default="html",
 | 
						|
        help="specify the output renderer",
 | 
						|
    )
 | 
						|
    parser.add_argument("--version", action="version", version="mistune " + version)
 | 
						|
    args = parser.parse_args()
 | 
						|
 | 
						|
    message = args.message
 | 
						|
    if not message and not args.file:
 | 
						|
        message = read_stdin()
 | 
						|
 | 
						|
    if message:
 | 
						|
        md = _md(args)
 | 
						|
        text = md(message)
 | 
						|
        assert isinstance(text, str)
 | 
						|
        _output(text, args)
 | 
						|
    elif args.file:
 | 
						|
        md = _md(args)
 | 
						|
        text = md.read(args.file)[0]
 | 
						|
        assert isinstance(text, str)
 | 
						|
        _output(text, args)
 | 
						|
    else:
 | 
						|
        print("You MUST specify a message or file")
 | 
						|
        sys.exit(1)
 | 
						|
 | 
						|
 | 
						|
def read_stdin() -> Optional[str]:
 | 
						|
    is_stdin_pipe = not sys.stdin.isatty()
 | 
						|
    if is_stdin_pipe:
 | 
						|
        return sys.stdin.read()
 | 
						|
    else:
 | 
						|
        return None
 | 
						|
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
    cli()
 |