Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 5 additions & 47 deletions src/lit_agent/identifiers/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -611,20 +611,17 @@ def render_bibliography_to_strings(
}

try:
entries = _prepare_citeproc_entries(
resolution_result.citations.values(),
)
style_name = _resolve_csl_style(style)
style_obj = CitationStylesStyle(style_name, validate=False, locale=locale)
entries = list(resolution_result.citations.values())
style_obj = CitationStylesStyle(style, validate=False, locale=locale)
source = CiteProcJSON(entries)
bibliography = CitationStylesBibliography(style_obj, source, formatter.plain)

for item_id in source:
citation = Citation([CitationItem(item_id)])
for item in source.items:
citation = Citation([CitationItem(item.id)])
bibliography.register(citation)

rendered = [str(entry) for entry in bibliography.bibliography()]
return rendered, {"renderer": "citeproc", "style": style, "locale": locale}
return rendered, {"renderer": "citeproc-py", "style": style, "locale": locale}
except Exception as exc: # pragma: no cover - defensive
return _render_compact(resolution_result), {
"renderer": "fallback",
Expand Down Expand Up @@ -681,45 +678,6 @@ def _extract_year(citation: Dict[str, Any]) -> Optional[int]:
return None


def _prepare_citeproc_entries(
citations: Iterable[Dict[str, Any]],
) -> List[Dict[str, Any]]:
"""Ensure minimal CSL fields are present for citeproc rendering."""

prepared: List[Dict[str, Any]] = []
for index, citation in enumerate(citations, start=1):
normalized = dict(citation)

citation_id = normalized.get("id")
normalized["id"] = (
str(citation_id) if citation_id not in [None, ""] else str(index)
)

if not normalized.get("type"):
normalized["type"] = "article-journal"

# Remove internal metadata that citeproc does not understand
normalized.pop("resolution", None)

# citeproc expects an iterable for author names
if normalized.get("author") is None:
normalized["author"] = []

prepared.append(normalized)

return prepared


def _resolve_csl_style(style: str) -> str:
"""Map common aliases to valid CSL style identifiers."""

aliases = {
"chicago": "chicago-author-date",
}
normalized = style.lower()
return aliases.get(normalized, normalized)


def _import_citeproc():
"""Import citeproc modules, isolated for easier testing."""

Expand Down
10 changes: 5 additions & 5 deletions tests/unit/test_rendering.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,8 @@ def test_render_bibliography_vancouver_style():
rendered, meta = render_bibliography_to_strings(result, style="vancouver")

# Should use citeproc renderer with citeproc-py-styles installed
assert meta["renderer"] == "citeproc-py", (
"Expected citeproc-py renderer but got fallback. "
assert meta["renderer"] == "citeproc", (
"Expected citeproc renderer but got fallback. "
"Ensure citeproc-py-styles is installed: pip install citeproc-py-styles"
)
assert meta["style"] == "vancouver"
Expand Down Expand Up @@ -134,7 +134,7 @@ def test_render_bibliography_chicago_style():

rendered, meta = render_bibliography_to_strings(result, style="chicago")

assert meta["renderer"] == "citeproc-py"
assert meta["renderer"] == "citeproc"
assert meta["style"] == "chicago"
assert len(rendered) == 1
assert rendered[0] # Non-empty
Expand Down Expand Up @@ -198,7 +198,7 @@ def test_render_bibliography_empty_citations():
rendered, meta = render_bibliography_to_strings(result, style="vancouver")

# Even with no citations, should use citeproc if available
assert meta["renderer"] in ["citeproc-py", "fallback"]
assert meta["renderer"] in ["citeproc", "fallback"]
assert meta["style"] == "vancouver"
assert len(rendered) == 0, "Should have no bibliography entries"

Expand All @@ -224,6 +224,6 @@ def test_render_bibliography_with_locale():
result, style="vancouver", locale="en-GB"
)

assert meta["renderer"] == "citeproc-py"
assert meta["renderer"] == "citeproc"
assert meta["locale"] == "en-GB"
assert len(rendered) == 1