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