blob: 805425b931e50d9ee623806ccc30aef3d8919371 [file] [log] [blame]
Skyler Grey95c67e02022-10-30 22:28:42 +00001{
2 lib,
3 fetchFromGitHub,
4 stdenv,
5 fontforge,
Skyler Grey0c7d0922022-10-30 22:59:22 +00006 writeText,
7 useNerdfontsOffset ? true,
Skyler Grey95c67e02022-10-30 22:28:42 +00008}: let
Skyler Grey0c7d0922022-10-30 22:59:22 +00009 pname = "octicons";
10 version = "4.4.0";
11 src = fetchFromGitHub {
12 owner = "primer";
13 repo = "octicons";
14 rev = "v${version}";
15 sha256 = "sha256-xhJRe5mO2YkqQggqZ1JHBYsJKQUSJA08crDvl22GSGg=";
16 };
17
18 script = writeText "octicons.py" ''
Skyler Grey95c67e02022-10-30 22:28:42 +000019 import fontforge
20 import json
Skyler Grey0c7d0922022-10-30 22:59:22 +000021 import itertools
22
23
24 if ${
25 if useNerdfontsOffset
26 then "True"
27 else "False"
28 }:
29 validRange = list(itertools.chain((0x2665, 0x26a1), range(0xF400, 0xF4A8), (0xF112, 0xF67C)))
30 def codepointTransform(_):
31 return validRange.pop(0)
32 else:
33 codepointTransform = lambda cp: cp
34
35 offset = ${
36 if useNerdfontsOffset
37 then "0x0400"
38 else "0"
39 }
40
41 with open("${src}/lib/font/codepoints.json") as f:
Skyler Grey95c67e02022-10-30 22:28:42 +000042 codepoints = json.load(f)
43
44 font = fontforge.font()
45
Skyler Grey0c7d0922022-10-30 22:59:22 +000046 for name, codepoint in sorted(codepoints.items(), key=lambda item: item[1]):
47 transformed = codepointTransform(codepoint)
48 print(name, hex(transformed))
49 glyph = font.createChar(transformed)
50 glyph.importOutlines(f"${src}/lib/svg/{name}.svg")
Skyler Grey95c67e02022-10-30 22:28:42 +000051
Skyler Grey0c7d0922022-10-30 22:59:22 +000052 font.familyname = "${pname}"
53 font.fullname = "${pname}"
54 font.fontname = "${pname}"
Skyler Grey95c67e02022-10-30 22:28:42 +000055
Skyler Grey0c7d0922022-10-30 22:59:22 +000056 font.generate("${pname}.ttf")
Skyler Grey95c67e02022-10-30 22:28:42 +000057 '';
58in
Skyler Grey0c7d0922022-10-30 22:59:22 +000059 stdenv.mkDerivation rec {
60 inherit version src pname;
Skyler Grey95c67e02022-10-30 22:28:42 +000061
62 buildPhase = ''
63 fontforge \
64 -lang py \
Skyler Grey0c7d0922022-10-30 22:59:22 +000065 -script ${script} \;
Skyler Grey95c67e02022-10-30 22:28:42 +000066 '';
67
68 installPhase = ''
Skyler Grey0c7d0922022-10-30 22:59:22 +000069 mkdir -p $out/bin $out/share/fonts/truetype
70 mv ${pname}.ttf $out/share/fonts/truetype
71 echo $out
Skyler Grey95c67e02022-10-30 22:28:42 +000072 '';
73
74 nativeBuildInputs = [fontforge];
75
76 meta = with lib; {
77 description = "GitHub's Octicons icon pack";
78 homepage = "https://github.com/primer/octicons";
79 license = licenses.mit;
80 maintainers = with maintainers; [minion3665];
81 };
82 }