1{
2 lib,
3 stdenvNoCC,
4 fetchurl,
5 unzip,
6}:
7
8let
9 makeSuperOTC =
10 {
11 family,
12 description,
13 rev,
14 hash,
15 zip ? "",
16 prefix ? "",
17 }:
18 let
19 Family = lib.toUpper (lib.substring 0 1 family) + 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 =
33 lib.optionalString (zip == "") ''
34 cp $src SourceHan${Family}.ttc${zip}
35 ''
36 + lib.optionalString (zip == ".zip") ''
37 unzip $src
38 '';
39
40 installPhase = ''
41 runHook preInstall
42
43 install -Dm444 *.ttc -t $out/share/fonts/opentype/${pname}
44
45 runHook postInstall
46 '';
47
48 meta = {
49 description = "Open source Pan-CJK ${description} typeface";
50 homepage = "https://github.com/adobe-fonts/source-han-${family}";
51 license = lib.licenses.ofl;
52 maintainers = with lib.maintainers; [
53 taku0
54 emily
55 ];
56 };
57 };
58
59 makeVariable =
60 {
61 family,
62 version,
63 hash,
64 format,
65 }:
66 let
67 Family = lib.toUpper (lib.substring 0 1 family) + lib.substring 1 (lib.stringLength family) family;
68 in
69 fetchurl {
70 pname = "source-han-${family}-vf-${format}";
71 inherit version hash;
72 url = "https://raw.githubusercontent.com/adobe-fonts/source-han-${family}/${version}R/Variable/OTC/SourceHan${Family}-VF.${format}.ttc";
73 recursiveHash = true;
74 downloadToTemp = true;
75 postFetch = "install -Dm444 $downloadedFile $out/share/fonts/variable/SourceHan${Family}-VF.${format}.ttc";
76
77 meta = {
78 description = "Open source Pan-CJK ${Family} typeface";
79 homepage = "https://github.com/adobe-fonts/source-han-${family}";
80 license = lib.licenses.ofl;
81 maintainers = with lib.maintainers; [
82 taku0
83 emily
84 ];
85 };
86 };
87in
88{
89 sans = makeSuperOTC {
90 family = "sans";
91 description = "sans-serif";
92 rev = "2.005R";
93 hash = "sha256-oCTPF1lJSEfNR6rkN5vLPcUwAXxwnz9QPuDtkY3ZKVI=";
94 zip = ".zip";
95 prefix = "01_";
96 };
97
98 serif = makeSuperOTC {
99 family = "serif";
100 description = "serif";
101 rev = "2.003R";
102 hash = "sha256-buaJq1eJSuNa9gSnPpXDcr2gMGYQ/6F5pHCOjNR6eV8=";
103 zip = ".zip";
104 prefix = "01_";
105 };
106
107 mono = makeSuperOTC {
108 family = "mono";
109 description = "monospaced";
110 rev = "1.002";
111 hash = "sha256-DBkkSN6QhI8R64M2h2iDqaNtxluJZeSJYAz8x6ZzWME=";
112 };
113
114 sans-vf-otf = makeVariable {
115 family = "sans";
116 version = "2.005";
117 hash = "sha256-7/THncqTE6IpPezcX14eYRRC8WR/xPv0XjfOPEfF8aU=";
118 format = "otf";
119 };
120
121 sans-vf-ttf = makeVariable {
122 family = "sans";
123 version = "2.005";
124 hash = "sha256-CL5kjZzCiNvdcwiFflTlarINpeYxvuqZH+4ayiIQdD8=";
125 format = "ttf";
126 };
127
128 serif-vf-otf = makeVariable {
129 family = "serif";
130 version = "2.003";
131 hash = "sha256-a6295Ukha9QY5ByMr2FUy13j5gZ1itnezvfJWmJjqt0=";
132 format = "otf";
133 };
134
135 serif-vf-ttf = makeVariable {
136 family = "serif";
137 version = "2.003";
138 hash = "sha256-F+FUQunfyAEBVV10lZxC3dzGTWhHgHzpTO8CjC3n4WY=";
139 format = "ttf";
140 };
141}