import os
import html
articles_path = 'articles/'
generate_path = 'pages/'
atom_content = ""
index_content = "
Articles
"
"""Parse le fichier markdown et retourne le contenu à mettre dans notre page html"""
def parsemd(filename):
content = {'content': '', 'title': '', 'date': '', 'description': '', 'filename': generate_path + filename.split('.')[0] + '.html'}
inquote, inpre, inul = False, False, False
for line in open('../' + articles_path + filename, "r"):
line = line.strip()
# Récupère la date
if line.startswith('date:'):
content['date'] = line.split(':')[1].strip()
# Récupère la description
if line.startswith('description:'):
content['description'] = line.split(':')[1].strip()
# Ferme la citation si on ne cite plus
if inquote and not line.startswith(">"):
content['content'] += "\n"
inquote = False
# Ferme la liste si on ne liste plus
if inul and not line.startswith("-"):
content['content'] += "
\n"
inul = False
# Vérifie si on est dans un bloc de code
if line.startswith("```"):
if inpre:
content['content'] += "\n"
content['content'] += "" + line.lstrip("```")
inpre = True
# Vérifie si on est dans une citation
elif line.startswith(">"):
if inquote:
content['content'] += parseline(line.lstrip("> "))
else:
content['content'] += "" + parseline(line.lstrip("> "))
inquote = True
# Vérifie si on est dans un listing
elif line.startswith("-"):
if inul:
content['content'] += "\n"
content['content'] += "" + parseline(line.lstrip("- "))
else:
content['content'] += "- " + parseline(line.lstrip("- "))
inul = True
# Vérifie si on est dans un titre
elif line.startswith("###"):
content['content'] += "
" + parseline(line.lstrip("# ")) + "
\n"
elif line.startswith("##"):
content['content'] += "" + parseline(line.lstrip("# ")) + "
\n"
elif line.startswith("#"):
content['title'] += parseline(line.lstrip("# "))
# Sinon, on est dans un paragraphe
elif line != " " and line != "":
content['content'] += "" + parseline(line) + "
\n"
# Vérification que chaque balise est bien fermée
if inquote:
content['content'] += "
\n"
inquote = False
if inul:
content['content'] += "\n"
inul = False
if inpre:
content['content'] += "
\n"
inpre = False
return content
"""Parse une ligne de texte afin d'enlever les caractères spéciaux html, les liens, et symboles gras / italiques du markdown"""
def parseline(line):
# Change les &, <, > pour le support en HTML
html.escape(line)
# Vérifie si on a des italiques ou gras
while '*' in line:
line = line.replace('*', '', 1)
line = line.replace('*', '', 1)
while '**' in line:
line = line.replace('**', '', 1)
line = line.replace('**', '', 1)
# Vérifie si on a des images
while '![' in line and ']' in line:
title = line.split(']')[0].split('[')[1]
link = line.split(']')[1].split('(')[1].split(')')[0]
line = line.replace('', '
')
# Vérifie si on a des liens
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 + ')', '' + title + '')
return line
"""Fonction pour transformer un fichier markdown en page html"""
def md2html(filename):
content = parsemd(filename) # Contenu parsé de notre fichier markdown
template = open('page_template.html', 'r').read()
# Création du fichier html & ajout du contenu
output = open('../' + generate_path + filename.split('.')[0] + '.html', 'w')
output.write(template.replace("$CONTENT", content['content']).replace("$TITLE", content['title']).
replace("$DATE", content['date']).replace("$DESC", content['description']))
output.close()
# Génération du post Atom et de l'index
generatePageXML(content)
global index_content
index_content += '' + content['title'] + '\n'
""" Génère le post Atom"""
def generatePageXML(data):
global atom_content
template = open('atom_post_template.xml', 'r').read()
atom_content += template.replace("$TITLE", data['title']).replace("$DATE", data['date']).replace("$CONTENT",
data['content']).replace("$URL", "https://blog.arka.rocks/" + data['filename'])
""" Génère le fichier Atom"""
def generateAtom():
template = open('atom_template.xml', 'r').read()
output = open('../atom.xml', 'w')
output.write(template.replace("$CONTENT", atom_content))
output.close()
""" Génère l'index"""
def updateIndex():
template = open('index_template.html', 'r').read()
output = open('../index.html', 'w')
output.write(template.replace("$CONTENT", index_content + ''))
output.close()
if __name__=="__main__":
if not os.path.exists('../' + generate_path):
os.mkdir('../' + generate_path)
else: # Régénation du blog
for file in os.listdir('../' + generate_path):
os.remove('../' + generate_path + file)
os.remove('../atom.xml')
os.remove('../index.html')
for file in os.listdir('../' + articles_path):
print("Génération en cours du fichier: " + file)
md2html(file)
print("Génération du fichier RSS / Atom")
generateAtom()
print("Génération de l'index")
updateIndex()