""" 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()