// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.transport; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.lang3.text.WordUtils; import org.openstreetmap.josm.data.osm.DataSet; import org.openstreetmap.josm.data.osm.Node; import org.openstreetmap.josm.plugins.opendata.modules.fr.toulouse.datasets.ToulouseDataSetHandler; public class HorodateurHandler extends ToulouseDataSetHandler { public HorodateurHandler() { super(12540, "vending=parking_tickets"); setWikiPage("Horodateurs"); setCategory(CAT_TRANSPORT); setMenuIcon("styles/standard/transport/ticket-machine.png"); } @Override public boolean acceptsFilename(String filename) { return acceptsCsvKmzTabFilename(filename, "Horodateur"); } private String parseHour(String hour) { String s = hour.replaceFirst("[hH]", ":"); if (s.endsWith(":")) { s += "00"; } return s; } protected String parseOpeningHours(String horaire) { final String hour = "\\p{Digit}{1,2}[hH]\\p{Digit}{0,2}"; final String sep = "[ -/]+"; final String hours = "("+hour+sep+hour+")"; final Pattern p = Pattern.compile(hours+"(?:"+sep+hours+")*"); final Matcher m = p.matcher(horaire); String opening_hours = ""; if (m.matches()) { for (int i = 1; i<=m.groupCount(); i++) { if (m.group(i) != null) { if (!opening_hours.isEmpty()) { opening_hours += "; "; } final Pattern p2 = Pattern.compile("("+hour+")"+sep+"("+hour+")"); final Matcher m2 = p2.matcher(m.group(i)); if (m2.matches()) { opening_hours += parseHour(m2.group(1)) + "-" + parseHour(m2.group(2)); } else { System.err.println(m.group(i)+" does not match "+p2); } } } } else { System.err.println(horaire+" does not match "+p); } return opening_hours; } @Override public void updateDataSet(DataSet ds) { for (Node n : ds.getNodes()) { n.put("amenity", "vending_machine"); n.put("vending", "parking_tickets"); n.remove("name"); n.remove("Code_Insee"); n.remove("Lib_voie"); n.remove("Mot_dir"); n.remove("No"); n.remove("Reglementation"); n.remove("color"); replace(n, "commune", "operator", new ValueReplacer() { @Override public String replace(String value) { return "Mairie de "+WordUtils.capitalizeFully(value); } }); replace(n, "horaire", "opening_hours", new ValueReplacer() { @Override public String replace(String value) { return parseOpeningHours(value); } }); replace(n, "maj_date", "source:date", new ValueReplacer() { @Override public String replace(String value) { return value.substring(0, 4)+"-"+value.substring(4, 6)+"-"+value.substring(6, 8); } }); replace(n, "observations", "note"); replace(n, "quartier_residant", "parking:ticket:zone", new ValueReplacer() { @Override public String replace(String value) { return WordUtils.capitalizeFully(value.trim()) .replace(" Iv", " IV").replace("Sebastopol", "Sébastopol") .replace("St ", "Saint-").replace("Peri", "Péri"); } }); } } }