"""
|
|
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 = ""
|
|
inCodeBlock = False
|
|
|
|
with open(fileName) as file:
|
|
for line in file:
|
|
|
|
if line.startswith("```"):
|
|
inCodeBlock = not inCodeBlock
|
|
result = result + line
|
|
elif inCodeBlock:
|
|
result = result + line
|
|
elif line.strip(" ") == "\n":
|
|
result = result + formatChunk(tempResult, charLimit)
|
|
tempResult = ""
|
|
result = result + "\n"
|
|
else:
|
|
tempResult = tempResult + 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()
|