Last active
February 25, 2019 15:51
-
-
Save eyalroth/20421d5ea04795db47a00f2837228ff9 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import sys | |
import re | |
from os import listdir | |
from os.path import isfile, join | |
from collections import OrderedDict | |
RESOURCES_FILE = "resources-enqueue.php" | |
OUT_FILE_PREFIX = "lang-" | |
OUT_FILE_SUFFIX = ".js" | |
FILE_NAME_REGEX = re.compile("""prism-(?P<lang>\w+)\.js""") | |
DEPENDENCY_REGEX = re.compile("""Prism\.languages\.(?P<lang>\w+)[\s]*=[\s]*Prism\.languages\.(extend\(['"](?P<extend>\w+)['"],|(?P<is>\w+))""") | |
def read_files(in_dir): | |
lang_to_script = {} | |
lang_files = [f for f in listdir(in_dir) if isfile(join(in_dir, f)) and FILE_NAME_REGEX.match(f)] | |
for fname in lang_files: | |
with open(join(in_dir, fname)) as f: | |
lang = FILE_NAME_REGEX.match(fname).group('lang') | |
script = f.read() | |
lang_to_script[lang] = script | |
return lang_to_script | |
def analyze_dependencies(lang_to_script): | |
dependencies = {} | |
for lang in lang_to_script.keys(): | |
dependencies[lang] = [] | |
all_scripts = str.join("\n", lang_to_script.values()) | |
for m in DEPENDENCY_REGEX.finditer(all_scripts): | |
lang = m.group('lang') | |
if (m.group('extend')): | |
dependency = m.group('extend') | |
else: | |
dependency = m.group('is') | |
if lang not in dependencies: | |
dependencies[lang] = [] | |
dependencies[lang].append(dependency) | |
return dependencies | |
def distinct(l): | |
return list(OrderedDict.fromkeys(l)) | |
def add_dependencies_to_lang(lang, lang_to_script, dependencies, with_dependencies): | |
if lang not in with_dependencies: | |
for dependency in dependencies[lang]: | |
add_dependencies_to_lang(dependency, lang_to_script, dependencies, with_dependencies) | |
dependencies_code = [with_dependencies[d] for d in dependencies[lang]] | |
dependencies_code = distinct(dependencies_code) # in case of "diamond" dependency | |
script = str.join("\n", dependencies_code) | |
if lang in lang_to_script: | |
script += "\n" + lang_to_script[lang] | |
with_dependencies[lang] = script | |
def add_dependencies(lang_to_script, dependencies): | |
with_dependencies = {} | |
for lang in lang_to_script.keys() + dependencies.keys(): | |
add_dependencies_to_lang(lang, lang_to_script, dependencies, with_dependencies) | |
return with_dependencies | |
def write_files(out_dir, lang_to_script): | |
for lang, script in lang_to_script.iteritems(): | |
with open(join(out_dir, OUT_FILE_PREFIX + lang + OUT_FILE_SUFFIX), 'w') as f: | |
f.write(script) | |
with open(join(out_dir, RESOURCES_FILE), 'w') as f: | |
languages = lang_to_script.keys() | |
languages_a = str.join(",\n", ["\t'language-" + l + "'" for l in languages]) | |
resources = ["array("] + [languages_a] + ["),", ""] | |
languages_b = str.join(",\n", ["\t'lang-" + l + "'" for l in languages]) | |
resources += ["array("] + [languages_b] + [")"] | |
resources = str.join("\n", resources) | |
f.write(resources) | |
def convert(in_dir, out_dir): | |
lang_to_script = read_files(in_dir) | |
dependencies = analyze_dependencies(lang_to_script) | |
lang_to_script = add_dependencies(lang_to_script, dependencies) | |
write_files(out_dir, lang_to_script) | |
if __name__ == "__main__": | |
convert(sys.argv[1], sys.argv[2]) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment