]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Allow some xsl-function calls with omitted args, patch contributed by
authorSimon Pepping <spepping@apache.org>
Thu, 12 Jan 2006 20:40:08 +0000 (20:40 +0000)
committerSimon Pepping <spepping@apache.org>
Thu, 12 Jan 2006 20:40:08 +0000 (20:40 +0000)
Gerhard Oettl, bug 38098.

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@368462 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/fop/fo/expr/FromParentFunction.java
src/java/org/apache/fop/fo/expr/FromTableColumnFunction.java
src/java/org/apache/fop/fo/expr/Function.java
src/java/org/apache/fop/fo/expr/FunctionBase.java
src/java/org/apache/fop/fo/expr/InheritedPropFunction.java
src/java/org/apache/fop/fo/expr/NearestSpecPropFunction.java
src/java/org/apache/fop/fo/expr/PropertyParser.java
test/fotree/testcases/properties_omitted_propertyname.fo [new file with mode: 0644]

index f2e1c252f3991e4fd89f5944ce165a812c1d6640..6ddafe490c9359716f45016a369c9aef557c6df4 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 1999-2004 The Apache Software Foundation.
+ * Copyright 1999-2006 The Apache Software Foundation.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -35,6 +35,13 @@ public class FromParentFunction extends FunctionBase {
         return 1;
     }
 
+    /**
+     * @return true (allow padding of arglist with property name)
+     */
+    public boolean padArgsWithPropertyName() {
+        return true;
+    }
+
     /**
      * @param args array of arguments, which should either be empty, or the
      * first of which should contain an NCName corresponding to property name
index a076eee4c718672cf341ad47fbb87e1828577118..101cfb179d824895bf7db715937ea0f7598e0229 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 1999-2005 The Apache Software Foundation.
+ * Copyright 1999-2006 The Apache Software Foundation.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -33,6 +33,13 @@ public class FromTableColumnFunction extends FunctionBase {
         return 1;
     }
 
+    /**
+     * @return true (allow padding of arglist with property name)
+     */
+    public boolean padArgsWithPropertyName() {
+        return true;
+    }
+
     /**
      *
      * @param args array of arguments, which should either be empty, or the
@@ -45,10 +52,12 @@ public class FromTableColumnFunction extends FunctionBase {
      */
     public Property eval(Property[] args,
                          PropertyInfo pInfo) throws PropertyException {
+        /* uncomment when implementing
         String propName = args[0].getString();
         if (propName == null) {
-            //TODO Determine on which property this method was called.
+            throw new PropertyException("Incorrect parameter to from-table-column function");
         }
+        */
         throw new PropertyException("The from-table-column() function is not implemented, yet!");
     }
 
index 514843d5a199e0d4112046dfad729558e6e1d214..df4ca9f4cc3e5cfa560f2e6753b094007ee8ff4a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 1999-2004 The Apache Software Foundation.
+ * Copyright 1999-2006 The Apache Software Foundation.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -47,5 +47,10 @@ public interface Function {
      */
     Property eval(Property[] args,
                   PropertyInfo propInfo) throws PropertyException;
-}
 
+    /**
+     * @return if it is allowed to fill up the property list with
+     * the property name if only one arg is missing.
+     */
+    boolean padArgsWithPropertyName();
+}
index bc50888306536d49670f2cd6da09be7ca70d3383..1854222ddda2eb744a668f47072361d2d722052f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 1999-2004 The Apache Software Foundation.
+ * Copyright 1999-2006 The Apache Software Foundation.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -32,5 +32,10 @@ public abstract class FunctionBase implements Function {
         return null;
     }
 
+    /**
+     * @return false (by default don't pad arglist with property-name)
+     */
+    public boolean padArgsWithPropertyName() {
+        return false;
+    }
 }
-
index 8956a49dc8ae04b3694661e2f88fe434aef8e354..9b2bd4296308a50d7fb56447189e5b4115edf3f2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 1999-2004 The Apache Software Foundation.
+ * Copyright 1999-2006 The Apache Software Foundation.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -35,6 +35,13 @@ public class InheritedPropFunction extends FunctionBase {
         return 1;
     }
 
