@gregoriusrippenstein/node-red-contrib-introspection 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,11 +5,22 @@
5
5
  //
6
6
  var origSvg = $($('svg')[0]);
7
7
 
8
+ // the DOMParser of Firefox does not like foreignObjects, so remove them.
9
+ // Correction: DOMParser doesn't mind foreignObjects as long as there is
10
+ // any HTML/<img>-tags in the foreignObjects.,,, of course, image tags
11
+ // rarely occur but nonetheless. foreighObjects are used to display divs
12
+ // within SVGs that contain html code to be displayed in the browser. So
13
+ // we assume that the foreignObject is not relevant for exporting as its
14
+ // content is specifically for the browser user.
15
+ var preParseSvg = origSvg.clone();
16
+ preParseSvg.find("foreignObject").remove();
17
+
8
18
  var hwAttrs = (
9
19
  'width="' + origSvg.attr('width') + '" height="' +
10
20
  origSvg.attr('height') + '"'
11
21
  );
12
22
 
23
+ // redefine the svgHeader because we need to include the xml namespaces
13
24
  var svgHeader = (
14
25
  '<?xml version="1.0" standalone="no"?>\r\n' +
15
26
  '<svg ' + hwAttrs + ' pointer-events="all" style="cursor: crosshair; '+
@@ -17,9 +28,10 @@
17
28
  'xmlns:xlink="http://www.w3.org/1999/xlink">\r\n'
18
29
  );
19
30
 
20
- var svgBody = origSvg.html();
31
+ var svgBody = preParseSvg.html();
21
32
 
22
33
  var parser = new DOMParser();
34
+
23
35
  var doc = parser.parseFromString(svgHeader + svgBody + '\r\n</svg>',
24
36
  "image/svg+xml");
25
37
 
@@ -50,7 +62,7 @@
50
62
  opa: rgb4[4]
51
63
  }
52
64
  } else {
53
- console.log( "Screenshot node: returning unknown color: " + rgb );
65
+ console.log( "Screenshot node: returned unknown color: " + rgb );
54
66
  return rgb;
55
67
  }
56
68
  }
@@ -216,6 +228,44 @@
216
228
  }
217
229
  };
218
230
 
231
+ /*
232
+ When the server side of this node is triggered, it posts a message on
233
+ the communication channel. The frontend node captures that message,
234
+ generates an SVG and posts that to the POST endpoint (that is assumed)
235
+ to be running. If not, there will be a console error.
236
+ */
237
+ RED.comms.subscribe('introspect:screenshot-timer-tripped', (event,data) => {
238
+ if ( data.msg == "timer-tripped" ) {
239
+
240
+ if ( data.notification != "off" ) {
241
+ RED.notify("Screenshot triggered", { type: "warning" });
242
+ }
243
+
244
+ var notification = data.notification;
245
+ nr_intro_generate_svg( (svgdata) => {
246
+ // TODO the post will hit a 'Request too large' limit with the
247
+ // TODO SVG gets larger than XX-MB (got this when an svg of 5.5MB
248
+ // TODO but an svg with 4.1MB went through). No immediate fix, would
249
+ // TODO good to create parts that can be manually joined using the
250
+ // TODO 'join' node.
251
+ $.ajax({
252
+ type: "POST",
253
+ url: "/screenshot",
254
+ data: {
255
+ ...data,
256
+ d: svgdata
257
+ },
258
+ complete: (_ignore) => {
259
+ if ( notification != "off" ) {
260
+ RED.notify("Screenshot posted", { type: "success" });
261
+ }
262
+ },
263
+ dataType: "image/svg+xml;charset=utf-8"
264
+ });
265
+ });
266
+ }
267
+ });
268
+
219
269
  RED.nodes.registerType('Screenshot',{
220
270
  color: '#e5e4ef',
221
271
  icon: "font-awesome/fa-camera",
@@ -237,47 +287,6 @@
237
287
  },
238
288
 
239
289
  labelStyle: function() {
240
- /*
241
- because there is not a better hook to connect up the event
242
- listener, misuse the label styling for this. Also don't register a
243
- new listener each time, maintain only one listener by removing and
244
- readding.
245
- */
246
- var that = this;
247
- var functName = "introspect:" + that.id;
248
-
249
- if ( !window[functName] ) {
250
- window[functName] = (e,m) => {
251
- if ( m.msg == "timer-tripped" ) {
252
-
253
- if ( m.notification != "off" ) {
254
- RED.notify("Screenshot triggered", { type: "warning" });
255
- }
256
-
257
- var notification = m.notification;
258
- nr_intro_generate_svg( (svgdata) => {
259
- $.ajax({
260
- type: "POST",
261
- url: "/screenshot",
262
- data: {
263
- ...m,
264
- d: svgdata
265
- },
266
- complete: (data) => {
267
- if ( notification != "off" ) {
268
- RED.notify("Screenshot posted", { type: "success" });
269
- }
270
- },
271
- dataType: "image/svg+xml;charset=utf-8"
272
- });
273
- });
274
- }
275
- }
276
- }
277
-
278
- RED.comms.unsubscribe(functName, window[functName]);
279
- RED.comms.subscribe(functName, window[functName] );
280
-
281
290
  return this.name?"node_label_italic":"";
282
291
  },
283
292
 
@@ -10,10 +10,12 @@ module.exports = function(RED) {
10
10
  });
