/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.fontbox.encoding;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* This is an interface to a text encoder.
*
* @author Ben Litchfield
* @version $Revision: 1.1 $
*/
public abstract class Encoding
{
/**
* Identifies a non-mapped character.
*/
private static final String NOTDEF = ".notdef";
/**
* This is a mapping from a character code to a character name.
*/
protected Map<Integer,String> codeToName = new HashMap<Integer,String>();
/**
* This is a mapping from a character name to a character code.
*/
protected Map<String,Integer> nameToCode = new HashMap<String,Integer>();
private static final Map<String,String> NAME_TO_CHARACTER = new HashMap<String,String>();
private static final Map<String,String> CHARACTER_TO_NAME = new HashMap<String,String>();
/**
* This will add a character encoding.
*
* @param code The character code that matches the character.
* @param name The name of the character.
*/
protected void addCharacterEncoding( int code, String name )
{
codeToName.put( code, name );
nameToCode.put( name, code );
}
/**
* This will get the character code for the name.
*
* @param name The name of the character.
*
* @return The code for the character.
*
* @throws IOException If there is no character code for the name.
*/
public int getCode( String name ) throws IOException
{
Integer code = nameToCode.get( name );
if( code == null )
{
throw new IOException( "No character code for character name '" + name + "'" );
}
return code.intValue();
}
/**
* This will take a character code and get the name from the code.
*
* @param code The character code.
*
* @return The name of the character.
*
* @throws IOException If there is no name for the code.
*/
public String getName( int code ) throws IOException
{
String name = codeToName.get( code );
if( name == null )
{
name = NOTDEF;
}
return name;
}
/**
* This will take a character code and get the name from the code.
*
* @param c The character.
*
* @return The name of the character.
*
* @throws IOException If there is no name for the character.
*/
public String getNameFromCharacter( char c ) throws IOException
{
String name = CHARACTER_TO_NAME.get( c );
if( name == null )
{
throw new IOException( "No name for character '" + c + "'" );
}
return name;
}
/**
* This will get the character from the code.
*
* @param code The character code.
*
* @return The printable character for the code.
*
* @throws IOException If there is not name for the character.
*/
public String getCharacter( int code ) throws IOException
{
return getCharacter( getName( code ) );
}
/**
* This will get the character from the name.
*
* @param name The name of the character.
*
* @return The printable character for the code.
*/
public static String getCharacter( String name )
{
String character = NAME_TO_CHARACTER.get( name );
if( character == null )
{
character = name;
}
return character;
}
}