1{ lib
2, stdenvNoCC
3, fetchurl
4, unzip
5}:
6
7let
8 makeSuperOTC =
9 { family
10 , description
11 , rev
12 , hash
13 , zip ? ""
14 , prefix ? ""
15 }:
16 let
17 Family =
18 lib.toUpper (lib.substring 0 1 family) +
19 lib.substring 1 (lib.stringLength family) family;
20 in
21 stdenvNoCC.mkDerivation rec {
22 pname = "source-han-${family}";
23 version = lib.removeSuffix "R" rev;
24
25 src = fetchurl {
26 url = "https://github.com/adobe-fonts/source-han-${family}/releases/download/${rev}/${prefix}SourceHan${Family}.ttc${zip}";
27 inherit hash;
28 };
29
30 nativeBuildInputs = lib.optionals (zip == ".zip") [ unzip ];
31
32 unpackPhase = lib.optionalString (zip == "") ''
33 cp $src SourceHan${Family}.ttc${zip}
34 '' + lib.optionalString (zip == ".zip") ''
35 unzip $src
36 '';
37
38 installPhase = ''
39 runHook preInstall
40
41 install -Dm444 *.ttc -t $out/share/fonts/opentype/${pname}
42
43 runHook postInstall
44 '';
45
46 meta = {
47 description = "Open source Pan-CJK ${description} typeface";
48 homepage = "https://github.com/adobe-fonts/source-han-${family}";
49 license = lib.licenses.ofl;
50 maintainers = with lib.maintainers; [ taku0 emily ];
51 };
52 };
53
54 makeVariable =
55 { family
56 , version
57 , hash
58 , format
59 }:
60 let
61 Family =
62 lib.toUpper (lib.substring 0 1 family) +
63 lib.substring 1 (lib.stringLength family) family;
64 in
65 fetchurl {
66 pname = "source-han-${family}-vf-${format}";
67 inherit version hash;
68 url = "https://raw.githubusercontent.com/adobe-fonts/source-han-${family}/${version}R/Variable/OTC/SourceHan${Family}-VF.${format}.ttc";
69 recursiveHash = true;
70 downloadToTemp = true;
71 postFetch = "install -Dm444 $downloadedFile $out/share/fonts/variable/SourceHan${Family}-VF.${format}.ttc";
72
73 meta = {
74 description = "Open source Pan-CJK ${Family} typeface";
75 homepage = "https://github.com/adobe-fonts/source-han-${family}";
76 license = lib.licenses.ofl;
77 maintainers = with lib.maintainers; [ taku0 emily ];
78 };
79 };
80in
81{
82 sans = makeSuperOTC {
83 family = "sans";
84 description = "sans-serif";
85 rev = "2.004R";
86 hash = "sha256-b1kRiprdpaf+Tp5rtTgwn34dPFQR+anTKvMqeVAbfk8=";
87 zip = ".zip";
88 };
89
90 serif = makeSuperOTC {
91 family = "serif";
92 description = "serif";
93 rev = "2.001R";
94 hash = "sha256-ULdrtPLtzsgfZEHWkr4ebC/FSROHBWJJVD+PzdIJ6Og=";
95 zip = ".zip";
96 prefix = "01_";
97 };
98
99 mono = makeSuperOTC {
100 family = "mono";
101 description = "monospaced";
102 rev = "1.002";
103 hash = "sha256-DBkkSN6QhI8R64M2h2iDqaNtxluJZeSJYAz8x6ZzWME=";
104 };
105
106 sans-vf-otf = makeVariable {
107 family = "sans";
108 version = "2.004";
109 hash = "sha256-V7PE09c7h4RDS8Ij4PSI36Gy+LM+PVDi73Rcs+4DfHo=";
110 format = "otf";
111 };
112
113 sans-vf-ttf = makeVariable {
114 family = "sans";
115 version = "2.004";
116 hash = "sha256-mXTG/d30gUxzxkJpaH4vOawRXMSxxTXlHCvHEsfGqbc=";
117 format = "ttf";
118 };
119
120 serif-vf-otf = makeVariable {
121 family = "serif";
122 version = "2.002";
123 hash = "sha256-8sD4bU6w7HBm4vBuPAjcjpxN2rtEJugAw+X0bAOcmjA=";
124 format = "otf";
125 };
126
127 serif-vf-ttf = makeVariable {
128 family = "serif";
129 version = "2.002";
130 hash = "sha256-dmTZFRsD55WCOg2+sqd8bkmTSnSNn5xUYf0PgzIvzww=";
131 format = "ttf";
132 };
133}