forked from MapComplete/MapComplete
Rewrite left-right tags when updating them on click
This commit is contained in:
parent
45e8ee310b
commit
40c4ae769d
2 changed files with 95 additions and 73 deletions
|
@ -6,6 +6,8 @@ import {ElementStorage} from "../ElementStorage";
|
|||
import {Changes} from "../Osm/Changes";
|
||||
import {OsmObject} from "../Osm/OsmObject";
|
||||
import {OsmConnection} from "../Osm/OsmConnection";
|
||||
import LayoutConfig from "../../Models/ThemeConfig/LayoutConfig";
|
||||
import SimpleMetaTagger from "../SimpleMetaTagger";
|
||||
|
||||
export default class SelectedElementTagsUpdater {
|
||||
|
||||
|
@ -14,13 +16,14 @@ export default class SelectedElementTagsUpdater {
|
|||
"changeset",
|
||||
"user",
|
||||
"uid",
|
||||
"id"] )
|
||||
"id"])
|
||||
|
||||
constructor(state: {
|
||||
selectedElement: UIEventSource<any>,
|
||||
allElements: ElementStorage,
|
||||
changes: Changes,
|
||||
osmConnection: OsmConnection
|
||||
osmConnection: OsmConnection,
|
||||
layoutToUse: LayoutConfig
|
||||
}) {
|
||||
|
||||
|
||||
|
@ -37,7 +40,8 @@ export default class SelectedElementTagsUpdater {
|
|||
selectedElement: UIEventSource<any>,
|
||||
allElements: ElementStorage,
|
||||
changes: Changes,
|
||||
osmConnection: OsmConnection
|
||||
osmConnection: OsmConnection,
|
||||
layoutToUse: LayoutConfig
|
||||
}) {
|
||||
|
||||
|
||||
|
@ -70,11 +74,18 @@ export default class SelectedElementTagsUpdater {
|
|||
selectedElement: UIEventSource<any>,
|
||||
allElements: ElementStorage,
|
||||
changes: Changes,
|
||||
osmConnection: OsmConnection
|
||||
osmConnection: OsmConnection,
|
||||
layoutToUse: LayoutConfig
|
||||
}, latestTags: any, id: string
|
||||
) {
|
||||
try {
|
||||
|
||||
const leftRightSensitive = state.layoutToUse.layers.some(layer => layer.lineRendering.some(lr => lr.leftRightSensitive))
|
||||
|
||||
if (leftRightSensitive) {
|
||||
SimpleMetaTagger.removeBothTagging(latestTags)
|
||||
}
|
||||
|
||||
const pendingChanges = state.changes.pendingChanges.data
|
||||
.filter(change => change.type + "/" + change.id === id)
|
||||
.filter(change => change.tags !== undefined);
|
||||
|
@ -92,6 +103,7 @@ export default class SelectedElementTagsUpdater {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
// With the changes applied, we merge them onto the upstream object
|
||||
let somethingChanged = false;
|
||||
const currentTagsSource = state.allElements.getEventSourceById(id);
|
||||
|
@ -115,7 +127,7 @@ export default class SelectedElementTagsUpdater {
|
|||
if (currentKey.startsWith("_")) {
|
||||
continue
|
||||
}
|
||||
if(this.metatags.has(currentKey)){
|
||||
if (this.metatags.has(currentKey)) {
|
||||
continue
|
||||
}
|
||||
if (currentKey in latestTags) {
|
||||
|
|
|
@ -78,6 +78,83 @@ export default class SimpleMetaTagger {
|
|||
return true;
|
||||
}
|
||||
)
|
||||
|
||||
/**
|
||||
* Edits the given object to rewrite 'both'-tagging into a 'left-right' tagging scheme.
|
||||
* These changes are performed in-place.
|
||||
*
|
||||
* Returns 'true' is at least one change has been made
|
||||
* @param tags
|
||||
*/
|
||||
public static removeBothTagging(tags: any): boolean{
|
||||
let somethingChanged = false
|
||||
/**
|
||||
* Sets the key onto the properties (but doesn't overwrite if already existing)
|
||||
*/
|
||||
function set(k, value) {
|
||||
if (tags[k] === undefined || tags[k] === "") {
|
||||
tags[k] = value
|
||||
somethingChanged = true
|
||||
}
|
||||
}
|
||||
|
||||
if (tags["sidewalk"]) {
|
||||
|
||||
const v = tags["sidewalk"]
|
||||
switch (v) {
|
||||
case "none":
|
||||
case "no":
|
||||
set("sidewalk:left", "no");
|
||||
set("sidewalk:right", "no");
|
||||
break
|
||||
case "both":
|
||||
set("sidewalk:left", "yes");
|
||||
set("sidewalk:right", "yes");
|
||||
break;
|
||||
case "left":
|
||||
set("sidewalk:left", "yes");
|
||||
set("sidewalk:right", "no");
|
||||
break;
|
||||
case "right":
|
||||
set("sidewalk:left", "no");
|
||||
set("sidewalk:right", "yes");
|
||||
break;
|
||||
default:
|
||||
set("sidewalk:left", v);
|
||||
set("sidewalk:right", v);
|
||||
break;
|
||||
}
|
||||
delete tags["sidewalk"]
|
||||
somethingChanged = true
|
||||
}
|
||||
|
||||
|
||||
const regex = /\([^:]*\):both:\(.*\)/
|
||||
for (const key in tags) {
|
||||
const v = tags[key]
|
||||
if (key.endsWith(":both")) {
|
||||
const strippedKey = key.substring(0, key.length - ":both".length)
|
||||
set(strippedKey + ":left", v)
|
||||
set(strippedKey + ":right", v)
|
||||
delete tags[key]
|
||||
continue
|
||||
}
|
||||
|
||||
const match = key.match(regex)
|
||||
if (match !== null) {
|
||||
const strippedKey = match[1]
|
||||
const property = match[1]
|
||||
set(strippedKey + ":left:" + property, v)
|
||||
set(strippedKey + ":right:" + property, v)
|
||||
console.log("Left-right rewritten " + key)
|
||||
delete tags[key]
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return somethingChanged
|
||||
}
|
||||
|
||||
private static noBothButLeftRight = new SimpleMetaTagger(
|
||||
{
|
||||
keys: ["sidewalk:left", "sidewalk:right", "generic_key:left:property", "generic_key:right:property"],
|
||||
|
@ -91,74 +168,7 @@ export default class SimpleMetaTagger {
|
|||
return;
|
||||
}
|
||||
|
||||
const tgs = feature.properties;
|
||||
let somethingChanged = false
|
||||
|
||||
/**
|
||||
* Sets the key onto the properties (but doesn't overwrite if already existing)
|
||||
*/
|
||||
function set(k, value) {
|
||||
if (tgs[k] === undefined || tgs[k] === "") {
|
||||
tgs[k] = value
|
||||
somethingChanged = true
|
||||
}
|
||||
}
|
||||
|
||||
if (tgs["sidewalk"]) {
|
||||
|
||||
const v = tgs["sidewalk"]
|
||||
switch (v) {
|
||||
case "none":
|
||||
case "no":
|
||||
set("sidewalk:left", "no");
|
||||
set("sidewalk:right", "no");
|
||||
break
|
||||
case "both":
|
||||
set("sidewalk:left", "yes");
|
||||
set("sidewalk:right", "yes");
|
||||
break;
|
||||
case "left":
|
||||
set("sidewalk:left", "yes");
|
||||
set("sidewalk:right", "no");
|
||||
break;
|
||||
case "right":
|
||||
set("sidewalk:left", "no");
|
||||
set("sidewalk:right", "yes");
|
||||
break;
|
||||
default:
|
||||
set("sidewalk:left", v);
|
||||
set("sidewalk:right", v);
|
||||
break;
|
||||
}
|
||||
delete tgs["sidewalk"]
|
||||
somethingChanged = true
|
||||
}
|
||||
|
||||
|
||||
const regex = /\([^:]*\):both:\(.*\)/
|
||||
for (const key in tgs) {
|
||||
const v = tgs[key]
|
||||
if (key.endsWith(":both")) {
|
||||
const strippedKey = key.substring(0, key.length - ":both".length)
|
||||
set(strippedKey + ":left", v)
|
||||
set(strippedKey + ":right", v)
|
||||
delete tgs[key]
|
||||
continue
|
||||
}
|
||||
|
||||
const match = key.match(regex)
|
||||
if (match !== null) {
|
||||
const strippedKey = match[1]
|
||||
const property = match[1]
|
||||
set(strippedKey + ":left:" + property, v)
|
||||
set(strippedKey + ":right:" + property, v)
|
||||
console.log("Left-right rewritten " + key)
|
||||
delete tgs[key]
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return somethingChanged
|
||||
return SimpleMetaTagger.removeBothTagging(feature.properties)
|
||||
})
|
||||
)
|
||||
private static surfaceArea = new SimpleMetaTagger(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue