diff --git a/CHANGES b/CHANGES index bcad80274be..f666a5b16a9 100644 --- a/CHANGES +++ b/CHANGES @@ -17,6 +17,8 @@ Bugs fixed ---------- * #8884: html: minified js stemmers not included in the distributed package +* #8885: html: AttributeError is raised if CSS/JS files are installed via + :confval:`html_context` * #8880: viewcode: ExtensionError is raised on incremental build after unparsable python module found diff --git a/sphinx/builders/html/__init__.py b/sphinx/builders/html/__init__.py index 1dbde6e371e..c799b017671 100644 --- a/sphinx/builders/html/__init__.py +++ b/sphinx/builders/html/__init__.py @@ -1035,8 +1035,20 @@ def hasdoc(name: str) -> bool: templatename = newtmpl # sort JS/CSS before rendering HTML - ctx['script_files'].sort(key=lambda js: js.priority) - ctx['css_files'].sort(key=lambda js: js.priority) + try: + # Convert script_files to list to support non-list script_files (refs: #8889) + ctx['script_files'] = sorted(list(ctx['script_files']), key=lambda js: js.priority) + except AttributeError: + # Skip sorting if users modifies script_files directly (maybe via `html_context`). + # refs: #8885 + # + # Note: priority sorting feature will not work in this case. + pass + + try: + ctx['css_files'] = sorted(list(ctx['css_files']), key=lambda css: css.priority) + except AttributeError: + pass try: output = self.templates.render(templatename, ctx)