blob: eab3caa56353562cc83029bebfbf7fbdaa93bb66 [file] [log] [blame]
/*
* 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.
*/
/* $Id$ */
package org.apache.fop.tools.fontlist;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.SortedMap;
import java.util.regex.Pattern;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;
import org.apache.fop.fonts.FontTriplet;
import org.apache.fop.util.GenerationHelperContentHandler;
/**
* Turns the font list into SAX events.
*/
public class FontListSerializer {
private static final String FONTS = "fonts";
private static final String FAMILY = "family";
private static final String FONT = "font";
private static final String TRIPLETS = "triplets";
private static final String TRIPLET = "triplet";
private static final String NAME = "name";
private static final String STRIPPED_NAME = "stripped-name";
private static final String TYPE = "type";
private static final String KEY = "key";
private static final String STYLE = "style";
private static final String WEIGHT = "weight";
private static final String CDATA = "CDATA";
/**
* Generates SAX events from the font damily map.
* @param fontFamilies the font families
* @param handler the target SAX handler
* @throws SAXException if an XML-related exception occurs
*/
public void generateSAX(SortedMap fontFamilies,
GenerationHelperContentHandler handler) throws SAXException {
generateSAX(fontFamilies, null, handler);
}
/**
* Generates SAX events from the font damily map.
* @param fontFamilies the font families
* @param singleFamily if not null, the output will be filtered so only this single font family
* will be used
* @param handler the target SAX handler
* @throws SAXException if an XML-related exception occurs
*/
public void generateSAX(SortedMap fontFamilies, String singleFamily,
GenerationHelperContentHandler handler) throws SAXException {
handler.startDocument();
AttributesImpl atts = new AttributesImpl();
handler.startElement(FONTS, atts);
Iterator iter = fontFamilies.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry)iter.next();
String familyName = (String)entry.getKey();
if (singleFamily != null && familyName != singleFamily) {
continue;
}
atts.clear();
atts.addAttribute(null, NAME, NAME, CDATA, familyName);
atts.addAttribute(null, STRIPPED_NAME, STRIPPED_NAME, CDATA,
stripQuotes(familyName));
handler.startElement(FAMILY, atts);
List containers = (List)entry.getValue();
generateXMLForFontContainers(handler, containers);
handler.endElement(FAMILY);
}
handler.endElement(FONTS);
handler.endDocument();
}
private final Pattern quotePattern = Pattern.compile("'");
private String stripQuotes(String name) {
return quotePattern.matcher(name).replaceAll("");
}
private void generateXMLForFontContainers(GenerationHelperContentHandler handler,
List containers) throws SAXException {
AttributesImpl atts = new AttributesImpl();
Iterator fontIter = containers.iterator();
while (fontIter.hasNext()) {
FontSpec cont = (FontSpec)fontIter.next();
atts.clear();
atts.addAttribute(null, KEY, KEY, CDATA, cont.getKey());
atts.addAttribute(null, TYPE, TYPE, CDATA,
cont.getFontMetrics().getFontType().getName());
handler.startElement(FONT, atts);
generateXMLForTriplets(handler, cont.getTriplets());
handler.endElement(FONT);
}
}
private void generateXMLForTriplets(GenerationHelperContentHandler handler, Collection triplets)
throws SAXException {
AttributesImpl atts = new AttributesImpl();
atts.clear();
handler.startElement(TRIPLETS, atts);
Iterator iter = triplets.iterator();
while (iter.hasNext()) {
FontTriplet triplet = (FontTriplet)iter.next();
atts.clear();
atts.addAttribute(null, NAME, NAME, CDATA, triplet.getName());
atts.addAttribute(null, STYLE, STYLE, CDATA, triplet.getStyle());
atts.addAttribute(null, WEIGHT, WEIGHT, CDATA,
Integer.toString(triplet.getWeight()));
handler.element(TRIPLET, atts);
}
handler.endElement(TRIPLETS);
}
}