78 lines
2.0 KiB
Python
Executable File
78 lines
2.0 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
import argparse
|
|
import sys
|
|
import re
|
|
|
|
|
|
def get_opts():
|
|
parser = argparse.ArgumentParser(
|
|
description="Line wrapper for markdown.",
|
|
formatter_class=argparse.RawTextHelpFormatter,
|
|
)
|
|
parser.add_argument(
|
|
"-w",
|
|
help="Line width. Defaults to 78",
|
|
action="store",
|
|
default=78,
|
|
type=int,
|
|
)
|
|
parser.add_argument(
|
|
"markdown",
|
|
help="Filename to read. - for stdin",
|
|
action="store",
|
|
default="-",
|
|
nargs="?",
|
|
)
|
|
args = parser.parse_args()
|
|
return args
|
|
|
|
|
|
def main():
|
|
opts = get_opts()
|
|
if opts.markdown == "-":
|
|
fp = sys.stdin
|
|
else:
|
|
fp = open(opts.markdown, "rt")
|
|
markdown = fp.read().splitlines()
|
|
|
|
in_code = False
|
|
|
|
for i, row in enumerate(markdown):
|
|
in_table = row.startswith("|")
|
|
if row.startswith("```"):
|
|
in_code = not in_code
|
|
|
|
if not any((in_code, in_table)):
|
|
row = row.rstrip(" ")
|
|
if len(row.strip(" ")) == 0:
|
|
row = ""
|
|
if len(row) > opts.w:
|
|
# Row is long, let's cut it
|
|
leading_spaces = len(row) - len(row.lstrip(" -*"))
|
|
row_split = row.split(" ")
|
|
new_row = []
|
|
new_padding = ""
|
|
while len(row_split) > 0:
|
|
while (
|
|
len(row_split) > 0
|
|
and len(new_padding)
|
|
+ len(" ".join(new_row))
|
|
+ len(row_split[0])
|
|
< opts.w
|
|
):
|
|
new_row.append(row_split.pop(0))
|
|
if len(new_row) == 0:
|
|
new_row.append(row_split.pop(0))
|
|
print(new_padding + " ".join(new_row))
|
|
new_row = []
|
|
new_padding = " " * leading_spaces
|
|
row = None
|
|
|
|
if not row is None:
|
|
print(row)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|