2022-01-14 03:14:56 +01:00
import { LayoutConfigJson } from "../Json/LayoutConfigJson" ;
import { Utils } from "../../../Utils" ;
import LineRenderingConfigJson from "../Json/LineRenderingConfigJson" ;
import { LayerConfigJson } from "../Json/LayerConfigJson" ;
2022-04-06 03:06:50 +02:00
import { DesugaringStep , Each , Fuse , On } from "./Conversion" ;
2021-12-21 18:35:31 +01:00
export class UpdateLegacyLayer extends DesugaringStep < LayerConfigJson | string | { builtin , override } > {
constructor ( ) {
super ( "Updates various attributes from the old data format to the new to provide backwards compatibility with the formats" ,
2022-02-14 02:26:03 +01:00
[ "overpassTags" , "source.osmtags" , "tagRenderings[*].id" , "mapRendering" ] ,
"UpdateLegacyLayer" ) ;
2021-12-21 18:35:31 +01:00
}
2022-02-04 01:05:35 +01:00
convert ( json : LayerConfigJson , context : string ) : { result : LayerConfigJson ; errors : string [ ] ; warnings : string [ ] } {
2021-12-21 18:35:31 +01:00
const warnings = [ ]
2022-01-27 01:30:54 +01:00
if ( typeof json === "string" || json [ "builtin" ] !== undefined ) {
// Reuse of an already existing layer; return as-is
return { result : json , errors : [ ] , warnings : [ ] }
2021-12-21 18:35:31 +01:00
}
let config : any = { . . . json } ;
2021-10-29 01:41:37 +02:00
if ( config [ "overpassTags" ] ) {
config . source = config . source ? ? { }
config . source . osmTags = config [ "overpassTags" ]
delete config [ "overpassTags" ]
}
if ( config . tagRenderings !== undefined ) {
2022-01-17 21:33:03 +01:00
let i = 0 ;
2021-10-29 01:41:37 +02:00
for ( const tagRendering of config . tagRenderings ) {
2021-12-21 19:56:04 +01:00
i ++ ;
2022-01-27 01:30:54 +01:00
if ( typeof tagRendering === "string" || tagRendering [ "builtin" ] !== undefined || tagRendering [ "rewrite" ] !== undefined ) {
2021-12-21 19:56:04 +01:00
continue
}
2021-10-29 01:41:37 +02:00
if ( tagRendering [ "id" ] === undefined ) {
2021-11-04 22:31:14 +01:00
if ( tagRendering [ "#" ] !== undefined ) {
tagRendering [ "id" ] = tagRendering [ "#" ]
delete tagRendering [ "#" ]
} else if ( tagRendering [ "freeform" ] ? . key !== undefined ) {
2021-10-29 01:41:37 +02:00
tagRendering [ "id" ] = config . id + "-" + tagRendering [ "freeform" ] [ "key" ]
2022-01-17 21:33:03 +01:00
} else {
tagRendering [ "id" ] = "tr-" + i
2021-10-29 01:41:37 +02:00
}
}
}
}
2021-12-21 18:35:31 +01:00
2021-11-21 03:48:05 +01:00
if ( config . mapRendering === undefined ) {
2021-11-14 16:57:14 +01:00
config . mapRendering = [ ]
2021-10-29 01:41:37 +02:00
// This is a legacy format, lets create a pointRendering
let location : ( "point" | "centroid" ) [ ] = [ "point" ]
let wayHandling : number = config [ "wayHandling" ] ? ? 0
2021-11-11 17:35:24 +01:00
if ( wayHandling !== 0 ) {
2021-10-29 01:41:37 +02:00
location = [ "point" , "centroid" ]
}
2021-12-21 18:35:31 +01:00
if ( config [ "icon" ] ? ? config [ "label" ] !== undefined ) {
const pointConfig = {
icon : config [ "icon" ] ,
iconBadges : config [ "iconOverlays" ] ,
label : config [ "label" ] ,
iconSize : config [ "iconSize" ] ,
location ,
rotation : config [ "rotation" ]
}
config . mapRendering . push ( pointConfig )
}
2021-10-29 01:41:37 +02:00
if ( wayHandling !== 1 ) {
const lineRenderConfig = < LineRenderingConfigJson > {
color : config [ "color" ] ,
width : config [ "width" ] ,
dashArray : config [ "dashArray" ]
}
if ( Object . keys ( lineRenderConfig ) . length > 0 ) {
config . mapRendering . push ( lineRenderConfig )
}
}
2021-12-21 18:35:31 +01:00
if ( config . mapRendering . length === 0 ) {
throw "Could not convert the legacy theme into a new theme: no renderings defined for layer " + config . id
2021-11-14 16:57:14 +01:00
}
2021-10-29 01:41:37 +02:00
}
2021-12-21 18:35:31 +01:00
2021-11-07 21:20:05 +01:00
delete config [ "color" ]
delete config [ "width" ]
delete config [ "dashArray" ]
delete config [ "icon" ]
delete config [ "iconOverlays" ]
delete config [ "label" ]
delete config [ "iconSize" ]
delete config [ "rotation" ]
delete config [ "wayHandling" ]
2021-12-03 02:29:25 +01:00
delete config [ "hideUnderlayingFeaturesMinPercentage" ]
2021-12-21 18:35:31 +01:00
2021-10-29 01:41:37 +02:00
for ( const mapRenderingElement of config . mapRendering ) {
if ( mapRenderingElement [ "iconOverlays" ] !== undefined ) {
mapRenderingElement [ "iconBadges" ] = mapRenderingElement [ "iconOverlays" ]
}
for ( const overlay of mapRenderingElement [ "iconBadges" ] ? ? [ ] ) {
if ( overlay [ "badge" ] !== true ) {
2021-12-21 18:35:31 +01:00
warnings . push ( "Warning: non-overlay element for " , config . id )
2021-10-29 01:41:37 +02:00
}
delete overlay [ "badge" ]
}
}
2021-12-21 18:35:31 +01:00
return {
result : config ,
errors : [ ] ,
warnings
} ;
}
}
class UpdateLegacyTheme extends DesugaringStep < LayoutConfigJson > {
constructor ( ) {
2022-02-14 02:26:03 +01:00
super ( "Small fixes in the theme config" , [ "roamingRenderings" ] , "UpdateLegacyTheme" ) ;
2021-12-21 18:35:31 +01:00
}
2022-02-04 01:05:35 +01:00
convert ( json : LayoutConfigJson , context : string ) : { result : LayoutConfigJson ; errors : string [ ] ; warnings : string [ ] } {
2021-12-21 18:35:31 +01:00
const oldThemeConfig = { . . . json }
2022-02-19 17:40:51 +01:00
if ( oldThemeConfig . socialImage === "" ) {
delete oldThemeConfig . socialImage
}
2021-12-21 18:35:31 +01:00
if ( oldThemeConfig [ "roamingRenderings" ] !== undefined ) {
if ( oldThemeConfig [ "roamingRenderings" ] . length == 0 ) {
delete oldThemeConfig [ "roamingRenderings" ]
} else {
return {
result : null ,
errors : [ context + ": The theme contains roamingRenderings. These are not supported anymore" ] ,
warnings : [ ]
}
}
}
2022-01-24 16:43:50 +01:00
oldThemeConfig . layers = Utils . NoNull ( oldThemeConfig . layers )
2022-01-27 01:30:54 +01:00
delete oldThemeConfig [ "language" ]
2021-12-21 18:35:31 +01:00
return {
errors : [ ] ,
warnings : [ ] ,
result : oldThemeConfig
}
2021-10-29 01:41:37 +02:00
}
2021-12-21 18:35:31 +01:00
}
2021-10-29 01:41:37 +02:00
2021-12-21 18:35:31 +01:00
export class FixLegacyTheme extends Fuse < LayoutConfigJson > {
constructor ( ) {
super (
"Fixes a legacy theme to the modern JSON format geared to humans. Syntactic sugars are kept (i.e. no tagRenderings are expandend, no dependencies are automatically gathered)" ,
new UpdateLegacyTheme ( ) ,
2022-04-06 03:06:50 +02:00
new On ( "layers" , new Each ( new UpdateLegacyLayer ( ) ) )
2021-12-21 18:35:31 +01:00
) ;
}
}
2022-02-04 15:48:26 +01:00