/* * Freeplane - mind map editor * Copyright (C) 2011 Volker Boerchers * * This file author is Volker Boerchers * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * 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. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.freeplane.features.format; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.apache.commons.lang.StringUtils; import org.freeplane.core.util.TextUtils; import org.freeplane.n3.nanoxml.XMLElement; /** Scanner.scan(string) uses a number of Parsers to convert string into a Number, a Date or whatever. */ public class Scanner { private static final String ELEM_SCANNER = "scanner"; private static final String ATTRIB_LOCALE = "locale"; private static final String ATTRIB_DEFAULT = "default"; private static final String ELEM_CHECKFIRSTCHAR = "checkfirstchar"; private static final String ATTRIB_DISABLED = "disabled"; private static final String ATTRIB_CHARS = "chars"; private final ArrayList<String> locales; private final boolean isDefault; private String firstChars; private boolean checkFirstChars; private ArrayList<Parser> parsers = new ArrayList<Parser>(); public Scanner(String[] locales, boolean isDefault) { this.locales = new ArrayList<String>(Arrays.asList(locales)); this.isDefault = isDefault; validate(); } private void validate() { if (locales.isEmpty()) throw new IllegalArgumentException("attribute " + ATTRIB_LOCALE + " is mandatory and may not be empty"); } public ArrayList<String> getLocales() { return locales; } public boolean isDefault() { return isDefault; } public String getFirstChars() { return firstChars; } public void setFirstChars(String firstChars) { this.firstChars = firstChars; checkFirstChars = !TextUtils.isEmpty(firstChars); } public void addParser(Parser parser) { parsers.add(parser); } public List<Parser> getParsers() { return new ArrayList<Parser>(parsers); } public XMLElement toXml() { final XMLElement xmlElement = new XMLElement(ELEM_SCANNER); xmlElement.setAttribute(ATTRIB_LOCALE, StringUtils.join(locales.iterator(), ",")); if (isDefault) xmlElement.setAttribute(ATTRIB_DEFAULT, "true"); xmlElement.addChild(firstCharsToXml()); for (Parser parser : parsers) { xmlElement.addChild(parser.toXml()); } return xmlElement; } private XMLElement firstCharsToXml() { final XMLElement xmlElement = new XMLElement(ELEM_CHECKFIRSTCHAR); if (checkFirstChars) xmlElement.setAttribute(ATTRIB_CHARS, firstChars); else xmlElement.setAttribute(ATTRIB_DISABLED, "true"); return xmlElement; } public boolean localeMatchesExactly(String locale) { return locales.contains(locale); } public boolean countryMatches(String locale) { return locales.contains(locale.replaceFirst("_.*", "")); } public Object parse(String string) { if (TextUtils.isEmpty(string) || (checkFirstChars && firstChars.indexOf(string.charAt(0)) == -1)) return string; if(string.charAt(0) == '\'') return string; for (Parser parser : parsers) { final Object object = parser.parse(string); if (object != null) return object; } return string; } }