1
|
|
|
""" |
2
|
|
|
download the icons. |
3
|
|
|
""" |
4
|
|
|
|
5
|
|
|
import contextlib |
6
|
|
|
import os |
7
|
|
|
import pathlib |
8
|
|
|
import re |
9
|
|
|
import shutil |
10
|
|
|
import sys |
11
|
|
|
import urllib.error |
12
|
|
|
import urllib.request |
13
|
|
|
|
14
|
|
|
from packaging.version import Version |
15
|
|
|
|
16
|
|
|
import requests |
17
|
|
|
|
18
|
|
|
|
19
|
|
|
def get_icons(): |
20
|
|
|
""" |
21
|
|
|
Download the icons. |
22
|
|
|
""" |
23
|
|
|
get_fontawesome_47() |
24
|
|
|
get_fontawesome_5x() |
25
|
|
|
get_glyphicons_33() |
26
|
|
|
get_material_design_3x() |
27
|
|
|
|
28
|
|
|
|
29
|
|
|
def get_fontawesome_47(): |
30
|
|
|
""" |
31
|
|
|
Download the fontawesome 4.7 icons. |
32
|
|
|
""" |
33
|
|
|
# fontawesome 4.7 |
34
|
|
|
folder = get_folder("fontawesome", "4.7") |
35
|
|
|
download( |
36
|
|
|
"https://raw.githubusercontent.com/FortAwesome/" |
37
|
|
|
"Font-Awesome/v4.7.0/css/font-awesome.css", |
38
|
|
|
folder, |
39
|
|
|
"font-awesome.css", |
40
|
|
|
) |
41
|
|
|
download( |
42
|
|
|
"https://github.com/FortAwesome/Font-Awesome/" |
43
|
|
|
"blob/v4.7.0/fonts/fontawesome-webfont.ttf?raw=true", |
44
|
|
|
folder, |
45
|
|
|
"fontawesome-webfont.ttf", |
46
|
|
|
) |
47
|
|
|
|
48
|
|
|
|
49
|
|
|
def get_fontawesome_5x(): |
50
|
|
|
""" |
51
|
|
|
Download the fontawesome 5.x icons. |
52
|
|
|
""" |
53
|
|
|
# fontawesome 5.x |
54
|
|
|
folder = get_folder("fontawesome", "5.x") |
55
|
|
|
|
56
|
|
|
versions = get_versions( |
57
|
|
|
"https://api.github.com/repos/FortAwesome/Font-Awesome/tags", |
58
|
|
|
"Unable to get the last version number of the Font-Awesome package on github\n", |
59
|
|
|
) |
60
|
|
|
|
61
|
|
|
latest = get_latest("^5.", versions, "5.14.0") |
62
|
|
|
|
63
|
|
|
download( |
64
|
|
|
"https://raw.githubusercontent.com/FortAwesome/Font-Awesome/" |
65
|
|
|
+ latest |
66
|
|
|
+ "/css/fontawesome.css", |
67
|
|
|
folder, |
68
|
|
|
"fontawesome.css", |
69
|
|
|
) |
70
|
|
|
for ttf in ("fa-brands-400", "fa-regular-400", "fa-solid-900"): |
71
|
|
|
download( |
72
|
|
|
"https://github.com/FortAwesome/Font-Awesome/blob/" |
73
|
|
|
+ latest |
74
|
|
|
+ "/webfonts/" |
75
|
|
|
+ ttf |
76
|
|
|
+ ".ttf?raw=true", |
77
|
|
|
folder, |
78
|
|
|
ttf + ".ttf", |
79
|
|
|
) |
80
|
|
|
|
81
|
|
|
|
82
|
|
|
def get_glyphicons_33(): |
83
|
|
|
""" |
84
|
|
|
Download the glyphicons 3.3 icons. |
85
|
|
|
""" |
86
|
|
|
# glyphicons 3.3 |
87
|
|
|
folder = get_folder("glyphicons", "3.3") |
88
|
|
|
|
89
|
|
|
download( |
90
|
|
|
"https://github.com/twbs/bootstrap/raw/v3.3.7/dist/css/bootstrap.css", |
91
|
|
|
folder, |
92
|
|
|
"bootstrap.css", |
93
|
|
|
) |
94
|
|
|
|
95
|
|
|
download( |
96
|
|
|
"https://github.com/twbs/bootstrap/" |
97
|
|
|
"blob/v3.3.7/dist/fonts/glyphicons-halflings-regular.ttf?raw=true", |
98
|
|
|
folder, |
99
|
|
|
"glyphicons-halflings-regular.ttf", |
100
|
|
|
) |
101
|
|
|
|
102
|
|
|
with open( |
103
|
|
|
os.path.join(folder, "bootstrap.css"), "rt", encoding="utf-8" |
104
|
|
|
) as original, open( |
105
|
|
|
os.path.join(folder, "bootstrap-modified.css"), "w", encoding="utf-8" |
106
|
|
|
) as modified: |
107
|
|
|
index = 0 |
108
|
|
|
for line in original: |
109
|
|
|
if index >= 1067: |
110
|
|
|
break |
111
|
|
|
if index >= 280: |
112
|
|
|
modified.write(line) |
113
|
|
|
index = index + 1 |
114
|
|
|
original.close() |
115
|
|
|
modified.close() |
116
|
|
|
|
117
|
|
|
|
118
|
|
|
def get_material_design_3x(): |
119
|
|
|
""" |
120
|
|
|
Download the material design 3.x icons. |
121
|
|
|
""" |
122
|
|
|
# material design 3.x |
123
|
|
|
folder = get_folder("materialdesign", "3.x") |
124
|
|
|
|
125
|
|
|
versions = get_versions( |
126
|
|
|
"https://api.github.com/repos/Templarian/MaterialDesign-Webfont/tags", |
127
|
|
|
"Unable to get the last version number" |
128
|
|
|
"of the MaterialDesign-Webfont package on github\n", |
129
|
|
|
) |
130
|
|
|
|
131
|
|
|
latest = get_latest("^v3.", versions, "v5.9.55") |
132
|
|
|
|
133
|
|
|
download( |
134
|
|
|
"https://github.com/Templarian/MaterialDesign-Webfont/blob/" |
135
|
|
|
+ latest |
136
|
|
|
+ "/css/materialdesignicons.css", |
137
|
|
|
folder, |
138
|
|
|
"materialdesignicons.css", |
139
|
|
|
) |
140
|
|
|
|
141
|
|
|
download( |
142
|
|
|
"https://github.com/Templarian/MaterialDesign-Webfont/blob/" |
143
|
|
|
+ latest |
144
|
|
|
+ "/fonts/materialdesignicons-webfont.ttf?raw=true", |
145
|
|
|
folder, |
146
|
|
|
"materialdesignicons-webfont.ttf", |
147
|
|
|
) |
148
|
|
|
|
149
|
|
|
|
150
|
|
|
def download(url, folder, filename): |
151
|
|
|
""" |
152
|
|
|
Download an url to a folder/filename. |
153
|
|
|
|
154
|
|
|
Arguments |
155
|
|
|
--------- |
156
|
|
|
url |
157
|
|
|
An url |
158
|
|
|
folder |
159
|
|
|
A folder |
160
|
|
|
filename |
161
|
|
|
A filename |
162
|
|
|
""" |
163
|
|
|
print(f"Download '{url}' to {folder}/{filename}") |
164
|
|
|
try: |
165
|
|
|
with urllib.request.urlopen(url) as response, open( |
166
|
|
|
os.path.join(folder, filename), "wb" |
167
|
|
|
) as out_file: |
168
|
|
|
shutil.copyfileobj(response, out_file) |
169
|
|
|
except urllib.error.HTTPError as exception: |
170
|
|
|
sys.stderr.write(str(exception)) |
171
|
|
|
|
172
|
|
|
|
173
|
|
|
def get_latest(match, versions, latest): |
174
|
|
|
""" |
175
|
|
|
Get the latest version. |
176
|
|
|
|
177
|
|
|
Arguments |
178
|
|
|
--------- |
179
|
|
|
match |
180
|
|
|
A regular expression |
181
|
|
|
versions |
182
|
|
|
A list of versions |
183
|
|
|
latest |
184
|
|
|
Last known version |
185
|
|
|
|
186
|
|
|
Returns |
187
|
|
|
------- |
188
|
|
|
The latest version |
189
|
|
|
""" |
190
|
|
|
with contextlib.suppress(TypeError): |
191
|
|
|
for version in versions: |
192
|
|
|
if re.match(match, version["name"]) and Version(version["name"]) > Version( |
193
|
|
|
latest |
194
|
|
|
): |
195
|
|
|
latest = version["name"] |
196
|
|
|
return latest |
197
|
|
|
|
198
|
|
|
|
199
|
|
|
def get_folder(collection, icon_version): |
200
|
|
|
""" |
201
|
|
|
Get a folder. |
202
|
|
|
|
203
|
|
|
Arguments |
204
|
|
|
--------- |
205
|
|
|
collection |
206
|
|
|
The collection name |
207
|
|
|
icon_version |
208
|
|
|
The icon version |
209
|
|
|
|
210
|
|
|
Returns |
211
|
|
|
------- |
212
|
|
|
The folder |
213
|
|
|
""" |
214
|
|
|
folder = os.path.join( |
215
|
|
|
"share", |
216
|
|
|
"pandoc_latex_tip", |
217
|
|
|
collection, |
218
|
|
|
icon_version, |
219
|
|
|
) |
220
|
|
|
|
221
|
|
|
if not pathlib.Path(folder).exists(): |
222
|
|
|
pathlib.Path(folder).mkdir(parents=True) |
223
|
|
|
|
224
|
|
|
return folder |
225
|
|
|
|
226
|
|
|
|
227
|
|
|
def get_versions(url, message): |
228
|
|
|
""" |
229
|
|
|
Get all versions from an URL. |
230
|
|
|
|
231
|
|
|
Arguments |
232
|
|
|
--------- |
233
|
|
|
url |
234
|
|
|
An url |
235
|
|
|
message |
236
|
|
|
A mesasge |
237
|
|
|
|
238
|
|
|
Returns |
239
|
|
|
------- |
240
|
|
|
The list of versions. |
241
|
|
|
""" |
242
|
|
|
try: |
243
|
|
|
return requests.get(url, timeout=300).json() |
244
|
|
|
except ValueError: |
245
|
|
|
sys.stderr.write(message) |
246
|
|
|
return [] |
247
|
|
|
|
248
|
|
|
|
249
|
|
|
if __name__ == "__main__": |
250
|
|
|
get_icons() |
251
|
|
|
|