aboutsummaryrefslogtreecommitdiff
path: root/generator.py
blob: bcc92827f94cd127e9b93764f8d9231134dc11fe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
import os
import sys
import shutil
from dotenv import load_dotenv
from markdown_parser import parse_md
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 = parse_md(filename, env_vars)
    template = open(env_vars['templates_folder'] + "/" + env_vars["lang"] + "/page_template.html", 'r').read()

    # Generating the HTML page
    output = open(env_vars['pages_path'] + '/' + env_vars["lang"] + "/" + 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 generate_page_XML(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['templates_folder'] + "/" + env_vars["lang"] + "/atom_post_template.xml", 'r').read()
    date = datetime.strptime(data['date'], "%d-%m-%Y").isoformat() + "Z"
    return template.replace("$TITLE", data['title']).replace("$DATE", date).replace("$CONTENT", data['content']).replace("$URL", env_vars['website_url'] + data['filepath'])


def generate_atom_feed(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:
        # Checking if there is metadata, if not we don't create a RSS / Atom post
        if post['date'] != '01-01-0001':
            atom_content += generate_page_XML(post, env_vars)

    # Generate RSS / atom feed
    template = open(env_vars['templates_folder'] + "/" + env_vars["lang"] + "/atom_feed_template.xml", 'r').read()
    output = open(env_vars['parent_path'] + "/atom_" + env_vars["lang"] + ".xml", "w")
    output.write(template.replace('$CONTENT', atom_content).replace('$DATE', datetime.today().strftime("%Y-%m-%d")))
    output.close()


def generate_tags_pages(tags_dict, env_vars):
    """
    Generate page for each tag, which link to each content tagged
    tags_dict: A dictionnary with tag name as key, and a list of post (title & url) with that tag
    env_vars: dictionnary of env variables
    """
    if not os.path.exists(env_vars['pages_path'] + "/" + env_vars["lang"] + '/tags'):
        os.mkdir(env_vars['pages_path'] + "/" + env_vars["lang"] + '/tags')

    # Going on every tag and creating it's page
    for tag, pages in tags_dict.items():
        template = open(env_vars['templates_folder'] + "/" + env_vars["lang"] + "/tags_template.html", 'r').read()
        # Generating the HTML page
        output = open(env_vars['pages_path'] + "/" + env_vars["lang"] + '/tags/' + tag.replace(' ', '_') + '.html', 'w')

        # Adding all links for page with this tag
        content = "<ul>\n"
        for page in pages:
            content += '\t\t\t\t<li><a href="' + '../../../' + page[1] + '">' + page[0] + '</a></li>\n'
        content += "\t\t\t</ul>\n"

        output.write(template.replace("$CONTENT", content).replace("$TITLE", tag))
        output.close()
    pass


def generate_index(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
    tags_dict = {}
    index_content = "<ul>\n"

    # Getting data of each page
    for page in data:
        # Checking if there is metadata, if not we don't add the page in the index
        if page['date'] != '01-01-0001':
            index_content += ('\t\t\t\t<li><a href="' + page['filepath'] + '">' + page['title'] + '</a><p>'
                              + page['date'] + '</p></li>\n')

        # Adding page into tags categorie
        for tag in page['tags']:
            if tag not in tags_dict:
                tags_dict[tag] = []
            tags_dict[tag].append([page['title'], page['filepath']])

    index_content += '\t\t\t</ul>\n\t\t\t<h2>Tags:</h2>\n\t\t\t<div class="tags">\n\t\t\t\t<ul>\n'

    # Adding tags browsing into the page
    for tag in list(tags_dict.keys()):
        index_content += ('\t\t\t\t\t<li><a href="' + env_vars['pages_path'].replace(
            env_vars['parent_path'] + '/', '') + "/" + env_vars["lang"] + '/tags/' + tag.replace(' ', '_') + '.html' + '">' + tag + '</a></li>\n')
        generate_tags_pages(tags_dict, env_vars)
    index_content += '\t\t\t\t</ul>\n\t\t\t</div>'

    # Generate main page
    template = open(env_vars['templates_folder'] + "/" + env_vars["lang"] + "/index_template.html", 'r').read()
    output = open(env_vars['parent_path'] + "/index_" + env_vars["lang"] + ".html", 'w')
    output.write(template.replace('$CONTENT', index_content))
    output.close()

def check_env():
    """Check environment variables are set and not empty"""
    env = ['PARENT_PATH', 'PAGES_PATH', 'MARKDOWN_PATH', 'TEMPLATES_FOLDER', 'WEBSITE_URL', 'LANGS']
    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']}")
            sys.exit()

        if (os.environ.get(variable) or '') == '':
            print(
                f"{color['red']}{variable} isn't setup in the .env file, please fix this {color['end']}")
            sys.exit()



if __name__ == "__main__":
    # Load .env file into python environment
    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
    check_env()

    # 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'), 'templates_folder': os.environ.get('TEMPLATES_FOLDER'), 'website_url': os.environ.get('WEBSITE_URL')}
    langs = os.environ.get('LANGS').lower().split(',')

    # Checking if generate folder exist to remove previouly generated content, if not create it
    if os.path.exists(env_vars['pages_path']):
        shutil.rmtree(env_vars['pages_path'])
        for lang in langs:
            os.remove(env_vars['parent_path'] + "/atom_" + lang + ".xml")
            os.remove(env_vars['parent_path'] + "/index_" + lang + ".html")
    else:
        os.mkdir(env_vars['pages_path'])
        for lang in langs:
            os.mkdir(env_vars['pages_path'] + "/" + lang)

    
    # Generate for each lang
    for lang in langs:
        env_vars['lang'] = lang
        data = []  # A list for data generated by md2html

        # Generate all markdown file
        for file in os.listdir(env_vars['markdown_path'] + "/" + lang):

            # Generating HTML page
            print(f"{color['green']}Generating file: {file} in {lang} {color['end']}")
            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 in {lang} {color['end']}")
        generate_atom_feed(sorted_data, env_vars)

        # Generating index
        print(f"{color['green']}Generating main page in {lang} :{color['end']}")
        generate_index(sorted_data, env_vars)
ArKa projects. All rights to me, and your next child right arm.