2020-08-30 01:13:18 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								import  { AndOrTagConfigJson }  from  "./TagConfigJson" ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-09-02 11:37:34 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								import  { And ,  Or ,  RegexTag ,  Tag ,  TagsFilter }  from  "../../Logic/Tags" ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-28 11:19:47 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								import  { Translation }  from  "../../UI/i18n/Translations" ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-27 01:01:34 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-08-31 02:59:47 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								import  { Utils }  from  "../../Utils" ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-30 01:13:18 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								export  class  FromJSON  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-09-12 23:15:17 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    public  static  Translation ( json : string  |  any ) :  Translation  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-30 01:13:18 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								        if  ( json  ===  undefined )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            return  undefined ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if  ( typeof  ( json )  ===  "string" )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-09-12 23:15:17 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            return  new  Translation ( { "*" :  json } ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-30 01:13:18 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2020-09-25 23:59:19 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        if ( json . render  !==  undefined ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            console . error ( "Using a 'render' where a translation is expected. Content is" ,  json . render ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            throw  "ERROR: using a 'render' where none is expected" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-30 01:13:18 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								        const  tr  =  { } ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-09-02 11:37:34 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        let  keyCount  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-30 01:13:18 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								        for  ( let  key  in  json )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-09-12 23:15:17 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            keyCount ++ ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-30 01:13:18 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								            tr [ key ]  =  json [ key ] ;  // I'm doing this wrong, I know
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2020-09-02 11:37:34 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        if ( keyCount  ==  0 ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            return  undefined ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2020-09-12 23:15:17 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        const  transl  =  new  Translation ( tr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  transl ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-30 01:13:18 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    public  static  SimpleTag ( json : string ) :  Tag  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-31 02:59:47 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        const  tag  =  Utils . SplitFirst ( json ,  "=" ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-30 01:13:18 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								        return  new  Tag ( tag [ 0 ] ,  tag [ 1 ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-09-09 18:42:13 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    public  static  Tag ( json : AndOrTagConfigJson  |  string ,  context : string  =  "" ) :  TagsFilter  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-09-02 11:37:34 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        if ( json  ===  undefined ) { 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-27 01:01:34 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            throw  ` Error while parsing a tag: 'json' is undefined in  ${ context } . Make sure all the tags are defined and at least one tag is present in a complex expression ` 
							 
						 
					
						
							
								
									
										
										
										
											2020-09-02 11:37:34 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-30 01:13:18 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								        if  ( typeof  ( json )  ==  "string" )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            const  tag  =  json  as  string ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            if  ( tag . indexOf ( "!~" )  >=  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-31 02:59:47 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                const  split  =  Utils . SplitFirst ( tag ,  "!~" ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                if  ( split [ 1 ]  ===  "*" )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-09-08 00:33:05 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    throw  ` Don't use 'key!~*' - use 'key=' instead (empty string as value (in the tag  ${ tag }  while parsing  ${ context } ) ` 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-30 01:13:18 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                return  new  RegexTag ( 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-31 02:59:47 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    split [ 0 ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    new  RegExp ( "^"  +  split [ 1 ]  +  "$" ) , 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-30 01:13:18 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								                    true 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            } 
							 
						 
					
						
							
								
									
										
										
										
											2020-09-08 00:33:05 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            if  ( tag . indexOf ( "~~" )  >=  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                const  split  =  Utils . SplitFirst ( tag ,  "~~" ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                if  ( split [ 1 ]  ===  "*" )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    split [ 1 ]  =  "..*" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                return  new  RegexTag ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                        new  RegExp ( "^"  +  split [ 0 ]  +  "$" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    new  RegExp ( "^"  +  split [ 1 ]  +  "$" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            } 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-30 01:13:18 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								            if  ( tag . indexOf ( "!=" )  >=  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-31 02:59:47 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                const  split  =  Utils . SplitFirst ( tag ,  "!=" ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                if  ( split [ 1 ]  ===  "*" )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-09-03 02:05:09 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    split [ 1 ]  =  "..*" 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-31 02:59:47 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                } 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-30 01:13:18 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								                return  new  RegexTag ( 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-31 02:59:47 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    split [ 0 ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    new  RegExp ( "^"  +  split [ 1 ]  +  "$" ) , 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-30 01:13:18 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								                    true 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            if  ( tag . indexOf ( "~" )  >=  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-31 02:59:47 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                const  split  =  Utils . SplitFirst ( tag ,  "~" ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                if  ( split [ 1 ]  ===  "*" )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-09-03 02:05:09 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    split [ 1 ]  =  "..*" 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-30 01:13:18 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                return  new  RegexTag ( 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-31 02:59:47 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								                    split [ 0 ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                    new  RegExp ( "^"  +  split [ 1 ]  +  "$" ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-30 01:13:18 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								                ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            } 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-31 02:59:47 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            const  split  =  Utils . SplitFirst ( tag ,  "=" ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-09-08 00:33:05 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            if ( split [ 1 ]  ==  "*" ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								                throw  ` Error while parsing tag ' ${ tag } ' in  ${ context } : detected a wildcard on a normal value. Use a regex pattern instead ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            } 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-30 01:13:18 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								            return  new  Tag ( split [ 0 ] ,  split [ 1 ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if  ( json . and  !==  undefined )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-09-08 00:33:05 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            return  new  And ( json . and . map ( t  = >  FromJSON . Tag ( t ,  context ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-30 01:13:18 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if  ( json . or  !==  undefined )  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-09-08 00:33:05 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            return  new  Or ( json . or . map ( t  = >  FromJSON . Tag ( t ,  context ) ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-30 01:13:18 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								}