From 375490cda50c5d158a9b03055f482fdf4c73bb66 Mon Sep 17 00:00:00 2001 From: Alexandre Bassel <11035784+abassel@users.noreply.github.com> Date: Sun, 9 Feb 2025 12:01:07 -0500 Subject: [PATCH] Do not highlight sub words and ignore case when `bold_keywords` is given (#348) --- rendercv/data/models/entry_types.py | 20 ++++++++++++++++---- rendercv/data/reader.py | 15 ++++----------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/rendercv/data/models/entry_types.py b/rendercv/data/models/entry_types.py index a0bdcfef..2b8f005c 100644 --- a/rendercv/data/models/entry_types.py +++ b/rendercv/data/models/entry_types.py @@ -183,10 +183,22 @@ class EntryType(abc.ABC): def make_keywords_bold_in_a_string(string: str, keywords: list[str]) -> str: - """Make the given keywords bold in the given string.""" - replacement_map = {keyword: f"**{keyword}**" for keyword in keywords} - for keyword, replacement in replacement_map.items(): - string = string.replace(keyword, replacement) + """Make the given keywords bold in the given string, handling capitalization and substring issues. + + Examples: + >>> make_keywords_bold_in_a_string("I know java and javascript", ["java"]) + 'I know **java** and javascript' + + >>> make_keywords_bold_in_a_string("Experience with aws, Aws and AWS", ["aws"]) + 'Experience with **aws**, **Aws** and **AWS**' + """ + def bold_match(match): + return f"**{match.group(0)}**" + + for keyword in keywords: + # Use re.escape to ensure special characters in keywords are handled + pattern = r'\b' + re.escape(keyword) + r'\b' + string = re.sub(pattern, bold_match, string, flags=re.IGNORECASE) return string diff --git a/rendercv/data/reader.py b/rendercv/data/reader.py index b29a8e22..51f803e3 100644 --- a/rendercv/data/reader.py +++ b/rendercv/data/reader.py @@ -31,19 +31,12 @@ def make_given_keywords_bold_in_sections( if sections_input is None: return None - for section_title, entries in sections_input.items(): - new_entries = [] - for entry in entries: + for entries in sections_input.values(): + for i, entry in enumerate(entries): if isinstance(entry, str): - new_entry = entry_types.make_keywords_bold_in_a_string(entry, keywords) + entries[i] = entry_types.make_keywords_bold_in_a_string(entry, keywords) elif callable(getattr(entry, "make_keywords_bold", None)): - new_entry = entry.make_keywords_bold(keywords) # type: ignore - else: - new_entry = entry - - new_entries.append(new_entry) - - sections_input[section_title] = new_entries + entries[i] = entry.make_keywords_bold(keywords) # type: ignore return sections_input