logo

searx

Unnamed repository; edit this file 'description' to name the repository.
commit: dd84814b68369e36d6be20bae707848a051a025a
parent: f59daa4a4b92ae3c6cbe2482a14f50810a15a644
Author: Adam Tauber <asciimoo@gmail.com>
Date:   Sun, 12 Apr 2015 19:24:01 +0200

[enh] plugins: client side dependency support

Diffstat:

searx/plugins/__init__.py | 6++++++
searx/templates/oscar/base.html | 14++++++++++----
searx/webapp.py | 10++++++++++
3 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/searx/plugins/__init__.py b/searx/plugins/__init__.py @@ -8,6 +8,9 @@ required_attrs = (('name', str), ('description', str), ('default_on', bool)) +optional_attrs = (('js_dependencies', tuple), + ('css_dependencies', tuple)) + class Plugin(): default_on = False @@ -30,6 +33,9 @@ class PluginStore(): if not hasattr(plugin, plugin_attr) or not isinstance(getattr(plugin, plugin_attr), plugin_attr_type): logger.critical('missing attribute "{0}", cannot load plugin: {1}'.format(plugin_attr, plugin)) exit(3) + for plugin_attr, plugin_attr_type in optional_attrs: + if not hasattr(plugin, plugin_attr) or not isinstance(getattr(plugin, plugin_attr), plugin_attr_type): + setattr(plugin, plugin_attr, plugin_attr_type()) plugin.id = plugin.name.replace(' ', '_') self.plugins.append(plugin) diff --git a/searx/templates/oscar/base.html b/searx/templates/oscar/base.html @@ -9,17 +9,20 @@ <meta name="viewport" content="width=device-width, initial-scale=1 , maximum-scale=1.0, user-scalable=1" /> {% block meta %}{% endblock %} <title>{% block title %}{% endblock %}searx</title> - + <link rel="stylesheet" href="{{ url_for('static', filename='css/bootstrap.min.css') }}" type="text/css" /> - <link rel="stylesheet" href="{{ url_for('static', filename='css/oscar.min.css') }}" type="text/css" /> + <link rel="stylesheet" href="{{ url_for('static', filename='css/oscar.min.css') }}" type="text/css" /> <link rel="stylesheet" href="{{ url_for('static', filename='css/leaflet.min.css') }}" type="text/css" /> + {% for css in styles %} + <link rel="stylesheet" href="{{ url_for('static', filename=css) }}" type="text/css" /> + {% endfor %} <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> <!--[if lt IE 9]> <script src="{{ url_for('static', filename='js/html5shiv.min.js') }}"></script> <script src="{{ url_for('static', filename='js/respond.min.js') }}"></script> <![endif]--> - + <link rel="shortcut icon" href="{{ url_for('static', filename='img/favicon.png') }}" /> {% block styles %} @@ -28,7 +31,7 @@ {% endblock %} <link title="searx" type="application/opensearchdescription+xml" rel="search" href="{{ url_for('opensearch') }}"/> - + <script type="text/javascript"> searx = {}; searx.method = "{{ method or 'POST' }}"; @@ -79,5 +82,8 @@ {% if autocomplete %}<script src="{{ url_for('static', filename='js/typeahead.bundle.min.js') }}"></script>{% endif %} <script src="{{ url_for('static', filename='js/require-2.1.15.min.js') }}"></script> <script src="{{ url_for('static', filename='js/searx.min.js') }}"></script> + {% for script in scripts %} + <script src="{{ url_for('static', filename=script) }}"></script> + {% endfor %} </body> </html> diff --git a/searx/webapp.py b/searx/webapp.py @@ -301,6 +301,16 @@ def render(template_name, override_theme=None, **kwargs): kwargs['cookies'] = request.cookies + kwargs['scripts'] = set() + for plugin in request.user_plugins: + for script in plugin.js_dependencies: + kwargs['scripts'].add(script) + + kwargs['styles'] = set() + for plugin in request.user_plugins: + for css in plugin.css_dependencies: + kwargs['styles'].add(css) + return render_template( '{}/{}'.format(kwargs['theme'], template_name), **kwargs)