]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Implemented validity checking for fo:bidi-override.
authorGlen Mazza <gmazza@apache.org>
Tue, 3 Aug 2004 05:22:43 +0000 (05:22 +0000)
committerGlen Mazza <gmazza@apache.org>
Tue, 3 Aug 2004 05:22:43 +0000 (05:22 +0000)
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@197851 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/fop/fo/AbstractCharIterator.java
src/java/org/apache/fop/fo/FObj.java
src/java/org/apache/fop/fo/flow/BidiOverride.java
src/java/org/apache/fop/fo/flow/Inline.java

index 9f310bf2dc6937115613a897969f9a6931368063..d2e05ab4e60ee24fa29603e4f28de7f5b8b76032 100644 (file)
@@ -33,7 +33,7 @@ public abstract class AbstractCharIterator implements CharIterator, Cloneable {
     /**
      * @see org.apache.fop.fo.CharIterator#nextChar()
      */
-    public abstract char nextChar() throws NoSuchElementException ;
+    public abstract char nextChar() throws NoSuchElementException;
 
     /**
      * @see java.util.Iterator#next()
index a9272333b3d579d7f9f8a195b1d3fc6f1d9d7d5a..3d8c69b1b071d4f189298aa2e034c0155970a7d3 100644 (file)
@@ -366,7 +366,7 @@ public class FObj extends FONode implements Constants {
 
     /**
      * Return an iterator over the object's childNodes starting
-     * at the pased node.
+     * at the passed-in node.
      * @param childNode First node in the iterator
      * @return A ListIterator or null if childNode isn't a child of
      * this FObj.
@@ -529,5 +529,25 @@ public class FObj extends FONode implements Constants {
             || (!isOutOfLineFODescendant && lName.equals("float"))
             || lName.equals("retrieve-marker")));
     }
+    
+    /**
+     * Convenience method for validity checking.  Checks if the
+     * current node has an ancestor of a given name.
+     * @param ancestorName -- node name to check for (e.g., "fo:root")
+     * @return number of levels above FO where ancestor exists, 
+     *    -1 if not found
+     */
+    protected int findAncestor(String ancestorName) {
+        int found = 1;
+        FONode temp = getParent();
+        while (temp != null) {
+            if (temp.getName().equals(ancestorName)) {
+                return found;
+            }
+            found += 1;
+            temp = temp.getParent();
+        }
+        return -1;
+    }
 }
 
index b0cc8b0ecd27d3a138f0a1ac26ded811df6e4758..9e0e37cfd895c0c28272f1b0e2031bfcf1a9771a 100644 (file)
 
 package org.apache.fop.fo.flow;
 
+// XML
+import org.xml.sax.Attributes;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXParseException;
+
 // FOP
+import org.apache.fop.fo.FOElementMapping;
 import org.apache.fop.fo.FONode;
 import org.apache.fop.fo.FObjMixed;
 import org.apache.fop.layoutmgr.AddLMVisitor;
