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-08-30 01:13:18 +02:00
import Translation from "../../UI/i18n/Translation" ;
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
}
}
}