2020-08-03 11:34:21 +00:00
|
|
|
#!/usr/bin/env python3
|
2020-08-03 10:47:23 +00:00
|
|
|
|
|
|
|
import subprocess
|
|
|
|
import glob
|
|
|
|
import sys
|
|
|
|
import os.path as path
|
|
|
|
import os
|
2020-08-03 11:07:10 +00:00
|
|
|
import argparse
|
2020-08-03 10:47:23 +00:00
|
|
|
|
|
|
|
|
|
|
|
BAT_OPTIONS = [
|
|
|
|
"--no-config",
|
|
|
|
"--style=plain",
|
|
|
|
"--color=always",
|
|
|
|
"--theme='1337'",
|
|
|
|
"--italic-text=always",
|
|
|
|
]
|
|
|
|
|
2020-10-04 22:29:20 +00:00
|
|
|
SKIP_FILENAMES = [
|
|
|
|
"LICENSE.md",
|
|
|
|
"README.md",
|
|
|
|
"bat_options",
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
def get_extra_options(source):
|
|
|
|
with open(path.join(source, "bat_options"), "r") as f:
|
|
|
|
return list(map(lambda x: x.rstrip(), f.readlines()))
|
|
|
|
|
2020-08-03 10:47:23 +00:00
|
|
|
|
2020-08-03 11:07:10 +00:00
|
|
|
def create_highlighted_versions(output_basepath):
|
2020-08-03 10:47:23 +00:00
|
|
|
root = os.path.dirname(os.path.abspath(__file__))
|
|
|
|
|
|
|
|
for source in glob.glob(path.join(root, "source", "*", "*")):
|
|
|
|
try:
|
2020-08-03 13:10:26 +00:00
|
|
|
env = os.environ.copy()
|
|
|
|
env.pop("PAGER", None)
|
|
|
|
env.pop("BAT_PAGER", None)
|
|
|
|
env.pop("BAT_CONFIG_PATH", None)
|
|
|
|
env.pop("BAT_STYLE", None)
|
|
|
|
env.pop("BAT_THEME", None)
|
|
|
|
env.pop("BAT_TABS", None)
|
|
|
|
env["COLORTERM"] = "truecolor" # make sure to output 24bit colors
|
|
|
|
|
2020-10-04 22:29:20 +00:00
|
|
|
source_dirpath = path.dirname(source)
|
|
|
|
source_dirname = path.basename(source_dirpath)
|
2020-08-03 10:47:23 +00:00
|
|
|
source_filename = path.basename(source)
|
|
|
|
|
2020-10-04 22:29:20 +00:00
|
|
|
if source_filename in SKIP_FILENAMES:
|
2020-09-07 20:23:26 +00:00
|
|
|
continue
|
|
|
|
|
2020-10-04 22:29:20 +00:00
|
|
|
options = BAT_OPTIONS.copy()
|
|
|
|
# If a directory is empty, `files` could possibly be 0-length
|
|
|
|
if path.exists(path.join(source_dirpath, "bat_options")):
|
|
|
|
options += get_extra_options(source_dirpath)
|
|
|
|
|
|
|
|
bat_output = subprocess.check_output(
|
|
|
|
["bat"] + options + [source],
|
|
|
|
stderr=subprocess.PIPE, env=env,
|
|
|
|
)
|
|
|
|
|
2020-08-03 11:07:10 +00:00
|
|
|
output_dir = path.join(output_basepath, source_dirname)
|
2020-08-03 10:47:23 +00:00
|
|
|
output_path = path.join(output_dir, source_filename)
|
|
|
|
|
|
|
|
os.makedirs(output_dir, exist_ok=True)
|
|
|
|
|
|
|
|
with open(output_path, "wb") as output_file:
|
|
|
|
output_file.write(bat_output)
|
|
|
|
|
2020-08-03 11:34:21 +00:00
|
|
|
print("Created '{}'".format(output_path))
|
2020-08-03 10:47:23 +00:00
|
|
|
except subprocess.CalledProcessError as err:
|
|
|
|
print(
|
|
|
|
"=== Error: Could not highlight source file '{}".format(source),
|
|
|
|
file=sys.stderr,
|
|
|
|
)
|
|
|
|
print(
|
|
|
|
"=== bat stdout:\n{}".format(err.stdout.decode("utf-8")),
|
|
|
|
file=sys.stderr,
|
|
|
|
)
|
|
|
|
print(
|
|
|
|
"=== bat stderr:\n{}".format(err.stderr.decode("utf-8")),
|
|
|
|
file=sys.stderr,
|
|
|
|
)
|
|
|
|
sys.exit(1)
|
2020-10-04 22:47:28 +00:00
|
|
|
except FileNotFoundError:
|
|
|
|
print("Error: Could not execute 'bat'. Please make sure that the executable is available on the PATH.")
|
|
|
|
sys.exit(1)
|
2020-08-03 10:47:23 +00:00
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
2020-08-03 11:07:10 +00:00
|
|
|
parser = argparse.ArgumentParser(
|
|
|
|
description="This script creates syntax-highlighted versions of all "
|
|
|
|
"files in the 'source' directory."
|
|
|
|
)
|
|
|
|
parser.add_argument(
|
|
|
|
"--output",
|
|
|
|
"-O",
|
|
|
|
metavar="PATH",
|
|
|
|
help="Output directory",
|
|
|
|
required=True,
|
|
|
|
type=str,
|
|
|
|
)
|
|
|
|
|
|
|
|
args = parser.parse_args()
|
|
|
|
|
|
|
|
create_highlighted_versions(output_basepath=args.output)
|