xrfragment-haxe/src/xrfragment/URI.hx

64 lines
2.9 KiB
Haxe
Raw Normal View History

2023-05-23 11:30:39 +02:00
// SPDX-License-Identifier: MPL-2.0
// Copyright (c) 2023 Leon van Kammen/NLNET
2023-03-09 22:32:28 +01:00
package xrfragment;
2023-03-31 12:58:53 +02:00
import xrfragment.Parser;
2023-04-14 14:45:50 +02:00
import xrfragment.XRF;
2023-03-31 12:58:53 +02:00
2023-04-02 21:19:03 +02:00
/**
2023-06-27 12:15:04 +02:00
* # Spec
2023-04-02 21:22:22 +02:00
*
2023-06-27 12:15:04 +02:00
* > version 1.0.0 [![Actions Status](https://github.com/coderofsalvation/xrfragment/workflows/test/badge.svg)](https://github.com/coderofsalvation/xrfragment/actions) generated by `make doc` @ $(date +"%Y-%m-%dT%H:%M:%S%z")
*
* ### XR Fragment URI Grammar
2023-04-06 18:27:49 +02:00
*
* ```
* reserved = gen-delims / sub-delims
* gen-delims = "#" / "&"
2023-06-27 12:15:04 +02:00
* sub-delims = "," / "="
2023-04-06 18:27:49 +02:00
* ```
2023-04-06 18:29:53 +02:00
*
2023-06-27 12:15:04 +02:00
* In case your programming language has no parser ([check here](https://github.com/coderofsalvation/xrfragment/tree/main/dist)) you can [crosscompile it](https://github.com/coderofsalvation/xrfragment/blob/main/build.hxml), or roll your own `Parser.parse(k,v,store)` using the spec:
2023-04-06 18:30:36 +02:00
*
2023-04-02 21:19:03 +02:00
*/
@: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(url:String,filter:Int):haxe.DynamicAccess<Dynamic> {
2023-06-27 12:15:04 +02:00
var store:haxe.DynamicAccess<Dynamic> = {}; // 1. store key/values into a associative array or dynamic object
2023-06-10 14:43:07 +02:00
if( url == null || url.indexOf("#") == -1 ) return store;
var fragment:Array<String> = url.split("#"); // 1. fragment URI starts with `#`
2023-04-02 21:19:03 +02:00
var splitArray:Array<String> = fragment[1].split('&'); // 1. fragments are split by `&`
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-04-14 17:37:33 +02:00
var value:String = "";
if (splitByEqual.length > 1) {
2023-04-14 17:37:33 +02:00
value = StringTools.urlDecode(regexPlus.split(splitByEqual[1]).join(" "));
2023-03-09 22:32:28 +01:00
}
2023-06-27 12:15:04 +02:00
var ok:Bool = Parser.parse(key,value,store); // 1. for every recognized fragment key/value-pair call [Parser.parse](#%E2%86%AA%20Parser.parse%28k%2Cv%2Cstore%29)
}
if( filter != null && filter != 0 ){
for (key in store.keys()) {
var xrf:XRF = store.get(key);
if( !xrf.is( filter ) ){
store.remove(key);
2023-04-14 17:37:33 +02:00
}
2023-04-14 14:45:50 +02:00
}
}
return store;
2023-03-09 22:32:28 +01:00
}
}
2023-06-27 12:15:04 +02:00
/**
* > icanhazcode? yes, see [URI.hx](https://github.com/coderofsalvation/xrfragment/blob/main/src/xrfragment/URI.hx)
*
* # Tests
*
* the spec is tested with [JSON unittests](./../src/spec) consumed by [Test.hx](./../src/Test.hx) to cross-test all languages.
*/