Skip to content

Commit 69e6562

Browse files
committed
Generate version specifc individual software pages
1 parent 40249b0 commit 69e6562

File tree

3 files changed

+98
-10
lines changed

3 files changed

+98
-10
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
import argparse
2+
import json
3+
import shutil
4+
from collections import defaultdict
5+
from pathlib import Path
6+
7+
8+
def output_markdown(processed, output_base_path):
9+
packages = sum(len(v) for v in processed.values())
10+
top_page = open(output_base_path / 'index.md', 'w')
11+
top_page.write("# List of supported software\n\n")
12+
top_page.write(f"EasyBuild supports {packages} different software packages (incl. toolchains, bundles):\n\n")
13+
14+
for letter in processed:
15+
top_page.write(f" * [{letter}]({letter}/index.md)\n")
16+
17+
letter_dir = output_base_path / letter
18+
letter_dir.mkdir()
19+
letter_page = open(letter_dir / 'index.md', 'w')
20+
letter_page.write(f"# List of supported software ({letter})\n\n")
21+
22+
for software in processed[letter]:
23+
top_page.write(f" * [{software}]({letter}/{software}.md)\n")
24+
letter_page.write(f" * [{software}]({software}.md)\n")
25+
26+
versionsuffix = any(v['versionsuffix'] for v in processed[letter][software])
27+
28+
software_page = open(letter_dir / f'{software}.md', 'w')
29+
software_page.write(f"# {software}\n\n")
30+
software_page.write(f"{processed[letter][software][0]['description']}\n\n")
31+
software_page.write(f"*homepage*: <{processed[letter][software][0]['homepage']}>\n\n")
32+
33+
if versionsuffix:
34+
software_page.write("version | versionsuffix | toolchain\n")
35+
software_page.write("--------|---------------|----------\n")
36+
else:
37+
software_page.write("version | toolchain\n")
38+
software_page.write("--------|----------\n")
39+
40+
for version in processed[letter][software]:
41+
software_page.write(f"``{version['version']}`` | ")
42+
if versionsuffix:
43+
if version['versionsuffix']:
44+
software_page.write(f"``{version['versionsuffix']}``")
45+
software_page.write(" | ")
46+
software_page.write(f"``{version['toolchain']}``\n")
47+
48+
software_page.close()
49+
50+
letter_page.close()
51+
52+
top_page.close()
53+
54+
55+
def generate_markdown_pages(jsonfile, output_base, delete_existing):
56+
"""
57+
Generate markdown
58+
:param jsonfile: input file (json file)
59+
:param output_base: base directory for output files
60+
:param delete_existing: delete the output directory (if it exists)
61+
"""
62+
with open(jsonfile) as f:
63+
data = json.load(f)
64+
65+
processed = defaultdict(lambda: defaultdict(list))
66+
for software in data:
67+
initial = software['name'][0].lower()
68+
if initial.isnumeric():
69+
initial = '0'
70+
processed[initial][software['name']].append(software)
71+
72+
output_base_path = Path(output_base)
73+
74+
if delete_existing and output_base_path.exists() and output_base_path.is_dir():
75+
shutil.rmtree(output_base_path)
76+
77+
output_base_path.mkdir(parents=True)
78+
output_markdown(processed, output_base_path)
79+
80+
81+
if __name__ == "__main__":
82+
parser = argparse.ArgumentParser(prog='Software Markdown Pages',
83+
description='Generate Markdown pages of software from JSON file')
84+
parser.add_argument('-j', '--jsonfile', default='software.json', help='Input JSON file')
85+
parser.add_argument('-o', '--output-base', default='output', help='Base directory for output files')
86+
parser.add_argument('--delete-existing-output', action='store_true',
87+
help='Delete output base directory (if it exists)')
88+
args = parser.parse_args()
89+
90+
generate_markdown_pages(args.jsonfile, args.output_base, args.delete_existing_output)

docs/version-specific/update-version-specific-docs.sh

+5-9
Original file line numberDiff line numberDiff line change
@@ -157,15 +157,11 @@ echo "* [List of known toolchains](toolchains.md)" >> $overview
157157

158158
echo "eb --list-software=detailed"
159159
skip_lines='Temporary log file|Processed.*easyconfigs|Found.*different software packages|^# List of supported software'
160-
echo "# List of supported software" > supported-software.md
161-
echo >> supported-software.md
162-
echo "!!! note" >> supported-software.md
163-
echo >> supported-software.md
164-
echo " This page contains a lot of information, it may take a while to load." >> supported-software.md
165-
echo >> supported-software.md
166-
eb --list-software=detailed --output-format=md | egrep -v $skip_lines >> supported-software.md
167-
168-
echo "* [List of supported software](supported-software.md)" >> $overview
160+
eb --list-software=detailed --output-format=json | egrep -v $skip_lines >> software.json
161+
python software-markdown-pages.py -o supported-software --delete-existing-output
162+
rm software.json
163+
164+
echo "* [List of supported software](supported-software/index.md)" >> $overview
169165

170166
###################################################################################################
171167

mkdocs.yml

+3-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ nav:
105105
- EasyBuild release notes: release-notes.md
106106
- EasyBuild maintainers: maintainers.md
107107
- API: api/
108-
- List of supported software: version-specific/supported-software.md
108+
- List of supported software: version-specific/supported-software/index.md
109109
- Getting help: getting-help.md
110110
- User survey: user-survey/index.md
111111
- Policies:
@@ -194,6 +194,8 @@ plugins:
194194
- api/easybuild/*
195195
- api/summary.md
196196
- index.md
197+
- version-specific/supported-software/*
198+
- version-specific/supported-software/*/*
197199
# necessary for search to work
198200
- search
199201
- redirects:

0 commit comments

Comments
 (0)