#!/usr/bin/env bash # set -e shchemes_path=$(readlink -f "${BASH_SOURCE[0]}") shchemes_dir=$(dirname "$shchemes_path") scheme="$SCHEME" args=() for i in "$@"; do case $i in -s=*|--scheme=*) scheme="${i#*=}" ;; -f=*|--format=*) format="${i#*=}" ;; -c=*|--comment-pattern=*) comment_pattern="${i#*=}" ;; --help) args[0]="manual" ;; *) if [[ "$i" == "-"* ]]; then echo "Invalid option \"$i\"" exit 1 fi args+=("$i") esac done method=${args[0]} parse_scheme() { if [ -z "$scheme" ]; then echo "Please set a scheme" exit 1 fi scheme_format=${scheme%:*} scheme_name=${scheme#*:} # No format if [ "$scheme_format" == "$scheme_name" ] ; then scheme_format="base16" fi scheme_path="${shchemes_dir}/${scheme_format}/schemes/${scheme_name}.properties" } check_scheme_path() { if [ ! -r "$scheme_path" ]; then echo "Found no color scheme for \"${scheme_name}\" of format \"${scheme_format}\"" exit 1 fi } parse_format() { if [ -r "$format" ]; then format_dir="$format" else if [ -z "$format" ]; then format=$scheme_format fi format_dir="${shchemes_dir}/${format}" fi } parse_comment_pattern() { if [ -z "$comment_pattern" ]; then get_comment_start else readarray -td " " comment_pattern < <(echo "$comment_pattern") comment_start="${comment_pattern[0]}" comment_end="${comment_pattern[1]}" fi } get_comment_start() { local ext ext=$(basename "$path") ext="${ext##*.}" case $ext in js|rasi) comment_start="//" ;; css) comment_start="/*" comment_end="*/" ;; *) comment_start="#" esac } create_theme() { target=$1 parse_scheme check_scheme_path parse_format if [ -n "$target" ]; then if [ -r "$target" ]; then template_path="$target" else template_path=${format_dir}/templates/${target}.mustache if [ ! -r "$template_path" ]; then echo "No viable ${scheme_format} template for \"${target}\"" exit 1 fi fi fi if [ -z "$MO_PATH" ]; then MO_PATH="${shchemes_dir/lib/mo/mo}" fi bash "${shchemes_dir}/lib/apply_scheme_to_template.sh" "$scheme_path" "$template_path" } inject() { path=$1 parse_scheme check_scheme_path parse_comment_pattern if [ "$comment_start" == "" ]; then comment_start="#" fi awk -i inplace \ -v blockstart="${comment_start}START SHCHEMES BLOCK" \ -v blockend="${comment_start}END SHCHEMES BLOCK" \ -v commentend="$comment_end" \ -v scheme="$scheme" \ -v shchemes="$shchemes_path" \ -v sq="'" \ -F ":" ' !inblock { print } inblock { lines[++bi] = $0 } $1 ~ blockstart { inblock = 1; bi = 0; command = substr($2, 0, length($2) - length(commentend)) system("/usr/bin/env bash -c " sq "SCHEME=\"" scheme "\";" command sq); next } $1 ~ blockend { inblock = 0; print; next } ENDFILE { if(inblock) { print blockend commentend; for(i=1;i<=bi;i++) { print lines[i]; } } } ' "$path" } convert_tinted_template() { path=$1 sed -r \ -e 's/\{\{base([0-9A-F]+)-hex\}\}/{{base\1}}/' \ -e 's/\{\{base([0-9A-F]+)-rgb-r\}\}/{{rgb_r base\1}}/' \ -e 's/\{\{base([0-9A-F]+)-rgb-g\}\}/{{rgb_g base\1}}/' \ -e 's/\{\{base([0-9A-F]+)-rgb-b\}\}/{{rgb_b base\1}}/' "$path" } convert_tinted_scheme() { path=$1 awk -i inplace -F ' *: *' ' /^#/ { print } $1 ~ "palette" { p = 1; next } p && /^ +/ { gsub(/ /, "", $1); print $1 "=" $2 } ' "$path" } install_tinted_scheme() { if [ -n "$1" ]; then scheme=$1 fi parse_scheme # output="${shchemes_dir}/${scheme_format}/schemes/${scheme_name}.properties" if [ ! -d "$(dirname "$scheme_path")" ]; then echo "No folder for format" exit 1 fi url="https://raw.githubusercontent.com/tinted-theming/schemes/master/${scheme_format}/${scheme_name}.yaml" http_code=$( curl \ --silent \ --output "$scheme_path" \ --write-out "%{http_code}" \ "$url") if [[ $http_code -lt 200 || $http_code -gt 299 ]]; then echo "No such color scheme" exit 1 fi convert_tinted_scheme "$scheme_path" echo "Installed ${scheme}" } install_tinted_template() { url=$1 target=$2 curl "$url" | convert_tinted_template > "${shchemes_dir}/base16/templates/${target}.mustache" } manual() { man "${shchemes_dir}/doc/shchemes.1" } if [ "$method" != "" ]; then case $method in create_theme) create_theme "${args[1]}" ;; inject) inject "${args[1]}" "${args[2]}" ;; convert_tinted_template) convert_tinted_template "${args[1]}" ;; install_tinted_template) install_tinted_template "${args[1]}" "${args[2]}" ;; convert_tinted_scheme) convert_tinted_scheme "${args[1]}" ;; install_tinted_scheme) install_tinted_scheme "${args[1]}" "${args[2]}" ;; help|manual|man) manual ;; *) echo "No such method" esac fi