__main__.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import argparse
  2. import sys
  3. from typing import TYPE_CHECKING, Optional
  4. from . import __version__ as version
  5. from . import create_markdown
  6. from .renderers.markdown import MarkdownRenderer
  7. from .renderers.rst import RSTRenderer
  8. if TYPE_CHECKING:
  9. from .core import BaseRenderer
  10. from .markdown import Markdown
  11. def _md(args: argparse.Namespace) -> "Markdown":
  12. if args.plugin:
  13. plugins = args.plugin
  14. else:
  15. # default plugins
  16. plugins = ["strikethrough", "footnotes", "table", "speedup"]
  17. if args.renderer == "rst":
  18. renderer: "BaseRenderer" = RSTRenderer()
  19. elif args.renderer == "markdown":
  20. renderer = MarkdownRenderer()
  21. else:
  22. renderer = args.renderer
  23. return create_markdown(
  24. escape=args.escape,
  25. hard_wrap=args.hardwrap,
  26. renderer=renderer,
  27. plugins=plugins,
  28. )
  29. def _output(text: str, args: argparse.Namespace) -> None:
  30. if args.output:
  31. with open(args.output, "w") as f:
  32. f.write(text)
  33. else:
  34. print(text)
  35. CMD_HELP = """Mistune, a sane and fast python markdown parser.
  36. Here are some use cases of the command line tool:
  37. $ python -m mistune -m "Hi **Markdown**"
  38. <p>Hi <strong>Markdown</strong></p>
  39. $ python -m mistune -f README.md
  40. <p>...
  41. $ cat README.md | python -m mistune
  42. <p>...
  43. """
  44. def cli() -> None:
  45. parser = argparse.ArgumentParser(
  46. prog="python -m mistune",
  47. description=CMD_HELP,
  48. formatter_class=argparse.RawDescriptionHelpFormatter,
  49. )
  50. parser.add_argument(
  51. "-m",
  52. "--message",
  53. help="the markdown message to convert",
  54. )
  55. parser.add_argument(
  56. "-f",
  57. "--file",
  58. help="the markdown file to convert",
  59. )
  60. parser.add_argument(
  61. "-p",
  62. "--plugin",
  63. metavar="NAME",
  64. action="extend",
  65. nargs="+",
  66. help="specifiy a plugin to use",
  67. )
  68. parser.add_argument(
  69. "--escape",
  70. action="store_true",
  71. help="turn on escape option",
  72. )
  73. parser.add_argument(
  74. "--hardwrap",
  75. action="store_true",
  76. help="turn on hardwrap option",
  77. )
  78. parser.add_argument(
  79. "-o",
  80. "--output",
  81. help="write the rendered result into file",
  82. )
  83. parser.add_argument(
  84. "-r",
  85. "--renderer",
  86. default="html",
  87. help="specify the output renderer",
  88. )
  89. parser.add_argument("--version", action="version", version="mistune " + version)
  90. args = parser.parse_args()
  91. message = args.message
  92. if not message and not args.file:
  93. message = read_stdin()
  94. if message:
  95. md = _md(args)
  96. text = md(message)
  97. assert isinstance(text, str)
  98. _output(text, args)
  99. elif args.file:
  100. md = _md(args)
  101. text = md.read(args.file)[0]
  102. assert isinstance(text, str)
  103. _output(text, args)
  104. else:
  105. print("You MUST specify a message or file")
  106. sys.exit(1)
  107. def read_stdin() -> Optional[str]:
  108. is_stdin_pipe = not sys.stdin.isatty()
  109. if is_stdin_pipe:
  110. return sys.stdin.read()
  111. else:
  112. return None
  113. if __name__ == "__main__":
  114. cli()