source: osm/applications/editors/josm/plugins/comfort0/src/net/simon04/comfort0/OsmToLevel0L.java@ 35585

Last change on this file since 35585 was 35585, checked in by simon04, 4 years ago

see #19458 - Remove U+200C and U+200E from generated Level0L

File size: 3.5 KB
Line 
1package net.simon04.comfort0;
2
3import java.util.Collection;
4
5import org.openstreetmap.josm.data.coor.LatLon;
6import org.openstreetmap.josm.data.osm.DefaultNameFormatter;
7import org.openstreetmap.josm.data.osm.KeyValueVisitor;
8import org.openstreetmap.josm.data.osm.Node;
9import org.openstreetmap.josm.data.osm.OsmPrimitive;
10import org.openstreetmap.josm.data.osm.OsmPrimitiveComparator;
11import org.openstreetmap.josm.data.osm.Relation;
12import org.openstreetmap.josm.data.osm.RelationMember;
13import org.openstreetmap.josm.data.osm.Tagged;
14import org.openstreetmap.josm.data.osm.Way;
15import org.openstreetmap.josm.data.osm.visitor.OsmPrimitiveVisitor;
16
17/**
18 * Implements a conversion from {@link OsmPrimitive} to <a href="https://wiki.openstreetmap.org/wiki/Level0L">Level0L</a>.
19 */
20public class OsmToLevel0L implements OsmPrimitiveVisitor, KeyValueVisitor {
21
22 private final StringBuilder sb = new StringBuilder();
23
24 /**
25 * Visits a collection of primitives
26 * @param primitives The collection of primitives
27 * @return {@code this}
28 */
29 public OsmToLevel0L visit(Collection<OsmPrimitive> primitives) {
30 primitives.stream()
31 .sorted(OsmPrimitiveComparator.orderingWaysRelationsNodes().thenComparing(OsmPrimitiveComparator.comparingUniqueId()))
32 .forEachOrdered(p -> p.accept(this));
33 return this;
34 }
35
36 @Override
37 public void visit(Node n) {
38 appendCommon(n);
39 }
40
41 @Override
42 public void visit(Way w) {
43 appendCommon(w);
44 for (Node node : w.getNodes()) {
45 appendRef(node, "");
46 }
47 }
48
49 @Override
50 public void visit(Relation r) {
51 appendCommon(r);
52 for (RelationMember member : r.getMembers()) {
53 appendRef(member.getMember(), " " + member.getRole());
54 }
55 }
56
57 private void appendRef(OsmPrimitive primitive, String mixin) {
58 sb.append(" ");
59 switch (primitive.getType()) {
60 case NODE:
61 sb.append("nd ");
62 break;
63 case WAY:
64 sb.append("wy ");
65 break;
66 case RELATION:
67 sb.append("rel ");
68 break;
69 default:
70 break;
71 }
72 sb.append(primitive.getUniqueId());
73 sb.append(mixin);
74 appendDisplayName(primitive);
75 }
76
77 void appendCommon(OsmPrimitive p) {
78 sb.append("\n");
79 sb.append(p.getType().getAPIName()).append(" ").append(p.getUniqueId());
80 if (p instanceof Node) {
81 final LatLon latLon = ((Node) p).getCoor();
82 if (latLon != null) {
83 sb.append(": ").append(latLon.lat()).append(", ").append(latLon.lon());
84 }
85 }
86 appendDisplayName(p);
87 p.visitKeys(this);
88 }
89
90 void appendDisplayName(OsmPrimitive p) {
91 sb.append(" #").append(p.getDisplayName(DefaultNameFormatter.getInstance())).append("\n");
92 }
93
94 @Override
95 public void visitKeyValue(Tagged primitive, String key, String value) {
96 if (key.contains("#") || key.contains("=")) {
97 throw new UnsupportedOperationException("# and = are not supported in keys");
98 }
99 sb.append(" ").append(key).append(" = ").append(value).append("\n");
100 }
101
102 @Override
103 public String toString() {
104 return sb.toString()
105 .replace("\u200C", "")
106 .replace("\u200E", "")
107 .replace("\u200F", "")
108 .replaceFirst("^\\n", "");
109 }
110}
Note: See TracBrowser for help on using the repository browser.