From 95be3bf89cb07e1ea2c043eeadf9beddcae16f14 Mon Sep 17 00:00:00 2001 From: hasecilu Date: Tue, 17 Sep 2024 15:08:10 -0600 Subject: [PATCH] Help: Don't open 404 documentation pages Unfortunately, not all documentation is translated. Instead of presenting to the user 404 code error pages is preferable to show the documentation on English. Status codes 200 and 404 are assumed as requests response. --- src/Mod/Help/Help.py | 52 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/src/Mod/Help/Help.py b/src/Mod/Help/Help.py index 113bf3c627..65f8e62487 100644 --- a/src/Mod/Help/Help.py +++ b/src/Mod/Help/Help.py @@ -54,6 +54,9 @@ Defaults are to open the wiki in the desktop browser """ import os +import re +import urllib.request +import urllib.error import FreeCAD @@ -101,7 +104,7 @@ def show(page, view=None, conv=None): """ page = underscore_page(page) - location = get_location(page) + location, _pagename = get_location(page) FreeCAD.Console.PrintLog("Help: opening " + location + "\n") if not location: FreeCAD.Console.PrintError(LOCTXT + "\n") @@ -109,7 +112,10 @@ def show(page, view=None, conv=None): md = get_contents(location) html = convert(md, conv) baseurl = get_uri(location) - pagename = os.path.basename(page.replace("_", " ").replace(".md", "")) + if _pagename != "": + pagename = _pagename + else: + pagename = os.path.basename(page.replace("_", " ").replace(".md", "")) title = translate("Help", "Help") + ": " + pagename if FreeCAD.GuiUp: if PREFS.GetBool("optionTab", False) and get_qtwebwidgets(): @@ -150,6 +156,27 @@ def get_uri(location): return baseurl +def location_url(url_localized: str, url_english: str) -> tuple: + """ + Returns localized documentation url and page name, if they exist, + otherwise defaults to english version. + """ + try: + req = urllib.request.Request(url_localized) + with urllib.request.urlopen(req) as response: + html = response.read().decode("utf-8") + if re.search(r"https://wiki.freecad.org", url_localized): + pagename_match = re.search(r"(.*?) - .*?", html) + else: + pagename_match = re.search(r"Name/.*?:\s*(.+)", html) + if pagename_match is not None: + return (url_localized, pagename_match.group(1)) + else: + return (url_localized, "") + except urllib.error.HTTPError as e: + return (url_english, "") + + def get_location(page): """retrieves the location (online or offline) of a given page""" @@ -166,24 +193,33 @@ def get_location(page): page = page.replace("wiki/", "") page = page.split("#")[0] suffix = PREFS.GetString("Suffix", "") + pagename = "" if suffix: if not suffix.startswith("/"): suffix = "/" + suffix if PREFS.GetBool("optionWiki", True): # default - location = WIKI_URL + "/" + page + suffix + location, pagename = location_url(WIKI_URL + "/" + page + suffix, WIKI_URL + "/" + page) elif PREFS.GetBool("optionMarkdown", False): if PREFS.GetBool("optionBrowser", False): location = MD_RENDERED_URL else: location = MD_RAW_URL if suffix: - location += "/" + MD_TRANSLATIONS_FOLDER + suffix - location += "/" + page + ".md" + location, pagename = location_url( + location + "/" + MD_TRANSLATIONS_FOLDER + suffix + "/" + page + ".md", + location + "/" + page + ".md", + ) + else: + location += "/" + page + ".md" elif PREFS.GetBool("optionGithub", False): location = MD_RENDERED_URL if suffix: - location += "/" + MD_TRANSLATIONS_FOLDER + suffix - location += "/" + page + ".md" + location, pagename = location_url( + location + "/" + MD_TRANSLATIONS_FOLDER + suffix + "/" + page + ".md", + location + "/" + page + ".md", + ) + else: + location += "/" + page + ".md" elif PREFS.GetBool("optionCustom", False): location = PREFS.GetString("Location", "") if not location: @@ -195,7 +231,7 @@ def get_location(page): "wiki", ) location = os.path.join(location, page + ".md") - return location + return (location, pagename) def show_browser(url):