// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.opendata.core.util; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang3.text.WordUtils; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.data.osm.OsmPrimitive; import org.openstreetmap.josm.plugins.opendata.core.OdConstants; import org.openstreetmap.josm.plugins.opendata.core.datasets.SimpleDataSetHandler; public abstract class NamesFrUtils { private static Map<String, String> dictionary = initDictionary(); public static final String checkDictionary(String value) { String result = ""; for (String word : value.split(" ")) { if (!result.isEmpty()) { result += " "; } result += dictionary.containsKey(word) ? dictionary.get(word) : word; } return result; } private static Map<String, String> initDictionary() { Map<String, String> result = new HashMap<>(); try (BufferedReader reader = new BufferedReader(new InputStreamReader( SimpleDataSetHandler.class.getResourceAsStream(OdConstants.DICTIONARY_FR), OdConstants.UTF8))) { String line = reader.readLine(); // Skip first line while ((line = reader.readLine()) != null) { String[] tab = line.split(";"); result.put(tab[0].replace("\"", ""), tab[1].replace("\"", "")); } } catch (IOException e) { Main.error(e); } return result; } public static final String getStreetLabel(String label) { if (label == null) { return label; } else if (label.equals("All")) { return "Allée"; } else if (label.equals("Autoroute")) { return label; } else if (label.startsWith("Anc")) { // Anc, Ancien return "Ancien"; } else if (label.equals("Av")) { return "Avenue"; } else if (label.equals("Bd")) { return "Boulevard"; } else if (label.equals("Bre")) { return "Bré"; } else if (label.equals("Caminot")) { return label; } else if (label.equals("Carrefour")) { return label; } else if (label.startsWith("Che")) { // Che, Chem return "Chemin"; } else if (label.equals("Cite")) { return "Cité"; } else if (label.equals("Clos")) { return label; } else if (label.equals("Cote")) { return "Côte"; } else if (label.equals("Cours")) { return label; } else if (label.equals("Dom")) { return "Domaine"; } else if (label.equals("Dsc")) { return "Descente"; } else if (label.equals("Esp")) { return "Esplanade"; } else if (label.equals("Espa")) { return "Espace"; } else if (label.equals("Giratoire")) { return label; } else if (label.equals("Grande-rue")) { return label; } else if (label.equals("Hameau")) { return label; } else if (label.equals("Imp")) { return "Impasse"; } else if (label.equals("Itineraire")) { return "Itinéraire"; } else if (label.equals("Jardin")) { return label; } else if (label.startsWith("L'") || label.equals("La") || label.equals("Le") || label.equals("Les") || label.equals("Saint")) { // Lieux-dits return label; } else if (label.equals("Lot")) { return "Lotissement"; } else if (label.equals("Mail")) { return label; } else if (label.equals("Mas")) { return label; } else if (label.equals("Parc")) { return label; } else if (label.equals("Pas")) { return "Passage"; } else if (label.equals("Passerelle")) { return label; } else if (label.equals("Pch")) { return "Petit Chemin"; } else if (label.equals("Petit")) { return label; } else if (label.equals("Petite-allée")) { return label; } else if (label.equals("Petite-rue")) { return label; } else if (label.equals("Pl")) { return "Place"; } else if (label.equals("Plan")) { return label; } else if (label.equals("Pont")) { return label; } else if (label.equals("Port")) { return label; } else if (label.equals("Porte")) { return label; } else if (label.equals("Prom")) { return "Promenade"; } else if (label.equals("Prv")) { return "Parvis"; } else if (label.equals("Qu")) { return "Quai"; } else if (label.equals("Rampe")) { return label; } else if (label.equals("Residence")) { return "Résidence"; } else if (label.equals("Rocade")) { return label; } else if (label.equals("Rpt")) { return "Rond-Point"; } else if (label.equals("Rte")) { return "Route"; } else if (label.equals("Rue")) { return label; } else if (label.equals("Sentier")) { return label; } else if (label.equals("Sq")) { return "Square"; } else if (label.equals("Tra")) { return "Traverse"; } else if (label.equals("Vieux")) { return label; } else if (label.equals("Voie")) { return label; } else if (label.equals("Zone")) { return label; } else { Main.warn("unknown street label: "+label); return label; } } public static final String checkStreetName(OsmPrimitive p, String key) { String value = null; if (p != null) { value = p.get(key); if (value != null) { value = WordUtils.capitalizeFully(value); // Cas particuliers if (value.equals("Boulingrin")) { // square Boulingrin, mal formé value = "Sq Boulingrin"; } else if (value.matches("A[0-9]+")) { // Autoroutes sans le mot "Autoroute" value = "Autoroute "+value; } else if (value.equals("All A61")) { // A61 qualifiée d'Allée ? value = "Autoroute A61"; } else if (value.startsWith("Che Vieux Che")) { // "Che" redondant value = value.replaceFirst("Che ", ""); } else if (value.startsWith("Petite Allee ")) { // Tiret, comme grand-rue, petite-rue value = value.replaceFirst("Petite Allee ", "Petite-allée "); } else if (value.startsWith("Ld De ")) { // Lieux-dit value = value.replaceFirst("Ld De ", ""); } while (value.startsWith("Ld ")) { // Lieux-dit, inutile. Plus le cas avec "Ld Ld" value = value.replaceFirst("Ld ", ""); } if (value.startsWith("L ")) { value = value.replaceFirst("L ", "L'"); } String[] words = value.split(" "); if (words.length > 0) { value = ""; List<String> list = Arrays.asList(words); words[0] = getStreetLabel(words[0]); if (words[0].equals("Ancien") && words.length > 1 && words[1].equals("Che")) { words[1] = "Chemin"; } for (int i = 0; i < words.length; i++) { if (i > 0) { value += " "; // Prénoms/Noms propres abrégés if (words[i].equals("A") && list.contains("Bernard")) { words[i] = "Arnaud"; } else if (words[i].equals("A") && list.contains("Passerieu")) { words[i] = "Ariste"; } else if (words[i].equals("A") && list.contains("Bougainville")) { words[i] = "Antoine"; } else if (words[i].equals("Ch") && list.contains("Leconte")) { words[i] = "Charles"; } else if (words[i].equals("Frs") && list.contains("Dugua")) { words[i] = "François"; } else if (words[i].equals("G") && list.contains("Latecoere")) { words[i] = "Georges"; } else if (words[i].equals("H") && list.contains("Lautrec")) { words[i] = "Henri"; } else if (words[i].equals("J") && list.contains("Dieulafoy")) { words[i] = "Jane"; } else if (words[i].equals("J") && (list.contains("Champollion") || list.contains("Stanislas"))) { words[i] = "Jean"; } else if (words[i].equals("L") && list.contains("Zamenhof")) { words[i] = "Ludwik"; } else if (words[i].equals("L") && list.contains("Sacha")) { words[i] = "Lucien"; if (!list.contains("Et")) { words[i] += " et"; } } else if (words[i].equals("L") && (list.contains("Vauquelin") || list.contains("Bougainville"))) { words[i] = "Louis"; } else if (words[i].equals("M") && list.contains("Dieulafoy")) { words[i] = "Marcel"; } else if (words[i].equals("M") && list.contains("Arifat")) { words[i] = "Marie"; } else if (words[i].equals("N") && list.contains("Djamena")) { words[i] = "N'"; } else if (words[i].equals("Oo")) { words[i] = "Oô"; } else if (words[i].equals("Ph") && list.contains("Ravary")) { words[i] = "Philippe"; } else if (words[i].equals("R") && list.contains("Folliot")) { words[i] = "Raphaël"; } else if (words[i].equals("W") && list.contains("Booth")) { words[i] = "William"; // Mots de liaison non couverts par le dictionnaire } else if (words[i].equals("A")) { words[i] = "à"; } else if (words[i].equals("D") || words[i].equals("L")) { words[i] = words[i].toLowerCase()+"'"; } else if (words[i].equals("La") || words[i].equals("Le")) { words[i] = words[i].toLowerCase(); } } value += words[i]; } } // Ponctuation value = value.replace("' ", "'"); // Dictionnaire value = checkDictionary(value); p.put(key, value); } } return value; } }