prepare_software_list.py

Mon, 20 Mar 2023 11:49:20 +0000

author
Matthew Wild <mwild1@gmail.com>
date
Mon, 20 Mar 2023 11:49:20 +0000
changeset 6
266242703b38
parent 0
8e1675826e46
permissions
-rwxr-xr-x

Update implementation count query to exclude negative implementation statuses

E.g. 'removed' or 'wontfix' are possible implementation statuses.

0
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 '''
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2 Download / prepare / process XMPP DOAP files for the software list
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 Requires: Pillow, python-slugify
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 '''
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5 from typing import Any
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6 from typing import Optional
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7 from typing import Union
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9 import json
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10 import os
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11 import re
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12 import shutil
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13 from datetime import date
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
14 from pathlib import Path
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15 from urllib.parse import urlparse
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17 from colorama import Fore
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18 from colorama import Style
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19 from defusedxml.ElementTree import parse
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20 from defusedxml.ElementTree import ParseError
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21 from PIL import Image
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 from PIL import UnidentifiedImageError
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23 from PIL.Image import Resampling
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 from slugify import slugify
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26 from util import download_file
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27 from util import initialize_directory
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 SOFTWARE_PATH = Path('content/software')
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30 DATA_PATH = Path('data')
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 DOWNLOAD_PATH = Path('downloads')
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 STATIC_PATH = Path('static')
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 STATIC_DOAP_PATH = STATIC_PATH / 'doap'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 LOGOS_PATH = STATIC_PATH / 'images' / 'packages'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36 DOAP_NS = 'http://usefulinc.com/ns/doap#'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 XMPP_NS = 'https://linkmauve.fr/ns/xmpp-doap#'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 SCHEMA_NS = 'https://schema.org/'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 RDF_RESOURCE = '{http://www.w3.org/1999/02/22-rdf-syntax-ns#}resource'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 DOAP_NAME = f'.//{{{DOAP_NS}}}name'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41 DOAP_SHORTDESC = f'.//{{{DOAP_NS}}}shortdesc'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 DOAP_HOMEPAGE = f'.//{{{DOAP_NS}}}homepage'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 DOAP_OS = f'.//{{{DOAP_NS}}}os'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 DOAP_PROGRAMMING_LANGUAGE = f'.//{{{DOAP_NS}}}programming-language'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 DOAP_LOGO = f'.//{{{SCHEMA_NS}}}logo'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 DOAP_IMPLEMENTS = f'.//{{{DOAP_NS}}}implements'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 DOAP_SUPPORTED_XEP = f'.//{{{XMPP_NS}}}SupportedXep'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 DOAP_XEP_NUMBER = f'.//{{{XMPP_NS}}}xep'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49 DOAP_XEP_VERSION = f'.//{{{XMPP_NS}}}version'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 DOAP_XEP_STATUS = f'.//{{{XMPP_NS}}}status'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52 RFC_REGEX = r'rfc\d{1,4}'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 XEP_REGEX = r'xep-\d{1,4}'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 XML_DECLARATION = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56 XMPP_XSL = '<?xml-stylesheet href=\"/doap/xmpp-style.xsl\" type=\"text/xsl\"?>'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58 MD_FRONTMATTER = '''---
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 title: "%(title)s"
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60 date: %(date)s
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 layout: packages
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62 aliases:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 - "/software/%(type)s/%(name_slug)s"
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64 ---
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66 {{< package-details name_slug="%(name_slug)s" package_type="%(type)s" >}}
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67 '''
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 SOFTWARE_CATEGORIES: list[str] = [
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70 'client',
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71 'component',
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72 'library',
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73 'server',
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74 'tool',
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75 ]
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
76 PLATFORMS: list[str] = [
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
77 'Android',
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
78 'iOS',
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
79 'Browser',
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
80 'Windows',
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
81 'macOS',
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
82 'Linux',
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
83 ]
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
84
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
85
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
86 def parse_doap_infos(doap_file: str
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
87 ) -> Optional[dict[str, Union[str, list[str], list[dict[str, str]], None]]]:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
88 '''
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
89 Parse DOAP file and return infos
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
90 '''
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
91 try:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
92 doap = parse(
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
93 DOWNLOAD_PATH / f'doap_files/{doap_file}.doap')
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
94 except (FileNotFoundError, ParseError) as err:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
95 print('Error while trying to parse DOAP file:', doap_file, err)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
96 return None
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
97
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
98 info: dict[str, Union[str, list[str], list[dict[str, str]], None]] = {}
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
99
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
100 info['name'] = None
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
101 doap_name = doap.find(DOAP_NAME)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
102 if doap_name is not None:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
103 info['name'] = doap_name.text
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
104
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
105 info['homepage'] = None
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
106 doap_homepage = doap.find(DOAP_HOMEPAGE)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
107 if doap_homepage is not None:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
108 info['homepage'] = doap_homepage.attrib.get(RDF_RESOURCE)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
109
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
110 info['shortdesc'] = None
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
111 doap_shortdesc = doap.find(DOAP_SHORTDESC)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
112 if doap_shortdesc is not None:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
113 info['shortdesc'] = doap_shortdesc.text
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
114
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
115 info['platforms'] = []
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
116 for entry in doap.findall(DOAP_OS):
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
117 info['platforms'].append(entry.text)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
118
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
119 info['programming_lang'] = []
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
120 for entry in doap.findall(DOAP_PROGRAMMING_LANGUAGE):
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
121 info['programming_lang'].append(entry.text)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
122
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
123 info['logo'] = None
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
124 doap_logo = doap.find(DOAP_LOGO)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
125 if doap_logo is not None:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
126 info['logo'] = doap_logo.attrib.get(RDF_RESOURCE)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
127
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
128 rfcs: list[str] = []
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
129 xeps: list[dict[str, str]] = []
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
130 for entry in doap.findall(DOAP_IMPLEMENTS):
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
131 rfc = entry.attrib.get(RDF_RESOURCE)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
132 if rfc is not None:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
133 match = re.search(RFC_REGEX, rfc)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
134 if match:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
135 rfcs.append(match.group()[3:])
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
136
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
137 supported_xep = entry.find(DOAP_SUPPORTED_XEP)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
138 if supported_xep is not None:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
139 number = supported_xep.find(DOAP_XEP_NUMBER)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
140 if number is not None:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
141 number = number.attrib.get(RDF_RESOURCE)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
142 match = re.search(XEP_REGEX, number or '')
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
143 if match:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
144 number = match.group()[4:]
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
145
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
146 version = supported_xep.find(DOAP_XEP_VERSION)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
147 if version is not None:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
148 version = version.text
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
149
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
150 status = supported_xep.find(DOAP_XEP_STATUS)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
151 if status is not None:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
152 status = status.text
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
153
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
154 xeps.append({
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
155 'ref': supported_xep.find(DOAP_XEP_NUMBER).text,
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
156 'number': number,
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
157 'version': version,
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
158 'status': status,
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
159 })
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
160
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
161 info['rfcs'] = rfcs
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
162 info['xeps'] = xeps
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
163
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
164 return info
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
165
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
166
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
167 def check_image_file(file_path: Path, extension: str) -> bool:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
168 '''
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
169 Check if file size is greater than 300 KiB and if so, resize image
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
170 Returns success
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
171 '''
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
172 if extension == 'svg':
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
173 # No need to resize SVG files
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
174 return True
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
175
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
176 try:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
177 file_size = os.path.getsize(file_path)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
178 except OSError as error:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
179 print('An error occurred while trying to open logo:', error)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
180 return False
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
181
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
182 if file_size <= 300000:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
183 # Small enough, no need to resize image
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
184 return True
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
185
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
186 try:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
187 with Image.open(file_path) as img:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
188 width, height = img.size
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
189 new_width = 400
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
190 new_height = int(new_width * height / width)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
191 img = img.resize(
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
192 (new_width, new_height), Resampling.LANCZOS)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
193 img.save(file_path)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
194 print(f' Logo at {file_path} '
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
195 f'(file size: {file_size / (1<<10):,.0f} KB) '
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
196 f'too big, had to be resized')
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
197 except (ValueError, OSError, UnidentifiedImageError) as error:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
198 print('An error occurred while trying to resize logo:', error)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
199 return False
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
200
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
201 return True
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
202
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
203
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
204 def process_logo(package_name: str, uri: str) -> Optional[str]:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
205 '''
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
206 Download package logo and return logo URI
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
207 '''
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
208 image_url = urlparse(uri)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
209 _, extension = os.path.splitext(image_url.path)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
210 file_name = f'{package_name}{extension}'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
211 success = download_file(
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
212 uri,
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
213 Path(file_name))
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
214 if not success:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
215 return None
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
216
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
217 success = check_image_file(
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
218 DOWNLOAD_PATH / file_name, extension[1:].lower())
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
219 if not success:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
220 return None
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
221 logo_uri = f'/images/packages/{package_name}{extension}'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
222 shutil.copyfile(
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
223 DOWNLOAD_PATH / file_name,
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
224 Path(LOGOS_PATH / file_name))
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
225 return logo_uri
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
226
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
227
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
228 def prepare_package_data() -> None:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
229 '''
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
230 Download and prepare package data (software.json) for
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
231 rendering with Hugo
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
232 '''
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
233 for category in SOFTWARE_CATEGORIES:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
234 if category == 'library':
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
235 category = 'libraries'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
236 else:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
237 category = f'{category}s'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
238
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
239 shutil.copy(SOFTWARE_PATH / '_index.md',
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
240 DOWNLOAD_PATH / 'software_index.md')
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
241 shutil.copy(SOFTWARE_PATH / 'software-comparison.md',
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
242 DOWNLOAD_PATH / 'software-comparison.md')
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
243 initialize_directory(SOFTWARE_PATH)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
244 shutil.copy(DOWNLOAD_PATH / 'software_index.md',
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
245 SOFTWARE_PATH / '_index.md')
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
246 shutil.copy(DOWNLOAD_PATH / 'software-comparison.md',
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
247 SOFTWARE_PATH / 'software-comparison.md')
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
248
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
249 with open(DATA_PATH / 'software.json', 'rb') as json_file:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
250 xsf_package_list = json.load(json_file)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
251
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
252 package_infos: dict[str, Any] = {}
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
253
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
254 number_of_doap_packages = 0
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
255
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
256 for package in xsf_package_list:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
257 if package['doap'] is None:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
258 print(f'{Fore.YELLOW}DOAP n/a'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
259 f'{Style.RESET_ALL} ',
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
260 package['name'])
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
261 continue
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
262
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
263 # DOAP is available
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
264 number_of_doap_packages += 1
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
265 package_name_slug = slugify(
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
266 package['name'],
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
267 replacements=[['+', 'plus']])
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
268
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
269 doap_url = package['doap']
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
270 if doap_url.startswith('/hosted-doap'):
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
271 # DOAP file is hosted at xmpp.org
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
272 print(f'{Fore.LIGHTCYAN_EX}DOAP by xmpp.org'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
273 f'{Style.RESET_ALL} ',
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
274 package['name'])
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
275 shutil.copyfile(
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
276 f'{STATIC_PATH}{doap_url}',
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
277 Path(f'{DOWNLOAD_PATH}/doap_files/{package_name_slug}.doap'))
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
278 else:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
279 print(f'{Fore.LIGHTBLUE_EX}DOAP by vendor'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
280 f'{Style.RESET_ALL} ',
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
281 package['name'])
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
282 download_file(
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
283 package['doap'],
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
284 Path(f'doap_files/{package_name_slug}.doap'))
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
285
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
286 parsed_package_infos = parse_doap_infos(package_name_slug)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
287 if parsed_package_infos is None:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
288 continue
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
289
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
290 logo_uri = None
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
291 logo = parsed_package_infos['logo']
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
292 if logo is not None and isinstance(logo, str):
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
293 logo_uri = process_logo(
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
294 package_name_slug, logo)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
295
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
296 package_infos[package['name']] = {
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
297 'categories': package['categories'],
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
298 'name_slug': package_name_slug,
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
299 'homepage': parsed_package_infos['homepage'],
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
300 'logo': logo_uri,
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
301 'shortdesc': parsed_package_infos['shortdesc'],
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
302 'platforms': parsed_package_infos['platforms'],
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
303 'programming_lang': parsed_package_infos['programming_lang'],
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
304 'rfcs': parsed_package_infos['rfcs'],
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
305 'xeps': parsed_package_infos['xeps'],
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
306 }
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
307
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
308 for category in package['categories']:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
309 if category == 'library':
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
310 category = 'libraries'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
311 else:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
312 category = f'{category}s'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
313 create_package_page(category, package_name_slug, package['name'])
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
314
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
315 print(f'Number of packages:\n'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
316 f'total: {len(xsf_package_list)} '
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
317 f'(with DOAP: {number_of_doap_packages}), '
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
318 f'\n{42 * "="}')
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
319 with open(DATA_PATH / 'software_list_doap.json',
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
320 'w',
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
321 encoding='utf-8') as package_data_file:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
322 json.dump(package_infos, package_data_file, indent=4)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
323
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
324
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
325 def add_doap_data_to_xeplist() -> None:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
326 with open(DATA_PATH / 'software_list_doap.json') as software_list:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
327 software_data = json.load(software_list)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
328 with open(DATA_PATH / 'xeplist.json') as xep_list:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
329 xep_data = json.load(xep_list)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
330
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
331 for xep in xep_data:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
332 xep['implementations'] = []
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
333 for name, package_data in software_data.items():
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
334 if not package_data['xeps']:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
335 continue
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
336 for supported_xep in package_data['xeps']:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
337 if xep['number'] is not None and (supported_xep['number'] == f'{xep["number"]:04d}') \
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
338 or supported_xep["ref"] == xep["url"]:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
339 xep['implementations'].append({
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
340 'package_name': name,
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
341 'package_name_slug': package_data['name_slug'],
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
342 'package_categories': package_data['categories'],
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
343 'implemented_version': supported_xep['version'],
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
344 'implementation_status': supported_xep['status']
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
345 })
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
346 break
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
347
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
348 with open(DATA_PATH / 'xeplist.json',
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
349 'w',
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
350 encoding='utf-8') as xep_list:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
351 json.dump(xep_data, xep_list, indent=4)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
352
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
353 def create_package_page(package_type: str, name_slug: str, name: str) -> None:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
354 '''
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
355 Create an .md page for package, containing a shortcode
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
356 for displaying package details
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
357 '''
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
358 today = date.today()
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
359 date_formatted = today.strftime('%Y-%m-%d')
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
360 with open(SOFTWARE_PATH / f'{name_slug}.md',
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
361 'w',
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
362 encoding='utf8') as md_file:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
363 md_file.write(
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
364 MD_FRONTMATTER % {
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
365 'title': f'XMPP {package_type.capitalize()}: {name}',
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
366 'date': date_formatted,
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
367 'type': package_type,
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
368 'name_slug': name_slug,
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
369 }
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
370 )
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
371
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
372
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
373 def prepare_doap_files() -> None:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
374 '''
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
375 Copy DOAP files to /static/doap/ and replace the
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
376 xml-stylesheet with our stylesheet (or add it, if there is none)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
377 '''
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
378 for entry in os.scandir(DOWNLOAD_PATH / 'doap_files'):
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
379 shutil.copy(DOWNLOAD_PATH / 'doap_files' / entry.name,
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
380 STATIC_DOAP_PATH / entry.name)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
381
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
382 for entry in os.scandir(STATIC_PATH / 'hosted-doap'):
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
383 shutil.copy(STATIC_PATH / 'hosted-doap' / entry.name,
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
384 STATIC_DOAP_PATH / entry.name)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
385
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
386 xml_declaration_pattern = r'<\?xml version.+?\?>'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
387 stylesheet_pattern = r'<\?xml-stylesheet.+?\?>'
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
388 for entry in os.scandir(STATIC_DOAP_PATH):
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
389 if not entry.name.endswith('.doap'):
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
390 continue
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
391
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
392 with open(STATIC_DOAP_PATH / entry.name,
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
393 'r+',
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
394 encoding='utf-8') as doap_file:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
395 content = doap_file.read()
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
396
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
397 result = re.sub(
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
398 stylesheet_pattern,
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
399 XMPP_XSL,
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
400 content,
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
401 0,
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
402 re.MULTILINE)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
403 if result != content:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
404 # Replaced custom stylesheet with our stylesheet
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
405 doap_file.truncate(0)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
406 doap_file.seek(0)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
407 doap_file.write(result)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
408 continue
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
409
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
410 # No custom stylesheet found
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
411 result = re.sub(
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
412 xml_declaration_pattern,
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
413 f'{XML_DECLARATION}\n{XMPP_XSL}',
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
414 content,
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
415 0,
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
416 re.MULTILINE)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
417 if result != content:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
418 # Added our stylesheet
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
419 doap_file.truncate(0)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
420 doap_file.seek(0)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
421 doap_file.write(result)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
422 else:
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
423 print('WARNING: Could not alter XML header of', entry.name)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
424 # Remove content entirely, since we can't
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
425 # control what would be rendered
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
426 doap_file.truncate(0)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
427
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
428
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
429 if __name__ == '__main__':
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
430 initialize_directory(DOWNLOAD_PATH)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
431 initialize_directory(LOGOS_PATH)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
432 Path(DOWNLOAD_PATH / 'doap_files').mkdir(parents=True)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
433
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
434 prepare_package_data()
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
435 add_doap_data_to_xeplist()
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
436
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
437 initialize_directory(STATIC_DOAP_PATH)
8e1675826e46 Data data data
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
438 prepare_doap_files()

mercurial