2021-10-19 02:31:32 +02:00
import TagRenderingConfig from "./TagRenderingConfig" ;
import SharedTagRenderings from "../../Customizations/SharedTagRenderings" ;
import { TagRenderingConfigJson } from "./Json/TagRenderingConfigJson" ;
import { Utils } from "../../Utils" ;
export default class WithContextLoader {
private readonly _json : any ;
private readonly _context : string ;
constructor ( json : any , context : string ) {
this . _json = json ;
this . _context = context ;
}
/ * * G i v e n a k e y , g e t s t h e c o r r e s p o n d i n g p r o p e r t y f r o m t h e j s o n ( o r t h e d e f a u l t i f n o t f o u n d
*
* The found value is interpreted as a tagrendering and fetched / parsed
* * /
public tr ( key : string , deflt ) {
const v = this . _json [ key ] ;
if ( v === undefined || v === null ) {
if ( deflt === undefined ) {
return undefined ;
}
return new TagRenderingConfig (
deflt ,
` ${ this . _context } . ${ key } .default value `
) ;
}
if ( typeof v === "string" ) {
const shared = SharedTagRenderings . SharedTagRendering . get ( v ) ;
if ( shared ) {
return shared ;
}
}
return new TagRenderingConfig (
v ,
` ${ this . _context } . ${ key } `
) ;
}
/ * *
* Converts a list of tagRenderingCOnfigJSON in to TagRenderingConfig
* A string is interpreted as a name to call
* /
public trs (
tagRenderings ? : ( string | { builtin : string , override : any } | TagRenderingConfigJson ) [ ] ,
readOnly = false
) {
if ( tagRenderings === undefined ) {
return [ ] ;
}
const context = this . _context
const renderings : TagRenderingConfig [ ] = [ ]
for ( let i = 0 ; i < tagRenderings . length ; i ++ ) {
let renderingJson = tagRenderings [ i ]
if ( typeof renderingJson === "string" ) {
renderingJson = { builtin : renderingJson , override : undefined }
}
if ( renderingJson [ "builtin" ] !== undefined ) {
const renderingId = renderingJson [ "builtin" ]
if ( renderingId === "questions" ) {
if ( readOnly ) {
throw ` A tagrendering has a question, but asking a question does not make sense here: is it a title icon or a geojson-layer? ${ context } . The offending tagrendering is ${ JSON . stringify (
renderingJson
) } ` ;
}
2021-10-19 03:00:57 +02:00
const tr = new TagRenderingConfig ( "questions" , context ) ;
2021-10-19 02:31:32 +02:00
renderings . push ( tr )
continue ;
}
if ( renderingJson [ "override" ] !== undefined ) {
const sharedJson = SharedTagRenderings . SharedTagRenderingJson . get ( renderingId )
const tr = new TagRenderingConfig (
Utils . Merge ( renderingJson [ "override" ] , sharedJson ) ,
` ${ context } .tagrendering[ ${ i } ]+override `
) ;
renderings . push ( tr )
continue
}
const shared = SharedTagRenderings . SharedTagRendering . get ( renderingId ) ;
if ( shared !== undefined ) {
renderings . push ( shared )
continue
}
if ( Utils . runningFromConsole ) {
continue
}
const keys = Array . from ( SharedTagRenderings . SharedTagRendering . keys ( ) ) ;
throw ` Predefined tagRendering ${ renderingId } not found in ${ context } . \ n Try one of ${ keys . join (
", "
) } \ n If you intent to output this text literally , use { \ "render\": <your text>} instead" } ` ;
}
const tr = new TagRenderingConfig (
< TagRenderingConfigJson > renderingJson ,
` ${ context } .tagrendering[ ${ i } ] `
) ;
renderings . push ( tr )
}
return renderings ;
}
}