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 = '' elif match.find('.js') != -1: file_content = '' 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