2021-07-23 15:56:22 +02:00
import { Translation } from "../../UI/i18n/Translation" ;
2021-03-20 23:45:52 +01:00
import SourceConfig from "./SourceConfig" ;
2021-08-07 23:11:34 +02:00
import TagRenderingConfig from "./TagRenderingConfig" ;
2021-07-23 15:56:22 +02:00
import { TagsFilter } from "../../Logic/Tags/TagsFilter" ;
2021-08-07 23:11:34 +02:00
import PresetConfig from "./PresetConfig" ;
import { LayerConfigJson } from "./Json/LayerConfigJson" ;
import Translations from "../../UI/i18n/Translations" ;
import { TagUtils } from "../../Logic/Tags/TagUtils" ;
import SharedTagRenderings from "../../Customizations/SharedTagRenderings" ;
import { TagRenderingConfigJson } from "./Json/TagRenderingConfigJson" ;
import { Utils } from "../../Utils" ;
import { UIEventSource } from "../../Logic/UIEventSource" ;
2021-06-10 01:36:20 +02:00
import BaseUIElement from "../../UI/BaseUIElement" ;
2021-08-07 23:11:34 +02:00
import { FixedUiElement } from "../../UI/Base/FixedUiElement" ;
import Combine from "../../UI/Base/Combine" ;
import { VariableUiElement } from "../../UI/Base/VariableUIElement" ;
2021-07-22 11:29:09 +02:00
import FilterConfig from "./FilterConfig" ;
2021-08-07 23:11:34 +02:00
import { Unit } from "../Unit" ;
import DeleteConfig from "./DeleteConfig" ;
2021-09-06 01:35:08 +02:00
import Svg from "../../Svg" ;
2021-09-26 17:36:39 +02:00
import Img from "../../UI/Base/Img" ;
2021-10-14 03:46:09 +02:00
import MoveConfig from "./MoveConfig" ;
2021-04-10 23:53:13 +02:00
2020-10-27 01:01:34 +01:00
export default class LayerConfig {
2021-07-23 15:56:22 +02:00
static WAYHANDLING_DEFAULT = 0 ;
static WAYHANDLING_CENTER_ONLY = 1 ;
static WAYHANDLING_CENTER_AND_WAY = 2 ;
id : string ;
name : Translation ;
description : Translation ;
source : SourceConfig ;
calculatedTags : [ string , string ] [ ] ;
doNotDownload : boolean ;
passAllFeatures : boolean ;
isShown : TagRenderingConfig ;
minzoom : number ;
2021-07-27 19:39:57 +02:00
minzoomVisible : number ;
2021-08-07 21:19:01 +02:00
maxzoom : number ;
2021-07-23 15:56:22 +02:00
title? : TagRenderingConfig ;
titleIcons : TagRenderingConfig [ ] ;
icon : TagRenderingConfig ;
iconOverlays : { if : TagsFilter ; then : TagRenderingConfig ; badge : boolean } [ ] ;
iconSize : TagRenderingConfig ;
label : TagRenderingConfig ;
rotation : TagRenderingConfig ;
color : TagRenderingConfig ;
width : TagRenderingConfig ;
dashArray : TagRenderingConfig ;
wayHandling : number ;
public readonly units : Unit [ ] ;
public readonly deletion : DeleteConfig | null ;
2021-10-14 03:46:09 +02:00
public readonly allowMove : MoveConfig | null
2021-07-15 20:47:28 +02:00
public readonly allowSplit : boolean
2021-07-23 15:56:22 +02:00
2021-08-07 21:19:01 +02:00
presets : PresetConfig [ ] ;
2020-11-17 02:22:48 +01:00
2021-07-23 15:56:22 +02:00
tagRenderings : TagRenderingConfig [ ] ;
filters : FilterConfig [ ] ;
2021-07-22 11:29:09 +02:00
2021-07-23 15:56:22 +02:00
constructor (
json : LayerConfigJson ,
context? : string ,
official : boolean = true
) {
2021-09-13 01:21:47 +02:00
2021-07-23 15:56:22 +02:00
context = context + "." + json . id ;
const self = this ;
this . id = json . id ;
2021-07-15 20:47:28 +02:00
this . allowSplit = json . allowSplit ? ? false ;
2021-07-23 15:56:22 +02:00
this . name = Translations . T ( json . name , context + ".name" ) ;
2021-10-14 03:46:09 +02:00
this . units = ( json . units ? ? [ ] ) . map ( ( ( unitJson , i ) = > Unit . fromJson ( unitJson , ` ${ context } .unit[ ${ i } ] ` ) ) )
2021-07-23 15:56:22 +02:00
if ( json . description !== undefined ) {
if ( Object . keys ( json . description ) . length === 0 ) {
json . description = undefined ;
}
}
2021-03-20 23:45:52 +01:00
2021-07-23 15:56:22 +02:00
this . description = Translations . T (
json . description ,
context + ".description"
2021-07-22 11:29:09 +02:00
) ;
2021-03-20 23:45:52 +01:00
2021-07-23 15:56:22 +02:00
let legacy = undefined ;
if ( json [ "overpassTags" ] !== undefined ) {
// @ts-ignore
2021-08-07 23:11:34 +02:00
legacy = TagUtils . Tag ( json [ "overpassTags" ] , context + ".overpasstags" ) ;
2021-03-20 23:45:52 +01:00
}
2021-07-23 15:56:22 +02:00
if ( json . source !== undefined ) {
if ( legacy !== undefined ) {
throw (
context +
"Both the legacy 'layer.overpasstags' and the new 'layer.source'-field are defined"
) ;
}
let osmTags : TagsFilter = legacy ;
if ( json . source [ "osmTags" ] ) {
2021-08-07 23:11:34 +02:00
osmTags = TagUtils . Tag (
2021-07-23 15:56:22 +02:00
json . source [ "osmTags" ] ,
context + "source.osmTags"
) ;
}
if ( json . source [ "geoJsonSource" ] !== undefined ) {
throw context + "Use 'geoJson' instead of 'geoJsonSource'" ;
}
2021-09-18 02:32:40 +02:00
if ( json . source [ "geojson" ] !== undefined ) {
throw context + "Use 'geoJson' instead of 'geojson' (the J is a capital letter)" ;
}
2021-07-23 15:56:22 +02:00
this . source = new SourceConfig (
{
osmTags : osmTags ,
geojsonSource : json.source [ "geoJson" ] ,
geojsonSourceLevel : json.source [ "geoJsonZoomLevel" ] ,
overpassScript : json.source [ "overpassScript" ] ,
isOsmCache : json.source [ "isOsmCache" ] ,
} ,
this . id
) ;
} else {
this . source = new SourceConfig ( {
osmTags : legacy ,
} ) ;
2021-03-24 01:25:57 +01:00
}
2021-07-23 15:56:22 +02:00
this . calculatedTags = undefined ;
if ( json . calculatedTags !== undefined ) {
if ( ! official ) {
console . warn (
` Unofficial theme ${ this . id } with custom javascript! This is a security risk `
) ;
2021-01-08 03:57:18 +01:00
}
2021-07-23 15:56:22 +02:00
this . calculatedTags = [ ] ;
for ( const kv of json . calculatedTags ) {
const index = kv . indexOf ( "=" ) ;
const key = kv . substring ( 0 , index ) ;
const code = kv . substring ( index + 1 ) ;
2021-01-08 03:57:18 +01:00
2021-10-14 03:46:09 +02:00
try {
new Function ( "feat" , "return " + code + ";" ) ;
} catch ( e ) {
throw ` Invalid function definition: code ${ code } is invalid: ${ e } (at ${ context } ) `
2021-09-18 02:32:40 +02:00
}
2021-07-23 15:56:22 +02:00
this . calculatedTags . push ( [ key , code ] ) ;
2020-10-27 01:01:34 +01:00
}
2021-07-23 15:56:22 +02:00
}
2021-01-08 03:57:18 +01:00
2021-07-23 15:56:22 +02:00
this . doNotDownload = json . doNotDownload ? ? false ;
this . passAllFeatures = json . passAllFeatures ? ? false ;
this . minzoom = json . minzoom ? ? 0 ;
2021-07-27 19:39:57 +02:00
this . minzoomVisible = json . minzoomVisible ? ? this . minzoom ;
2021-07-23 15:56:22 +02:00
this . wayHandling = json . wayHandling ? ? 0 ;
2021-10-14 03:46:09 +02:00
if ( json . presets !== undefined && json . presets ? . map === undefined ) {
throw "Presets should be a list of items (at " + context + ")"
2021-09-22 20:44:53 +02:00
}
2021-07-14 00:17:15 +02:00
this . presets = ( json . presets ? ? [ ] ) . map ( ( pr , i ) = > {
2021-08-07 23:11:34 +02:00
2021-08-07 21:19:01 +02:00
let preciseInput = undefined ;
2021-08-07 23:11:34 +02:00
if ( pr . preciseInput !== undefined ) {
2021-08-07 21:19:01 +02:00
if ( pr . preciseInput === true ) {
pr . preciseInput = {
preferredBackground : undefined
}
}
let snapToLayers : string [ ] ;
if ( typeof pr . preciseInput . snapToLayer === "string" ) {
snapToLayers = [ pr . preciseInput . snapToLayer ]
} else {
snapToLayers = pr . preciseInput . snapToLayer
}
2021-08-07 23:11:34 +02:00
let preferredBackground : string [ ]
2021-08-07 21:19:01 +02:00
if ( typeof pr . preciseInput . preferredBackground === "string" ) {
preferredBackground = [ pr . preciseInput . preferredBackground ]
} else {
preferredBackground = pr . preciseInput . preferredBackground
}
preciseInput = {
preferredBackground : preferredBackground ,
snapToLayers : snapToLayers ,
maxSnapDistance : pr.preciseInput.maxSnapDistance ? ? 10
2021-07-14 00:17:15 +02:00
}
}
2021-08-07 23:11:34 +02:00
const config : PresetConfig = {
2021-03-13 19:08:31 +01:00
title : Translations.T ( pr . title , ` ${ context } .presets[ ${ i } ].title ` ) ,
2021-08-07 23:11:34 +02:00
tags : pr.tags.map ( ( t ) = > TagUtils . SimpleTag ( t ) ) ,
2021-07-14 00:17:15 +02:00
description : Translations.T ( pr . description , ` ${ context } .presets[ ${ i } ].description ` ) ,
2021-08-07 21:19:01 +02:00
preciseInput : preciseInput ,
2021-07-24 02:32:33 +02:00
}
2021-08-07 21:19:01 +02:00
return config ;
2021-07-24 02:32:33 +02:00
} ) ;
2021-07-23 15:56:22 +02:00
/ * * 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
* * /
function tr ( key : string , deflt ) {
const v = json [ key ] ;
if ( v === undefined || v === null ) {
if ( deflt === undefined ) {
return undefined ;
}
return new TagRenderingConfig (
deflt ,
self . source . osmTags ,
` ${ context } . ${ key } .default value `
) ;
}
if ( typeof v === "string" ) {
const shared = SharedTagRenderings . SharedTagRendering . get ( v ) ;
if ( shared ) {
return shared ;
}
}
return new TagRenderingConfig (
v ,
self . source . osmTags ,
` ${ context } . ${ key } `
2021-07-22 11:29:09 +02:00
) ;
2021-07-23 15:56:22 +02:00
}
2020-11-24 12:52:01 +01:00
2021-07-23 15:56:22 +02:00
/ * *
* Converts a list of tagRenderingCOnfigJSON in to TagRenderingConfig
* A string is interpreted as a name to call
* /
function trs (
2021-09-09 20:26:12 +02:00
tagRenderings ? : ( string | { builtin : string , override : any } | TagRenderingConfigJson ) [ ] ,
2021-07-23 15:56:22 +02:00
readOnly = false
) {
if ( tagRenderings === undefined ) {
return [ ] ;
2020-12-06 00:20:27 +01:00
}
2020-10-27 01:01:34 +01:00
2021-07-23 15:56:22 +02:00
return Utils . NoNull (
tagRenderings . map ( ( renderingJson , i ) = > {
if ( typeof renderingJson === "string" ) {
2021-09-09 20:26:12 +02:00
renderingJson = { builtin : renderingJson , override : undefined }
}
if ( renderingJson [ "builtin" ] !== undefined ) {
const renderingId = renderingJson [ "builtin" ]
if ( renderingId === "questions" ) {
2021-07-23 15:56:22 +02:00
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-15 00:52:31 +02:00
return new TagRenderingConfig ( "questions" , undefined , context ) ;
2021-07-23 15:56:22 +02:00
}
2021-09-09 20:26:12 +02:00
if ( renderingJson [ "override" ] !== undefined ) {
const sharedJson = SharedTagRenderings . SharedTagRenderingJson . get ( renderingId )
return new TagRenderingConfig (
Utils . Merge ( renderingJson [ "override" ] , sharedJson ) ,
self . source . osmTags ,
` ${ context } .tagrendering[ ${ i } ]+override `
) ;
2021-07-23 15:56:22 +02:00
}
2021-09-09 20:26:12 +02:00
const shared = SharedTagRenderings . SharedTagRendering . get ( renderingId ) ;
2021-07-23 15:56:22 +02:00
2021-09-09 20:26:12 +02:00
if ( shared !== undefined ) {
return shared ;
}
2021-07-23 15:56:22 +02:00
if ( Utils . runningFromConsole ) {
return undefined ;
}
2021-09-09 20:26:12 +02:00
const keys = Array . from (
SharedTagRenderings . SharedTagRendering . keys ( )
) ;
throw ` Predefined tagRendering ${ renderingId } not found in ${ context } . \ n Try one of ${ keys . join (
2021-07-23 15:56:22 +02:00
", "
) } \ n If you intent to output this text literally , use { \ "render\": <your text>} instead" } ` ;
}
2021-09-09 20:26:12 +02:00
2021-07-23 15:56:22 +02:00
return new TagRenderingConfig (
2021-09-09 20:26:12 +02:00
< TagRenderingConfigJson > renderingJson ,
2021-07-23 15:56:22 +02:00
self . source . osmTags ,
` ${ context } .tagrendering[ ${ i } ] `
) ;
} )
) ;
}
2020-11-16 01:59:30 +01:00
2021-07-23 15:56:22 +02:00
this . tagRenderings = trs ( json . tagRenderings , false ) ;
2021-10-14 03:46:09 +02:00
const missingIds = json . tagRenderings ? . filter ( tr = > typeof tr !== "string" && tr [ "builtin" ] === undefined && tr [ "id" ] === undefined ) ? ? [ ] ;
if ( missingIds . length > 0 && official ) {
console . error ( "Some tagRenderings of" , this . id , "are missing an id:" , missingIds )
throw "Missing ids in tagrenderings"
}
2021-07-23 15:56:22 +02:00
this . filters = ( json . filter ? ? [ ] ) . map ( ( option , i ) = > {
return new FilterConfig ( option , ` ${ context } .filter-[ ${ i } ] ` )
} ) ;
2021-10-14 03:46:09 +02:00
if ( json [ "filters" ] !== undefined ) {
throw "Error in " + context + ": use 'filter' instead of 'filters'"
}
2021-07-23 15:56:22 +02:00
const titleIcons = [ ] ;
const defaultIcons = [
"phonelink" ,
"emaillink" ,
"wikipedialink" ,
"osmlink" ,
"sharelink" ,
] ;
for ( const icon of json . titleIcons ? ? defaultIcons ) {
if ( icon === "defaults" ) {
titleIcons . push ( . . . defaultIcons ) ;
} else {
titleIcons . push ( icon ) ;
}
}
2020-11-16 01:59:30 +01:00
2021-07-23 15:56:22 +02:00
this . titleIcons = trs ( titleIcons , true ) ;
2021-03-15 16:23:04 +01:00
2021-07-23 15:56:22 +02:00
this . title = tr ( "title" , undefined ) ;
this . icon = tr ( "icon" , "" ) ;
this . iconOverlays = ( json . iconOverlays ? ? [ ] ) . map ( ( overlay , i ) = > {
let tr = new TagRenderingConfig (
overlay . then ,
self . source . osmTags ,
` iconoverlays. ${ i } `
) ;
if (
typeof overlay . then === "string" &&
SharedTagRenderings . SharedIcons . get ( overlay . then ) !== undefined
) {
tr = SharedTagRenderings . SharedIcons . get ( overlay . then ) ;
}
return {
2021-08-07 23:11:34 +02:00
if : TagUtils . Tag ( overlay . if ) ,
2021-07-23 15:56:22 +02:00
then : tr ,
badge : overlay.badge ? ? false ,
} ;
} ) ;
const iconPath = this . icon . GetRenderValue ( { id : "node/-1" } ) . txt ;
if ( iconPath . startsWith ( Utils . assets_path ) ) {
const iconKey = iconPath . substr ( Utils . assets_path . length ) ;
if ( Svg . All [ iconKey ] === undefined ) {
throw "Builtin SVG asset not found: " + iconPath ;
}
}
this . isShown = tr ( "isShown" , "yes" ) ;
this . iconSize = tr ( "iconSize" , "40,40,center" ) ;
this . label = tr ( "label" , "" ) ;
this . color = tr ( "color" , "#0000ff" ) ;
this . width = tr ( "width" , "7" ) ;
this . rotation = tr ( "rotation" , "0" ) ;
this . dashArray = tr ( "dashArray" , "" ) ;
this . deletion = null ;
if ( json . deletion === true ) {
json . deletion = { } ;
}
if ( json . deletion !== undefined && json . deletion !== false ) {
this . deletion = new DeleteConfig ( json . deletion , ` ${ context } .deletion ` ) ;
}
2021-03-15 16:23:04 +01:00
2021-10-14 03:46:09 +02:00
this . allowMove = null
if ( json . allowMove === false ) {
this . allowMove = null ;
} else if ( json . allowMove === true ) {
this . allowMove = new MoveConfig ( { } , context + ".allowMove" )
} else if ( json . allowMove !== undefined && json . allowMove !== false ) {
this . allowMove = new MoveConfig ( json . allowMove , context + ".allowMove" )
}
2021-07-23 15:56:22 +02:00
if ( json [ "showIf" ] !== undefined ) {
throw (
"Invalid key on layerconfig " +
this . id +
": showIf. Did you mean 'isShown' instead?"
) ;
}
2021-01-08 03:57:18 +01:00
}
2021-07-23 15:56:22 +02:00
public CustomCodeSnippets ( ) : string [ ] {
if ( this . calculatedTags === undefined ) {
return [ ] ;
}
2021-01-08 03:57:18 +01:00
2021-07-23 15:56:22 +02:00
return this . calculatedTags . map ( ( code ) = > code [ 1 ] ) ;
2021-07-22 11:29:09 +02:00
}
2021-01-08 03:57:18 +01:00
2021-07-23 15:56:22 +02:00
public AddRoamingRenderings ( addAll : {
tagRenderings : TagRenderingConfig [ ] ;
titleIcons : TagRenderingConfig [ ] ;
iconOverlays : {
if : TagsFilter ;
then : TagRenderingConfig ;
badge : boolean ;
} [ ] ;
} ) : LayerConfig {
let insertionPoint = this . tagRenderings
. map ( ( tr ) = > tr . IsQuestionBoxElement ( ) )
. indexOf ( true ) ;
if ( insertionPoint < 0 ) {
// No 'questions' defined - we just add them all to the end
insertionPoint = this . tagRenderings . length ;
}
this . tagRenderings . splice ( insertionPoint , 0 , . . . addAll . tagRenderings ) ;
2021-01-08 03:57:18 +01:00
2021-07-23 15:56:22 +02:00
this . iconOverlays . push ( . . . addAll . iconOverlays ) ;
for ( const icon of addAll . titleIcons ) {
this . titleIcons . splice ( 0 , 0 , icon ) ;
}
return this ;
2021-07-22 11:29:09 +02:00
}
2021-01-08 03:57:18 +01:00
2021-07-23 15:56:22 +02:00
public GetRoamingRenderings ( ) : {
tagRenderings : TagRenderingConfig [ ] ;
titleIcons : TagRenderingConfig [ ] ;
iconOverlays : {
if : TagsFilter ;
then : TagRenderingConfig ;
badge : boolean ;
} [ ] ;
} {
const tagRenderings = this . tagRenderings . filter ( ( tr ) = > tr . roaming ) ;
const titleIcons = this . titleIcons . filter ( ( tr ) = > tr . roaming ) ;
const iconOverlays = this . iconOverlays . filter ( ( io ) = > io . then . roaming ) ;
return {
tagRenderings : tagRenderings ,
titleIcons : titleIcons ,
iconOverlays : iconOverlays ,
} ;
2021-01-08 03:57:18 +01:00
}
2021-07-23 15:56:22 +02:00
public GenerateLeafletStyle (
tags : UIEventSource < any > ,
2021-07-27 22:23:42 +02:00
clickable : boolean
2021-07-23 15:56:22 +02:00
) : {
icon : {
html : BaseUIElement ;
iconSize : [ number , number ] ;
iconAnchor : [ number , number ] ;
popupAnchor : [ number , number ] ;
iconUrl : string ;
className : string ;
} ;
color : string ;
weight : number ;
dashArray : number [ ] ;
} {
function num ( str , deflt = 40 ) {
const n = Number ( str ) ;
if ( isNaN ( n ) ) {
return deflt ;
}
return n ;
}
2020-11-16 01:59:30 +01:00
2021-07-23 15:56:22 +02:00
function rendernum ( tr : TagRenderingConfig , deflt : number ) {
const str = Number ( render ( tr , "" + deflt ) ) ;
const n = Number ( str ) ;
if ( isNaN ( n ) ) {
return deflt ;
}
return n ;
}
2020-11-17 02:22:48 +01:00
2021-07-23 15:56:22 +02:00
function render ( tr : TagRenderingConfig , deflt? : string ) {
2021-08-07 23:11:34 +02:00
if ( tags === undefined ) {
2021-08-07 21:19:01 +02:00
return deflt
}
2021-07-23 15:56:22 +02:00
const str = tr ? . GetRenderValue ( tags . data ) ? . txt ? ? deflt ;
return Utils . SubstituteKeys ( str , tags . data ) . replace ( /{.*}/g , "" ) ;
}
2020-11-17 02:22:48 +01:00
2021-07-23 15:56:22 +02:00
const iconSize = render ( this . iconSize , "40,40,center" ) . split ( "," ) ;
2021-08-07 21:19:01 +02:00
const dashArray = render ( this . dashArray ) ? . split ( " " ) ? . map ( Number ) ;
2021-07-23 15:56:22 +02:00
let color = render ( this . color , "#00f" ) ;
2020-11-17 02:22:48 +01:00
2021-07-23 15:56:22 +02:00
if ( color . startsWith ( "--" ) ) {
color = getComputedStyle ( document . body ) . getPropertyValue (
"--catch-detail-color"
) ;
}
2020-11-17 02:22:48 +01:00
2021-07-23 15:56:22 +02:00
const weight = rendernum ( this . width , 5 ) ;
2020-11-17 02:22:48 +01:00
2021-07-23 15:56:22 +02:00
const iconW = num ( iconSize [ 0 ] ) ;
let iconH = num ( iconSize [ 1 ] ) ;
const mode = iconSize [ 2 ] ? . trim ( ) ? . toLowerCase ( ) ? ? "center" ;
2020-11-16 01:59:30 +01:00
2021-07-23 15:56:22 +02:00
let anchorW = iconW / 2 ;
let anchorH = iconH / 2 ;
if ( mode === "left" ) {
anchorW = 0 ;
2020-11-16 01:59:30 +01:00
}
2021-07-23 15:56:22 +02:00
if ( mode === "right" ) {
anchorW = iconW ;
2020-11-16 01:59:30 +01:00
}
2021-07-23 15:56:22 +02:00
if ( mode === "top" ) {
anchorH = 0 ;
}
if ( mode === "bottom" ) {
anchorH = iconH ;
2020-11-16 01:59:30 +01:00
}
2021-07-22 11:29:09 +02:00
2021-07-23 15:56:22 +02:00
const iconUrlStatic = render ( this . icon ) ;
const self = this ;
2021-08-07 21:19:01 +02:00
2021-09-26 17:36:39 +02:00
function genHtmlFromString ( sourcePart : string , rotation : string ) : BaseUIElement {
const style = ` width:100%;height:100%;transform: rotate( ${ rotation } );display:block;position: absolute; top: 0; left: 0 ` ;
2021-08-07 21:19:01 +02:00
let html : BaseUIElement = new FixedUiElement (
` <img src=" ${ sourcePart } " style=" ${ style } " /> `
) ;
const match = sourcePart . match ( /([a-zA-Z0-9_]*):([^;]*)/ ) ;
if ( match !== null && Svg . All [ match [ 1 ] + ".svg" ] !== undefined ) {
2021-09-26 17:36:39 +02:00
html = new Img (
2021-08-07 21:19:01 +02:00
( Svg . All [ match [ 1 ] + ".svg" ] as string ) . replace (
/#000000/g ,
match [ 2 ]
) ,
2021-09-26 17:36:39 +02:00
true
) . SetStyle ( style ) ;
2021-07-23 15:56:22 +02:00
}
2021-08-07 21:19:01 +02:00
return html ;
}
2021-07-23 15:56:22 +02:00
2021-08-07 21:19:01 +02:00
const mappedHtml = tags ? . map ( ( tgs ) = > {
2021-07-23 15:56:22 +02:00
// What do you mean, 'tgs' is never read?
// It is read implicitly in the 'render' method
const iconUrl = render ( self . icon ) ;
const rotation = render ( self . rotation , "0deg" ) ;
let htmlParts : BaseUIElement [ ] = [ ] ;
let sourceParts = Utils . NoNull (
iconUrl . split ( ";" ) . filter ( ( prt ) = > prt != "" )
) ;
for ( const sourcePart of sourceParts ) {
2021-08-07 21:19:01 +02:00
htmlParts . push ( genHtmlFromString ( sourcePart , rotation ) ) ;
2021-07-23 15:56:22 +02:00
}
let badges = [ ] ;
for ( const iconOverlay of self . iconOverlays ) {
if ( ! iconOverlay . if . matchesProperties ( tgs ) ) {
continue ;
}
if ( iconOverlay . badge ) {
const badgeParts : BaseUIElement [ ] = [ ] ;
2021-10-15 15:20:08 +02:00
const renderValue = iconOverlay
. then
2021-07-23 15:56:22 +02:00
. GetRenderValue ( tgs )
2021-10-15 15:20:08 +02:00
if ( renderValue === undefined ) {
continue ;
}
const partDefs = renderValue . txt . split ( ";" )
2021-07-23 15:56:22 +02:00
. filter ( ( prt ) = > prt != "" ) ;
for ( const badgePartStr of partDefs ) {
2021-09-26 17:36:39 +02:00
badgeParts . push ( genHtmlFromString ( badgePartStr , "0" ) ) ;
2021-07-23 15:56:22 +02:00
}
const badgeCompound = new Combine ( badgeParts ) . SetStyle (
"display:flex;position:relative;width:100%;height:100%;"
) ;
badges . push ( badgeCompound ) ;
} else {
htmlParts . push (
2021-08-07 21:19:01 +02:00
genHtmlFromString ( iconOverlay . then . GetRenderValue ( tgs ) . txt , "0" )
2021-07-23 15:56:22 +02:00
) ;
}
}
if ( badges . length > 0 ) {
const badgesComponent = new Combine ( badges ) . SetStyle (
"display:flex;height:50%;width:100%;position:absolute;top:50%;left:50%;"
) ;
htmlParts . push ( badgesComponent ) ;
}
if ( sourceParts . length == 0 ) {
iconH = 0 ;
}
try {
const label = self . label
? . GetRenderValue ( tgs )
? . Subs ( tgs )
? . SetClass ( "block text-center" )
? . SetStyle ( "margin-top: " + ( iconH + 2 ) + "px" ) ;
if ( label !== undefined ) {
htmlParts . push (
new Combine ( [ label ] ) . SetClass ( "flex flex-col items-center" )
) ;
}
} catch ( e ) {
console . error ( e , tgs ) ;
}
return new Combine ( htmlParts ) ;
} ) ;
return {
icon : {
2021-08-07 21:19:01 +02:00
html : mappedHtml === undefined ? new FixedUiElement ( self . icon . render . txt ) : new VariableUiElement ( mappedHtml ) ,
2021-07-23 15:56:22 +02:00
iconSize : [ iconW , iconH ] ,
iconAnchor : [ anchorW , anchorH ] ,
popupAnchor : [ 0 , 3 - anchorH ] ,
iconUrl : iconUrlStatic ,
className : clickable
? "leaflet-div-icon"
: "leaflet-div-icon unclickable" ,
} ,
color : color ,
weight : weight ,
dashArray : dashArray ,
} ;
}
public ExtractImages ( ) : Set < string > {
const parts : Set < string > [ ] = [ ] ;
parts . push ( . . . this . tagRenderings ? . map ( ( tr ) = > tr . ExtractImages ( false ) ) ) ;
parts . push ( . . . this . titleIcons ? . map ( ( tr ) = > tr . ExtractImages ( true ) ) ) ;
parts . push ( this . icon ? . ExtractImages ( true ) ) ;
parts . push (
. . . this . iconOverlays ? . map ( ( overlay ) = > overlay . then . ExtractImages ( true ) )
2021-07-22 11:29:09 +02:00
) ;
2021-07-23 15:56:22 +02:00
for ( const preset of this . presets ) {
parts . push ( new Set < string > ( preset . description ? . ExtractImages ( false ) ) ) ;
2020-11-16 01:59:30 +01:00
}
2021-07-23 15:56:22 +02:00
const allIcons = new Set < string > ( ) ;
for ( const part of parts ) {
part ? . forEach ( allIcons . add , allIcons ) ;
}
2021-04-09 02:57:06 +02:00
2021-07-23 15:56:22 +02:00
return allIcons ;
}
2021-08-07 23:11:34 +02:00
}