/*
* Copyright 2009 Toby Speight
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
package uk.me.parabola.mkgmap.osmstyle.actions;
import java.util.HashMap;
import java.util.Map;
import uk.me.parabola.mkgmap.reader.osm.Element;
/**
* Prepend a Garmin magic-character to the value.
* TODO: symbolic names?
*
* @author Toby Speight
*/
public class PrependFilter extends ValueFilter {
private final String prefix;
private static final Map<String, String> symbols_6bit;
private static final Map<String, String> symbols_8bit;
static {
// Firstly, the symbols common to both encodings.
symbols_6bit = new HashMap<String, String>();
symbols_6bit.put("ele", "\u001f"); // name.height separator
// Copy to other encoding
symbols_8bit = new HashMap<String, String>(symbols_6bit);
// Now add other symbols
symbols_6bit.put("interstate", "\u002a"); // US Interstate
symbols_8bit.put("interstate", "\u0001");
symbols_6bit.put("shield", "\u002b"); // US Highway shield
symbols_8bit.put("shield", "\u0002");
symbols_6bit.put("round", "\u002c"); // US Highway round
symbols_8bit.put("round", "\u0003");
symbols_6bit.put("boxx", "\u002d"); // box with horizontal bands
symbols_8bit.put("boxx", "\u0004");
symbols_6bit.put("box", "\u002e"); // Square box
symbols_8bit.put("box", "\u0005");
symbols_6bit.put("oval", "\u002f"); // box with rounded ends
symbols_8bit.put("oval", "\u0006");
}
// TODO: runtime select appropriate table
public PrependFilter(String s) {
// First, try the lookup table
Map<String, String> symbols = symbols_8bit;
String p = symbols.get(s);
if (p == null) {
// else, s is a hex constant character number
try {
p = Character.toString((char)Integer.parseInt(s, 16));
} catch (NumberFormatException e) {
// failed - use string literally
p = s;
}
}
prefix = p;
}
public String doFilter(String value, Element el) {
return value == null ? null : prefix + value;
}
}