/* * $Id$ * Copyright (C) 2001 The Apache Software Foundation. All rights reserved. * For details on use and redistribution please refer to the * LICENSE file included with these sources. */ package org.apache.fop.fo.pagination; // FOP import org.apache.fop.fo.properties.*; // Avalon import org.apache.avalon.framework.logger.AbstractLogEnabled; // Java import java.util.*; /** * This class uses the 'format', 'groupingSeparator', 'groupingSize', * and 'letterValue' properties on fo:page-sequence to return a String * corresponding to the supplied integer page number. */ public class PageNumberGenerator extends AbstractLogEnabled { private String format; private char groupingSeparator; private int groupingSize; private int letterValue; // constants private int DECIMAL = 1; // '0*1' private int LOWERALPHA = 2; // 'a' private int UPPERALPHA = 3; // 'A' private int LOWERROMAN = 4; // 'i' private int UPPERROMAN = 5; // 'I' // flags private int formatType = DECIMAL; private int minPadding = 0; // for decimal formats // preloaded strings of zeros private String zeros[] = { "", "0", "00", "000", "0000", "00000" }; public PageNumberGenerator(String format, char groupingSeparator, int groupingSize, int letterValue) { this.format = format; this.groupingSeparator = groupingSeparator; this.groupingSize = groupingSize; this.letterValue = letterValue; // the only accepted format strings are currently '0*1' 'a', 'A', 'i' // and 'I' int fmtLen = format.length(); if (fmtLen == 1) { if (format.equals("1")) { formatType = DECIMAL; minPadding = 0; } else if (format.equals("a")) { formatType = LOWERALPHA; } else if (format.equals("A")) { formatType = UPPERALPHA; } else if (format.equals("i")) { formatType = LOWERROMAN; } else if (format.equals("I")) { formatType = UPPERROMAN; } else { // token not handled //getLogger().debug("'format' token not recognized; using '1'"); formatType = DECIMAL; minPadding = 0; } } else { // only accepted token is '0+1'at this stage. Because of the // wonderful regular expression support in Java, we will resort to a // loop for (int i = 0; i < fmtLen - 1; i++) { if (format.charAt(i) != '0') { //getLogger().debug("'format' token not recognized; using '1'"); formatType = DECIMAL; minPadding = 0; } else { minPadding = fmtLen - 1; } } } } public String makeFormattedPageNumber(int number) { String pn = null; if (formatType == DECIMAL) { pn = Integer.toString(number); if (minPadding >= pn.length()) { int nz = minPadding - pn.length() + 1; pn = zeros[nz] + pn; } } else if ((formatType == LOWERROMAN) || (formatType == UPPERROMAN)) { pn = makeRoman(number); if (formatType == UPPERROMAN) pn = pn.toUpperCase(); } else { // alphabetic pn = makeAlpha(number); if (formatType == UPPERALPHA) pn = pn.toUpperCase(); } return pn; } private String makeRoman(int num) { int arabic[] = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 }; String roman[] = { "m", "cm", "d", "cd", "c", "xc", "l", "xl", "x", "ix", "v", "iv", "i" }; int i = 0; StringBuffer romanNumber = new StringBuffer(); while (num > 0) { while (num >= arabic[i]) { num = num - arabic[i]; romanNumber.append(roman[i]); } i = i + 1; } return romanNumber.toString(); } private String makeAlpha(int num) { String letters = "abcdefghijklmnopqrstuvwxyz"; StringBuffer alphaNumber = new StringBuffer(); int base = 26; int rem = 0; num--; if (num < base) { alphaNumber.append(letters.charAt(num)); } else { while (num >= base) { rem = num % base; alphaNumber.append(letters.charAt(rem)); num = num / base; } alphaNumber.append(letters.charAt(num - 1)); } return alphaNumber.reverse().toString(); } }