forked from atpotts/base16-nix
-
Notifications
You must be signed in to change notification settings - Fork 2
/
base16.nix
122 lines (110 loc) · 3.63 KB
/
base16.nix
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
{ config, lib, pkgs, ... }:
with lib;
let
cfg = config.themes.base16;
inherit (builtins) pathExists;
schemes = importJSON ./schemes.json;
templates = importJSON ./templates.json;
# Data file for a given base16 scheme and variant. Returns the nix store
# path of the file.
mkTheme = scheme: variant:
"${builtins.fetchGit {
url = schemes.${scheme}.url;
rev = schemes.${scheme}.rev;
}}/${variant}.yaml";
# Source file for a given base16 template.
# Returns the nix store path of the file.
mkTemplate = name: type:
let
templateDir = "${builtins.fetchGit {
url = templates.${name}.url;
rev = templates.${name}.rev;
}}/templates";
in
if pathExists (templateDir + "/${type}.mustache")
then templateDir + "/${type}.mustache"
else templateDir + "/default.mustache";
# The theme yaml files only supply 16 hex values, but the templates take
# a transformation of this data such as rgb. The hacky python script pre-
# processes the theme file in this way for consumption by the mustache
# engine below.
python = pkgs.python3.withPackages (ps: [ ps.pyyaml ]);
preprocess = src:
pkgs.stdenv.mkDerivation {
name = "yaml";
inherit src;
builder = pkgs.writeText "builder.sh" ''
slug_all=$(${pkgs.coreutils}/bin/basename $src)
slug=''${slug_all%.*}
${python}/bin/python ${./base16writer.py} $slug < $src > $out
'';
allowSubstitutes = false; # will never be in cache
};
# Mustache engine. Applies any theme to any template, providing they are
# included in the local json source files.
mustache = scheme: variant: name: type:
pkgs.stdenv.mkDerivation {
name = "${name}-base16-${variant}";
data = preprocess (mkTheme scheme variant);
src = mkTemplate name type;
phases = [ "buildPhase" ];
buildPhase ="${pkgs.mustache-go}/bin/mustache $data $src > $out";
allowSubstitutes = false; # will never be in cache
};
mustacheCustom = schemePath: name: type:
pkgs.stdenv.mkDerivation {
name = "${name}-base16-scheme";
data = preprocess schemePath;
src = mkTemplate name type;
phases = [ "buildPhase" ];
buildPhase ="${pkgs.mustache-go}/bin/mustache $data $src > $out";
allowSubstitutes = false; # will never be in cache
};
schemeJSON = scheme: variant:
importJSON (preprocess (mkTheme scheme variant));
schemeJSONCustom = schemePath:
importJSON (preprocess schemePath);
in
{
options = with types; {
themes.base16 = {
enable = mkEnableOption "Base 16 Color Schemes";
customScheme = {
enable = mkEnableOption "Use custom scheme instead of remote repository";
path = mkOption {
type = nullOr path;
default = null;
};
};
scheme = mkOption {
type = str;
default = "solarized";
};
variant = mkOption {
type = str;
default = "solarized-dark";
};
extraParams = mkOption {
type = attrsOf anything;
default = {};
};
defaultTemplateType = mkOption {
type = str;
default = "default";
example = "colors";
};
};
};
config = {
lib.base16.theme =
if cfg.customScheme.enable then
schemeJSONCustom cfg.customScheme.path // cfg.extraParams
else
schemeJSON cfg.scheme cfg.variant // cfg.extraParams;
lib.base16.templateFile = { name, type ? cfg.defaultTemplateType, ... }:
if cfg.customScheme.enable then
mustacheCustom cfg.customScheme.path name type
else
mustache cfg.scheme cfg.variant name type;
};
}