Skip to content
40 changes: 22 additions & 18 deletions src/pydata_sphinx_theme/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,12 @@ def update_config(app):
)

# Validate icon links
if not isinstance(theme_options.get("icon_links", []), list):
raise ExtensionError(
"`icon_links` must be a list of dictionaries, you provided "
f"type {type(theme_options.get('icon_links'))}."
)
if theme_options.get("icon_links") is not None:
if not isinstance(theme_options.get("icon_links", []), list):
Copy link
Member

@drammock drammock Jan 27, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can see why on current main, setting icon_links = None in your conf.py would cause an error here. But if you don't want icon links, why not just leave icon_links undefined? Genuinely curious if there's a reason you need this.

raise ExtensionError(
"`icon_links` must be a list of dictionaries, you provided "
f"type {type(theme_options.get('icon_links'))}."
)

# Set the anchor link default to be # if the user hasn't provided their own
if not utils.config_provided_by_user(app, "html_permalinks_icon"):
Expand Down Expand Up @@ -140,18 +141,19 @@ def update_config(app):
# Add extra icon links entries if there were shortcuts present
# TODO: Deprecate this at some point in the future?
icon_links = theme_options.get("icon_links", [])
for url, icon, name in shortcuts:
if theme_options.get(url):
# This defaults to an empty list so we can always insert
icon_links.insert(
0,
{
"url": theme_options.get(url),
"icon": icon,
"name": name,
"type": "fontawesome",
},
)
if icon_links is not None:
for url, icon, name in shortcuts:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same question as above: the code on main is fine if icon_links is not defined, it only errors if you explicitly set icon_links=None in the html_theme_options dictionary of conf.py. So why do that?

if theme_options.get(url):
# This defaults to an empty list so we can always insert
icon_links.insert(
0,
{
"url": theme_options.get(url),
"icon": icon,
"name": name,
"type": "fontawesome",
},
)
theme_options["icon_links"] = icon_links

# Prepare the logo config dictionary
Expand Down Expand Up @@ -282,7 +284,9 @@ def setup(app: Sphinx) -> Dict[str, str]:

app.add_html_theme("pydata_sphinx_theme", str(theme_path))

app.add_post_transform(short_link.ShortenLinkTransform)
theme_options = utils.get_theme_options_dict(app)
if theme_options.get("shorten_urls") is True:
app.add_post_transform(short_link.ShortenLinkTransform)

app.connect("builder-inited", translator.setup_translators)
app.connect("builder-inited", update_config)
Expand Down