|
@ -0,0 +1,121 @@ |
|
|
|
|
|
""" |
|
|
|
|
|
Jeffery Russell |
|
|
|
|
|
2019-4-21 |
|
|
|
|
|
|
|
|
|
|
|
Simple program to reformat paragraphs in markdown text files |
|
|
|
|
|
to follow a specific col limit. |
|
|
|
|
|
""" |
|
|
|
|
|
|
|
|
|
|
|
import os |
|
|
|
|
|
import sys |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def formatChunk(stringContent, charLimit): |
|
|
|
|
|
""" |
|
|
|
|
|
Formats a markdown section with with a specific |
|
|
|
|
|
col limit. This only makes changes if the section is a |
|
|
|
|
|
paragraph and nothing else. |
|
|
|
|
|
|
|
|
|
|
|
The only guarantee for the input is that there |
|
|
|
|
|
are no lines which only contain a new line or space. |
|
|
|
|
|
|
|
|
|
|
|
:param stringContent: string of markdown chunk |
|
|
|
|
|
:param charLimit: max character limit |
|
|
|
|
|
:return: formatted string |
|
|
|
|
|
""" |
|
|
|
|
|
if len(stringContent.strip(" ")) == 0: |
|
|
|
|
|
return "" |
|
|
|
|
|
elif not stringContent[0].isalpha(): |
|
|
|
|
|
return stringContent |
|
|
|
|
|
result = "" |
|
|
|
|
|
line = "" |
|
|
|
|
|
stringContent = stringContent.replace("\n", " ") |
|
|
|
|
|
words = stringContent.split(" ") |
|
|
|
|
|
|
|
|
|
|
|
for word in words: |
|
|
|
|
|
if len(line) == 0 or len(line) + len(word) < charLimit: |
|
|
|
|
|
if not len(line) == 0: |
|
|
|
|
|
line = line + " " |
|
|
|
|
|
line = line + word |
|
|
|
|
|
else: |
|
|
|
|
|
result = result + line + "\n" |
|
|
|
|
|
line = word |
|
|
|
|
|
if line != "": |
|
|
|
|
|
result = result + line + "\n" |
|
|
|
|
|
return result |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def writeToFile(fileName, content): |
|
|
|
|
|
""" |
|
|
|
|
|
Writes to a file, overwriting the existing |
|
|
|
|
|
output. |
|
|
|
|
|
:param fileName: |
|
|
|
|
|
:param content: |
|
|
|
|
|
:return: |
|
|
|
|
|
""" |
|
|
|
|
|
f = open(fileName, "w+") |
|
|
|
|
|
f.write(content) |
|
|
|
|
|
f.close() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def wrapMarkdownParagraphsToColLimit(fileName, charLimit): |
|
|
|
|
|
""" |
|
|
|
|
|
Breaks apart a markdown file into chunks. A chunks are |
|
|
|
|
|
separated by a blank lines. Each chunk is then |
|
|
|
|
|
rendered according to our 80 char rules defined |
|
|
|
|
|
in the formatChunk section. |
|
|
|
|
|
:param fileName: |
|
|
|
|
|
:param charLimit: |
|
|
|
|
|
:return: |
|
|
|
|
|
""" |
|
|
|
|
|
result = "" |
|
|
|
|
|
tempResult = "" |
|
|
|
|
|
with open(fileName) as file: |
|
|
|
|
|
for line in file: |
|
|
|
|
|
if line.strip(" ") == "\n": |
|
|
|
|
|
result = result + formatChunk(tempResult, charLimit) |
|
|
|
|
|
tempResult = "" |
|
|
|
|
|
result = result + "\n" |
|
|
|
|
|
else: |
|
|
|
|
|
tempResult = tempResult + line |
|
|
|
|
|
print(line) |
|
|
|
|
|
if tempResult != "": |
|
|
|
|
|
result = result + formatChunk(tempResult, charLimit) |
|
|
|
|
|
return result |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def print_usage(): |
|
|
|
|
|
""" |
|
|
|
|
|
Prints script usage. |
|
|
|
|
|
:return: |
|
|
|
|
|
""" |
|
|
|
|
|
print("Usage: file name -t (optional)") |
|
|
|
|
|
print("\t-p simply prints the formatted output.") |
|
|
|
|
|
print("\tfile name -- runs the command overwriting the existing file.") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def main(): |
|
|
|
|
|
""" |
|
|
|
|
|
Checks command line input and calls the proper formatting |
|
|
|
|
|
functions. |
|
|
|
|
|
:return: |
|
|
|
|
|
""" |
|
|
|
|
|
if len(sys.argv) > 1: |
|
|
|
|
|
fileName = os.getcwd() + "/" + sys.argv[1] |
|
|
|
|
|
if len(sys.argv) == 3 and sys.argv[2].lower() == "-p": |
|
|
|
|
|
print(wrapMarkdownParagraphsToColLimit(fileName, 70)) |
|
|
|
|
|
else: |
|
|
|
|
|
writeToFile(fileName, |
|
|
|
|
|
wrapMarkdownParagraphsToColLimit(fileName, 70)) |
|
|
|
|
|
else: |
|
|
|
|
|
print_usage() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
""" |
|
|
|
|
|
Makes sure that other scripts don't execute the main |
|
|
|
|
|
""" |
|
|
|
|
|
if __name__ == '__main__': |
|
|
|
|
|
try: |
|
|
|
|
|
main() |
|
|
|
|
|
except KeyboardInterrupt: |
|
|
|
|
|
panic() |