Added example plugin registry
Change-Id: I80daa31b6bdbaa9e6d6e81d62e6c34400509844a
diff --git a/dev/js/src/plugin/server.js b/dev/js/src/plugin/server.js
index d4190fb..6689529 100644
--- a/dev/js/src/plugin/server.js
+++ b/dev/js/src/plugin/server.js
@@ -14,6 +14,10 @@
// Contains all widgets to address with
// messages to them
var widgets = {};
+ var plugins = {};
+ var buttons = {
+ match : []
+ };
// This is a counter to limit acceptable incoming messages
// to a certain amount. For every message, this counter will
@@ -45,6 +49,96 @@
},
/**
+ * Register a plugin described as a JSON object.
+ *
+ * This is work in progress.
+ */
+ register : function (obj) {
+
+ /* Example:
+
+ KorAP.Plugin.register({
+ 'name' : 'CatContent',
+ 'desc' : 'Some content about cats',
+ 'about' : 'https://localhost:5678/',
+ 'embed' : [{
+ 'buttonGroup' : 'match',
+ 'title' : loc.TRANSLATE,
+ 'classes' : ['translate']
+ 'onClick' : {
+ 'action' : 'addWidget',
+ 'panel' : 'match',
+ 'template' : 'https://localhost:5678/?match={matchid}',
+ }
+ }]
+ });
+ */
+
+ // TODO:
+ // These fields need to be localized by a structure like
+ // {
+ // de : {
+ // name : '..'
+ // }
+ // en : ...
+ // }
+ // for display
+ var name = obj["name"];
+
+ // Register plugin by name
+ var plugin = plugins[name] = {
+ name : name,
+ desc : obj["desc"],
+ about : obj["about"],
+ widgets : []
+ };
+
+ // Embed all embeddings of the plugin
+ for (var i in obj["embed"]) {
+ var embed = obj["embed"][i];
+ var addTo = embed["buttonGroup"];
+ var onClick = embed["onClick"];
+
+ // Needs to be localized as well
+ var title = embed["title"];
+
+ // The embedding will open a widget
+ if (onClick["action"] == "addWidget") {
+
+ var panel = onClick["panel"];
+ var that = this;
+ var cb = function (e) {
+
+ // Get the URL of the widget
+ var url = onClick["template"]; // that._interpolateURI(onClick["template"], this.match);
+
+ // Add the widget to the panel
+ var id = that.addWidget(document.getElementById(panel), name, url);
+ plugin["widgets"].push(id);
+ };
+
+ buttons["match"].push([title, embed["classes"], cb]);
+ };
+ };
+ },
+
+
+ // TODO:
+ // Interpolate URIs similar to https://tools.ietf.org/html/rfc6570
+ // but as simple as possible
+ _interpolateURI : function (uri, obj) {
+ // ...
+ },
+
+
+ /**
+ * Get named button group
+ */
+ buttonGroup : function (name) {
+ return buttons[name];
+ },
+
+ /**
* Open a new widget as a child to a certain element
*/
addWidget : function (element, name, src) {
@@ -79,6 +173,8 @@
limits[id] = maxMessages;
// Open widget in frontend
+ // TODO:
+ // Instead of an "element" this should probably be a 'panel' object!
element.appendChild(
widget.element()
);
@@ -119,6 +215,9 @@
// Kill widget
KorAP.log(0, 'Suspicious action by widget', widget.src);
+
+ // TODO:
+ // Potentially kill the whole plugin!
this.closeWidget(widget);
return;
};
diff --git a/dev/js/src/util.js b/dev/js/src/util.js
index cb60c2a..27c3d8d 100644
--- a/dev/js/src/util.js
+++ b/dev/js/src/util.js
@@ -83,6 +83,9 @@
KorAP.API = KorAP.API || {};
KorAP.Locale = KorAP.Locale || {};
+ // This should load plugin/server
+ KorAP.Plugin = KorAP.Plugin || {};
+
const loc = KorAP.Locale;
loc.OR = loc.OR || 'or';
loc.AND = loc.AND || 'and';