Changeset 17977 in josm


Ignore:
Timestamp:
2021-07-10T17:48:58+02:00 (3 years ago)
Author:
Don-vip
Message:

fix #21079 - TagInfo: group required tags too

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/scripts/TagInfoExtract.java

    r17744 r17977  
    11// License: GPL. For details, see LICENSE file.
    2 
    32import java.awt.Graphics2D;
    43import java.awt.image.BufferedImage;
     
    249248            }
    250249        }
    251 
    252250    }
    253251
     
    266264        List<TagInfoTag> convertPresets(Iterable<TaggingPreset> presets, String descriptionPrefix, boolean addImages) {
    267265            final List<TagInfoTag> tags = new ArrayList<>();
     266            final Map<Tag, TagInfoTag> requiredTags = new LinkedHashMap<>();
    268267            final Map<Tag, TagInfoTag> optionalTags = new LinkedHashMap<>();
    269268            for (TaggingPreset preset : presets) {
     
    278277                                Set<TagInfoTag.Type> types = TagInfoTag.Type.forPresetTypes(preset.types);
    279278                                if (item.isKeyRequired()) {
    280                                     tags.add(new TagInfoTag(descriptionPrefix + preset.getName(), item.key, value, types,
    281                                             addImages && preset.iconName != null ? options.findImageUrl(preset.iconName) : null));
     279                                    fillTagsMap(requiredTags, item, value, preset.getName(), types,
     280                                            descriptionPrefix + TagInfoTag.REQUIRED_FOR_COUNT + ": ",
     281                                            addImages && preset.iconName != null ? options.findImageUrl(preset.iconName) : null);
    282282                                } else if (Presets.class.equals(getClass())) { // not for ExternalPresets
    283                                     optionalTags.compute(new Tag(item.key, value), (osmTag, tagInfoTag) -> {
    284                                         if (tagInfoTag == null) {
    285                                             String description = descriptionPrefix + TagInfoTag.OPTIONAL_FOR_COUNT + ": " + preset.getName();
    286                                             return new TagInfoTag(description, item.key, value, types, null);
    287                                         } else {
    288                                             tagInfoTag.descriptions.add(preset.getName());
    289                                             tagInfoTag.objectTypes.addAll(types);
    290                                             return tagInfoTag;
    291                                         }
    292                                     });
     283                                    fillTagsMap(optionalTags, item, value, preset.getName(), types,
     284                                            descriptionPrefix + TagInfoTag.OPTIONAL_FOR_COUNT + ": ", null);
    293285                                }
    294286                            }
    295287                        });
    296288            }
     289            tags.addAll(requiredTags.values());
    297290            tags.addAll(optionalTags.values());
    298291            return tags;
     292        }
     293
     294        private void fillTagsMap(Map<Tag, TagInfoTag> optionalTags, KeyedItem item, String value, String presetName, Set<TagInfoTag.Type> types, String descriptionPrefix, String iconUrl) {
     295            optionalTags.compute(new Tag(item.key, value), (osmTag, tagInfoTag) -> {
     296                if (tagInfoTag == null) {
     297                    return new TagInfoTag(descriptionPrefix + presetName, item.key, value, types, iconUrl);
     298                } else {
     299                    tagInfoTag.descriptions.add(presetName);
     300                    tagInfoTag.objectTypes.addAll(types);
     301                    return tagInfoTag;
     302                }
     303            });
    299304        }
    300305
     
    303308            return values.isEmpty() || values.size() > 50 ? Collections.singleton(null) : values;
    304309        }
    305 
    306310    }
    307311
     
    328332                    Logging.warn(ex);
    329333                }
    330 
    331334            }
    332335            writeJson("JOSM user presets", "Tags supported by the user contributed presets in the OSM editor JOSM", tags);
     
    491494                return Optional.empty();
    492495            }
    493 
    494496        }
    495497
     
    510512                LineElement les = LineElement.createLine(env);
    511513                if (les != null) {
    512                     if (!generateImage) return Optional.of("");
    513                     return Optional.of(createImage(les, "way", nc));
     514                    return Optional.of(generateImage ? createImage(les, "way", nc) : "");
    514515                }
    515516                return Optional.empty();
    516517            }
    517 
    518518        }
    519519
     
    551551     */
    552552    private static class TagInfoTag {
     553        static final String REQUIRED_FOR_COUNT = "Required for {count}";
    553554        static final String OPTIONAL_FOR_COUNT = "Optional for {count}";
    554555        final Collection<String> descriptions = new ArrayList<>();
     
    573574                final int size = descriptions.size();
    574575                object.add("description", String.join(", ", Utils.limit(descriptions, 8, "..."))
     576                        .replace(REQUIRED_FOR_COUNT, size > 3 ? "Required for " + size : "Required for")
    575577                        .replace(OPTIONAL_FOR_COUNT, size > 3 ? "Optional for " + size : "Optional for"));
    576578            }
     
    605607
    606608            static Set<TagInfoTag.Type> forPresetTypes(Set<TaggingPresetType> types) {
    607                 if (types == null) {
    608                     return Collections.emptySet();
    609                 }
    610                 return types.stream()
     609                return types == null ? Collections.emptySet() : types.stream()
    611610                        .map(Type::forPresetType)
    612611                        .collect(Collectors.toCollection(() -> EnumSet.noneOf(Type.class)));
Note: See TracChangeset for help on using the changeset viewer.