blob: d35fbbaf5122af86497f62460719ff55ad2d7688 [file] [log] [blame]
Skyler Grey252927a2022-10-18 22:18:15 +01001{ lib
2, fetchFromGitHub
3, stdenv
4, fontforge
5, writeText
6, useNerdfontsOffset ? true
7,
8}:
9let
Skyler Grey0c7d0922022-10-30 22:59:22 +000010 pname = "octicons";
11 version = "4.4.0";
12 src = fetchFromGitHub {
13 owner = "primer";
14 repo = "octicons";
15 rev = "v${version}";
16 sha256 = "sha256-xhJRe5mO2YkqQggqZ1JHBYsJKQUSJA08crDvl22GSGg=";
17 };
18
19 script = writeText "octicons.py" ''
Skyler Grey95c67e02022-10-30 22:28:42 +000020 import fontforge
21 import json
Skyler Grey0c7d0922022-10-30 22:59:22 +000022 import itertools
23
24
25 if ${
26 if useNerdfontsOffset
27 then "True"
28 else "False"
29 }:
30 validRange = list(itertools.chain((0x2665, 0x26a1), range(0xF400, 0xF4A8), (0xF112, 0xF67C)))
31 def codepointTransform(_):
32 return validRange.pop(0)
33 else:
34 codepointTransform = lambda cp: cp
35
36 offset = ${
37 if useNerdfontsOffset
38 then "0x0400"
39 else "0"
40 }
41
42 with open("${src}/lib/font/codepoints.json") as f:
Skyler Grey95c67e02022-10-30 22:28:42 +000043 codepoints = json.load(f)
44
45 font = fontforge.font()
46
Skyler Grey0c7d0922022-10-30 22:59:22 +000047 for name, codepoint in sorted(codepoints.items(), key=lambda item: item[1]):
48 transformed = codepointTransform(codepoint)
49 print(name, hex(transformed))
50 glyph = font.createChar(transformed)
51 glyph.importOutlines(f"${src}/lib/svg/{name}.svg")
Skyler Grey95c67e02022-10-30 22:28:42 +000052
Skyler Grey0c7d0922022-10-30 22:59:22 +000053 font.familyname = "${pname}"
54 font.fullname = "${pname}"
55 font.fontname = "${pname}"
Skyler Grey95c67e02022-10-30 22:28:42 +000056
Skyler Grey0c7d0922022-10-30 22:59:22 +000057 font.generate("${pname}.ttf")
Skyler Grey95c67e02022-10-30 22:28:42 +000058 '';
59in
Skyler Grey252927a2022-10-18 22:18:15 +010060stdenv.mkDerivation rec {
61 inherit version src pname;
Skyler Grey95c67e02022-10-30 22:28:42 +000062
Skyler Grey252927a2022-10-18 22:18:15 +010063 buildPhase = ''
64 fontforge \
65 -lang py \
66 -script ${script} \;
67 '';
Skyler Grey95c67e02022-10-30 22:28:42 +000068
Skyler Grey252927a2022-10-18 22:18:15 +010069 installPhase = ''
70 mkdir -p $out/bin $out/share/fonts/truetype
71 mv ${pname}.ttf $out/share/fonts/truetype
72 echo $out
73 '';
Skyler Grey95c67e02022-10-30 22:28:42 +000074
Skyler Grey252927a2022-10-18 22:18:15 +010075 nativeBuildInputs = [ fontforge ];
Skyler Grey95c67e02022-10-30 22:28:42 +000076
Skyler Grey252927a2022-10-18 22:18:15 +010077 meta = with lib; {
78 description = "GitHub's Octicons icon pack";
79 homepage = "https://github.com/primer/octicons";
80 license = licenses.mit;
81 maintainers = with maintainers; [ minion3665 ];
82 };
83}