+    /**
+     * @return true (allow padding of arglist with property name)
+     */
+    public boolean padArgsWithPropertyName() {
+        return true;
+    }
+
     /**
      *
      * @param args arguments to be evaluated
index 00bd9596b04a2aecf9ef7d8b47cf209862298d54..b9190a2d814cfbd09c2cdf096aba841980a66093 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 1999-2004 The Apache Software Foundation.
+ * Copyright 1999-2006 The Apache Software Foundation.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -35,6 +35,13 @@ public class NearestSpecPropFunction extends FunctionBase {
         return 1;
     }
 
+    /**
+     * @return true (allow padding of arglist with property name)
+     */
+    public boolean padArgsWithPropertyName() {
+        return true;
+    }
+
     /**
      *
      * @param args array of arguments for the function
index 47b4584d635a0fdc8ed57f1a4f4318e05ed6dd5d..d08f7631c9e00ccd20944f8acb23acd98babea4d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 1999-2005 The Apache Software Foundation.
+ * Copyright 1999-2006 The Apache Software Foundation.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -308,7 +308,7 @@ public final class PropertyParser extends PropertyTokenizer {
             next();
             // Push new function (for function context: getPercentBase())
             propInfo.pushFunction(function);
-            prop = function.eval(parseArgs(function.nbArgs()), propInfo);
+            prop = function.eval(parseArgs(function), propInfo);
             propInfo.popFunction();
             return prop;
         
@@ -324,13 +324,15 @@ public final class PropertyParser extends PropertyTokenizer {
      * Parse a comma separated list of function arguments. Each argument
      * may itself be an expression. This method consumes the closing right
      * parenthesis of the argument list.
-     * @param nbArgs The number of arguments expected by the function.
+     * @param function The function object for which the arguments are 
+     * collected.
      * @return An array of Property objects representing the arguments
      * found.
      * @throws PropertyException If the number of arguments found isn't equal
      * to the number expected.
      */
-    Property[] parseArgs(int nbArgs) throws PropertyException {
+    Property[] parseArgs(Function function) throws PropertyException {
+        int nbArgs = function.nbArgs();
         Property[] args = new Property[nbArgs];
         Property prop;
         int i = 0;
@@ -352,8 +354,12 @@ public final class PropertyParser extends PropertyTokenizer {
             }
             expectRpar();
         }
+        if (i == nbArgs - 1 && function.padArgsWithPropertyName()) {
+            args[i++] = new StringProperty(propInfo.getPropertyMaker().getName());
+        }
         if (nbArgs != i) {
-            throw new PropertyException("Wrong number of args for function");
+            throw new PropertyException("Expected " + nbArgs
+                                        + ", but got " + i + " args for function");
         }
         return args;
     }
diff --git a/test/fotree/testcases/properties_omitted_propertyname.fo b/test/fotree/testcases/properties_omitted_propertyname.fo
new file mode 100644 (file)
index 0000000..3ded0a1
--- /dev/null
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright 2006 The Apache Software Foundation
+
+  Licensed 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$ -->
+<!-- This test verifies the addition of the property name for which the
+     function is called to the parameter list of the function if the
+     last parameter is omitted. (Only for currently implemented functions).
+-->
+<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:test="http://xmlgraphics.apache.org/fop/test">
+  <fo:layout-master-set>
+    <fo:simple-page-master master-name="normal" page-width="5in" page-height="5in">
+      <fo:region-body/>
+    </fo:simple-page-master>
+  </fo:layout-master-set>
+  <fo:page-sequence master-reference="normal">
+    <fo:flow flow-name="xsl-region-body">
+      <!-- system-font (not implemented) -->
+      <!-- inherited-property-value -->
+      <fo:block font-size="13pt">
+        Top Level Block: font-size="13pt" background-color="#00ff00"
+        <fo:block font-size="inherited-property-value() + 3pt">
+          <test:assert property="font-size" expected="16000mpt"/>
+          Nested Block: font-size="inherited-property-value() + 3pt" 
+                       (calculate with an inherited value)
+        </fo:block>
+      </fo:block>
+      <!-- from-parent -->
+      <fo:block font-size="24pt" background-color="#ff0000">
+        Top Level Block: font-size="24pt" background-color="#ff0000"
+        <fo:block font-size="from-parent() + 2pt" 
+         background-color="from-parent()">
+          <test:assert property="font-size" expected="26000mpt"/>
+          <test:assert property="background-color" expected="#ff0000"/>
+          Nested Block: 
+          font-size="from-parent() + 2pt"(inherited value and calculate)
+          background-color="from-parent()" (calculate with an inherited value)
+        </fo:block>
+      </fo:block>
+      <!-- from-nearest-specified-value -->
+      <fo:block background-color="#0000ff">
+        Top Level Block: font-size="24pt" background-color="#0000ff"
+        <fo:block>
+          <test:assert property="background-color" expected="#000000"/>
+          Nested Block: background-color=default
+          <fo:block background-color="from-nearest-specified-value()">
+            <test:assert property="background-color" expected="#0000ff"/>
+            Nested Block: background-color="from-nearest-specified-value()"
+          </fo:block>
+        </fo:block>
+      </fo:block>
+      <!-- from-table-column (not implemented) -->
+      <!-- merge-property-value (not implemented) -->
+    </fo:flow>
+  </fo:page-sequence>
+</fo:root>
+