Token.java
package com.github.mygreen.cellformatter.tokenizer;
/**
* Excelのセルの書式の基本的な構成要素を表現するトークン。
*
* @author T.TSUCHIE
*
*/
public abstract class Token {
/**
* 書式の区切り文字';'用の記号。
*/
public static final Symbol SYMBOL_SEMI_COLON = new Symbol(";");
/**
* 数値の桁数の区切り文字','の記号
*/
public static final Symbol SYMBOL_COLON = new Symbol(",");
/**
* 数値の百分率'%'の記号
*/
public static final Symbol SYMBOL_PERCENT = new Symbol("%");
/**
* 数値の分数'/'の記号
*/
public static final Symbol SYMBOL_SLASH = new Symbol("/");
/**
* 小数の区切り'.'の記号
*/
public static final Symbol SYMBOL_DOT = new Symbol(".");
/**
* テキストのマーカー'@'用の記号。
*/
public static final Symbol SYMBOL_AT_MARK = new Symbol("@");
/**
* エスケープ文字(バックスペース\\)
*/
public static final String STR_ESCAPE_BACKSPACE = "\\";
/**
* エスケープ文字(クエスチョン!)
*/
public static final String STR_ESCAPE_QUESTION = "!";
/**
* エスケープ文字の配列
*/
public static final String[] STR_ESCAPES = {STR_ESCAPE_BACKSPACE, STR_ESCAPE_QUESTION};
/**
* トークンの文字列。
*/
private final String value;
public Token(final String value) {
this.value = value;
}
public static Word word(final String token) {
return new Word(token);
}
public static EscapedChar escapedChar(final String token) {
return new EscapedChar(token);
}
public static Condition condition(final String token) {
return new Condition(token);
}
public static Underscore underscore(final String token) {
return new Underscore(token);
}
public static Asterisk asterisk(final String token) {
return new Asterisk(token);
}
public static Factor factor(final String token) {
return new Factor(token);
}
public static Formatter formatter(final String token) {
return new Formatter(token);
}
public static Digits digits(final String token) {
return new Digits(token);
}
public Word asWord() {
return (Word) this;
}
public Symbol asSymbol() {
return (Symbol) this;
}
public EscapedChar asEscapedChar() {
return (EscapedChar) this;
}
public Condition asCondition() {
return (Condition) this;
}
public Underscore asUnderscore() {
return (Underscore) this;
}
public Asterisk asAsterisk() {
return (Asterisk) this;
}
public Factor asFactor() {
return (Factor) this;
}
public Formatter asFormatter() {
return (Formatter) this;
}
public Digits asDigits() {
return (Digits) this;
}
@Override
public String toString() {
return getValue();
}
/**
* トークンの値を取得する。
* @return
*/
public String getValue() {
return value;
}
/**
* ダブルクウォート'"'で囲まれた文字列。
*
*/
public static class Word extends Token {
public Word(final String value) {
super(value);
}
/**
* ダブルクウォート'"'を除いたテキストの値を取得する。
* @return
*/
public String getWord() {
int length = getValue().length();
return getValue().substring(1, length-1);
}
}
/**
* 書式用の記号。
*
*/
public static class Symbol extends Token {
public Symbol(final String value) {
super(value);
}
}
/**
* エスケープされた文字。
*
*/
public static class EscapedChar extends Token {
public EscapedChar(final String value) {
super(value);
}
/**
* エスケープ文字'\'を除いた文字を取得する。
* @return
*/
public String getChar() {
return getValue().substring(1);
}
}
/**
* 括弧で囲まれた条件の書式'[condition]'。
*
*/
public static class Condition extends Token {
public Condition(final String value) {
super(value);
}
/**
* 括弧を除いた条件の値の取得。
* @return
*/
public String getCondition() {
int length = getValue().length();
return getValue().substring(1, length-1);
}
}
/**
* アンダースコア'_'とそれに続く次の文字。
*/
public static class Underscore extends Token {
public Underscore(final String value) {
super(value);
}
/**
* アンダースコアに付随する次の文字の取得
* @return
*/
public String getAttachedValue() {
return getValue().substring(1);
}
}
/**
* アスタリスク'*'とそれに続く次の文字。
*/
public static class Asterisk extends Token {
public Asterisk(final String value) {
super(value);
}
/**
* アスタリスクに付随する次の文字の取得
* @return
*/
public String getAttachedValue() {
return getValue().substring(1);
}
}
/**
* 書式の因子となるものを構成するもの。
* ・日付などの'yyyy'や数値の'##'など。
*/
public static class Factor extends Token {
public Factor(String value) {
super(value);
}
}
/**
* 書式のフォーマットの最小単位。
* ・各書式ごとに解析して、{@link Factor}をさらに分解したもの。
*
*/
public static class Formatter extends Token {
public Formatter(String value) {
super(value);
}
}
/**
* 整数の数値
* ・各書式ごとに解析して、{@link Factor}をさらに分解したもの。
*
*/
public static class Digits extends Token {
public Digits(String value) {
super(value);
}
/**
* 整数に変換した値
* @return
*/
public int intValue() {
return Integer.valueOf(getValue());
}
}
}