diff --git a/modules/actions/reverse.js b/modules/actions/reverse.js index bb9703692..3fc799101 100644 --- a/modules/actions/reverse.js +++ b/modules/actions/reverse.js @@ -22,6 +22,10 @@ export function actionReverse(entityID, options) { var numeric = /^([+\-]?)(?=[\d.])/; var directionKey = /direction$/; var turn_lanes = /^turn:lanes:?/; + const keysToKeepUnchanged = [ + // https://github.com/openstreetmap/iD/issues/10736 + /^red_turn:(right|left)/ + ]; var keyReplacements = [ [/:right$/, ':left'], [/:left$/, ':right'], @@ -82,6 +86,9 @@ export function actionReverse(entityID, options) { function reverseKey(key) { + if (keysToKeepUnchanged.some(keyRegex => keyRegex.test(key))) { + return key; + } for (var i = 0; i < keyReplacements.length; ++i) { var replacement = keyReplacements[i]; if (replacement[0].test(key)) { diff --git a/test/spec/actions/reverse.js b/test/spec/actions/reverse.js index 7507a8f11..3e0be2244 100644 --- a/test/spec/actions/reverse.js +++ b/test/spec/actions/reverse.js @@ -646,5 +646,22 @@ describe('iD.actionReverse', function () { expect(target.tags.direction).to.eql('backward'); expect(target.tags.side).to.eql('right'); }); + + it('preserves the direction of a red turn at a traffic signal', function () { + var node1 = iD.osmNode(); + var node2 = iD.osmNode({tags: { + 'highway': 'traffic_signals', + 'traffic_signals:direction': 'forward', + 'red_turn:right': 'no', + 'red_turn:right:bicycle': 'yes' + }}); + var node3 = iD.osmNode(); + var way = iD.osmWay({nodes: [node1.id, node2.id, node3.id]}); + var graph = iD.actionReverse(way.id)(iD.coreGraph([node1, node2, node3, way])); + var target = graph.entity(node2.id); + expect(target.tags['traffic_signals:direction']).to.eql('backward'); + expect(target.tags['red_turn:right']).to.eql('no'); + expect(target.tags['red_turn:right:bicycle']).to.eql('yes'); + }); }); });