diff options
Diffstat (limited to 'markdown_parser.py')
-rw-r--r-- | markdown_parser.py | 133 |
1 files changed, 74 insertions, 59 deletions
diff --git a/markdown_parser.py b/markdown_parser.py index 403b9e4..b4bce38 100644 --- a/markdown_parser.py +++ b/markdown_parser.py @@ -1,135 +1,150 @@ import html -def parseline(line): + +def parse_line(line): """ - Parse a line of texte to replace HTML specialchars, link, and strong / emphased of markdown for HTML + Parse a line of texte to replace HTML specialchars, link, and strong + / emphased of markdown for HTML return: the line ready for HTML """ # Change &, <, > for HTML support html.escape(line) # Checking if there is strong or emphasized - while '*' in line: - line = line.replace('*', '<em>', 1) - line = line.replace('*', '</em>', 1) - while '**' in line: - line = line.replace('**', '<strong>', 1) - line = line.replace('**', '</strong>', 1) + while "*" in line: + line = line.replace("*", "<em>", 1) + line = line.replace("*", "</em>", 1) + while "**" in line: + line = line.replace("**", "<strong>", 1) + line = line.replace("**", "</strong>", 1) # Checking if there is image - while '![' in line and ']' in line: - title = line.split(']')[0].split('[')[1] - link = line.split(']')[1].split('(')[1].split(')')[0] - line = line.replace('', '<img src="' + link + '" alt="' + title + '"/>') - - # Checkinf if there is link - while '[' in line and ']' in line: - title = line.split(']')[0].split('[')[1] - link = line.split(']')[1].split('(')[1].split(')')[0] - line = line.replace('[' + title + '](' + link + ')', '<a href="' + link + '">' + title + '</a>') + while "![" in line and "]" in line: + title = line.split("]")[0].split("[")[1] + link = line.split("]")[1].split("(")[1].split(")")[0] + line = line.replace( + "", + '<img src="' + link + '" alt="' + title + '"/>', + ) + + # Checking if there is link + while "[" in line and "]" in line: + title = line.split("]")[0].split("[")[1] + link = line.split("]")[1].split("(")[1].split(")")[0] + line = line.replace( + "[" + title + "](" + link + ")", '<a href="' + link + '">' + title + "</a>" + ) return line -def parsemd(filepath, env_vars): +def parse_md(filepath, env_vars): """ - Parse the markdown file and return the content to put into the template page + Parse a markdown file and return the content to put into the template page env_vars: dictionnary of environment variable filepath: Filepath of the markdown file - return: a dictionnary containing title, metadata, local path, content for HTML + return: a dictionnary containing title, metadata, local path, content """ - content = {'content': '', 'title': '', 'date': '01-01-0001', 'description': '', 'tags' : [], 'filepath': env_vars['pages_path'].replace(env_vars['parent_path'] + '/', '') - + '/' + filepath.split('.')[0] + '.html'} - + content = { + "content": "", + "title": "", + "date": "01-01-0001", + "description": "", + "tags": [], + "filepath": env_vars["pages_path"].replace(env_vars["parent_path"] + "/", "") + + "/" + + filepath.split(".")[0] + + ".html", + } + inmeta, inquote, inpre, inul = False, False, False, False - - # Reading the content of the file and transform into html - for line in open(env_vars['markdown_path'] + '/' + filepath, "r"): + + # Reading the content of the file and transform into html + for line in open(env_vars["markdown_path"] + "/" + filepath, "r"): line = line.strip() # Open the metadata - if line.startswith('---'): + if line.startswith("---"): if inmeta: inmeta = False else: inmeta = True # Getting the date metadata - if inmeta and line.startswith('date:'): - content['date'] = line.split(':')[1].strip() - + if inmeta and line.startswith("date:"): + content["date"] = line.split(":")[1].strip() + # Getting the description metadata - if inmeta and line.startswith('description:'): - content['description'] = line.split(':')[1].strip() + if inmeta and line.startswith("description:"): + content["description"] = line.split(":")[1].strip() # Getting the tags metadata - if inmeta and line.startswith('tags:'): - tags = line.split(':')[1].split(',') + if inmeta and line.startswith("tags:"): + tags = line.split(":")[1].split(",") # Removing leading and ending white spaces for i in range(0, len(tags)): tags[i] = tags[i].strip() - content['tags'] = tags - + content["tags"] = tags + # Close quote if not quoting if inquote and not line.startswith(">"): - content['content'] += "</blockquote>\n" + content["content"] += "</blockquote>\n" inquote = False - + # Close list if not listing if inul and not line.startswith("-"): - content['content'] += "</li>\n</ul>\n" + content["content"] += "</li>\n</ul>\n" inul = False - + # Checking if it's a code block if line.startswith("```"): if inpre: - content['content'] += "</code></pre>\n" + content["content"] += "</code></pre>\n" - content['content'] += "<pre><code>" + line.lstrip("```") + content["content"] += "<pre><code>" + line.lstrip("```") inpre = True # Checking if it's a quote elif line.startswith(">"): if inquote: - content['content'] += parseline(line.lstrip("> ")) - else: - content['content'] += "<blockquote>" + parseline(line.lstrip("> ")) + content["content"] += parse_line(line.lstrip("> ")) + else: + content["content"] += "<blockquote>" + parse_line(line.lstrip("> ")) inquote = True # Checking if it's a list elif line.startswith("-") and not line.startswith("---"): if inul: - content['content'] += "</li>\n" - content['content'] += "\t<li>" + parseline(line.lstrip("- ")) + content["content"] += "</li>\n" + content["content"] += "\t<li>" + parse_line(line.lstrip("- ")) else: - content['content'] += "<ul>\n\t<li>" + parseline(line.lstrip("- ")) + content["content"] += "<ul>\n\t<li>" + parse_line(line.lstrip("- ")) inul = True - + # Checking if it's a title elif line.startswith("###"): - content['content'] += "<h3>" + parseline(line.lstrip("# ")) + "</h3>\n" + content["content"] += "<h3>" + parse_line(line.lstrip("# ")) + "</h3>\n" elif line.startswith("##"): - content['content'] += "<h2>" + parseline(line.lstrip("# ")) + "</h2>\n" + content["content"] += "<h2>" + parse_line(line.lstrip("# ")) + "</h2>\n" elif line.startswith("#"): - content['title'] += parseline(line.lstrip("# ")) + content["title"] += parse_line(line.lstrip("# ")) # else it's a paragraph elif line != " " and line != "" and not inmeta and not line.startswith("---"): - content['content'] += "<p>" + parseline(line) + "</p>\n" + content["content"] += "<p>" + parse_line(line) + "</p>\n" # Checking all balise are closed if inquote: - content['content'] += "</blockquote>\n" + content["content"] += "</blockquote>\n" inquote = False if inul: - content['content'] += "</li>\n</ul>\n" + content["content"] += "</li>\n</ul>\n" inul = False - + if inpre: - content['content'] += "</code></pre>\n" + content["content"] += "</code></pre>\n" inpre = False return content - |