#!/usr/bin/env python import os import re html_files = [] directory = "lib/ESPMegaPRO/html" for filename in os.listdir(directory): if filename.endswith(".html"): html_files.append(os.path.join(directory, filename)) # Iterate over the list of html files for html_file in html_files: # Open the html file f = open(html_file, "r") # Read the content of the html file html_content = f.read() # Close the html file f.close() # Section Disabled, Using client side JS to replace variables # First, replace % with %% #html_content = html_content.replace("%", "%%") # The html file contains placeholders for the variables # These placeholders are in the form of $(variable_name)$ # Replace these with %variable_name% #html_content = re.sub(r"\$\((.*?)\)\$", r"%\1%", html_content) # Create the temp folder if it doesn't exist if not os.path.exists("temp"): os.makedirs("temp") # Save the new content to a new file in the temp directory # The new file will have the same name as the original file nf = open("temp/" + os.path.basename(html_file), "w") nf.write(html_content) nf.close() # Use xxd to convert the html file to a C++ file # The C++ file will have the same name as the original file but with a .h extension # Save the C++ file in lib/ESPMegaPRO/html os.system("xxd -i temp/" + os.path.basename(html_file) + " > lib/ESPMegaPRO/" + os.path.basename(html_file).replace(".html", "_html.h")) # Now delete the temp file os.remove("temp/" + os.path.basename(html_file)) # Next we open the C++ file f = open("lib/ESPMegaPRO/" + os.path.basename(html_file).replace(".html", "_html.h"), "r") # Read the content of the C++ file cpp_content = f.read() # Close the C++ file f.close() # By default, xxd will create a unsigned char array # We need to change this to a const char array # We also need to add a null terminator at the end of the array # Additionally we want to place the array in PROGMEM # Ex. From unsigned char index_html[] = { to const char index_html[] PROGMEM = { # We will use regex to do this cpp_content = re.sub(r"unsigned char (.*?)\[\] = \{", r"const char \1[] PROGMEM = {", cpp_content) # Add null terminator cpp_content = cpp_content.replace("};", ", 0x00};") # Lastly, we do not need the length of the array so we remove it # Ex. From unsigned int index_html_len = 1000; to cpp_content = re.sub(r"unsigned int (.*?)_len = (.*?);", r"", cpp_content) # Change the name of the variable to _html where is the name of the html file filename = os.path.basename(html_file).replace(".html", "") cpp_content = re.sub(r"const char (.*?)\[\] PROGMEM = {", r"const char " + filename + r"_html[] PROGMEM = {", cpp_content) # Reopen the C++ file f = open("lib/ESPMegaPRO/" + os.path.basename(html_file).replace(".html", "_html.h"), "w") # Write the new content to the C++ file f.write(cpp_content) # Close the C++ file f.close() # Lastly, we need to create a header file that includes all the html files # Open the header file f = open("lib/ESPMegaPRO/all_html.h", "w") # Write the pragma once directive f.write("#pragma once\n") # Write the includes for all the html files for html_file in html_files: f.write("#include \"" + os.path.basename(html_file).replace(".html", "_html.h") + "\"\n") # Close the header file