From 02870e573154517f129cbc85e437d5f0105d7cbe Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Sun, 27 May 2018 01:45:03 -0700 Subject: [PATCH] Filter out duplicate JS/CSS URLs, refs #291 (testme) --- datasette/app.py | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/datasette/app.py b/datasette/app.py index b512fdb5..8a3442b5 100644 --- a/datasette/app.py +++ b/datasette/app.py @@ -189,15 +189,25 @@ class Datasette: return {"name": query_name, "sql": query} def asset_urls(self, key): - urls_or_dicts = (self.metadata.get(key) or []) # Flatten list-of-lists from plugins: - urls_or_dicts += list(itertools.chain.from_iterable(getattr(pm.hook, key)())) - for url_or_dict in urls_or_dicts: + seen_urls = set() + for url_or_dict in itertools.chain( + itertools.chain.from_iterable(getattr(pm.hook, key)()), + (self.metadata.get(key) or []) + ): if isinstance(url_or_dict, dict): - yield {"url": url_or_dict["url"], "sri": url_or_dict.get("sri")} - + url = url_or_dict["url"] + sri = url_or_dict.get("sri") else: - yield {"url": url_or_dict} + url = url_or_dict + sri = None + if url in seen_urls: + continue + seen_urls.add(url) + if sri: + yield {"url": url, "sri": sri} + else: + yield {"url": url} def extra_css_urls(self): return self.asset_urls("extra_css_urls")