Skip to content

Instantly share code, notes, and snippets.

@eyalroth
Last active February 25, 2019 15:51
Show Gist options
  • Save eyalroth/20421d5ea04795db47a00f2837228ff9 to your computer and use it in GitHub Desktop.
Save eyalroth/20421d5ea04795db47a00f2837228ff9 to your computer and use it in GitHub Desktop.
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