summary refs log tree commit diff
path: root/pkgs/data/fonts/iosevka/default.nix
blob: 657eb80c53924f68908ad0cb91d932ca8e7cb62b (plain) (blame)
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
{
  stdenv, lib,
  fetchFromGitHub, fetchurl,
  runCommand, writeText,
  nodejs, ttfautohint-nox, otfcc,

  # Custom font set options.
  # See https://github.com/be5invis/Iosevka#build-your-own-style
  design ? [], upright ? [], italic ? [], oblique ? [],
  family ? null, weights ? [],
  # Custom font set name. Required if any custom settings above.
  set ? null
}:

assert (design != []) -> set != null;
assert (upright != []) -> set != null;
assert (italic != []) -> set != null;
assert (oblique != []) -> set != null;
assert (family != null) -> set != null;
assert (weights != []) -> set != null;

let
  installPackageLock = import ./package-lock.nix { inherit fetchurl lib; };
in

let pname = if set != null then "iosevka-${set}" else "iosevka"; in

let
  version = "1.14.2";
  name = "${pname}-${version}";
  src = fetchFromGitHub {
    owner = "be5invis";
    repo ="Iosevka";
    rev = "v${version}";
    sha256 = "18vh5rjffqgiliyfia40lh7cygz6fv3rwgq28fxl26i9sc95qsqd";
  };
in

with lib;
let unwords = concatStringsSep " "; in

let
  param = name: options:
    if options != [] then "${name}='${unwords options}'" else null;
  config = unwords (lib.filter (x: x != null) [
    (param "design" design)
    (param "upright" upright)
    (param "italic" italic)
    (param "oblique" oblique)
    (if family != null then "family='${family}'" else null)
    (param "weights" weights)
  ]);
  custom = design != [] || upright != [] || italic != [] || oblique != []
    || family != null || weights != [];
in

stdenv.mkDerivation {
  inherit name pname version src;

  nativeBuildInputs = [ nodejs ttfautohint-nox otfcc ];

  passAsFile = [ "installPackageLock" ];
  installPackageLock = installPackageLock ./package-lock.json;

  preConfigure = ''
    HOME=$TMPDIR
    source "$installPackageLockPath";
    npm --offline rebuild
  '';

  configurePhase = ''
    runHook preConfigure

    ${optionalString custom ''make custom-config set=${set} ${config}''}

    runHook postConfigure
  '';

  makeFlags = lib.optionals custom [ "custom" "set=${set}" ];

  installPhase = ''
    runHook preInstall

    fontdir="$out/share/fonts/$pname"
    install -d "$fontdir"
    install "dist/$pname/ttf"/* "$fontdir"

    runHook postInstall
  '';

  enableParallelBuilding = true;

  meta = with stdenv.lib; {
    homepage = https://be5invis.github.io/Iosevka/;
    downloadPage = "https://github.com/be5invis/Iosevka/releases";
    description = ''
      Slender monospace sans-serif and slab-serif typeface inspired by Pragmata
      Pro, M+ and PF DIN Mono, designed to be the ideal font for programming.
    '';
    license = licenses.ofl;
    platforms = platforms.all;
    maintainers = with maintainers; [ cstrahan jfrankenau ttuegel ];
  };
}