aboutsummaryrefslogtreecommitdiff
path: root/generator.py
diff options
context:
space:
mode:
authorOxbian <got.dacs@slmail.me>2023-06-24 21:40:36 +0200
committerOxbian <got.dacs@slmail.me>2023-06-24 21:40:36 +0200
commit1e0156df7c1efd7cfe013adb90eaa9dc37677643 (patch)
tree819aa85b3cbe118c95babebda75dab0d86e85f35 /generator.py
downloadblog-generator-1e0156df7c1efd7cfe013adb90eaa9dc37677643.tar.gz
blog-generator-1e0156df7c1efd7cfe013adb90eaa9dc37677643.zip
Init commit
Diffstat (limited to 'generator.py')
-rw-r--r--generator.py127
1 files changed, 127 insertions, 0 deletions
diff --git a/generator.py b/generator.py
new file mode 100644
index 0000000..793eb28
--- /dev/null
+++ b/generator.py
@@ -0,0 +1,127 @@
+import os
+import dotenv
+from markdown_parser import *
+from datetime import datetime
+
+def md2html(filename, env_vars):
+ """
+ Create the html webpage from template and markdown content
+ filename: file to transform into HTML
+ env_vars: dictionnary of env variables
+ return: a dictionnary containing title, metadata, local path, content for HTML
+ """
+ # Getting parsed content of markdown file & page template
+ data = parsemd(filename, env_vars)
+ template = open(env_vars['template_page'], 'r').read()
+
+ # Generating the HTML page
+ output = open(env_vars['pages_path'] + '/' + filename.split('.')[0] + '.html', 'w')
+ output.write(template.replace("$CONTENT", data['content']).replace("$TITLE", data['title']).
+ replace("$DATE", data['date']).replace("$DESC", data['description']))
+ output.close()
+
+ return data
+
+
+def generatePageXML(data, env_vars):
+ """
+ Generate a RSS / Atom post for the page
+ data: dictionnary generated by the markdown parser
+ env_vars: dictionnary of env variables
+ return: RSS / Atom post
+ """
+ template = open(env_vars['template_atom_post'], 'r').read()
+ date = datetime.strptime(data['date'],"%d-%m-%Y").isoformat() + "Z"
+ return template.replace("$TITLE", data['title']).replace("$DATE", data['date']).replace("$CONTENT",
+ data['content']).replace("$URL", env_vars['website_url'] + data['filepath'])
+
+
+def generateAtomFeed(posts, env_vars):
+ """
+ Generate a RSS / Atom feed
+ posts: list of data get from markdown pages
+ env_vars: dictionnary of env variables
+ """
+ # Generate RSS / Atom post
+ atom_content = []
+ for post in posts:
+ generatePageXML(post, env_vars)
+
+ # Generate RSS / atom feed
+ template = open(env_vars['template_atom_feed'], 'r').read()
+ output = open(env_vars['parent_path'] + '/atom.xml', 'w')
+ output.write(template.replace("$CONTENT", atom_content))
+ output.close()
+
+
+def generateIndex(data, env_vars):
+ """
+ Generate the main page
+ data: list of data get from markdown pages
+ env_vars: dictionnary of env variables
+ """
+ # Create the index content
+ index_content = "<ul>"
+ for page in data:
+ index_content += '<li><a href="' + page['filepath'] + '">' + page['title'] + '</a><p>'
+ + page['date'] + '</p></li>\n'
+ index_content += "</ul>"
+
+ # Generate main page
+ template = open(env_vars['template_index'], 'r').read()
+ output = open(env_vars['parent_path'] + '/index.html', 'w')
+ output.write(template.replace("$CONTENT", index_content))
+ output.close()
+
+
+if __name__=="__main__":
+ # Load .env file into python environment
+ dotenv.load_dotenv()
+
+ # Color for print
+ color = { 'red': '\033[1;31m', 'green' : '\033[1;32m', 'end' : '\033[0m'}
+
+ # Checking if all environment variable are present & setup
+ env = ['PARENT_PATH', 'PAGES_PATH', 'MARKDOWN_PATH', 'TEMPLATE_PAGE', 'TEMPLATE_ATOM_POST',
+ 'TEMPLATE_ATOM_FEED', 'WEBSITE_URL', 'TEMPLATE_INDEX']
+ for variable in env:
+ if variable not in os.environ:
+ print(f"{color['red']}{variable} isn't present in the .env file, please fix this {color['end']}")
+ quit()
+
+ if (os.environ.get(variable) or '') == '':
+ print(f"{color['red']}{variable} isn't setup in the .env file, please fix this {color['end']}")
+ quit()
+
+ # Getting env variable
+ env_vars = { 'parent_path' : os.environ.get('PARENT_PATH'), 'pages_path' : os.environ.get('PAGES_PATH')
+ , 'markdown_path' : os.environ.get('MARKDOWN_PATH'), 'template_page' : os.environ.get('TEMPLATE_PAGE')
+ , 'template_atom_post' : os.environ.get('TEMPLATE_PAGE'), 'template_atom_feed' : os.environ.get('TEMPLATE_ATOM_FEED')
+ , 'website_url' : os.environ.get('WEBSITE_URL'), 'template_index' : os.environ.get('TEMPLATE_INDEX') }
+
+ # Checking if generate folder exist to remove previouly generated content, if not create it
+ if os.path.exists(env_vars['pages_path']):
+ for file in os.listdir(env_vars['pages_path']):
+ os.remove(env_vars['pages_path'] + '/' + file)
+ os.remove(env_vars['parent_path'] + '/atom.xml')
+ os.remove(env_vars['parent_path'] + '/index.html')
+ else:
+ os.mkdir(env_vars['pages_path'])
+
+ # Generate all markdown file
+ for file in os.listdir(env_vars['markdown_path']):
+
+ # Generating HTML page
+ print(f"{color['green']}Generating file: {file} {color['end']}")
+ data = [] # A list for data generated by md2html
+ data.append(md2html(file, env_vars))
+
+ sorted_data = sorted(data, key=lambda x:datetime.strptime(x['date'], '%d/%m/%Y'))
+
+ # Generating atom feed
+ print(f"{color['green']}Generating RSS / Atom feed {color['end']}")
+ generateAtomFeed(data, env_vars)
+
+ # Generating index
+ print(f"{color['green']}Generating main page {color['end']}")
+ generateIndex(data, env_vars) \ No newline at end of file
ArKa projects. All rights to me, and your next child right arm.