Passed
Push — develop ( 6653d0...8285d4 )
by Christophe
03:46
created

download   A

Complexity

Total Complexity 22

Size/Duplication

Total Lines 251
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 122
dl 0
loc 251
rs 10
c 0
b 0
f 0
wmc 22

9 Functions

Rating   Name   Duplication   Size   Complexity  
A get_icons() 0 8 1
A get_versions() 0 20 2
A get_folder() 0 26 2
A get_fontawesome_5x() 0 30 2
B get_glyphicons_33() 0 34 5
A get_latest() 0 24 5
A download() 0 21 3
A get_material_design_3x() 0 29 1
A get_fontawesome_47() 0 17 1
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