diff --git a/elixir/autocomplete.py b/elixir/autocomplete.py
index 6ce34078..ba5adaee 100755
--- a/elixir/autocomplete.py
+++ b/elixir/autocomplete.py
@@ -33,6 +33,7 @@ def on_get(self, req, resp):
ident_prefix = req.get_param('q')
family = req.get_param('f')
project = req.get_param('p')
+ opensearch_mode = req.get_param('opensearch') == 'true'
ident_prefix = validate_ident(ident_prefix)
if ident_prefix is None:
@@ -83,7 +84,11 @@ def on_get(self, req, resp):
resp.status = falcon.HTTP_200
resp.content_type = falcon.MEDIA_JSON
- resp.media = response
+
+ if not opensearch_mode:
+ resp.media = response
+ else:
+ resp.media = [ident_prefix, response]
query.close()
diff --git a/elixir/web.py b/elixir/web.py
index 1427136e..1649e60a 100755
--- a/elixir/web.py
+++ b/elixir/web.py
@@ -383,6 +383,27 @@ def on_get(self, req, resp, project: str, version: str, family: str = "", subcmd
})
+class OpenSearchManifestResource:
+ def on_get(self, req, resp, project):
+ ctx = req.context
+ query = get_query(ctx.config.project_dir, project)
+ if not query:
+ resp.status = falcon.HTTP_NOT_FOUND
+ resp.content_type = falcon.MEDIA_TEXT
+ resp.text = f'invalid project name: {project}'
+ return
+
+ template = ctx.jinja_env.get_template('search.xml')
+
+ data = {
+ 'project_name': project,
+ }
+
+ resp.status = falcon.HTTP_OK
+ resp.content_type = falcon.MEDIA_XML
+ resp.text = template.render(data)
+
+
# File families available in the dropdown next to search input in the topbar
TOPBAR_FAMILIES = {
'A': 'All symbols',
@@ -830,6 +851,8 @@ def get_application():
app.add_route('/acp', AutocompleteResource())
app.add_route('/api/ident/{project:project}/{ident:ident}', ApiIdentGetterResource())
+ app.add_route('/opensearch/{project:project}/search.xml', OpenSearchManifestResource())
+
app.add_route('/{project}', IncompleteURLRedirectResource())
app.add_route('/{project}/{version}', IncompleteURLRedirectResource())
app.add_route('/{project}/{version}/', IncompleteURLRedirectResource())
diff --git a/templates/layout.html b/templates/layout.html
index 8f9bcc34..d8df844a 100644
--- a/templates/layout.html
+++ b/templates/layout.html
@@ -16,6 +16,7 @@
{%- endblock %}">
+
diff --git a/templates/search.xml b/templates/search.xml
new file mode 100644
index 00000000..a1b8e60d
--- /dev/null
+++ b/templates/search.xml
@@ -0,0 +1,11 @@
+
+
+ Elixir ({{ project_name }})
+ Elixir Cross Referencer - {{ project_name }}
+ UTF-8
+ {{ project_name }}
+ https://elixir.bootlin.com/favicon.ico
+
+
+
+