Files
monobiome/monobiome/cli/scheme.py

156 lines
3.6 KiB
Python

import argparse
from pathlib import Path
from monobiome.util import _SubparserType
from monobiome.scheme import generate_scheme
from monobiome.constants import monotone_h_map
def register_parser(subparsers: _SubparserType) -> None:
parser = subparsers.add_parser(
"scheme",
help="create scheme variants"
)
parser.add_argument(
"mode",
type=str,
choices=["dark", "light"],
help="Scheme mode (light or dark)"
)
parser.add_argument(
"biome",
type=str,
choices=list(monotone_h_map.keys()),
help="Biome setting for scheme."
)
parser.add_argument(
"-m",
"--metric",
type=str,
default="oklch",
choices=["wcag", "oklch", "lightness"],
help="Metric to use for measuring swatch distances."
)
# e.g., wcag=4.5; oklch=0.40; lightness=40
parser.add_argument(
"-d",
"--distance",
type=float,
default=0.40,
help="Distance threshold for specified metric",
)
parser.add_argument(
"-o",
"--output",
type=str,
help="Output file to write scheme content",
)
# these params remain rooted in lightness; no need to accommodate metric
# given these are monotone adjustments. You *could* consider rooting these
# in metric units, but along monotones, distance=lightness and WCAG isn't a
# particularly good measure of perceptual distinction, so we'd prefer the
# former.
parser.add_argument(
"-l",
"--l-base",
type=int,
default=20,
help="Minimum lightness level (default: 20)",
)
parser.add_argument(
"--l-step",
type=int,
default=5,
help="Lightness step size (default: 5)",
)
# gaps
parser.add_argument(
"--fg-gap",
type=int,
default=50,
help="Foreground lightness gap (default: 50)",
)
parser.add_argument(
"--grey-gap",
type=int,
default=30,
help="Grey lightness gap (default: 30)",
)
parser.add_argument(
"--term-fg-gap",
type=int,
default=65,
help="Terminal foreground lightness gap (default: 60)",
)
parser.set_defaults(func=handle_scheme)
def handle_scheme(args: argparse.Namespace) -> None:
output = args.output
mode = args.mode
biome = args.biome
metric = args.metric
distance = args.distance
l_base = args.l_base
l_step = args.l_step
fg_gap = args.fg_gap
grey_gap = args.grey_gap
term_fg_gap = args.term_fg_gap
full_color_map = {
"red": "red",
"orange": "orange",
"yellow": "yellow",
"green": "green",
"cyan": "cyan",
"blue": "blue",
"violet": "violet",
"magenta": "orange",
}
term_color_map = {
"red": "red",
"yellow": "yellow",
"green": "green",
"cyan": "blue",
"blue": "blue",
"magenta": "orange",
}
vim_color_map = {
"red": "red",
"orange": "orange",
"yellow": "yellow",
"green": "green",
"cyan": "green",
"blue": "blue",
"violet": "blue",
"magenta": "red",
}
# vim_color_map = full_color_map
scheme_text = generate_scheme(
mode,
biome,
metric,
distance,
l_base,
l_step,
fg_gap,
grey_gap,
term_fg_gap,
full_color_map,
term_color_map,
vim_color_map,
)
if output is None:
print(scheme_text)
else:
with Path(output).open("w") as f:
f.write(scheme_text)