Skip to content

Commit ccd881f

Browse files
committed
fix(metadata): update scripts to correctly handle date and other edge cases
1 parent cba286c commit ccd881f

3 files changed

Lines changed: 380 additions & 99 deletions

File tree

quadriga/metadata/create_bibtex.py

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import logging
44
import sys
55

6+
from datetime import datetime
7+
68
from .utils import (
79
extract_keywords,
810
format_authors_for_bibtex,
@@ -119,7 +121,18 @@ def create_bibtex_from_cff() -> bool | None:
119121
# Validate required fields
120122
authors = pref.get("authors", [])
121123
title = pref.get("title", "Untitled")
122-
year = str(pref.get("year", "")) # Ensure year is a string for generate_citation_key
124+
# Try 'year' field first, fall back to extracting year from 'date-released'
125+
year = pref.get("year", "")
126+
if not year and "date-released" in pref:
127+
date_released = str(pref["date-released"])
128+
year = date_released[:4] if len(date_released) >= 4 else ""
129+
if not year and "date-released" in citation_data:
130+
date_released = str(citation_data["date-released"])
131+
year = date_released[:4] if len(date_released) >= 4 else ""
132+
if not year:
133+
year = str(datetime.now().year)
134+
logger.info("No year or date-released found, using current year: %s", year)
135+
year = str(year) # Ensure year is a string for generate_citation_key
123136

124137
if not authors:
125138
logger.warning("No authors found in CITATION.cff")
@@ -175,6 +188,18 @@ def create_bibtex_from_cff() -> bool | None:
175188
if "version" in pref:
176189
bibtex_lines.append(f" version = {{{pref['version']}}},")
177190

191+
# Extract DOI from 'identifiers' list if not present as a top-level field
192+
if "doi" not in pref and "identifiers" in pref:
193+
for identifier in pref["identifiers"]:
194+
if isinstance(identifier, dict) and identifier.get("type") == "doi":
195+
bibtex_lines.append(f" doi = {{{identifier['value']}}},")
196+
break
197+
if "doi" not in pref and "identifiers" not in pref and "identifiers" in citation_data:
198+
for identifier in citation_data["identifiers"]:
199+
if isinstance(identifier, dict) and identifier.get("type") == "doi":
200+
bibtex_lines.append(f" doi = {{{identifier['value']}}},")
201+
break
202+
178203
# Define common fields for all entry types
179204
simple_fields = [
180205
"doi",

0 commit comments

Comments
 (0)