diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..c84016a --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,5 @@ +/inspectionProfiles/ +/httpRequests/ +/shelf/ +/misc.xml +/workspace.xml diff --git a/.idea/Discord-History-Tracker.iml b/.idea/Discord-History-Tracker.iml new file mode 100644 index 0000000..4c30404 --- /dev/null +++ b/.idea/Discord-History-Tracker.iml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..c2bae49 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..ad5c5fe --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations/Build_Minified.xml b/.idea/runConfigurations/Build_Minified.xml new file mode 100644 index 0000000..885612a --- /dev/null +++ b/.idea/runConfigurations/Build_Minified.xml @@ -0,0 +1,24 @@ + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations/Build_Raw.xml b/.idea/runConfigurations/Build_Raw.xml new file mode 100644 index 0000000..1e23ba9 --- /dev/null +++ b/.idea/runConfigurations/Build_Raw.xml @@ -0,0 +1,24 @@ + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations/Build_Website.xml b/.idea/runConfigurations/Build_Website.xml new file mode 100644 index 0000000..a2e1e91 --- /dev/null +++ b/.idea/runConfigurations/Build_Website.xml @@ -0,0 +1,24 @@ + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..5fc0921 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file diff --git a/build.py b/build.py index 31e70b1..565cc35 100644 --- a/build.py +++ b/build.py @@ -8,11 +8,9 @@ import os import re import distutils.dir_util - VERSION_SHORT = "v.27" VERSION_FULL = VERSION_SHORT + ", released 24 Aug 2020" - EXEC_UGLIFYJS_WIN = "{2}/lib/uglifyjs.cmd --parse bare_returns --compress --mangle toplevel --mangle-props keep_quoted,reserved=[{3}] --output \"{1}\" \"{0}\"" EXEC_UGLIFYJS_AUTO = "uglifyjs --parse bare_returns --compress --mangle toplevel --mangle-props keep_quoted,reserved=[{3}] --output \"{1}\" \"{0}\"" @@ -23,184 +21,182 @@ CLIPBOARD_TRACKER = "--copytracker" in sys.argv WORKING_DIR = os.getcwd() - # UglifyJS Setup if os.name == "nt": - EXEC_UGLIFYJS = EXEC_UGLIFYJS_WIN + EXEC_UGLIFYJS = EXEC_UGLIFYJS_WIN else: - EXEC_UGLIFYJS = EXEC_UGLIFYJS_AUTO - - if USE_UGLIFYJS and shutil.which("uglifyjs") is None: - USE_UGLIFYJS = False - print("Could not find 'uglifyjs', JS minification will be disabled") - + EXEC_UGLIFYJS = EXEC_UGLIFYJS_AUTO + + if USE_UGLIFYJS and shutil.which("uglifyjs") is None: + USE_UGLIFYJS = False + print("Could not find 'uglifyjs', JS minification will be disabled") if USE_UGLIFYJS: - with open("reserve.txt", "r") as reserved: - RESERVED_PROPS = ",".join(line.strip() for line in reserved.readlines()) + with open("reserve.txt", "r") as reserved: + RESERVED_PROPS = ",".join(line.strip() for line in reserved.readlines()) # File Utilities def combine_files(input_pattern, output_file): - is_first_file = True - - with fileinput.input(sorted(glob.glob(input_pattern))) as stream: - for line in stream: - if stream.isfirstline(): - if is_first_file: - is_first_file = False - else: - output_file.write("\n") - - output_file.write(line.replace("{{{version:full}}}", VERSION_FULL)) + is_first_file = True + + with fileinput.input(sorted(glob.glob(input_pattern))) as stream: + for line in stream: + if stream.isfirstline(): + if is_first_file: + is_first_file = False + else: + output_file.write("\n") + + output_file.write(line.replace("{{{version:full}}}", VERSION_FULL)) def minify_css(input_file, output_file): - if not USE_MINIFICATION: - if input_file != output_file: - shutil.copyfile(input_file, output_file) + if not USE_MINIFICATION: + if input_file != output_file: + shutil.copyfile(input_file, output_file) + + return - return - - with open(input_file, "r") as fin: - css = fin.read() - - css = re.sub(r"^\s+(.+?):\s*(.+?)(?:\s*(!important))?;\n", r"\1:\2\3;", css, flags = re.M) # remove spaces after colons - css = re.sub(r"\{\n", r"{", css, flags = re.M) # remove new lines after { - css = re.sub(r"\n\}", r"}", css, flags = re.M) # remove new lines before } - css = re.sub(r"\n\n", r"\n", css, flags = re.M) # remove empty lines - css = re.sub(r";\}$", r"}", css, flags = re.M) # remove last semicolons - css = re.sub(r"rgb\((.*?),\s*(.*?),\s*(.*?)\)", r"rgb(\1,\2,\3)", css, flags = re.M) # remove spaces after commas in rgb() - css = re.sub(r"rgba\((.*?),\s*(.*?),\s*(.*?),\s*(.*?)\)", r"rgba(\1,\2,\3,\4)", css, flags = re.M) # remove spaces after commas in rgba() - - with open(output_file, "w") as out: - out.write(css) + with open(input_file, "r") as fin: + css = fin.read() + + css = re.sub(r"^\s+(.+?):\s*(.+?)(?:\s*(!important))?;\n", r"\1:\2\3;", css, flags = re.M) # remove spaces after colons + css = re.sub(r"\{\n", r"{", css, flags = re.M) # remove new lines after { + css = re.sub(r"\n\}", r"}", css, flags = re.M) # remove new lines before } + css = re.sub(r"\n\n", r"\n", css, flags = re.M) # remove empty lines + css = re.sub(r";\}$", r"}", css, flags = re.M) # remove last semicolons + css = re.sub(r"rgb\((.*?),\s*(.*?),\s*(.*?)\)", r"rgb(\1,\2,\3)", css, flags = re.M) # remove spaces after commas in rgb() + css = re.sub(r"rgba\((.*?),\s*(.*?),\s*(.*?),\s*(.*?)\)", r"rgba(\1,\2,\3,\4)", css, flags = re.M) # remove spaces after commas in rgba() + + with open(output_file, "w") as out: + out.write(css) # Build System def build_tracker_html(): - output_file_raw = "bld/track.js" - output_file_html = "bld/track.html" - - output_file_tmp = "bld/track.tmp.js" - input_pattern = "src/tracker/*.js" - - with open(output_file_raw, "w") as out: - if not USE_UGLIFYJS: - out.write("(function(){\n") + output_file_raw = "bld/track.js" + output_file_html = "bld/track.html" - combine_files(input_pattern, out) - - if not USE_UGLIFYJS: - out.write("})()") - - if USE_UGLIFYJS: - os.system(EXEC_UGLIFYJS.format(output_file_raw, output_file_tmp, WORKING_DIR, RESERVED_PROPS)) + output_file_tmp = "bld/track.tmp.js" + input_pattern = "src/tracker/*.js" with open(output_file_raw, "w") as out: - out.write("javascript:(function(){") - - with open(output_file_tmp, "r") as minified: - out.write(minified.read().replace("\n", " ").replace("\r", "")) - - out.write("})()") + if not USE_UGLIFYJS: + out.write("(function(){\n") + + combine_files(input_pattern, out) + + if not USE_UGLIFYJS: + out.write("})()") - os.remove(output_file_tmp) - - with open(output_file_raw, "r") as raw: - script_contents = raw.read().replace("&", "&").replace('"', """).replace("'", "'").replace("<", "<").replace(">", ">") - - with open(output_file_html, "w") as out: - out.write(script_contents) + if USE_UGLIFYJS: + os.system(EXEC_UGLIFYJS.format(output_file_raw, output_file_tmp, WORKING_DIR, RESERVED_PROPS)) + + with open(output_file_raw, "w") as out: + out.write("javascript:(function(){") + + with open(output_file_tmp, "r") as minified: + out.write(minified.read().replace("\n", " ").replace("\r", "")) + + out.write("})()") + + os.remove(output_file_tmp) + + with open(output_file_raw, "r") as raw: + script_contents = raw.read().replace("&", "&").replace('"', """).replace("'", "'").replace("<", "<").replace(">", ">") + + with open(output_file_html, "w") as out: + out.write(script_contents) def build_tracker_userscript(): - output_file = "bld/track.user.js" - - input_pattern = "src/tracker/*.js" - userscript_base = "src/base/track.user.js" - - with open(userscript_base, "r") as base: - userscript_contents = base.read().replace("{{{version}}}", VERSION_SHORT).split("{{{contents}}}") - - with open(output_file, "w") as out: - out.write(userscript_contents[0]) - combine_files(input_pattern, out) - out.write(userscript_contents[1]) + output_file = "bld/track.user.js" + + input_pattern = "src/tracker/*.js" + userscript_base = "src/base/track.user.js" + + with open(userscript_base, "r") as base: + userscript_contents = base.read().replace("{{{version}}}", VERSION_SHORT).split("{{{contents}}}") + + with open(output_file, "w") as out: + out.write(userscript_contents[0]) + combine_files(input_pattern, out) + out.write(userscript_contents[1]) def build_viewer(): - output_file = "bld/viewer.html" - input_html = "src/viewer/index.html" - - input_css_pattern = "src/viewer/styles/*.css" - tmp_css_file_combined = "bld/viewer.tmp.css" - tmp_css_file_minified = "bld/viewer.min.css" - - with open(tmp_css_file_combined, "w") as out: - combine_files(input_css_pattern, out) - - minify_css(tmp_css_file_combined, tmp_css_file_minified) - os.remove(tmp_css_file_combined) - - input_js_pattern = "src/viewer/scripts/*.js" - tmp_js_file_combined = "bld/viewer.tmp.js" - tmp_js_file_minified = "bld/viewer.min.js" - - with open(tmp_js_file_combined, "w") as out: - combine_files(input_js_pattern, out) - - if USE_UGLIFYJS: - os.system(EXEC_UGLIFYJS.format(tmp_js_file_combined, tmp_js_file_minified, WORKING_DIR, RESERVED_PROPS)) - else: - shutil.copyfile(tmp_js_file_combined, tmp_js_file_minified) - - os.remove(tmp_js_file_combined) - - tokens = { - "/*{js}*/": tmp_js_file_minified, - "/*{css}*/": tmp_css_file_minified - } - - with open(output_file, "w") as out: - with open(input_html, "r") as fin: - for line in fin: - token = None - - for token in (token for token in tokens if token in line): - with open(tokens[token], "r") as token_file: - embedded = token_file.read() - - out.write(embedded) - os.remove(tokens[token]) - - if token is None: - out.write(line) + output_file = "bld/viewer.html" + input_html = "src/viewer/index.html" + + input_css_pattern = "src/viewer/styles/*.css" + tmp_css_file_combined = "bld/viewer.tmp.css" + tmp_css_file_minified = "bld/viewer.min.css" + + with open(tmp_css_file_combined, "w") as out: + combine_files(input_css_pattern, out) + + minify_css(tmp_css_file_combined, tmp_css_file_minified) + os.remove(tmp_css_file_combined) + + input_js_pattern = "src/viewer/scripts/*.js" + tmp_js_file_combined = "bld/viewer.tmp.js" + tmp_js_file_minified = "bld/viewer.min.js" + + with open(tmp_js_file_combined, "w") as out: + combine_files(input_js_pattern, out) + + if USE_UGLIFYJS: + os.system(EXEC_UGLIFYJS.format(tmp_js_file_combined, tmp_js_file_minified, WORKING_DIR, RESERVED_PROPS)) + else: + shutil.copyfile(tmp_js_file_combined, tmp_js_file_minified) + + os.remove(tmp_js_file_combined) + + tokens = { + "/*{js}*/": tmp_js_file_minified, + "/*{css}*/": tmp_css_file_minified + } + + with open(output_file, "w") as out: + with open(input_html, "r") as fin: + for line in fin: + token = None + + for token in (token for token in tokens if token in line): + with open(tokens[token], "r") as token_file: + embedded = token_file.read() + + out.write(embedded) + os.remove(tokens[token]) + + if token is None: + out.write(line) def build_website(): - tracker_file_html = "bld/track.html" - tracker_file_userscript = "bld/track.user.js" - viewer_file = "bld/viewer.html" - web_style_file = "bld/web/style.css" - - distutils.dir_util.copy_tree("web", "bld/web") - index_file = "bld/web/index.php" - - with open(index_file, "r") as index: - index_contents = index.read() - - with open(index_file, "w") as index: - index.write(index_contents.replace("{{{version:web}}}", VERSION_SHORT.replace(" ", " "))) - - os.makedirs("bld/web/build", exist_ok = True) - shutil.copyfile(tracker_file_html, "bld/web/build/track.html") - shutil.copyfile(tracker_file_userscript, "bld/web/build/track.user.js") - shutil.copyfile(viewer_file, "bld/web/build/viewer.html") - minify_css(web_style_file, web_style_file) + tracker_file_html = "bld/track.html" + tracker_file_userscript = "bld/track.user.js" + viewer_file = "bld/viewer.html" + web_style_file = "bld/web/style.css" + + distutils.dir_util.copy_tree("web", "bld/web") + index_file = "bld/web/index.php" + + with open(index_file, "r") as index: + index_contents = index.read() + + with open(index_file, "w") as index: + index.write(index_contents.replace("{{{version:web}}}", VERSION_SHORT.replace(" ", " "))) + + os.makedirs("bld/web/build", exist_ok = True) + shutil.copyfile(tracker_file_html, "bld/web/build/track.html") + shutil.copyfile(tracker_file_userscript, "bld/web/build/track.user.js") + shutil.copyfile(viewer_file, "bld/web/build/viewer.html") + minify_css(web_style_file, web_style_file) # Build Process @@ -217,14 +213,14 @@ print("Building viewer...") build_viewer() if BUILD_WEBSITE: - print("Building website...") - build_website() + print("Building website...") + build_website() if CLIPBOARD_TRACKER: - if os.name == "nt": - print("Copying to clipboard...") - os.system("clip < bld/track.js") - else: - print("Clipboard is only supported on Windows") + if os.name == "nt": + print("Copying to clipboard...") + os.system("clip < bld/track.js") + else: + print("Clipboard is only supported on Windows") print("Done")