diff options
-rw-r--r-- | build.xml | 3 | ||||
-rw-r--r-- | src/codegen/fo-property-mapping.xsl (renamed from src/codegen/propmap.xsl) | 120 | ||||
-rw-r--r-- | src/java/org/apache/fop/fo/FObj.java | 35 | ||||
-rw-r--r-- | src/java/org/apache/fop/fo/PropertyList.java | 17 |
4 files changed, 150 insertions, 25 deletions
@@ -209,7 +209,6 @@ list of possible build targets. <property name="colorkw.xml" value="${build.codegen}/colorkw.xml"/> <property name="properties.xsl" value="${build.codegen}/properties.xsl"/> - <property name="propmap.xsl" value="${build.codegen}/propmap.xsl"/> <property name="enumgen.xsl" value="${build.codegen}/enumgen.xsl"/> <property name="propinc.xsl" value="${build.codegen}/propinc.xsl"/> <property name="src.charlist.xsl" value="${src.codegen}/code-point-mapping.xsl"/> @@ -354,7 +353,7 @@ list of possible build targets. <style in="${foproperties.xml}" style="${properties.xsl}" out="${build.gensrc}/${replacestring}/fo/properties/fo_${ignore_this}"/> - <style in="${foproperties.xml}" style="${propmap.xsl}" + <style in="${foproperties.xml}" style="${build.codegen}/fo-property-mapping.xsl" out="${build.gensrc}/${replacestring}/fo/properties/FOPropertyMapping.java"/> <style in="${foproperties.xml}" style="${enumgen.xsl}" out="${build.gensrc}/${replacestring}/fo/properties/foenums_${ignore_this}"/> diff --git a/src/codegen/propmap.xsl b/src/codegen/fo-property-mapping.xsl index c300f5e49..a6a888898 100644 --- a/src/codegen/propmap.xsl +++ b/src/codegen/fo-property-mapping.xsl @@ -76,29 +76,65 @@ Software Foundation, please see <http://www.apache.org/>. </xsl:otherwise> </xsl:choose> </xsl:variable> -<xsl:text> </xsl:text><xsl:value-of select="$htname"/>.put("<xsl:value-of select="$prop/name"/>", <xsl:value-of select="$makerclass"/>.maker("<xsl:value-of select="$prop/name"/>")); + <xsl:variable name="lcletters" select="'abcdefghijklmnopqrstuvwxyz-:'" /> + <xsl:variable name="ucletters" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ__'" /> + <xsl:variable name="enum" select="translate($prop/name, $lcletters, $ucletters)"/> +<xsl:text> </xsl:text><xsl:value-of select="$htname"/>String.put("<xsl:value-of select="$prop/name"/>", <xsl:value-of select="$makerclass"/>.maker("<xsl:value-of select="$prop/name"/>")); +<xsl:text> </xsl:text><xsl:value-of select="$htname"/>[PR_<xsl:value-of select="$enum"/>] =<xsl:value-of select="$makerclass"/>.maker("<xsl:value-of select="$prop/name"/>"); +<xsl:text> addPropertyName("</xsl:text><xsl:value-of select="$prop/name"/>", PR_<xsl:value-of select="$enum"/>); +</xsl:template> + + +<xsl:template name="genenum"> + <xsl:param name="prop" select="."/> + <xsl:variable name="lcletters" select="'abcdefghijklmnopqrstuvwxyz-:'" /> + <xsl:variable name="ucletters" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ__'" /> + <xsl:variable name="num" select="count(preceding-sibling::property)"/> + <xsl:variable name="enum" select="translate($prop/name, $lcletters, $ucletters)"/> +<!-- +<xsl:text> public final static short </xsl:text><xsl:value-of select="$enum"/> = <xsl:value-of select="$num"/>; +--> </xsl:template> <xsl:template match="text()"/> +<xsl:template match="text()" mode="enums"/> <xsl:template match="property-list"> package org.apache.fop.fo.properties; import java.util.HashMap; import java.util.Set; +import org.apache.fop.fo.Property; //import org.apache.fop.svg.*; -public class <xsl:value-of select="@family"/>PropertyMapping { +public class <xsl:value-of select="@family"/>PropertyMapping implements Constants { - private static HashMap s_htGeneric = new HashMap(); + private static Property.Maker[] s_htGeneric = new Property.Maker[PROPERTY_COUNT+1]; + private static HashMap s_htGenericString = new HashMap(); // temporary + private static HashMap s_htElementStringLists = new HashMap(); // temporary private static HashMap s_htElementLists = new HashMap(); + private static HashMap s_htSubPropNames = new HashMap(); + private static HashMap s_htPropNames = new HashMap(); + private static HashMap s_htPropIds = new HashMap(); <xsl:for-each select="element-property-list"> private static HashMap s_ht<xsl:value-of select="localname[1]"/>;</xsl:for-each> <xsl:apply-templates/> - public static HashMap getGenericMappings() { + public static HashMap getGenericStringMappings() { + return s_htGenericString; + } + + public static Set getElementStringMappings() { + return s_htElementStringLists.keySet(); + } + + public static HashMap getElementStringMapping(String elemName) { + return (HashMap)s_htElementStringLists.get(elemName); + } + + public static Property.Maker[] getGenericMappings() { return s_htGeneric; } @@ -106,13 +142,57 @@ public class <xsl:value-of select="@family"/>PropertyMapping { return s_htElementLists.keySet(); } - public static HashMap getElementMapping(String elemName) { - return (HashMap)s_htElementLists.get(elemName); + public static Property.Maker[] getElementMapping(int elemName) { + return (Property.Maker[])s_htElementLists.get(new Integer(elemName)); + } + + public static int getPropertyId(String name) { + Integer i = (Integer) s_htPropNames.get(name); + if (i == null) + return -1; + return i.intValue(); + } + + public static int getSubPropertyId(String name) { + Integer i = (Integer) s_htSubPropNames.get(name); + if (i == null) + return -1; + return i.intValue(); + } + + public static String getPropertyName(int id) { + return (String) s_htPropIds.get(new Integer(id)); + } + + static { + addSubPropertyName("length", CP_LENGTH); + addSubPropertyName("conditionality", CP_CONDITIONALITY); + addSubPropertyName("block-progression-direction", CP_BLOCK_PROGRESSION_DIRECTION); + addSubPropertyName("inline-progression-direction", CP_INLINE_PROGRESSION_DIRECTION); + addSubPropertyName("within-line", CP_WITHIN_LINE); + addSubPropertyName("within-column", CP_WITHIN_COLUMN); + addSubPropertyName("within-page", CP_WITHIN_PAGE); + addSubPropertyName("minimum", CP_MINIMUM); + addSubPropertyName("maximum", CP_MAXIMUM); + addSubPropertyName("optimum", CP_OPTIMUM); + addSubPropertyName("precedence", CP_PRECEDENCE); + + } + + public static void addPropertyName(String name, int id) { + s_htPropNames.put(name, new Integer(id)); + s_htPropIds.put(new Integer(id), name); + } + + public static void addSubPropertyName(String name, int id) { + s_htSubPropNames.put(name, new Integer(id)); + s_htPropIds.put(new Integer(id), name); } } </xsl:template> <xsl:template match="generic-property-list"> + <xsl:apply-templates mode="enums"/> static { // Generate the generic mapping <xsl:apply-templates> @@ -135,6 +215,34 @@ public class <xsl:value-of select="@family"/>PropertyMapping { } </xsl:template> +<xsl:template match="property[@type='generic']" mode="enums"> + /* PROPCLASS = <xsl:call-template name="propclass"/> */ +</xsl:template> + +<xsl:template match="property" mode="enums"> + <xsl:param name="htname"/> + <xsl:variable name="refname" select="name"/> + <xsl:choose> + <xsl:when test="@type='ref'"> + <xsl:call-template name="genenum"> + <xsl:with-param name="htname" select="$htname"/> + <xsl:with-param name="prop" + select='document(concat(@family, "properties.xml"))//property[name=$refname]'/> + </xsl:call-template> + </xsl:when> + <xsl:when test="not(@type)"> + <xsl:call-template name="genenum"> + <xsl:with-param name="htname" select="$htname"/> + </xsl:call-template> + </xsl:when> + <xsl:otherwise/> + </xsl:choose> +</xsl:template> + +<xsl:template match="subproperty" mode="enums"> + <xsl:call-template name="genenum"/> +</xsl:template> + <xsl:template match="property"> <xsl:param name="htname"/> <xsl:variable name="refname" select="name"/> diff --git a/src/java/org/apache/fop/fo/FObj.java b/src/java/org/apache/fop/fo/FObj.java index 7693fef74..9e65217bc 100644 --- a/src/java/org/apache/fop/fo/FObj.java +++ b/src/java/org/apache/fop/fo/FObj.java @@ -59,6 +59,7 @@ import java.util.Set; import org.apache.fop.apps.FOPException; import org.apache.fop.fo.flow.Marker; +import org.apache.fop.fo.properties.Constants; import org.apache.fop.fo.properties.FOPropertyMapping; import org.xml.sax.Attributes; @@ -68,9 +69,11 @@ import org.xml.sax.Attributes; public class FObj extends FONode { private static final String FO_URI = "http://www.w3.org/1999/XSL/Format"; - public static HashMap propertyListTable = null; - public static HashMap elementTable = null; + public static HashMap propertyListStringTable = null; // temporary + public static HashMap elementStringTable = null; // temporary + public static Property.Maker[] propertyListTable = null; + /** * Formatting properties for this fo element. */ @@ -104,22 +107,30 @@ public class FObj extends FONode { */ public FObj(FONode parent) { super(parent); - - if (propertyListTable == null) { - propertyListTable = new HashMap(); - propertyListTable.putAll(FOPropertyMapping.getGenericMappings()); +/* temporary, during conversions to int constants only + if (propertyListStringTable == null) { + propertyListStringTable = new HashMap(); + propertyListStringTable.putAll(FOPropertyMapping.getGenericStringMappings()); } - - if (elementTable == null) { - elementTable = new HashMap(); +*/ + if (elementStringTable == null) { + elementStringTable = new HashMap(); for (Iterator iter = - FOPropertyMapping.getElementMappings().iterator(); + FOPropertyMapping.getElementStringMappings().iterator(); iter.hasNext();) { String elem = (String) iter.next(); - elementTable.put(elem, FOPropertyMapping.getElementMapping(elem)); + elementStringTable.put(elem, FOPropertyMapping.getElementStringMapping(elem)); } } - + + if (propertyListTable == null) { + propertyListTable = new Property.Maker[Constants.PROPERTY_COUNT+1]; + Property.Maker[] list = FOPropertyMapping.getGenericMappings(); + for (int i = 1; i < list.length; i++) { + if (list[i] != null) + propertyListTable[i] = list[i]; + } + } } /** Marks input file containing this object **/ diff --git a/src/java/org/apache/fop/fo/PropertyList.java b/src/java/org/apache/fop/fo/PropertyList.java index ca2d3775b..fc302897c 100644 --- a/src/java/org/apache/fop/fo/PropertyList.java +++ b/src/java/org/apache/fop/fo/PropertyList.java @@ -52,12 +52,12 @@ package org.apache.fop.fo; // Java import java.util.HashMap; -import java.util.Iterator; import org.xml.sax.Attributes; // FOP import org.apache.fop.apps.FOPException; import org.apache.fop.fo.Property.Maker; +import org.apache.fop.fo.properties.FOPropertyMapping; import org.apache.fop.fo.properties.WritingMode; @@ -486,7 +486,7 @@ public class PropertyList extends HashMap { FObj parentFO = fobj.findNearestAncestorFObj(); HashMap validProperties; - validProperties = (HashMap) fobj.elementTable.get(element); + validProperties = (HashMap) FObj.elementStringTable.get(element); /* Handle "compound" properties, ex. space-before.minimum */ String basePropertyName = findBasePropertyName(attributeName); @@ -667,7 +667,7 @@ public class PropertyList extends HashMap { */ protected Property.Maker findMaker(String space, String elementName, String propertyName) { - return findMaker((HashMap) fobj.elementTable.get(elementName), + return findMaker((HashMap) FObj.elementStringTable.get(elementName), propertyName); } @@ -686,8 +686,15 @@ public class PropertyList extends HashMap { propertyMaker = (Property.Maker) elemTable.get(propertyName); } if (propertyMaker == null) { - propertyMaker = - (Property.Maker) fobj.propertyListTable.get(propertyName); + int propId = FOPropertyMapping.getPropertyId(propertyName); + if (propId != -1) { // -1 w/namespaces (xmlns:fo, xmlns:svg, etc.) + propertyMaker = FObj.propertyListTable[propId]; + } + // old string method (retained temporarily for troubleshooting) + // propertyMaker = + // (Property.Maker) FObj.propertyListStringTable.get(propertyName); + // System.out.println(propertyName + "= " + propId + " propMaker = " + // + ((propertyMaker != null) ? (propertyMaker.toString()) : "(is null)")); } return propertyMaker; } |