diff --git a/src/gabriel/utils/passage_viewer.py b/src/gabriel/utils/passage_viewer.py index e274b35..1781bff 100644 --- a/src/gabriel/utils/passage_viewer.py +++ b/src/gabriel/utils/passage_viewer.py @@ -1906,11 +1906,33 @@ def _build_highlighted_text( return "".join(pieces) +def _extract_label_pills( + snippet_map: Mapping[str, List[str]], + *, + max_labels: int = 24, +) -> List[str]: + labels: List[str] = [] + seen: Set[str] = set() + for snippets in snippet_map.values(): + for snippet in snippets: + text = str(snippet).strip() + if not text or text in seen: + continue + seen.add(text) + labels.append(text) + if len(labels) >= max_labels: + return labels + return labels + + def _build_header_html( header_rows: List[Tuple[str, str]], active_categories: List[str], + *, + category_labels: Optional[Mapping[str, str]] = None, + label_pills: Optional[Sequence[str]] = None, ) -> str: - if not header_rows and not active_categories: + if not header_rows and not active_categories and not label_pills: return "" card_rows: List[str] = [] @@ -1933,7 +1955,11 @@ def _build_header_html( if active_categories: pills = "".join( "" - + html.escape(cat.replace("_", " ").title()) + + html.escape( + category_labels.get(cat, cat).replace("_", " ").title() + if category_labels + else cat.replace("_", " ").title() + ) + "" for cat in active_categories ) @@ -1944,6 +1970,20 @@ def _build_header_html( "" ) + if label_pills: + pills = "".join( + "" + + html.escape(str(label)) + + "" + for label in label_pills + ) + sections.append( + "