From 76fe4123f6d7c6c0e35d287dff52d61f8335122f Mon Sep 17 00:00:00 2001
From: dceejay
Date: Fri, 29 May 2015 17:49:19 +0100
Subject: [PATCH] Add what3words node
---
parsers/what3words/LICENSE | 177 +++++++++++++++++++++++++++++
parsers/what3words/README.md | 48 ++++++++
parsers/what3words/package.json | 24 ++++
parsers/what3words/w3w.tgz | Bin 0 -> 15483 bytes
parsers/what3words/what3words.html | 102 +++++++++++++++++
parsers/what3words/what3words.js | 116 +++++++++++++++++++
6 files changed, 467 insertions(+)
create mode 100644 parsers/what3words/LICENSE
create mode 100644 parsers/what3words/README.md
create mode 100644 parsers/what3words/package.json
create mode 100644 parsers/what3words/w3w.tgz
create mode 100644 parsers/what3words/what3words.html
create mode 100644 parsers/what3words/what3words.js
diff --git a/parsers/what3words/LICENSE b/parsers/what3words/LICENSE
new file mode 100644
index 00000000..f433b1a5
--- /dev/null
+++ b/parsers/what3words/LICENSE
@@ -0,0 +1,177 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
diff --git a/parsers/what3words/README.md b/parsers/what3words/README.md
new file mode 100644
index 00000000..7fc849f8
--- /dev/null
+++ b/parsers/what3words/README.md
@@ -0,0 +1,48 @@
+node-red-node-what3words
+========================
+
+A Node-RED node to convert positions to what3words...
+
+Install
+-------
+
+Run the following command in the root directory of your Node-RED install
+
+ npm install node-red-node-what3words
+
+Pre-reqs
+--------
+
+You will need a valid API key from what3words
+
+
+Usage
+-----
+
+Uses What 3 Words to convert a location to 3 unique words.
+and vice versa. Don't ask... just try it...
+
+To convert position to words it requires
+
+ - msg.location.lat
+ - msg.location.lon
+
+or
+
+ - msg.payload containing a string lat,lon
+
+
+To convert words to position it requires
+
+ - msg.payload containing a string unique.three.words
+
+
+The API-key is stored in a separate credentials file.
+
+**Note:** This is an online service and requires a live internet connection and a valid API key to work correctly.
+
+See what3words for more details.
+
+Example flow:
+
+ [{"id":"f38eba15.0c7148","type":"inject","name":"","topic":"","payload":"calibrate.newlyweds.switched","payloadType":"string","repeat":"","crontab":"","once":false,"x":646,"y":319,"z":"cf058368.30fa8","wires":[["22d6b2a5.dd294e"]]},{"id":"22d6b2a5.dd294e","type":"what3words","title":"","name":"","x":881,"y":317,"z":"cf058368.30fa8","wires":[["9caf8aa8.635078"]]},{"id":"9caf8aa8.635078","type":"debug","name":"","active":true,"console":false,"complete":"true","x":1077,"y":315,"z":"cf058368.30fa8","wires":[]}]
diff --git a/parsers/what3words/package.json b/parsers/what3words/package.json
new file mode 100644
index 00000000..b6f18efa
--- /dev/null
+++ b/parsers/what3words/package.json
@@ -0,0 +1,24 @@
+{
+ "name" : "node-red-node-what3words",
+ "version" : "0.0.1",
+ "description" : "A Node-RED node to convert locations to/from what3words",
+ "dependencies" : {
+ "geo.what3words" : "0.0.2"
+ },
+ "repository" : {
+ "type":"git",
+ "url":"https://github.com/node-red/node-red-nodes/tree/master/parsers/what3words"
+ },
+ "license": "Apache-2.0",
+ "keywords": [ "node-red", "what3words" ],
+ "node-red" : {
+ "nodes" : {
+ "what3words": "what3words.js"
+ }
+ },
+ "author": {
+ "name": "Dave Conway-Jones",
+ "email": "ceejay@vnet.ibm.com",
+ "url": "http://nodered.org"
+ }
+}
diff --git a/parsers/what3words/w3w.tgz b/parsers/what3words/w3w.tgz
new file mode 100644
index 0000000000000000000000000000000000000000..7c5bc96c67d1888f730f12faaded27a543e391e1
GIT binary patch
literal 15483
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
literal 0
HcmV?d00001
diff --git a/parsers/what3words/what3words.html b/parsers/what3words/what3words.html
new file mode 100644
index 00000000..4249f6d9
--- /dev/null
+++ b/parsers/what3words/what3words.html
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
diff --git a/parsers/what3words/what3words.js b/parsers/what3words/what3words.js
new file mode 100644
index 00000000..c1d8d9bf
--- /dev/null
+++ b/parsers/what3words/what3words.js
@@ -0,0 +1,116 @@
+/**
+ * Copyright 2014 IBM Corp.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ **/
+
+module.exports = function(RED) {
+ "use strict";
+ var What3Words = require('geo.what3words');
+
+ function what3wordsNode(n) {
+ RED.nodes.createNode(this, n);
+ this.lang = n.lang || "en";
+ var credentials = RED.nodes.getCredentials(n.id);
+ if ((credentials) && (credentials.hasOwnProperty("pushkey"))) { this.pushkey = credentials.pushkey; } else { this.error("No what3words API key set"); }
+ this.w3w = new What3Words(this.pushkey);
+ var node = this;
+ var w1 = /^\*\w{6,31}$/;
+ var w3 = /^\w+\.\w+\.\w+$/;
+ this.on("input", function(msg) {
+ if (msg.hasOwnProperty("location")) {
+ var lat = msg.location.lat;
+ var lon = msg.location.lon;
+ node.w3w.positionToWords({ position:lat + "," + lon, lang:node.lang })
+ .then(function(response) {
+ msg.payload = response; // prom.cape.pump
+ if (!msg.hasOwnProperty("topic") || (msg.topic === "")) { msg.topic = "what3words"; }
+ node.send(msg);
+ })
+ .catch(function(err) {
+ node.warn(err)
+ });
+ } else if (typeof (msg.payload) === "string") {
+ if (msg.payload.split(",").length === 2) { // see if it's 2 comma separated words
+ node.w3w.positionToWords({ position:msg.payload, lang:node.lang })
+ .then(function(response) {
+ msg.payload = response; // prom.cape.pump
+ if (!msg.hasOwnProperty("topic") || (msg.topic === "")) { msg.topic = "what3words"; }
+ node.send(msg);
+ })
+ .catch(function(err) {
+ node.warn(err);
+ });
+ } else if (msg.payload.match(w3)) { // see if it's 3 dot separated words
+ node.w3w.wordsToPosition({ words:msg.payload })
+ .then(function(response) {
+ if (!msg.hasOwnProperty("location")) { msg.location = {}; }
+ msg.location.lat = Number(response.split(",")[0]);
+ msg.location.lon = Number(response.split(",")[1]);
+ node.send(msg);
+ })
+ .catch(function(err) {
+ node.warn(err)
+ });
+ } else if (msg.payload.match(w1)) { // see if it's a *Oneword
+ node.w3w.wordsToPosition({ words:msg.payload })
+ .then(function(response) {
+ if (!msg.hasOwnProperty("location")) { msg.location = {}; }
+ msg.location.lat = Number(response.split(",")[0]);
+ msg.location.lon = Number(response.split(",")[1]);
+ msg.payload = response;
+ node.send(msg);
+ })
+ .catch(function(err) {
+ node.warn(err);
+ });
+ } else { node.warn("No useable data found. See info."); }
+ } else { node.warn("No useable data found. See info."); }
+ });
+ }
+ RED.nodes.registerType("what3words", what3wordsNode);
+
+ var querystring = require('querystring');
+
+ RED.httpAdmin.get('/what3words/:id', function(req, res) {
+ var credentials = RED.nodes.getCredentials(req.params.id);
+ if (credentials) {
+ res.send(JSON.stringify({hasPassword:(credentials.pushkey && credentials.pushkey !== "")}));
+ } else {
+ res.send(JSON.stringify({}));
+ }
+ });
+
+ RED.httpAdmin.delete('/what3words/:id', function(req, res) {
+ RED.nodes.deleteCredentials(req.params.id);
+ res.send(200);
+ });
+
+ RED.httpAdmin.post('/what3words/:id', function(req, res) {
+ var body = "";
+ req.on('data', function(chunk) {
+ body += chunk;
+ });
+ req.on('end', function() {
+ var newCreds = querystring.parse(body);
+ var credentials = RED.nodes.getCredentials(req.params.id) || {};
+ if (newCreds.pushkey === "") {
+ delete credentials.pushkey;
+ } else {
+ credentials.pushkey = newCreds.pushkey || credentials.pushkey;
+ }
+ RED.nodes.addCredentials(req.params.id, credentials);
+ res.send(200);
+ });
+ });
+}