11
11
 
12
12
  node.on("input", function(msg, send, done) {
13
- RED.comms.publish("introspect:" + node.id, RED.util.encodeObject({
14
- ...msg,
15
- msg: "timer-tripped",
16
- }));
13
+ RED.comms.publish("introspect:screenshot-timer-tripped",
14
+ RED.util.encodeObject({
15
+ ...msg,
16
+ msg: "timer-tripped",
17
+ })
18
+ );
17
19
 
18
20
  node.status({ fill: "green", shape: "dot", text: "Taking screenshot" });
19
21
  setTimeout( () => { node.status({}) }, 1432 );
@@ -24,8 +24,7 @@
24
24
  RED.sidebar.info.show()
25
25
  }, 1000);
26
26
 
27
- // a random value of 890px to indicate mobile, is very arbitrary.
28
- if ( window.matchMedia('only screen and (max-width: 890px)').matches ) {
27
+ if ( RED.utils.getBrowserInfo().mobile > 0 ) {
29
28
  setTimeout( function() {
30
29
  // taken from https://discourse.nodered.org/t/togglepalette-v-togglesidebar/78169/3
31
30
  RED.actions.invoke("core:toggle-palette", false)
@@ -1,4 +1,10 @@
1
1
  <script type="text/javascript">
2
+ RED.comms.subscribe("introspect:drawsvg", (event,data) => {
3
+ if ( data.msg == "svgdata" ) {
4
+ $($($('svg')[0]).find('> g > g > g')[2]).append(data.payload);
5
+ }
6
+ });
7
+
2
8
  RED.nodes.registerType('DrawSVG',{
3
9
  color: '#e5e4ef',
4
10
  icon: "font-awesome/fa-image",
@@ -16,26 +22,6 @@
16
22
  },
17
23
 
18
24
  labelStyle: function() {
19
- /*
20
- because there is not a better hook to connect up the event
21
- listener, misuse the label styling for this. Also don't register a
22
- new listener each time, maintain only one listener by removing and
23
- readding.
24
- */
25
- var that = this;
26
- var functName = "introspect:" + that.id;
27
-
28
- if ( !window[functName] ) {
29
- window[functName] = (e,m) => {
30
- if ( m.msg == "svgdata" ) {
31
- $($($('svg')[0]).find('> g > g > g')[2]).append(m.payload);
32
- }
33
- }
34
- }
35
-
36
- RED.comms.unsubscribe(functName, window[functName]);
37
- RED.comms.subscribe(functName, window[functName] );
38
-
39
25
  return this.name?"node_label_italic":"";
40
26
  },
41
27
  });
@@ -10,7 +10,7 @@ module.exports = function(RED) {
10
10
  });
11
11
 
12
12
  node.on("input", function(msg, send, done) {
13
- RED.comms.publish("introspect:" + node.id, RED.util.encodeObject({
13
+ RED.comms.publish("introspect:drawsvg", RED.util.encodeObject({
14
14
  ...msg,
15
15
  msg: "svgdata",
16
16
  }));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gregoriusrippenstein/node-red-contrib-introspection",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "keywords": [
5
5
  "node-red"
6
6
  ],