diff --git a/scripts/build_changelog.py b/scripts/build_changelog.py
index c4772a83..f0c01994 100644
--- a/scripts/build_changelog.py
+++ b/scripts/build_changelog.py
@@ -7,6 +7,7 @@ Copyright (c) EDCD, All Rights Reserved
Licensed under the GNU General Public License.
See LICENSE file.
"""
+
import pathlib
import re
from os import chdir
@@ -15,82 +16,87 @@ import mistune
def get_changelog() -> tuple[str, str]:
"""Pull the last full changelog details in MD."""
- with open("../CHANGELOG.md", encoding="utf-8") as changelog_file:
- content = changelog_file.read()
- changelog_list: list = content.split("---", maxsplit=2)
- changelog = changelog_list[2]
- changelog_list = changelog.split("===", maxsplit=2)
- changelog_list[0] = changelog_list[0].rstrip()
- changelog_list[0] = changelog_list[0].lstrip()
- changelog_list[0] += "\n==="
- changelog_list[1] = changelog_list[1].rstrip()
- changelog_list[1] = "\n".join(changelog_list[1].split("\n")[:-2])
- changelog = changelog_list[0] + changelog_list[1]
- changelog = changelog.rstrip()
- version = changelog.split("\n")[0]
- version = version.split(" ")[1]
- return changelog, version
+ try:
+ with open("../CHANGELOG.md", encoding="utf-8") as changelog_file:
+ content = changelog_file.read()
+ except FileNotFoundError as exc:
+ raise FileNotFoundError("Changelog file not found.") from exc
+
+ changelog_list = content.split("---", maxsplit=2)
+ if len(changelog_list) < 3:
+ raise ValueError("Changelog format is incorrect.")
+
+ changelog = changelog_list[2].split("===", maxsplit=2)
+ if len(changelog) < 2:
+ raise ValueError("Changelog format is incorrect.")
+
+ changelog[0] = changelog[0].strip()
+ changelog[1] = "\n".join(changelog[1].strip().split("\n")[:-2])
+ version = changelog[0]
+ version = version.split(" ")[1]
+ changelog = changelog[1].strip()
+
+ return changelog, version
-def build_html(md_changelog) -> str:
- html_out = mistune.html(md_changelog)
- html_out = re.sub("h1", "h2", html_out)
- html_out += "\n
"
+def build_html(md_changelog: str, version: str) -> str:
+ """Convert markdown changelog to HTML."""
+ html_out = f"Release {version}
\n"
+ html_out += mistune.html(md_changelog)
+ html_out = re.sub(r"h1", "h2", html_out) + "\n
"
+
with open("script_output/html_changelog.txt", "w", encoding="utf-8") as html_file:
html_file.write(html_out)
+
return html_out
+def format_fdev(md_log: str) -> str:
+ """Format changelog for FDEV forums."""
+ md_log = re.sub(r"|
", "", md_log)
+ md_log = re.sub(r"", "\n[HEADING=3]", md_log)
+ md_log = re.sub(r"", "[/HEADING]", md_log)
+ md_log = re.sub(r"", "[LIST]", md_log)
+ md_log = re.sub(r"- ", "[*]", md_log)
+ md_log = re.sub(r"
", "", md_log)
+ md_log = re.sub(r"", "[ICODE]", md_log)
+ md_log = re.sub(r"
", "[/ICODE]", md_log)
+ md_log = re.sub(r"
\n", "[/LIST]", md_log)
+ md_log = re.sub(r"
", "", md_log)
+ md_log = re.sub(r"Changes and Enhancements", "What's Changed", md_log)
+ return md_log
+
+
def build_fdev(
- vt_signed: str,
- vt_unsigned: str,
- version: str,
- gh_link: str,
- html: str,
+ vt_signed: str, vt_unsigned: str, version: str, gh_link: str, html: str
) -> None:
+ """Build changelog for FDEV forums."""
fdev_out = (
- "[HEADING=2][URL='"
- + gh_link
- + "'][SIZE=7]Release "
- + version
- + "[/SIZE][/URL][/HEADING]\n[URL='"
- + vt_signed
- )
- fdev_out += (
- "']Pre-emptive upload to VirusTotal[/URL]. ([URL='"
- + vt_unsigned
- + "']Unsigned Installer[/URL])\n\n"
+ f"[HEADING=2][URL='{gh_link}'][SIZE=7]Release {version}[/SIZE][/URL][/HEADING]\n"
+ f"[URL='{vt_signed}']Pre-emptive upload to VirusTotal[/URL]. "
+ f"([URL='{vt_unsigned}']Unsigned Installer[/URL])\n\n"
)
- if version.startswith("Pre-Release") or version.startswith("Beta"):
- fdev_out += f'This is a release candidate for {version}. It has been pushed to the "Beta" track for updates!'
+ if version.startswith(("Pre-Release", "Beta")):
fdev_out += (
- '\n\nFor more information on the "Beta" update track, please read '
+ f'This is a release candidate for {version}. It has been pushed to the "Beta" track for updates!\n\n'
+ 'For more information on the "Beta" update track, please read '
"[URL='https://github.com/EDCD/EDMarketConnector/wiki/Participating-in-Open-Betas-of-EDMC']"
"This Wiki Article[/URL]. Questions and comments are welcome!\n\n"
)
- changelog_trim = html.split("\n", maxsplit=1)
- md_log = changelog_trim[1]
- md_log = re.sub("", "", md_log)
- md_log = re.sub("
", "", md_log)
- md_log = re.sub("", "\n[HEADING=3]", md_log)
- md_log = re.sub("", "[/HEADING]", md_log)
- md_log = re.sub("", "[LIST]", md_log)
- md_log = re.sub("- ", "[*]", md_log)
- md_log = re.sub("
", "", md_log)
- md_log = re.sub("", "[ICODE]", md_log)
- md_log = re.sub("
", "[/ICODE]", md_log)
- md_log = re.sub("
\n", "[/LIST]", md_log)
+
+ md_log = html.split("\n", maxsplit=1)[1]
+ md_log = format_fdev(md_log)
fdev_out += md_log
with open("script_output/fdev_changelog.txt", "w", encoding="utf-8") as fdev_file:
fdev_file.write(fdev_out)
- return
def build_reddit(
md_changelog: str, vt_signed: str, vt_unsigned: str, version: str, gh_link: str
) -> None:
+ """Build changelog for Reddit."""
reddit_start = """# What Is Elite Dangerous Market Connector?
Elite Dangerous Market Connector ("EDMC") is a third-party application for use with Frontier Developments' game "Elite Dangerous". Its purpose is to facilitate supplying certain game data to, and in some cases retrieving it from, a number of websites and other tools.
@@ -107,9 +113,8 @@ You can also view the Elite: Dangerous Forum thread [HERE](https://forums.fronti
~~----------------------------------------------------~~
-**As has become routine now, various anti-virus software are reporting a false positive on our installer and/or files it contains. We've pre-emptively uploaded the installer to** [VirusTotal](
-"""
- reddit_mid_1 = """) **if you want to check what it's saying. Please see our** [Troubleshooting/AV-false-positives FAQ](https://github.com/EDCD/EDMarketConnector/wiki/Troubleshooting#installer-and-or-executables-flagged-as-malicious-viruses) **for further information.**
+**As has become routine now, various anti-virus software are reporting a false positive on our installer and/or files it contains. We've pre-emptively uploaded the installer to** [VirusTotal]("""
+ reddit_mid_1 = """) **if you want to check what it's saying. Please see our** [Troubleshooting/AV-false-positives FAQ](https://github.com/EDCD/EDMarketConnector/wiki/Troubleshooting#installer-and-or-executables-flagged-as-malicious-viruses) **for further information.**
[Unsigned Installer]("""
@@ -117,10 +122,9 @@ You can also view the Elite: Dangerous Forum thread [HERE](https://forums.fronti
~~----------------------------------------------------~~
"""
- versionsearch = f"Release {version}"
- updated = f"# [Release {version}]({gh_link})"
- md_changelog = re.sub("===\n", "", md_changelog)
- md_changelog = re.sub(versionsearch, updated, md_changelog)
+ updated = f"# [Release {version}]({gh_link})\n\n"
+ md_changelog = re.sub(r"===\n", "", md_changelog)
+ md_changelog = re.sub(f"Release {version}", updated, md_changelog)
reddit_end = f"""
**Linux**
@@ -133,9 +137,11 @@ If you're running on Linux, try the [Flatpak](https://flathub.org/apps/io.edcd.E
+ reddit_mid_1
+ vt_unsigned
+ reddit_mid_2
+ + updated
+ md_changelog
+ reddit_end
)
+
with open(
"script_output/reddit_changelog.txt", "w", encoding="utf-8"
) as reddit_file:
@@ -143,13 +149,14 @@ If you're running on Linux, try the [Flatpak](https://flathub.org/apps/io.edcd.E
def main() -> None:
+ """Run the Changelog Generator"""
md_changelog, version = get_changelog()
print(f"Detected version {version} in the changelog. Continuing...")
gh_link = input(f"Please enter the GitHub link for {version}: ")
vt_signed = input("Please enter the VirusTotal URL for the Signed Installer: ")
vt_unsigned = input("Please enter the VirusTotal URL for the Unsigned Installer: ")
build_reddit(md_changelog, vt_signed, vt_unsigned, version, gh_link)
- html = build_html(md_changelog)
+ html = build_html(md_changelog, version)
build_fdev(vt_signed, vt_unsigned, version, gh_link, html)