xrfragment-haxe/src/xrfragment/URI.hx

42 lines
2.1 KiB
Haxe
Raw Normal View History

2023-03-09 22:32:28 +01:00
package xrfragment;
2023-03-31 12:58:53 +02:00
import xrfragment.Parser;
2023-04-02 21:19:03 +02:00
/**
* <link rel="stylesheet" href="style.css"/>
* <link href="https://fonts.cdnfonts.com/css/montserrat" rel="stylesheet"/>
2023-04-02 21:22:22 +02:00
*
2023-04-02 21:19:03 +02:00
* > version 1.0.0
2023-04-02 21:22:22 +02:00
*
* date: $(date +"%Y-%m-%dT%H:%M:%S%z") (generated by \`./make doc\`)<br>
2023-04-02 21:19:03 +02:00
* [![Actions Status](https://github.com/coderofsalvation/xrfragment/workflows/test/badge.svg)](https://github.com/coderofsalvation/xrfragment/actions)
*
* # `://foo.com/my3d.asset#pos=1,0,0&prio=-5`
*
* # URI parser
* > icanhazcode? yes, see [URI.hx](https://github.com/coderofsalvation/xrfragment/blob/main/src/xrfragment/URI.hx)
*/
@:expose // <- makes the class reachable from plain JavaScript
@:keep // <- avoids accidental removal by dead code elimination
2023-03-31 14:47:54 +02:00
class URI {
2023-04-02 21:19:03 +02:00
@:keep
public static function parse(qs:String):haxe.DynamicAccess<Dynamic> {
var fragment:Array<String> = qs.split("#"); // 1. fragment URI starts with `#`
var splitArray:Array<String> = fragment[1].split('&'); // 1. fragments are split by `&`
var resultMap:haxe.DynamicAccess<Dynamic> = {}; // 1. store key/values into a associative array or dynamic object
for (i in 0...splitArray.length) { // 1. loop thru each fragment
2023-03-31 14:40:24 +02:00
2023-04-02 21:19:03 +02:00
var splitByEqual = splitArray[i].split('='); // 1. for each fragment split on `=` to separate key/values
2023-03-31 12:58:53 +02:00
var regexPlus = ~/\+/g; // 1. fragment-values are urlencoded (space becomes `+` using `encodeUriComponent` e.g.)
var key:String = splitByEqual[0];
2023-03-10 18:49:16 +01:00
if (splitByEqual.length > 1) {
var value:String = StringTools.urlDecode(regexPlus.split(splitByEqual[1]).join(" "));
2023-03-31 12:58:53 +02:00
var ok:Bool = Parser.parse(key,value,resultMap); // 1. every recognized fragment key/value-pair is added to a central map/associative array/object
2023-03-09 22:32:28 +01:00
}
}
return resultMap;
2023-03-09 22:32:28 +01:00
}
}