/*
* Copyright (C) 2006,2014 Steve Ratcliffe
*
* 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.
*
*
* Author: Steve Ratcliffe
* Create date: 10-Jan-2007
*/
package uk.me.parabola.imgfmt.app;
import java.util.regex.Pattern;
import uk.me.parabola.imgfmt.app.labelenc.EncodedText;
/**
* Labels are used for names of roads, points of interest etc.
*
* There are different storage formats.
*
* 1. A 6 bit compact uppercase ascii format, that has escape codes for some
* special characters.
*
* 2. An 8 bit format. This seems to be a fairly straightforward latin-1 like
* encoding with no tricks to reduce the amount of space required.
*
* 3. A multi-byte format. For unicode, cp932 etc.
*
* @author Steve Ratcliffe
*/
public class Label {
public static final Label NULL_LABEL = new Label("");
public static final Label NULL_OUT_LABEL = new Label(new char[0]);
private final String text;
private final char[] encText;
// The offset in to the data section.
private int offset;
public Label(String text) {
this.text = text;
this.encText = null;
}
public Label(char[] encText) {
this.encText = encText;
this.text = null;
}
public int getLength() {
if (text != null)
return text.length();
if (encText != null)
return encText.length;
return 0;
}
public String getText() {
assert text != null;
return text;
}
public char[] getEncText() {
return encText;
}
// highway shields and "thin" separators
public final static Pattern SHIELDS = Pattern.compile("[\u0001-\u0006\u001b-\u001c]");
// "fat" separators
private final static Pattern SEPARATORS = Pattern.compile("[\u001d-\u001f]");
// two or more whitespace characters
private final static Pattern SQUASH_SPACES = Pattern.compile("\\s\\s+");
public static String stripGarminCodes(String s) {
if(s == null)
return null;
s = SHIELDS.matcher(s).replaceAll(""); // remove
s = SEPARATORS.matcher(s).replaceAll(" "); // replace with a space
s = SQUASH_SPACES.matcher(s).replaceAll(" "); // replace with a space
// a leading separator would have turned into a space so trim it
return s.trim();
}
public static String squashSpaces(String s) {
if(s == null || s.isEmpty())
return null;
return SQUASH_SPACES.matcher(s).replaceAll(" "); // replace with single space
}
/**
* The offset of this label in the LBL file. The first byte of this file
* is zero and an offset of zero means that the label has a zero length/is
* empty.
*
* @return The offset within the LBL file of this string.
*/
public int getOffset() {
return offset;
}
public void setOffset(int offset) {
this.offset = offset;
}
/**
* Write this label to the given img file.
*
* @param writer The LBL file to write to.
* @param encText The encoded version of the text for this label.
*/
public void write(ImgFileWriter writer, EncodedText encText) {
assert encText != null;
if (encText.getLength() > 0)
writer.put(encText.getCtext(), 0, encText.getLength());
}
/**
* String version of the label, for diagnostic purposes.
*/
public String toString() {
return text != null ? text : "[" + offset + "]";
}
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
return offset == ((Label) o).offset;
}
public int hashCode() {
return offset;
}
}