From 8da9d0b13bb72a5e3a57711af001c9397048e12e Mon Sep 17 00:00:00 2001 From: Martin Zimmermann Date: Sat, 2 Nov 2013 18:26:33 +0100 Subject: [PATCH] override API location with `data-prefix="..."` --- README.md | 9 +++++++++ isso/js/app/api.js | 47 ++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 48 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 186d73e..bb8eb1b 100644 --- a/README.md +++ b/README.md @@ -122,6 +122,15 @@ You can configure the client (the JS part) via `data-` attributes: Make sure to escape the attribute value. +* data-prefix + + Isso usually detects the REST API automatically, but when you serve the JS + script on a different location, this may fail. Use `data-prefix` to + override the API location: + + ```html + + ``` ### Webserver configuration diff --git a/isso/js/app/api.js b/isso/js/app/api.js index 33cab7c..5bbd1c4 100644 --- a/isso/js/app/api.js +++ b/isso/js/app/api.js @@ -22,20 +22,51 @@ define(["q"], function(Q) { "/count": [200] }; - // guess Isso API location + /* + * Detect Isso API endpoint. There are typically two use cases: + * + * 1. use minified, single-file JavaScript. The browser interprets + * scripts sequentially, thus we can safely use the last script + * tag. Then, we chop off some characters -- /js/embed.min.s -- + * and we're done. + * + * If the script is not served by Isso directly, a custom data + * attribute can be used to override the default detection + * mechanism: + * + * .. code-block:: html + * + * + * + * 2. use require.js (during development). When using require.js, we + * assume that the path to the scripts ends with `/js/`. + * + */ + + var script, uri; + var port = window.location.port ? ":" + window.location.port : "", + host = window.location.protocol + "//" + window.location.hostname + port; + var js = document.getElementsByTagName("script"); for (var i = 0; i < js.length; i++) { - if (js[i].src.match("/js/components/requirejs/require\\.js$")) { - endpoint = js[i].src.substring(0, js[i].src.length - 35); - break; - } else if (js[i].src.match("/js/(embed|count)\\.(min|dev)\\.js$")) { - endpoint = js[i].src.substring(0, js[i].src.length - 16); - break; + if (js[i].src.match("require\\.js$") && js[i].dataset.main.match("/js/embed$")) { + uri = js[i].dataset.main; + endpoint = uri.substr(0, uri.length - "/js/main".length); } } if (! endpoint) { - throw "no Isso API location found"; + script = js[js.length - 1]; + + if (script.dataset.prefix) { + endpoint = script.dataset.prefix; + if (endpoint[endpoint.length - 1] === "/") { + endpoint = endpoint.substring(0, endpoint.length - 1); + } + } else { + uri = script.src.substring(host.length); + endpoint = uri.substring(0, uri.length - "/js/embed.min.js".length); + } } var curl = function(method, url, data) {