So I've written a parsing function myself (which I was hoping to avoid ) that I've posted below. Haven't done much testing on it so I'm providing no warranties :P
It takes a string of path data as generated by Blend as an argument and creates an array that can be used to simulate keyframe animation by drawing a point at a time. When I used path data generated by Design it fell over as the spaces are in the wrong place. You can get around this easily by pasting the XAML into BLend and then just shifting a point to force Blend to rewrite the XAML
Hopefully this will help someone else
function parsePathData(_pathData){
var dataArray = new Array();
dataArray = _pathData.split(" ");
var parsedArray = new Array();
var commands = new Array("F", "M", "L", "H", "V", "C", "Q", "S", "T", "A", "Z");
var command; //path data syntax command
var args; //how many args it takes
for(var a = 0; a < dataArray.length; a++){
var first_char = dataArray
.substr(0,1);
for(var b = 0; b < commands.length; b++){
if(first_char.toUpperCase() == commands
){
command = first_char;
}
}
if(command == "F"){ //FillRule - fillRule
parsedArray.push(dataArray
);
} else if (command == "M"){ //Move: startPoint
parsedArray.push(dataArray
);
} else if (command == "L"){ //Line: endPoint
parsedArray.push(dataArray
);
} else if (command == "H"){ //Horizontal Line: endPoint
parsedArray.push(dataArray
);
} else if (command == "V"){ //Vertical Line: endPoint
parsedArray.push(dataArray
);
} else if(command == "C"){ // Cubic Bezier Curve: controlPoint1 controlPoint2 endPoint
args = 3;
var toAdd = "";
for(var c = 0; c < args; c++){
toAdd += dataArray[a+c] + " ";
}
parsedArray.push(toAdd);
a += args-1;
} else if(command == "Q"){ // Quadratic Bezier Curve: controlPoint endPoint
args = 2;
var toAdd = "";
for(var c = 0; c < args; c++){
toAdd += dataArray[a+c] + " ";
}
parsedArray.push(toAdd);
a += args-1;
} else if(command == "S"){ // Smooth Bezier Curve: controlPoint2 endPoint
args = 2;
var toAdd = "";
for(var c = 0; c < args; c++){
toAdd += dataArray[a+c] + " ";
}
parsedArray.push(toAdd);
a += args-1;
} else if(command == "T"){ // Smooth Cubic Bezier Curve: controlPoint endPoint
args = 2;
var toAdd = "";
for(var c = 0; c < args; c++){
toAdd += dataArray[a+c] + " ";
}
parsedArray.push(toAdd);
a += args-1;
} else if(command == "A"){ // Elliptical Arc: size rotationAngle isLargeArcFlag sweepDirectionFlag endPoint
args = 5;
var toAdd = "";
for(var c = 0; c < args; c++){
toAdd += dataArray[a+c] + " ";
}
parsedArray.push(toAdd);
a += args-1;
} else if(command == "Z"){ // Smooth Cubic Bezier Curve: controlPoint endPoint
parsedArray.push(dataArray
);
}
}
return parsedArray;
}