Subversion Repositories mkgmap

Rev

Rev 1650 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * 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;
        }
}