summaryrefslogtreecommitdiffstats
path: root/lib.py
blob: 66d2ccdccb7e6c84079470051fa7af8b4bf45736 (plain) (blame)
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
import os 
import io
import re


posts = {}
gets = {}

def find_get(path):
    try:
        return gets[path]()
    except KeyError:
        return "404"


def find_post(path, request):
    try:
        return posts[path](request)
    except KeyError:
        return "404"

def get_relative_path():
    return os.path.dirname(os.path.abspath(__file__))


def read_html(relative_file_path):
    """ Reads the html file on the file location provided
        and injects any external files (marked with {{file_path}} )
        that may be present. """ 
    dir_path = get_relative_path()
    file_path = os.path.join(dir_path, relative_file_path)     
    with open(file_path) as file:
        html_content = file.read()
        html_content = inject_external_files(html_content)
    return html_content 

def inject_external_files(html_content):
    """ Replaces {{ 'file_path' }} with the file content of that
        file path. Useful for seperation of javascript and css files."""
        
    pattern = r'{{([^<]+)}}'
    external_files = re.findall(pattern, html_content)
    new_html_content = html_content
    for match in external_files:
        external_file_path = match.replace(' ', '')
        external_file = open(os.path.join(get_relative_path(), external_file_path))
        file_content = external_file.read()
        external_file.close()

        if match.find('.css') != -1:
            file_content = '<style>\n' + file_content + '</style>'
        elif match.find('.js') != -1:
            file_content = '<script>\n' + file_content + '</script>'

        to_be_replaced = '{{' + match + '}}'
        new_html_content = new_html_content.replace(to_be_replaced, file_content)
    return new_html_content
    

def post(route = '/'):
    """ A decorator that takes in the route path as argument, and then
        puts the post handler in the dictionary, with the route as a key. """

    def decorator(handler_function):
        posts[route] = handler_function
        return handler_function 

    return decorator

def get(route = '/'):
    """ A decorator that takes in the route path as argument, and then
        puts the get handler in the dictionary, with the route as a key. """

    def decorator(handler_function):
        gets[route] = handler_function
        return handler_function 

    return decorator