diff --git a/src/Mod/AddonManager/addonmanager_macro.py b/src/Mod/AddonManager/addonmanager_macro.py index 4fbcf96067..ffd619cab7 100644 --- a/src/Mod/AddonManager/addonmanager_macro.py +++ b/src/Mod/AddonManager/addonmanager_macro.py @@ -26,6 +26,7 @@ import re import io import codecs import shutil +import time from typing import Dict, Tuple, List import FreeCAD @@ -64,6 +65,7 @@ class Macro(object): self.author = "" self.other_files = [] self.parsed = False + self.parse_time = 0.0 def __eq__(self, other): return self.filename == other.filename @@ -108,23 +110,29 @@ class Macro(object): # __Version__ # __Files__ # __Author__ + start = time.perf_counter() + max_lines_to_search = 50 + line_counter = 0 number_of_fields = 5 - re_comment = re.compile( - r"^__Comment__\s*=\s*(['\"])(.*)\1", flags=re.IGNORECASE - ) - re_url = re.compile(r"^__Web__\s*=\s*(['\"])(.*)\1", flags=re.IGNORECASE) - re_version = re.compile( - r"^__Version__\s*=\s*(['\"])(.*)\1", flags=re.IGNORECASE - ) - re_files = re.compile(r"^__Files__\s*=\s*(['\"])(.*)\1", flags=re.IGNORECASE) - re_author = re.compile(r"^__Author__\s*=\s*(['\"])(.*)\1", flags=re.IGNORECASE) + ic = re.IGNORECASE # Shorten the line for Black + re_comment = re.compile(r"^__Comment__\s*=\s*(['\"])(.*)\1", flags=ic) + re_url = re.compile(r"^__Web__\s*=\s*(['\"])(.*)\1", flags=ic) + re_version = re.compile(r"^__Version__\s*=\s*(['\"])(.*)\1", flags=ic) + re_files = re.compile(r"^__Files__\s*=\s*(['\"])(.*)\1", flags=ic) + re_author = re.compile(r"^__Author__\s*=\s*(['\"])(.*)\1", flags=ic) f = io.StringIO(code) - while f: + while f and line_counter < max_lines_to_search: line = f.readline() + line_counter += 1 + if not line.startswith( + "__" + ): # Speed things up a bit... this comparison is very cheap + continue match = re.match(re_comment, line) if match: self.comment = match.group(2) + self.comment = re.sub("<.*?>", "", self.comment) # Strip any HTML tags number_of_fields -= 1 match = re.match(re_author, line) if match: @@ -144,7 +152,13 @@ class Macro(object): number_of_fields -= 1 if number_of_fields <= 0: break + + # Truncate long comments to speed up searches, and clean up display + if len(self.comment) > 512: + self.comment = self.comment[:511] + "…" self.parsed = True + end = time.perf_counter() + self.parse_time = end - start def fill_details_from_wiki(self, url): code = "" @@ -220,6 +234,8 @@ class Macro(object): ) desc = "No description available" self.desc = desc + self.comment, _, _ = desc.partition("", "", self.comment) # Strip any tags self.url = url if isinstance(code, list): flat_code = "" diff --git a/src/Mod/AddonManager/package_details.py b/src/Mod/AddonManager/package_details.py index 2e06781a3a..2e4a115def 100644 --- a/src/Mod/AddonManager/package_details.py +++ b/src/Mod/AddonManager/package_details.py @@ -207,7 +207,7 @@ class PackageDetails(QWidget): self.ui.buttonCheckForUpdate.hide() warningColorString = "rgb(255,0,0)" - if hasattr(QApplication.instance(),"styleSheet"): + if hasattr(QApplication.instance(), "styleSheet"): # Qt 5.9 doesn't give a QApplication instance, so can't give the stylesheet info if "dark" in QApplication.instance().styleSheet().lower(): warningColorString = "rgb(255,50,50)" diff --git a/src/Mod/AddonManager/package_list.py b/src/Mod/AddonManager/package_list.py index 2e7e677dee..f0e30a83a4 100644 --- a/src/Mod/AddonManager/package_list.py +++ b/src/Mod/AddonManager/package_list.py @@ -359,14 +359,14 @@ class PackageListItemDelegate(QStyledItemDelegate): ) self.widget.ui.labelMaintainer.setText(maintainers_string) elif repo.macro and repo.macro.parsed: - if repo.macro.comment: - self.widget.ui.labelDescription.setText(repo.macro.comment) - elif repo.macro.desc: - comment, _, _ = repo.desc.partition("