diff --git a/pd/nw/parse-svg-path.js b/pd/nw/parse-svg-path.js
new file mode 100644
index 0000000000000000000000000000000000000000..8cfc53bb0cda8906ed83d5610b4f3d0c6a322e3a
--- /dev/null
+++ b/pd/nw/parse-svg-path.js
@@ -0,0 +1,59 @@
+// Grabbed hastily from https://github.com/jkroso/parse-svg-path
+// MIT licensed so it's a good fit for Pd :)
+
+module.exports = parse
+
+/**
+ * expected argument lengths
+ * @type {Object}
+ */
+
+var length = {a: 7, c: 6, h: 1, l: 2, m: 2, q: 4, s: 4, t: 2, v: 1, z: 0}
+
+/**
+ * segment pattern
+ * @type {RegExp}
+ */
+
+var segment = /([astvzqmhlc])([^astvzqmhlc]*)/ig
+
+/**
+ * parse an svg path data string. Generates an Array
+ * of commands where each command is an Array of the
+ * form `[command, arg1, arg2, ...]`
+ *
+ * @param {String} path
+ * @return {Array}
+ */
+
+function parse(path) {
+	var data = []
+	path.replace(segment, function(_, command, args){
+		var type = command.toLowerCase()
+		args = parseValues(args)
+
+		// overloaded moveTo
+		if (type == 'm' && args.length > 2) {
+			data.push([command].concat(args.splice(0, 2)))
+			type = 'l'
+			command = command == 'm' ? 'l' : 'L'
+		}
+
+		while (true) {
+			if (args.length == length[type]) {
+				args.unshift(command)
+				return data.push(args)
+			}
+			if (args.length < length[type]) throw new Error('malformed path data')
+			data.push([command].concat(args.splice(0, length[type])))
+		}
+	})
+	return data
+}
+
+var number = /-?[0-9]*\.?[0-9]+(?:e[-+]?\d+)?/ig
+
+function parseValues(args) {
+	var numbers = args.match(number)
+	return numbers ? numbers.map(Number) : []
+}
diff --git a/pd/nw/pd_canvas.js b/pd/nw/pd_canvas.js
index 9d698037404811a33e7fce98f201f8fd166f8afe..e0af0309dc7205f4ec98b798abd477b9fe65c52e 100644
--- a/pd/nw/pd_canvas.js
+++ b/pd/nw/pd_canvas.js
@@ -32,8 +32,29 @@ function close_save_dialog() {
     document.getElementById("save_before_quit").close();
 }
 
+function text_to_normalized_svg_path(text) {
+    text = text.slice(4).trim()  // draw
+               .slice(4).trim()  // path
+               .slice(1).trim()  // d
+               .slice(1).trim(); // =
+    if (text.slice(0, 1) === '"') {
+        text = text.slice(1);
+    }
+    if (text.slice(-1) === '"') {
+        text = text.slice(0, -1);
+    }
+    text = pdgui.parse_svg_path(text);
+    return "draw path " + text.reduce(function (prev, curr) {
+        return prev.concat(curr)
+    }).join(" ");
+}
+
 function text_to_fudi(text) {
     text = text.trim();
+    // special case for draw path d="arbitrary path string" ...
+    if (text.search(/^draw\s+path\s+d\s*=\s*"/) !== -1) {
+        text = text_to_normalized_svg_path(text);
+    }
     text = text.replace(/(\$[0-9]+)/g, "\\$1");    // escape dollar signs
     text = text.replace(/(\$@)/g, "\\$@");         // escape special $@ sign
     text = text.replace(/(?!\\)(,|;)/g, " \\$1 "); // escape "," and ";"
diff --git a/pd/nw/pdgui.js b/pd/nw/pdgui.js
index c16affeca068a77190010e8869f90d9cf3c0fc65..727670b735355dcb93b0a4adc8d0cef4228e5aab 100644
--- a/pd/nw/pdgui.js
+++ b/pd/nw/pdgui.js
@@ -66,6 +66,10 @@ var fs = require("fs");     // for fs.existsSync
 var path = require("path"); // for path.dirname path.extname path.join
 var cp = require("child_process"); // for starting core Pd from GUI in OSX
 
+var parse_svg_path = require("./parse-svg-path.js");
+
+exports.parse_svg_path = parse_svg_path;
+
 // local strings
 var lang = require("./pdlang.js");