diff --git a/src/octoprint/server/__init__.py b/src/octoprint/server/__init__.py
index b076670b..2711afa1 100644
--- a/src/octoprint/server/__init__.py
+++ b/src/octoprint/server/__init__.py
@@ -1015,7 +1015,8 @@ class Server(object):
enable_gcodeviewer = settings().getBoolean(["gcodeViewer", "enabled"])
preferred_stylesheet = settings().get(["devel", "stylesheet"])
- dynamic_assets = util.flask.collect_plugin_assets(
+ dynamic_core_assets = util.flask.collect_core_assets(enable_gcodeviewer=enable_gcodeviewer)
+ dynamic_plugin_assets = util.flask.collect_plugin_assets(
enable_gcodeviewer=enable_gcodeviewer,
preferred_stylesheet=preferred_stylesheet
)
@@ -1051,11 +1052,13 @@ class Server(object):
"js/lib/loglevel.min.js",
"js/lib/sockjs-0.3.4.min.js"
]
- js_app = dynamic_assets["js"] + [
- "js/app/dataupdater.js",
- "js/app/helpers.js",
- "js/app/main.js",
- ]
+ js_core = dynamic_core_assets["js"] + \
+ dynamic_plugin_assets["bundled"]["js"] + \
+ ["js/app/dataupdater.js",
+ "js/app/helpers.js",
+ "js/app/main.js"]
+ js_plugins = dynamic_plugin_assets["external"]["js"]
+ js_app = js_core + js_plugins
css_libs = [
"css/bootstrap.min.css",
@@ -1066,13 +1069,21 @@ class Server(object):
"css/jquery.fileupload-ui.css",
"css/pnotify.min.css"
]
- css_app = list(dynamic_assets["css"])
- if len(css_app) == 0:
- css_app = ["empty"]
+ css_core = list(dynamic_core_assets["css"]) + list(dynamic_plugin_assets["bundled"]["css"])
+ if len(css_core) == 0:
+ css_core = ["empty"]
+ css_plugins = list(dynamic_plugin_assets["external"]["css"])
+ if len(css_plugins) == 0:
+ css_plugins = ["empty"]
+ css_app = css_core + css_plugins
- less_app = list(dynamic_assets["less"])
- if len(less_app) == 0:
- less_app = ["empty"]
+ less_core = list(dynamic_core_assets["less"]) + list(dynamic_plugin_assets["bundled"]["less"])
+ if len(less_core) == 0:
+ less_core = ["empty"]
+ less_plugins = list(dynamic_plugin_assets["external"]["less"])
+ if len(less_plugins) == 0:
+ less_plugins = ["empty"]
+ less_app = less_core + less_plugins
from webassets.filter import register_filter, Filter
from webassets.filter.cssrewrite.base import PatternRewriter
@@ -1093,7 +1104,7 @@ class Server(object):
return "{import_with_options}\"{import_url}\";".format(**locals())
- class JsDelimiterBundle(Filter):
+ class JsDelimiterBundler(Filter):
name = "js_delimiter_bundler"
options = {}
def input(self, _in, out, **kwargs):
@@ -1101,24 +1112,42 @@ class Server(object):
out.write("\n;\n")
register_filter(LessImportRewrite)
- register_filter(JsDelimiterBundle)
+ register_filter(JsDelimiterBundler)
+ # JS
js_libs_bundle = Bundle(*js_libs, output="webassets/packed_libs.js", filters="js_delimiter_bundler")
if settings().getBoolean(["devel", "webassets", "minify"]):
+ js_core_bundle = Bundle(*js_core, output="webassets/packed_core.js", filters="rjsmin, js_delimiter_bundler")
+ js_plugins_bundle = Bundle(*js_plugins, output="webassets/packed_plugins.js", filters="rjsmin, js_delimiter_bundler")
js_app_bundle = Bundle(*js_app, output="webassets/packed_app.js", filters="rjsmin, js_delimiter_bundler")
else:
+ js_core_bundle = Bundle(*js_core, output="webassets/packed_core.js", filters="js_delimiter_bundler")
+ js_plugins_bundle = Bundle(*js_plugins, output="webassets/packed_plugins.js", filters="js_delimiter_bundler")
js_app_bundle = Bundle(*js_app, output="webassets/packed_app.js", filters="js_delimiter_bundler")
+ # CSS
css_libs_bundle = Bundle(*css_libs, output="webassets/packed_libs.css")
+ css_core_bundle = Bundle(*css_core, output="webassets/packed_core.css", filters="cssrewrite")
+ css_plugins_bundle = Bundle(*css_plugins, output="webassets/packed_plugins.css", filters="cssrewrite")
css_app_bundle = Bundle(*css_app, output="webassets/packed_app.css", filters="cssrewrite")
- all_less_bundle = Bundle(*less_app, output="webassets/packed_app.less", filters="cssrewrite, less_importrewrite")
+ # LESS
+ less_core_bundle = Bundle(*less_core, output="webassets/packed_core.less", filters="cssrewrite, less_importrewrite")
+ less_plugins_bundle = Bundle(*less_plugins, output="webassets/packed_plugins.less", filters="cssrewrite, less_importrewrite")
+ less_app_bundle = Bundle(*less_app, output="webassets/packed_app.less", filters="cssrewrite, less_importrewrite")
+ # asset registration
assets.register("js_libs", js_libs_bundle)
+ assets.register("js_core", js_core_bundle)
+ assets.register("js_plugins", js_plugins_bundle)
assets.register("js_app", js_app_bundle)
assets.register("css_libs", css_libs_bundle)
+ assets.register("css_core", css_core_bundle)
+ assets.register("css_plugins", css_plugins_bundle)
assets.register("css_app", css_app_bundle)
- assets.register("less_app", all_less_bundle)
+ assets.register("less_core", less_core_bundle)
+ assets.register("less_plugins", less_plugins_bundle)
+ assets.register("less_app", less_app_bundle)
def _start_intermediary_server(self, s):
import BaseHTTPServer
diff --git a/src/octoprint/server/util/flask.py b/src/octoprint/server/util/flask.py
index d16237de..fdc8efd8 100644
--- a/src/octoprint/server/util/flask.py
+++ b/src/octoprint/server/util/flask.py
@@ -1134,12 +1134,8 @@ class SettingsCheckUpdater(webassets.updater.BaseUpdater):
cache_value = webassets.utils.hash_func(json.dumps(settings().effective_yaml))
ctx.cache.set(cache_key, cache_value)
-##~~ plugin assets collector
-
-def collect_plugin_assets(enable_gcodeviewer=True, preferred_stylesheet="css"):
- logger = logging.getLogger(__name__ + ".collect_plugin_assets")
-
- supported_stylesheets = ("css", "less")
+##~~ core assets collector
+def collect_core_assets(enable_gcodeviewer=True, preferred_stylesheet="css"):
assets = dict(
js=[],
css=[],
@@ -1178,9 +1174,24 @@ def collect_plugin_assets(enable_gcodeviewer=True, preferred_stylesheet="css"):
elif preferred_stylesheet == "css":
assets["css"].append('css/octoprint.css')
+ return assets
+
+##~~ plugin assets collector
+
+def collect_plugin_assets(enable_gcodeviewer=True, preferred_stylesheet="css"):
+ logger = logging.getLogger(__name__ + ".collect_plugin_assets")
+
+ supported_stylesheets = ("css", "less")
+ assets = dict(bundled=dict(js=[], css=[], less=[]),
+ external=dict(js=[], css=[], less=[]))
+
asset_plugins = octoprint.plugin.plugin_manager().get_implementations(octoprint.plugin.AssetPlugin)
for implementation in asset_plugins:
name = implementation._identifier
+ is_bundled = implementation._plugin_info.bundled
+
+ asset_key = "bundled" if is_bundled else "external"
+
try:
all_assets = implementation.get_assets()
basefolder = implementation.get_asset_folder()
@@ -1198,13 +1209,13 @@ def collect_plugin_assets(enable_gcodeviewer=True, preferred_stylesheet="css"):
for asset in all_assets["js"]:
if not asset_exists("js", asset):
continue
- assets["js"].append('plugin/{name}/{asset}'.format(**locals()))
+ assets[asset_key]["js"].append('plugin/{name}/{asset}'.format(**locals()))
if preferred_stylesheet in all_assets:
for asset in all_assets[preferred_stylesheet]:
if not asset_exists(preferred_stylesheet, asset):
continue
- assets[preferred_stylesheet].append('plugin/{name}/{asset}'.format(**locals()))
+ assets[asset_key][preferred_stylesheet].append('plugin/{name}/{asset}'.format(**locals()))
else:
for stylesheet in supported_stylesheets:
if not stylesheet in all_assets:
@@ -1213,7 +1224,7 @@ def collect_plugin_assets(enable_gcodeviewer=True, preferred_stylesheet="css"):
for asset in all_assets[stylesheet]:
if not asset_exists(stylesheet, asset):
continue
- assets[stylesheet].append('plugin/{name}/{asset}'.format(**locals()))
+ assets[asset_key][stylesheet].append('plugin/{name}/{asset}'.format(**locals()))
break
return assets
diff --git a/src/octoprint/templates/javascripts.jinja2 b/src/octoprint/templates/javascripts.jinja2
index acad1952..edebf560 100644
--- a/src/octoprint/templates/javascripts.jinja2
+++ b/src/octoprint/templates/javascripts.jinja2
@@ -1,11 +1,4 @@
-{% assets "js_libs" %}
-
-{% endassets %}
-
-{% assets "js_app" %}
-
-{% endassets %}
-
-{% if g.locale %}
-
-{% endif %}
+{% assets "js_libs" %}{% endassets %}
+{% assets "js_core" %}{% endassets %}
+{% assets "js_plugins" %}{% endassets %}
+{% if g.locale %}{% endif %}
diff --git a/src/octoprint/templates/stylesheets.jinja2 b/src/octoprint/templates/stylesheets.jinja2
index b88de6a0..95e7ae7a 100644
--- a/src/octoprint/templates/stylesheets.jinja2
+++ b/src/octoprint/templates/stylesheets.jinja2
@@ -1,13 +1,6 @@
-{% assets "css_libs" %}
-
-{% endassets %}
-
-{% assets "css_app" %}
-
-{% endassets %}
-
-{% assets "less_app" %}
-
-{% endassets %}
-
+{% assets "css_libs" %}{% endassets %}
+{% assets "css_core" %}{% endassets %}
+{% assets "css_plugins" %}{% endassets %}
+{% assets "less_core" %}{% endassets %}
+{% assets "less_plugins" %}{% endassets %}