@@ -30,36 +36,72 @@ import org.apache.fop.fo.properties.CommonRelativePosition;
  */
 public class BidiOverride extends FObjMixed {
 
+    // used for FO validation
+    private boolean blockOrInlineItemFound = false;
+    private boolean canHaveBlockLevelChildren = true;
+
     /**
      * @param parent FONode that is the parent of this object
      */
     public BidiOverride(FONode parent) {
         super(parent);
-    }
-
-    private void setup() {
-
-        // Common Aural Properties
-        CommonAural mAurProps = propMgr.getAuralProps();
+        
+       /* Check to see if this node can have block-level children.
+        * See validateChildNode() below.
+        */
+       int lvlLeader = findAncestor("fo:leader");
+       int lvlInCntr = findAncestor("fo:inline-container");
+       int lvlInline = findAncestor("fo:inline");
+       int lvlFootnote = findAncestor("fo:footnote");
 
-        // Common Font Properties
-        //this.fontState = propMgr.getFontState(area.getFontInfo());
+       if (lvlLeader > 0) {
+           if (lvlInCntr < 0 ||
+               (lvlInCntr > 0 && lvlInCntr > lvlLeader)) {
+               canHaveBlockLevelChildren = false;
+           }
+       } else if (lvlInline > 0 && lvlFootnote == (lvlInline + 1)) {
+           if (lvlInCntr < 0 ||
+           (lvlInCntr > 0 && lvlInCntr > lvlInline)) {
+               canHaveBlockLevelChildren = false;
+           }
+       }
 
-        // Common Margin Properties-Inline
-        CommonRelativePosition mProps = propMgr.getRelativePositionProps();
+    }
 
-        // this.propertyList.get("color");
-        // this.propertyList.get("direction");
+    /**
+     * @see org.apache.fop.fo.FObj#addProperties
+     */
+    protected void addProperties(Attributes attlist) throws SAXParseException {
+        super.addProperties(attlist);
         setupID();
-        // this.propertyList.get("letter-spacing");
-        // this.propertyList.get("line-height");
-        // this.propertyList.get("line-height-shift-adjustment");
-        // this.propertyList.get("score-spaces");
-        // this.propertyList.get("text-shadow");
-        // this.propertyList.get("text-transform");
-        // this.propertyList.get("unicode-bidi");
-        // this.propertyList.get("word-spacing");
+    }
 
+    /**
+     * @see org.apache.fop.fo.FONode#validateChildNode(Locator, String, String)
+     * XSL Content Model: marker* (#PCDATA|%inline;|%block;)*
+     * Additionally: "An fo:bidi-override that is a descendant of an fo:leader
+     *  or of the fo:inline child of an fo:footnote may not have block-level
+     *  children, unless it has a nearer ancestor that is an 
+     *  fo:inline-container."
+     */
+    protected void validateChildNode(Locator loc, String nsURI, String localName) 
+        throws SAXParseException {
+        if (nsURI == FOElementMapping.URI && localName.equals("marker")) {
+            if (blockOrInlineItemFound) {
+               nodesOutOfOrderError(loc, "fo:marker", 
+                    "(#PCDATA|%inline;|%block;)");
+            }
+        } else if (!isBlockOrInlineItem(nsURI, localName)) {
+            invalidChildError(loc, nsURI, localName);
+        } else if (!canHaveBlockLevelChildren && isBlockItem(nsURI, localName)) {
+            invalidChildError(loc, nsURI, localName);
+        } else {
+            blockOrInlineItemFound = true;
+        }
+    }
+    
+    public String getName() {
+        return "fo:bidi-override";
     }
 
     /**
@@ -77,8 +119,4 @@ public class BidiOverride extends FObjMixed {
     public void acceptVisitor(AddLMVisitor aLMV) {
         aLMV.serveBidiOverride(this);
     }
-
-    public String getName() {
-        return "fo:bidi-override";
-    }
 }
index adb33d0d154b7a87f29e3cfc5a0b674fc493e039..61e654eb14b964a868f5661485be7f82e72f4a38 100644 (file)
@@ -67,39 +67,7 @@ public class Inline extends FObjMixed {
                                    + " be directly under flow", locator);
         }
 
-        // Common Accessibility Properties
-        CommonAccessibility mAccProps = propMgr.getAccessibilityProps();
-
-        // Common Aural Properties
-        CommonAural mAurProps = propMgr.getAuralProps();
-
-        // Common Border, Padding, and Background Properties
-        CommonBorderAndPadding bap = propMgr.getBorderAndPadding();
-        CommonBackground bProps = propMgr.getBackgroundProps();
-
-        // Common Font Properties
-        //this.fontState = propMgr.getFontState(area.getFontInfo());
-
-        // Common Margin Properties-Inline
-        CommonMarginInline mProps = propMgr.getMarginInlineProps();
-
-        // Common Relative Position Properties
-        CommonRelativePosition mRelProps = propMgr.getRelativePositionProps();
-
-        // this.propertyList.get("alignment-adjust");
-        // this.propertyList.get("alignment-baseline");
-        // this.propertyList.get("baseline-shift");
-        // this.propertyList.get("color");
-        // this.propertyList.get("dominant-baseline");
         setupID();
-        // this.propertyList.get("keep-together");
-        // this.propertyList.get("keep-with-next");
-        // this.propertyList.get("keep-with-previous");
-        // this.propertyList.get("line-height");
-        // this.propertyList.get("line-height-shift-adjustment");
-        // this.propertyList.get("text-devoration");
-        // this.propertyList.get("visibility");
-        // this.propertyList.get("z-index");
 
         int textDecoration = this.propertyList.get(PR_TEXT_DECORATION).getEnum();
 
@@ -118,6 +86,13 @@ public class Inline extends FObjMixed {
         getFOInputHandler().startInline(this);
     }
 
+    /**
+     * @see org.apache.fop.fo.FONode#end
+     */
+    protected void endOfNode() throws SAXParseException {
+        getFOInputHandler().endInline(this);
+    }
+
     /**
      * @return true (Inline can contain Markers)
      */
@@ -136,13 +111,6 @@ public class Inline extends FObjMixed {
         aLMV.serveInline(this);
     }
 
-    /**
-     * @see org.apache.fop.fo.FONode#end
-     */
-    protected void endOfNode() throws SAXParseException {
-        getFOInputHandler().endInline(this);
-    }
-
     public String getName() {
         return "fo:inline";
     }