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 = " s t y l e s h e e t " href = " s t y l e . c s s " / >
* < link href = " h t t p s : / / f o n t s . c d n f o n t s . c o m / c s s / m o n t s e r r a t " rel = " s t y l e s h e e t " / >
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 - % d T % H : % M : % S % z " ) ( generated b y \ ` . / m a k e d o c \ ` ) < br >
2023-04-02 21:19:03 +02:00
* [ ! [ Actions S t a t u s ] ( https : //github.com/coderofsalvation/xrfragment/workflows/test/badge.svg)](https://github.com/coderofsalvation/xrfragment/actions)
*
2023-04-06 18:27:49 +02:00
* # XRFragment Grammar
*
* ` ` `
* reserved = gen - delims / sub - delims
* gen - delims = " # " / " & "
* sub - delims = " , " / " | " / " = "
* ` ` `
2023-04-06 18:29:31 +02:00
* < br >
2023-04-06 18:29:53 +02:00
*
2023-04-06 18:27:49 +02:00
* > Example : ` : //foo.com/my3d.asset#pos=1,0,0&prio=-5&t=0,100|100,200`
*
2023-04-06 18:30:36 +02:00
* < br > Explanation : < br >
2023-04-06 18:29:31 +02:00
* | ` x = 1 , 2 , 3 ` | vector / coordinate argument e . g . |
* | ` x = foo \ | bar \ | 1 \ , 2 , 3 \ | 1.0 ` | the ` \ | ` character is used for : < b r > 1 . s p e c i f y i n g ` n ` a r g u m e n t s f o r x r f r a g m e n t ` x ` < b r > 2 . f a l l b a c k u r l s ( ` src = https : //x.co/f.gltf\|xyz://f.gltf`)<br>3. roundrobin of values (in case provided arguments exceeds `n` of `x` for #1) when triggered by browser URI (clicking `href` e.g.)|
* | ` . mygroup ` | query - alias for ` c l a s s : m y g r o u p ` |
2023-04-02 21:19:03 +02:00
*
2023-04-06 18:30:36 +02:00
* > Focus : hasslefree 3 D vector - data ( ` , ` ) , multi - protocol / fallback - linking & dynamic values ( ` | ` ) , and C S S - p i g g y b a c k i n g ( ` . m y g r o u p ` )
*
2023-04-02 21:19:03 +02:00
* # URI parser
* > icanhazcode ? yes , s e e [ U R I . h x ] ( h t t p s : //github.com/coderofsalvation/xrfragment/blob/main/src/xrfragment/URI.hx)
* /
2023-03-30 19:51:32 +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 ( 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.)
2023-03-30 19:51:32 +02:00
var key: String = splitByEqual [ 0 ] ;
2023-03-10 18:49:16 +01:00
2023-03-30 19:51:32 +02: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
}
2023-03-30 19:51:32 +02:00
}
return resultMap ;
2023-03-09 22:32:28 +01:00
}
}