2023-03-09 22:32:28 +01:00
|
|
|
package xrfragment;
|
|
|
|
|
|
2023-03-09 22:39:59 +01:00
|
|
|
@:expose // <- makes the class reachable from plain JavaScript
|
|
|
|
|
@:keep // <- avoids accidental removal by dead code elimination
|
|
|
|
|
|
2023-03-10 18:49:16 +01:00
|
|
|
class Value {
|
|
|
|
|
public var x:Float;
|
|
|
|
|
public var y:Float;
|
|
|
|
|
public var z:Float;
|
|
|
|
|
public var color:String;
|
|
|
|
|
public var string:String;
|
|
|
|
|
public var int:Int;
|
|
|
|
|
public var float:Float;
|
|
|
|
|
public var args:Array<Value>;
|
|
|
|
|
public function new(){}
|
|
|
|
|
}
|
2023-03-09 22:32:28 +01:00
|
|
|
|
2023-03-10 18:49:16 +01:00
|
|
|
class Url {
|
2023-03-09 22:32:28 +01:00
|
|
|
|
2023-03-09 22:39:59 +01:00
|
|
|
@:keep
|
2023-03-10 18:49:16 +01:00
|
|
|
public static function parse(qs:String):Map<String, Value> {
|
|
|
|
|
var fragment:Array<String> = qs.split("#");
|
|
|
|
|
var splitArray:Array<String> = fragment[1].split('&');
|
2023-03-09 22:32:28 +01:00
|
|
|
var regexPlus = ~/\+/g; // Regex for replacing addition symbol with a space
|
2023-03-10 18:49:16 +01:00
|
|
|
var resultMap = new Map<String,Value>();
|
2023-03-09 22:32:28 +01:00
|
|
|
for (i in 0...splitArray.length) {
|
2023-03-10 18:49:16 +01:00
|
|
|
var splitByEqual = splitArray[i].split('=');
|
|
|
|
|
var key:String = splitByEqual[0];
|
|
|
|
|
var v:Value = new Value();
|
|
|
|
|
|
|
|
|
|
if (splitByEqual.length > 1) {
|
|
|
|
|
var value:String = StringTools.urlDecode(regexPlus.split(splitByEqual[1]).join(" "));
|
|
|
|
|
guessType(v, value);
|
|
|
|
|
|
|
|
|
|
// multiple/fallthrough values
|
|
|
|
|
if( value.split("|").length > 1 ){
|
|
|
|
|
v.args = new Array<Value>();
|
|
|
|
|
var args:Array<String> = value.split("|");
|
|
|
|
|
for( i in 0...args.length){
|
|
|
|
|
var x:Value = new Value();
|
|
|
|
|
guessType(x, args[i]);
|
|
|
|
|
v.args.push( x );
|
|
|
|
|
}
|
2023-03-09 22:32:28 +01:00
|
|
|
}
|
2023-03-10 18:49:16 +01:00
|
|
|
resultMap.set(key, v );
|
|
|
|
|
}
|
2023-03-09 22:32:28 +01:00
|
|
|
}
|
|
|
|
|
return resultMap;
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-10 18:49:16 +01:00
|
|
|
@:keep
|
|
|
|
|
public static function guessType(v:Value, str:String):Void {
|
|
|
|
|
var isColor:EReg = ~/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/;
|
|
|
|
|
var isInt:EReg = ~/^[0-9]+$/;
|
|
|
|
|
var isFloat:EReg = ~/^[0-9]+\.[0-9]+$/;
|
|
|
|
|
v.string = str;
|
|
|
|
|
if( str.split(",").length > 1){
|
|
|
|
|
var xyz:Array<String> = str.split(",");
|
|
|
|
|
if( xyz.length > 0 ) v.x = Std.parseFloat(xyz[0]);
|
|
|
|
|
if( xyz.length > 1 ) v.y = Std.parseFloat(xyz[1]);
|
|
|
|
|
if( xyz.length > 2 ) v.z = Std.parseFloat(xyz[2]);
|
|
|
|
|
}
|
|
|
|
|
if( isColor.match(str) ) v.color = str;
|
|
|
|
|
if( isFloat.match(str) ) v.float = Std.parseFloat(str);
|
|
|
|
|
if( isInt.match(str) ) v.int = Std.parseInt(str);
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-09 22:32:28 +01:00
|
|
|
}
|