diff --git a/d2oracle/edit.go b/d2oracle/edit.go index 0a7746c66..859b4281d 100644 --- a/d2oracle/edit.go +++ b/d2oracle/edit.go @@ -771,9 +771,20 @@ func _set(g *d2graph.Graph, baseAST *d2ast.Map, key string, tag, value *string) } } case "label": - if inlined(&attrs.Label) { - attrs.Label.MapKey.SetScalar(mk.Value.ScalarBox()) - return nil + if len(mk.Key.Path[reservedIndex:]) > 1 { + reservedTargetKey = mk.Key.Path[reservedIndex+1].Unbox().ScalarString() + switch reservedTargetKey { + case "near": + if inlined(attrs.LabelPosition) { + attrs.LabelPosition.MapKey.SetScalar(mk.Value.ScalarBox()) + return nil + } + } + } else { + if inlined(&attrs.Label) { + attrs.Label.MapKey.SetScalar(mk.Value.ScalarBox()) + return nil + } } } } diff --git a/d2oracle/edit_test.go b/d2oracle/edit_test.go index c6fa04950..f7068decc 100644 --- a/d2oracle/edit_test.go +++ b/d2oracle/edit_test.go @@ -2185,6 +2185,76 @@ layers: { value: go2.Pointer(`red`), exp: `...@yo (a -> b)[0].style.stroke: red +`, + }, + { + name: "label-near/1", + + text: `x +`, + key: `x.label.near`, + value: go2.Pointer(`bottom-right`), + exp: `x: {label.near: bottom-right} +`, + }, + { + name: "label-near/2", + + text: `x.label.near: bottom-left +`, + key: `x.label.near`, + value: go2.Pointer(`bottom-right`), + exp: `x.label.near: bottom-right +`, + }, + { + name: "label-near/3", + + text: `x: { + label.near: bottom-left +} +`, + key: `x.label.near`, + value: go2.Pointer(`bottom-right`), + exp: `x: { + label.near: bottom-right +} +`, + }, + { + name: "label-near/4", + + text: `x: { + label: hi { + near: bottom-left + } +} +`, + key: `x.label.near`, + value: go2.Pointer(`bottom-right`), + exp: `x: { + label: hi { + near: bottom-right + } +} +`, + }, + { + name: "label-near/5", + + text: `x: hi { + label: { + near: bottom-left + } +} +`, + key: `x.label.near`, + value: go2.Pointer(`bottom-right`), + exp: `x: hi { + label: { + near: bottom-right + } +} `, }, } diff --git a/testdata/d2oracle/TestSet/label-near/1.exp.json b/testdata/d2oracle/TestSet/label-near/1.exp.json new file mode 100644 index 000000000..5a4b9b691 --- /dev/null +++ b/testdata/d2oracle/TestSet/label-near/1.exp.json @@ -0,0 +1,159 @@ +{ + "graph": { + "name": "", + "isFolderOnly": false, + "ast": { + "range": "d2/testdata/d2oracle/TestSet/label-near/1.d2,0:0:0-1:0:30", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/label-near/1.d2,0:0:0-0:29:29", + "key": { + "range": "d2/testdata/d2oracle/TestSet/label-near/1.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label-near/1.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestSet/label-near/1.d2,0:3:3-0:29:29", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/label-near/1.d2,0:4:4-0:28:28", + "key": { + "range": "d2/testdata/d2oracle/TestSet/label-near/1.d2,0:4:4-0:14:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label-near/1.d2,0:4:4-0:9:9", + "value": [ + { + "string": "label", + "raw_string": "label" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label-near/1.d2,0:10:10-0:14:14", + "value": [ + { + "string": "near", + "raw_string": "near" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label-near/1.d2,0:16:16-0:28:28", + "value": [ + { + "string": "bottom-right", + "raw_string": "bottom-right" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "attributes": { + "label": { + "value": "" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/label-near/1.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label-near/1.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": -1 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "rectangle" + }, + "direction": { + "value": "" + }, + "constraint": null, + "labelPosition": { + "value": "bottom-right" + } + }, + "zIndex": 0 + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/label-near/2.exp.json b/testdata/d2oracle/TestSet/label-near/2.exp.json new file mode 100644 index 000000000..2352d151b --- /dev/null +++ b/testdata/d2oracle/TestSet/label-near/2.exp.json @@ -0,0 +1,163 @@ +{ + "graph": { + "name": "", + "isFolderOnly": false, + "ast": { + "range": "d2/testdata/d2oracle/TestSet/label-near/2.d2,0:0:0-1:0:27", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/label-near/2.d2,0:0:0-0:26:26", + "key": { + "range": "d2/testdata/d2oracle/TestSet/label-near/2.d2,0:0:0-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label-near/2.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label-near/2.d2,0:2:2-0:7:7", + "value": [ + { + "string": "label", + "raw_string": "label" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label-near/2.d2,0:8:8-0:12:12", + "value": [ + { + "string": "near", + "raw_string": "near" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label-near/2.d2,0:14:14-0:26:26", + "value": [ + { + "string": "bottom-right", + "raw_string": "bottom-right" + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "attributes": { + "label": { + "value": "" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/label-near/2.d2,0:0:0-0:12:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label-near/2.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label-near/2.d2,0:2:2-0:7:7", + "value": [ + { + "string": "label", + "raw_string": "label" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label-near/2.d2,0:8:8-0:12:12", + "value": [ + { + "string": "near", + "raw_string": "near" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": -1 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "rectangle" + }, + "direction": { + "value": "" + }, + "constraint": null, + "labelPosition": { + "value": "bottom-right" + } + }, + "zIndex": 0 + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/label-near/3.exp.json b/testdata/d2oracle/TestSet/label-near/3.exp.json new file mode 100644 index 000000000..1a3e49305 --- /dev/null +++ b/testdata/d2oracle/TestSet/label-near/3.exp.json @@ -0,0 +1,159 @@ +{ + "graph": { + "name": "", + "isFolderOnly": false, + "ast": { + "range": "d2/testdata/d2oracle/TestSet/label-near/3.d2,0:0:0-3:0:34", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/label-near/3.d2,0:0:0-2:1:33", + "key": { + "range": "d2/testdata/d2oracle/TestSet/label-near/3.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label-near/3.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestSet/label-near/3.d2,0:3:3-2:1:33", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/label-near/3.d2,1:2:7-1:26:31", + "key": { + "range": "d2/testdata/d2oracle/TestSet/label-near/3.d2,1:2:7-1:12:17", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label-near/3.d2,1:2:7-1:7:12", + "value": [ + { + "string": "label", + "raw_string": "label" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label-near/3.d2,1:8:13-1:12:17", + "value": [ + { + "string": "near", + "raw_string": "near" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label-near/3.d2,1:14:19-1:26:31", + "value": [ + { + "string": "bottom-right", + "raw_string": "bottom-right" + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "attributes": { + "label": { + "value": "" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/label-near/3.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label-near/3.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": -1 + } + ], + "attributes": { + "label": { + "value": "x" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "rectangle" + }, + "direction": { + "value": "" + }, + "constraint": null, + "labelPosition": { + "value": "bottom-right" + } + }, + "zIndex": 0 + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/label-near/4.exp.json b/testdata/d2oracle/TestSet/label-near/4.exp.json new file mode 100644 index 000000000..b259afc2c --- /dev/null +++ b/testdata/d2oracle/TestSet/label-near/4.exp.json @@ -0,0 +1,187 @@ +{ + "graph": { + "name": "", + "isFolderOnly": false, + "ast": { + "range": "d2/testdata/d2oracle/TestSet/label-near/4.d2,0:0:0-5:0:48", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/label-near/4.d2,0:0:0-4:1:47", + "key": { + "range": "d2/testdata/d2oracle/TestSet/label-near/4.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label-near/4.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestSet/label-near/4.d2,0:3:3-4:1:47", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/label-near/4.d2,1:2:7-3:3:45", + "key": { + "range": "d2/testdata/d2oracle/TestSet/label-near/4.d2,1:2:7-1:7:12", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label-near/4.d2,1:2:7-1:7:12", + "value": [ + { + "string": "label", + "raw_string": "label" + } + ] + } + } + ] + }, + "primary": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label-near/4.d2,1:9:14-1:11:16", + "value": [ + { + "string": "hi", + "raw_string": "hi" + } + ] + } + }, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestSet/label-near/4.d2,1:12:17-3:3:45", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/label-near/4.d2,2:4:23-2:22:41", + "key": { + "range": "d2/testdata/d2oracle/TestSet/label-near/4.d2,2:4:23-2:8:27", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label-near/4.d2,2:4:23-2:8:27", + "value": [ + { + "string": "near", + "raw_string": "near" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label-near/4.d2,2:10:29-2:22:41", + "value": [ + { + "string": "bottom-right", + "raw_string": "bottom-right" + } + ] + } + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "attributes": { + "label": { + "value": "" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/label-near/4.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label-near/4.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": -1 + } + ], + "attributes": { + "label": { + "value": "hi" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "rectangle" + }, + "direction": { + "value": "" + }, + "constraint": null, + "labelPosition": { + "value": "bottom-right" + } + }, + "zIndex": 0 + } + ] + }, + "err": "" +} diff --git a/testdata/d2oracle/TestSet/label-near/5.exp.json b/testdata/d2oracle/TestSet/label-near/5.exp.json new file mode 100644 index 000000000..ab5708901 --- /dev/null +++ b/testdata/d2oracle/TestSet/label-near/5.exp.json @@ -0,0 +1,187 @@ +{ + "graph": { + "name": "", + "isFolderOnly": false, + "ast": { + "range": "d2/testdata/d2oracle/TestSet/label-near/5.d2,0:0:0-5:0:48", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/label-near/5.d2,0:0:0-4:1:47", + "key": { + "range": "d2/testdata/d2oracle/TestSet/label-near/5.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label-near/5.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "primary": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label-near/5.d2,0:3:3-0:5:5", + "value": [ + { + "string": "hi", + "raw_string": "hi" + } + ] + } + }, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestSet/label-near/5.d2,0:6:6-4:1:47", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/label-near/5.d2,1:2:10-3:3:45", + "key": { + "range": "d2/testdata/d2oracle/TestSet/label-near/5.d2,1:2:10-1:7:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label-near/5.d2,1:2:10-1:7:15", + "value": [ + { + "string": "label", + "raw_string": "label" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2oracle/TestSet/label-near/5.d2,1:9:17-3:3:45", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2oracle/TestSet/label-near/5.d2,2:4:23-2:22:41", + "key": { + "range": "d2/testdata/d2oracle/TestSet/label-near/5.d2,2:4:23-2:8:27", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label-near/5.d2,2:4:23-2:8:27", + "value": [ + { + "string": "near", + "raw_string": "near" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label-near/5.d2,2:10:29-2:22:41", + "value": [ + { + "string": "bottom-right", + "raw_string": "bottom-right" + } + ] + } + } + } + } + ] + } + } + } + } + ] + } + } + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "attributes": { + "label": { + "value": "" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + }, + "edges": null, + "objects": [ + { + "id": "x", + "id_val": "x", + "references": [ + { + "key": { + "range": "d2/testdata/d2oracle/TestSet/label-near/5.d2,0:0:0-0:1:1", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2oracle/TestSet/label-near/5.d2,0:0:0-0:1:1", + "value": [ + { + "string": "x", + "raw_string": "x" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": -1 + } + ], + "attributes": { + "label": { + "value": "hi" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "rectangle" + }, + "direction": { + "value": "" + }, + "constraint": null, + "labelPosition": { + "value": "bottom-right" + } + }, + "zIndex": 0 + } + ] + }, + "err": "" +}