Ignore:
Timestamp:
11/12/11 09:27:55 (6 months ago)
Author:
jharrop
Message:

Basic support for importing XHTML into a content control with tag od:ContentType=application/xhtml+xml
Hyperlinks are handled.
TODO: tables, images, b/u/i, fonts, style creation

Location:
trunk/docx4j/src/main/java/org/docx4j
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/docx4j/src/main/java/org/docx4j/convert/in/css/Importer.java

    r1700 r1706  
    99 
    1010import org.apache.log4j.Logger; 
     11import org.docx4j.XmlUtils; 
    1112import org.docx4j.jaxb.Context; 
    1213import org.docx4j.model.properties.Property; 
     
    1516import org.docx4j.model.properties.run.AbstractRunProperty; 
    1617import org.docx4j.openpackaging.packages.WordprocessingMLPackage; 
     18import org.docx4j.openpackaging.parts.relationships.Namespaces; 
     19import org.docx4j.openpackaging.parts.relationships.RelationshipsPart; 
    1720import org.docx4j.org.xhtmlrenderer.css.constants.CSSName; 
    1821import org.docx4j.org.xhtmlrenderer.css.constants.IdentValue; 
     
    2629import org.docx4j.org.xhtmlrenderer.render.Box; 
    2730import org.docx4j.org.xhtmlrenderer.render.InlineBox; 
     31import org.docx4j.relationships.Relationships; 
    2832import org.docx4j.wml.P; 
    2933import org.docx4j.wml.PPr; 
     
    3135import org.docx4j.wml.RPr; 
    3236import org.docx4j.wml.Text; 
     37import org.docx4j.wml.P.Hyperlink; 
    3338import org.w3c.dom.Element; 
    3439import org.w3c.dom.css.CSSValue; 
    3540 
     41/** 
     42 * Convert XHTML + CSS to WordML content. 
     43 *  
     44 * People complain flying-saucer is slow 
     45 * (due to DTD related network lookups). 
     46 * See http://stackoverflow.com/questions/5431646/is-there-any-way-improve-the-performance-of-flyingsaucer 
     47 *  
     48 * Looking at FSEntityResolver, the problem is that there 
     49 * is no resources/schema on dir anymore which can be put on 
     50 * the classpath.  Once this problem is fixed, things work better. 
     51 *  
     52 *  
     53 * @author jharrop 
     54 * 
     55 */ 
    3656public class Importer { 
    3757         
     
    3959             
    4060    private List<Object> imports = new ArrayList<Object>();  
     61//    public List<Object>  getImportedContent() { 
     62//      return imports; 
     63//    } 
    4164     
    4265    private P currentP; 
    4366     
    44     private Importer() {} 
    45  
    46     public static List<Object> convert(File file) throws IOException { 
     67    private RelationshipsPart rp; 
     68     
     69    private Importer(RelationshipsPart rp) { 
     70        this.rp = rp; 
     71    } 
     72 
     73    public static List<Object> convert(File file, RelationshipsPart rp) throws IOException { 
    4774 
    4875        DocxRenderer renderer = new DocxRenderer(); 
     
    5077        renderer.layout(); 
    5178                     
    52         Importer importer = new Importer(); 
     79        Importer importer = new Importer(rp); 
    5380        importer.traverse(renderer.getRootBox(), ""); 
    5481         
     
    5683    } 
    5784     
    58     public List<Object> convert(String uri) { 
     85    public static List<Object> convert(String uri, RelationshipsPart rp) { 
    5986         
    6087        DocxRenderer renderer = new DocxRenderer(); 
     
    6289        renderer.layout(); 
    6390                     
    64         Importer importer = new Importer(); 
     91        Importer importer = new Importer(rp); 
    6592        importer.traverse(renderer.getRootBox(), ""); 
    6693         
     
    6895    } 
    6996 
    70     public List<Object> convertFromString(String content) { 
     97    public static List<Object> convertFromString(String content, RelationshipsPart rp) { 
    7198         
    7299        DocxRenderer renderer = new DocxRenderer(); 
     
    74101        renderer.layout(); 
    75102                     
    76         Importer importer = new Importer(); 
     103        Importer importer = new Importer(rp); 
    77104        importer.traverse(renderer.getRootBox(), ""); 
    78105         
     
    114141    } 
    115142 
    116     public void traverse(Box box, String indents) { 
     143    // A paragraph created for a div can be replaced by 
     144    // one created for a p within it, if it is still empty 
     145    boolean paraStillEmpty; 
     146     
     147    private void traverse(Box box, String indents) { 
    117148         
    118149        //log.info(box.getClass().getName() ); 
     
    146177                        if (currentP==null) { 
    147178                                currentP = Context.getWmlObjectFactory().createP(); 
     179                            imports.add(currentP); 
     180                            paraStillEmpty = true; 
    148181                        }                        
    149182                    } else { 
    150183                            currentP = Context.getWmlObjectFactory().createP(); 
    151184                            imports.add(currentP); 
     185                            paraStillEmpty = true; 
    152186                             
    153187                            // Paragraph level styling 
     
    176210                                Styleable s = ((InlineBox)o); 
    177211                                 
     212                                boolean isHyperlink = false; 
     213                                 
    178214                                String debug = ""; 
    179215                                if (s==null) { 
     
    182218                                    if (s.getElement()!=null) { 
    183219                                        debug = indents + "    " + "<" + s.getElement().getNodeName(); 
     220                                         
     221                                        if (s.getElement().getNodeName().equals("a")) { 
     222                                                log.info("Ha!  found a hyperlink. "); 
     223                                                isHyperlink = true; 
     224                                        } 
     225                                        if (s.getElement().getNodeName().equals("p")) { 
     226                                                // This seems to be the usual case. Odd? 
     227                                                log.debug("p in inline"); 
     228                                            Map<String, CSSValue> cssMap = getCascadedProperties(s.getStyle()); 
     229                                                currentP = Context.getWmlObjectFactory().createP();                                              
     230                                                if (paraStillEmpty) { 
     231                                                        // Replace it 
     232                                                    imports.remove( imports.size()-1);                                                   
     233                                                }  
     234                                                    imports.add(currentP); 
     235                                                    paraStillEmpty = true; 
     236                                                    currentP.setPPr( 
     237                                                                addParagraphProperties( cssMap )); 
     238 
     239                                        }                                         
    184240                                    } 
    185241                                    if (s.getStyle()!=null) { 
     
    188244                                } 
    189245                                 
     246                                 
    190247                                log.info(debug ); 
    191248                                //log.info("'" + ((InlineBox)o).getTextNode().getTextContent() );  // don't use .getText() 
    192                                 if (((InlineBox)o).getTextNode()!=null) { 
     249                                if (((InlineBox)o).getTextNode()==null) { 
     250                                        log.info("InlineBox has no TextNode, so skipping" ); 
     251                                } else  { 
    193252                                    log.info( ((InlineBox)o).getTextNode().getTextContent() );  // don't use .getText() 
     253 
     254                                    String theText = ((InlineBox)o).getTextNode().getTextContent();  
    194255                                     
    195                                     R run = Context.getWmlObjectFactory().createR(); 
    196                                     Text text = Context.getWmlObjectFactory().createText(); 
    197                                     String theText = ((InlineBox)o).getTextNode().getTextContent();  
    198                                     text.setValue( theText ); 
    199                                     if (theText.startsWith(" ") 
    200                                                 || theText.endsWith(" ") ) { 
    201                                         text.setSpace("preserve"); 
     256                                            paraStillEmpty = false;                                     
     257                                     
     258                                    if (isHyperlink) { 
     259                                         
     260                                        Hyperlink h = createHyperlink( 
     261                                                        s.getElement().getAttribute("href"),  
     262                                                        "Hyperlink", theText, rp);                                       
     263                                            currentP.getContent().add(h); 
     264                                         
     265                                    } else { // usual case 
     266                                     
     267                                            R run = Context.getWmlObjectFactory().createR(); 
     268                                            Text text = Context.getWmlObjectFactory().createText(); 
     269                                            text.setValue( theText ); 
     270                                            if (theText.startsWith(" ") 
     271                                                        || theText.endsWith(" ") ) { 
     272                                                text.setSpace("preserve"); 
     273                                            } 
     274                                            run.getContent().add(text); 
     275                                             
     276                                            currentP.getContent().add(run); 
     277                                             
     278                                            // Run level styling 
     279                                            if (s.getStyle()!=null) { // shouldn't happen 
     280                                                Map<String, CSSValue> cssMap = getCascadedProperties(s.getStyle());                                      
     281        //                                          Map cssMap = styleReference.getCascadedPropertiesMap(s.getElement()); 
     282                                                    run.setRPr( 
     283                                                                addRunProperties( cssMap )); 
     284                                            }  
     285        //                                    else { 
     286        //                                      // Get it from the parent element eg p 
     287        //                                          //Map cssMap = styleReference.getCascadedPropertiesMap(e); 
     288        //                                          run.setRPr( 
     289        //                                                      addRunProperties( cssMap ));                                                                                     
     290        //                                    } 
    202291                                    } 
    203                                     run.getContent().add(text); 
    204                                      
    205                                     currentP.getContent().add(run); 
    206                                      
    207                                     // Run level styling 
    208                                     if (s.getStyle()!=null) { // shouldn't happen 
    209                                         Map<String, CSSValue> cssMap = getCascadedProperties(s.getStyle());                                      
    210 //                                          Map cssMap = styleReference.getCascadedPropertiesMap(s.getElement()); 
    211                                             run.setRPr( 
    212                                                         addRunProperties( cssMap )); 
    213                                     }  
    214 //                                    else { 
    215 //                                      // Get it from the parent element eg p 
    216 //                                          //Map cssMap = styleReference.getCascadedPropertiesMap(e); 
    217 //                                          run.setRPr( 
    218 //                                                      addRunProperties( cssMap ));                                                                                     
    219 //                                    } 
    220                                      
    221292                                } 
    222                                  
    223293                                 
    224294                            } else if (o instanceof BlockBox ) { 
     
    291361    } 
    292362 
     363        private Hyperlink createHyperlink(String url, String style, String linkText, RelationshipsPart rp) { 
     364                 
     365                try { 
     366 
     367                        // We need to add a relationship to word/_rels/document.xml.rels 
     368                        // but since its external, we don't use the  
     369                        // usual wordMLPackage.getMainDocumentPart().addTargetPart 
     370                        // mechanism 
     371                        org.docx4j.relationships.ObjectFactory factory = 
     372                                new org.docx4j.relationships.ObjectFactory(); 
     373                         
     374                        org.docx4j.relationships.Relationship rel = factory.createRelationship(); 
     375                        rel.setType( Namespaces.HYPERLINK  ); 
     376                        rel.setTarget(url); 
     377                        rel.setTargetMode("External");   
     378                                                                         
     379                        rp.addRelationship(rel); 
     380                         
     381                        // addRelationship sets the rel's @Id 
     382                         
     383                        String hpl = "<w:hyperlink r:id=\"" + rel.getId() + "\" xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" " + 
     384            "xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" >" + 
     385            "<w:r>" + 
     386            "<w:rPr>" + 
     387            "<w:rStyle w:val=\"" + style + "\" />" +   
     388            "</w:rPr>" + 
     389            "<w:t>" + linkText + "</w:t>" + 
     390            "</w:r>" + 
     391            "</w:hyperlink>"; 
     392 
     393                        return (Hyperlink)XmlUtils.unmarshalString(hpl); 
     394                         
     395                } catch (Exception e) { 
     396                        // TODO Auto-generated catch block 
     397                        e.printStackTrace(); 
     398                        return null; 
     399                } 
     400                 
     401                 
     402        } 
     403     
     404     
    293405    public static void main(String[] args) throws Exception { 
    294406         
     
    298410             
    299411                WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();                 
    300                 wordMLPackage.getMainDocumentPart().getContent().addAll( convert(f) ); 
     412                wordMLPackage.getMainDocumentPart().getContent().addAll( convert(f, null) ); 
    301413                 
    302414                wordMLPackage.save(new java.io.File(System.getProperty("user.dir") + "/html_output.docx") ); 
  • trunk/docx4j/src/main/java/org/docx4j/model/datastorage/BindingHandler.java

    r1702 r1706  
    33import java.io.IOException; 
    44import java.util.HashMap; 
     5import java.util.List; 
    56import java.util.Map; 
    67import java.util.StringTokenizer; 
     
    1718 
    1819import org.apache.commons.codec.binary.Base64; 
     20import org.apache.commons.lang.StringEscapeUtils; 
    1921import org.apache.log4j.Logger; 
    2022import org.apache.xmlgraphics.image.loader.ImageSize; 
    2123import org.docx4j.XmlUtils; 
     24import org.docx4j.convert.in.css.Importer; 
    2225import org.docx4j.dml.wordprocessingDrawing.Inline; 
    2326import org.docx4j.jaxb.Context; 
     
    3538import org.docx4j.openpackaging.parts.relationships.RelationshipsPart; 
    3639import org.docx4j.relationships.Relationship; 
     40import org.docx4j.wml.P; 
    3741import org.docx4j.wml.P.Hyperlink; 
    3842import org.docx4j.wml.RPr; 
     
    244248                } 
    245249 
     250                //&lt;html&gt;&lt;body&gt;  &lt;p&gt;hello &lt;/p&gt; &lt;/body&gt;&lt;/html&gt; 
     251                 
     252                /** 
     253                 * Convert the input XHTML into a WordML w3c DocumentFragment, which Xalan  
     254                 * can insert into XSLT output. 
     255                 * 
     256                 * Note that the input XHTML must be suitable for the context  
     257                 * ie you can't insert block level stuff (eg p) into a run level sdt. 
     258                 */ 
     259                public static DocumentFragment convertXHTML( 
     260                                WordprocessingMLPackage pkg,  
     261                                JaxbXmlPart sourcePart,                          
     262                                Map<String, CustomXmlDataStoragePart> customXmlDataStorageParts, 
     263                                String storeItemId, String xpath, String prefixMappings, 
     264                                String sdtParent, 
     265                                String contentChild,                             
     266                                NodeIterator rPrNodeIt,  
     267                                String tag) { 
     268 
     269                        log.info("convertXHTML extension function"); 
     270                         
     271                        String r = xpathGetString(pkg, customXmlDataStorageParts, storeItemId, xpath, prefixMappings); 
     272                        if (r==null) return null; 
     273                         
     274                        try { 
     275                                String unescaped = StringEscapeUtils.unescapeHtml(r); 
     276                                log.info("Unescaped: " + unescaped); 
     277                                 
     278                                List<Object> results = Importer.convertFromString(unescaped, sourcePart.getRelationshipsPart() ); 
     279                                log.info("Got results: " + results.size() ); 
     280                                 
     281                                org.w3c.dom.Document docContainer = XmlUtils.neww3cDomDocument(); 
     282                                DocumentFragment docfrag = docContainer.createDocumentFragment(); 
     283                                 
     284                                if (results.size()>0 &&  
     285                                                contentChild.equals("r") ) { 
     286                                        // Only accept the first result object 
     287                                         
     288                                        // A span seems to come back as a w:p, so extract contents                                       
     289                                        if ( results.get(0) instanceof P) { 
     290                                                 
     291                                                for (Object o : ((P)results.get(0)).getContent() ) {                                                     
     292                                                        Document tmpDoc = XmlUtils.marshaltoW3CDomDocument(o); 
     293                                                        XmlUtils.treeCopy(tmpDoc.getDocumentElement(), docfrag);                                                                                                         
     294                                                } 
     295                                                 
     296                                        } else { 
     297                                                log.error("TODO: handle case where conversion returns " + results.get(0).getClass().getName() ); 
     298                                        } 
     299                                         
     300                                } else { 
     301         
     302                                         
     303                                        for(Object o : results) { 
     304                                                 
     305                                                String debug = XmlUtils.marshaltoString(o, true); 
     306                                                log.info("Conversion result: " + debug); 
     307                                                 
     308                                                Document tmpDoc = XmlUtils.marshaltoW3CDomDocument(o); 
     309                                                XmlUtils.treeCopy(tmpDoc.getDocumentElement(), docfrag);                                                 
     310                                                 
     311                                        } 
     312                                } 
     313                                 
     314                                // TODO: handle table related cases 
     315                                 
     316                                return docfrag;                  
     317                                 
     318                        } catch (Exception e) { 
     319                                log.error(e); 
     320                                return null; 
     321                        } 
     322                } 
    246323                 
    247324                 
     
    253330                                Map<String, CustomXmlDataStoragePart> customXmlDataStorageParts, 
    254331                                String storeItemId, String xpath, String prefixMappings, 
    255                                 NodeIterator rPrNodeIt, boolean multiLine) { 
     332                                String sdtParent, 
     333                                String contentChild,                             
     334                                NodeIterator rPrNodeIt, boolean multiLine, 
     335                                String tag) { 
    256336                         
    257337                        /** 
     
    561641                                XPathsPart xPathsPart, 
    562642                                String odTag,  
     643                                String sdtParent, 
     644                                String contentChild,                             
    563645                                NodeIterator rPrNodeIt, boolean multiLine) { 
    564646                         
     
    582664                                         customXmlDataStorageParts, 
    583665                                         storeItemId,  xpathExp,  prefixMappings, 
    584                                          rPrNodeIt,  multiLine); 
     666                                         sdtParent, contentChild, 
     667                                         rPrNodeIt,  multiLine, odTag); 
    585668                         
    586669                } 
  • trunk/docx4j/src/main/java/org/docx4j/model/datastorage/bind.xslt

    r1662 r1706  
    3131 
    3232  <xsl:template match="w:sdt">   
     33   
     34        <xsl:variable name="tag" select="string(w:sdtPr/w:tag/@w:val)"/> 
     35         
    3336        <xsl:choose> 
     37         
     38                <xsl:when test="contains( string(w:sdtPr/w:tag/@w:val), 'od:ContentType=application/xhtml+xml' )"> 
     39                        <!--  Convert XHTML --> 
     40                        <xsl:copy> 
     41                             <xsl:apply-templates select="w:sdtPr"/> 
     42                              
     43                             <xsl:if test="w:stdEndPr"> 
     44                                <xsl:copy-of select="w:sdtEndPr"/> 
     45                        </xsl:if> 
     46                              
     47                             <w:sdtContent> 
     48                                 
     49                                        <xsl:choose> 
     50                                                <xsl:when test="w:sdtContent/w:tbl"> 
     51                                                        <w:tbl> 
     52                                                                <xsl:copy-of select="w:sdtContent/w:tbl/w:tblPr"/> 
     53                                                                <xsl:copy-of select="w:sdtContent/w:tbl/w:tblGrid"/> 
     54                                                                <w:tr> 
     55                                                                        <xsl:copy-of select="w:sdtContent/w:tbl/w:tr/w:trPr"/> 
     56                                                                        <w:tc> 
     57                                                                                <xsl:copy-of select="w:sdtContent/w:tbl/w:tr/w:trPr/w:tc/w:tcPr"/> 
     58                                                                                <w:p> 
     59                                                                                        <xsl:copy-of select="w:sdtContent/w:tbl/w:tr/w:tc/w:p/w:pPr"/> 
     60                                                                                         
     61                                                                                        <xsl:copy-of 
     62                                                                                        select="java:org.docx4j.model.datastorage.BindingHandler.convertXHTML( 
     63                                                                                                                $wmlPackage, 
     64                                                                                                                $sourcePart, 
     65                                                                                                                $customXmlDataStorageParts, 
     66                                                                                                                string(w:sdtPr/w:dataBinding/@w:storeItemID), 
     67                                                                                                                string(w:sdtPr/w:dataBinding/@w:xpath), 
     68                                                                                                                string(w:sdtPr/w:dataBinding/@w:prefixMappings), 
     69                                                                                local-name(..), 
     70                                                                                local-name(w:sdtContent/*[1]), 
     71                                                                                                                w:sdtPr/w:rPr, 
     72                                                                                                                $tag )" /> 
     73                                                                                </w:p> 
     74                                                                        </w:tc> 
     75                                                                </w:tr> 
     76                                                        </w:tbl> 
     77                                                </xsl:when>                                              
     78                                                <xsl:when test="w:sdtContent/w:tr"> 
     79                                                        <w:tr> 
     80                                                                <xsl:copy-of select="w:sdtContent/w:tr/w:trPr"/> 
     81                                                                <w:tc> 
     82                                                                        <xsl:copy-of select="w:sdtContent/w:tr/w:trPr/w:tc/w:tcPr"/> 
     83                                                                        <w:p> 
     84                                                                                <xsl:copy-of select="w:sdtContent/w:tr/w:tc/w:p/w:pPr"/> 
     85                                                                                 
     86                                                                                <xsl:copy-of 
     87                                                                                select="java:org.docx4j.model.datastorage.BindingHandler.convertXHTML( 
     88                                                                                                        $wmlPackage, 
     89                                                                                                        $sourcePart, 
     90                                                                                                        $customXmlDataStorageParts, 
     91                                                                                                        string(w:sdtPr/w:dataBinding/@w:storeItemID), 
     92                                                                                                        string(w:sdtPr/w:dataBinding/@w:xpath), 
     93                                                                                                        string(w:sdtPr/w:dataBinding/@w:prefixMappings), 
     94                                                                                local-name(..), 
     95                                                                                local-name(w:sdtContent/*[1]), 
     96                                                                                                        w:sdtPr/w:rPr, 
     97                                                                                                        $tag )" /> 
     98                                                                        </w:p> 
     99                                                                </w:tc> 
     100                                                        </w:tr> 
     101                                                </xsl:when>                                              
     102                                                <xsl:when test="w:sdtContent/w:tc"> 
     103                                                        <w:tc> 
     104                                                                <!--  preserve existing w:tcPr --> 
     105                                                                <xsl:copy-of select="w:sdtContent/w:tc/w:tcPr"/> 
     106                                                                <w:p> 
     107                                                                        <!--  preserve existing w:pPr --> 
     108                                                                        <xsl:copy-of select="w:sdtContent/w:tc/w:p/w:pPr"/> 
     109                                                                         
     110                                                                        <!--  create runs --> 
     111                                                                        <xsl:copy-of 
     112                                                                        select="java:org.docx4j.model.datastorage.BindingHandler.convertXHTML( 
     113                                                                                                $wmlPackage, 
     114                                                                                                $sourcePart, 
     115                                                                                                $customXmlDataStorageParts, 
     116                                                                                                string(w:sdtPr/w:dataBinding/@w:storeItemID), 
     117                                                                                                string(w:sdtPr/w:dataBinding/@w:xpath), 
     118                                                                                                string(w:sdtPr/w:dataBinding/@w:prefixMappings), 
     119                                                                                local-name(..), 
     120                                                                                local-name(w:sdtContent/*[1]), 
     121                                                                                                w:sdtPr/w:rPr, 
     122                                                                                                $tag )" /> 
     123                                                                </w:p> 
     124                                                        </w:tc> 
     125                                                </xsl:when>                                              
     126                                                <xsl:when test="w:sdtContent/w:p"> 
     127                                                 
     128                                                                <!--  preserve existing w:pPr mode?  
     129                                                                        <xsl:copy-of select="w:sdtContent/w:p/w:pPr"/> 
     130                                                                --> 
     131                                                                 
     132                                                                <!--  create runs --> 
     133                                                                <xsl:copy-of 
     134                                                                select="java:org.docx4j.model.datastorage.BindingHandler.convertXHTML( 
     135                                                                                        $wmlPackage, 
     136                                                                                        $sourcePart, 
     137                                                                                        $customXmlDataStorageParts, 
     138                                                                                        string(w:sdtPr/w:dataBinding/@w:storeItemID), 
     139                                                                                        string(w:sdtPr/w:dataBinding/@w:xpath), 
     140                                                                                        string(w:sdtPr/w:dataBinding/@w:prefixMappings), 
     141                                                                                local-name(..), 
     142                                                                                local-name(w:sdtContent/*[1]), 
     143                                                                                        w:sdtPr/w:rPr, 
     144                                                                                        $tag )" /> 
     145                                                </xsl:when> 
     146                                                <xsl:otherwise>  <!--  run level -->  
     147                                                        <!--  can we insert a fragment ie multiple runs? -->             
     148                                                        <xsl:copy-of 
     149                                                        select="java:org.docx4j.model.datastorage.BindingHandler.convertXHTML( 
     150                                                                                $wmlPackage, 
     151                                                                                $sourcePart, 
     152                                                                                $customXmlDataStorageParts, 
     153                                                                                string(w:sdtPr/w:dataBinding/@w:storeItemID), 
     154                                                                                string(w:sdtPr/w:dataBinding/@w:xpath), 
     155                                                                                string(w:sdtPr/w:dataBinding/@w:prefixMappings), 
     156                                                                                local-name(..), 
     157                                                                                local-name(w:sdtContent/*[1]), 
     158                                                                                w:sdtPr/w:rPr, 
     159                                                                                $tag )" /> 
     160                                                </xsl:otherwise>                 
     161                                        </xsl:choose>     
     162                             </w:sdtContent> 
     163                              
     164                        </xsl:copy>                                      
     165                </xsl:when> 
     166                 
     167                 
     168                 
     169                 
     170                <xsl:when test="contains(string(w:sdtPr/w:tag/@w:val), 'od:xpath')"> 
     171                        <!--  honour extended bind (Word databinding only works when a element is returned); 
     172                                  (this used to be in OpenDoPEHandler, but moved 13 Sept 2011 for docx4j 2.7.1. 
     173                              here we support boolean, integer. What to do with node-set?? --> 
     174                        <xsl:copy> 
     175                             <xsl:apply-templates select="w:sdtPr"/> 
     176                              
     177                             <xsl:if test="w:stdEndPr"> 
     178                                <xsl:copy-of select="w:sdtEndPr"/> 
     179                        </xsl:if> 
     180                              
     181                             <w:sdtContent> 
     182                                <xsl:variable name="multiLine" select="w:sdtPr/w:text/@w:multiLine='1' or w:sdtPr/w:text/@w:multiLine='true' or w:sdtPr/w:text/@w:multiLine='yes'" />  
     183                                 
     184                                        <xsl:choose> 
     185                                                <xsl:when test="w:sdtContent/w:tbl"> 
     186                                                        <w:tbl> 
     187                                                                <xsl:copy-of select="w:sdtContent/w:tbl/w:tblPr"/> 
     188                                                                <xsl:copy-of select="w:sdtContent/w:tbl/w:tblGrid"/> 
     189                                                                <w:tr> 
     190                                                                        <xsl:copy-of select="w:sdtContent/w:tbl/w:tr/w:trPr"/> 
     191                                                                        <w:tc> 
     192                                                                                <xsl:copy-of select="w:sdtContent/w:tbl/w:tr/w:trPr/w:tc/w:tcPr"/> 
     193                                                                                <w:p> 
     194                                                                                        <xsl:copy-of select="w:sdtContent/w:tbl/w:tr/w:tc/w:p/w:pPr"/> 
     195                                                                                         
     196                                                                                        <xsl:copy-of 
     197                                                                                        select="java:org.docx4j.model.datastorage.BindingHandler.xpathGenerateRuns( 
     198                                                                                                                $wmlPackage, 
     199                                                                                                                $sourcePart, 
     200                                                                                                                $customXmlDataStorageParts, 
     201                                                                                                                $xPathsPart, 
     202                                                                                                                string(w:sdtPr/w:tag/@w:val), 
     203                                                                                local-name(..), 
     204                                                                                local-name(w:sdtContent/*[1]), 
     205                                                                                                                w:sdtPr/w:rPr, 
     206                                                                                                                $multiLine)" /> 
     207                                                                                </w:p> 
     208                                                                        </w:tc> 
     209                                                                </w:tr> 
     210                                                        </w:tbl> 
     211                                                </xsl:when>                                              
     212                                                <xsl:when test="w:sdtContent/w:tr"> 
     213                                                        <w:tr> 
     214                                                                <xsl:copy-of select="w:sdtContent/w:tr/w:trPr"/> 
     215                                                                <w:tc> 
     216                                                                        <xsl:copy-of select="w:sdtContent/w:tr/w:trPr/w:tc/w:tcPr"/> 
     217                                                                        <w:p> 
     218                                                                                <xsl:copy-of select="w:sdtContent/w:tr/w:tc/w:p/w:pPr"/> 
     219                                                                                 
     220                                                                                <xsl:copy-of 
     221                                                                                select="java:org.docx4j.model.datastorage.BindingHandler.xpathGenerateRuns( 
     222                                                                                                        $wmlPackage, 
     223                                                                                                        $sourcePart, 
     224                                                                                                        $customXmlDataStorageParts, 
     225                                                                                                        $xPathsPart, 
     226                                                                                                        string(w:sdtPr/w:tag/@w:val), 
     227                                                                                local-name(..), 
     228                                                                                local-name(w:sdtContent/*[1]), 
     229                                                                                                        w:sdtPr/w:rPr, 
     230                                                                                                        $multiLine)" /> 
     231                                                                        </w:p> 
     232                                                                </w:tc> 
     233                                                        </w:tr> 
     234                                                </xsl:when>                                              
     235                                                <xsl:when test="w:sdtContent/w:tc"> 
     236                                                        <w:tc> 
     237                                                                <!--  preserve existing w:tcPr --> 
     238                                                                <xsl:copy-of select="w:sdtContent/w:tc/w:tcPr"/> 
     239                                                                <w:p> 
     240                                                                        <!--  preserve existing w:pPr --> 
     241                                                                        <xsl:copy-of select="w:sdtContent/w:tc/w:p/w:pPr"/> 
     242                                                                         
     243                                                                        <!--  create runs --> 
     244                                                                        <xsl:copy-of 
     245                                                                        select="java:org.docx4j.model.datastorage.BindingHandler.xpathGenerateRuns( 
     246                                                                                                $wmlPackage, 
     247                                                                                                $sourcePart, 
     248                                                                                                $customXmlDataStorageParts, 
     249                                                                                                $xPathsPart, 
     250                                                                                                string(w:sdtPr/w:tag/@w:val), 
     251                                                                                local-name(..), 
     252                                                                                local-name(w:sdtContent/*[1]), 
     253                                                                                                w:sdtPr/w:rPr, 
     254                                                                                                $multiLine)" /> 
     255                                                                </w:p> 
     256                                                        </w:tc> 
     257                                                </xsl:when>                                              
     258                                                <xsl:when test="w:sdtContent/w:p"> 
     259                                                        <w:p> 
     260                                                                <!--  preserve existing w:pPr --> 
     261                                                                <xsl:copy-of select="w:sdtContent/w:p/w:pPr"/> 
     262                                                                 
     263                                                                <!--  create runs --> 
     264                                                                <xsl:copy-of 
     265                                                                select="java:org.docx4j.model.datastorage.BindingHandler.xpathGenerateRuns( 
     266                                                                                        $wmlPackage, 
     267                                                                                        $sourcePart, 
     268                                                                                        $customXmlDataStorageParts, 
     269                                                                                        $xPathsPart, 
     270                                                                                        string(w:sdtPr/w:tag/@w:val), 
     271                                                                                local-name(..), 
     272                                                                                local-name(w:sdtContent/*[1]), 
     273                                                                                        w:sdtPr/w:rPr, 
     274                                                                                        $multiLine)" /> 
     275                                                        </w:p> 
     276                                                </xsl:when> 
     277                                                <xsl:otherwise>  <!--  run level -->  
     278                                                        <!--  can we insert a fragment ie multiple runs? -->             
     279                                                        <xsl:copy-of 
     280                                                        select="java:org.docx4j.model.datastorage.BindingHandler.xpathGenerateRuns( 
     281                                                                                $wmlPackage, 
     282                                                                                $sourcePart, 
     283                                                                                $customXmlDataStorageParts, 
     284                                                                                $xPathsPart, 
     285                                                                                string(w:sdtPr/w:tag/@w:val), 
     286                                                                                local-name(..), 
     287                                                                                local-name(w:sdtContent/*[1]), 
     288                                                                                w:sdtPr/w:rPr, 
     289                                                                                $multiLine)" /> 
     290                                                </xsl:otherwise>                 
     291                                        </xsl:choose>     
     292                             </w:sdtContent> 
     293                              
     294                        </xsl:copy>                                      
     295                </xsl:when> 
     296                 
    34297                <xsl:when test="w:sdtPr/w:dataBinding and not(w:sdtPr/w:richText) and not(w:sdtPr/w:docPartGallery)"> 
    35298                        <!--  honour w:dataBinding --> 
     
    78341                                                                                                                string(w:sdtPr/w:dataBinding/@w:xpath), 
    79342                                                                                                                string(w:sdtPr/w:dataBinding/@w:prefixMappings), 
     343                                                                                local-name(..), 
     344                                                                                local-name(w:sdtContent/*[1]), 
    80345                                                                                                                w:sdtPr/w:rPr, 
    81                                                                                                                 $multiLine )" /> 
     346                                                                                                                $multiLine, 
     347                                                                                                                $tag )" /> 
    82348                                                                                </w:p> 
    83349                                                                        </w:tc> 
     
    101367                                                                                                        string(w:sdtPr/w:dataBinding/@w:xpath), 
    102368                                                                                                        string(w:sdtPr/w:dataBinding/@w:prefixMappings), 
     369                                                                                local-name(..), 
     370                                                                                local-name(w:sdtContent/*[1]), 
    103371                                                                                                        w:sdtPr/w:rPr, 
    104                                                                                                         $multiLine )" /> 
     372                                                                                                        $multiLine, 
     373                                                                                                        $tag )" /> 
    105374                                                                        </w:p> 
    106375                                                                </w:tc> 
     
    124393                                                                                                string(w:sdtPr/w:dataBinding/@w:xpath), 
    125394                                                                                                string(w:sdtPr/w:dataBinding/@w:prefixMappings), 
     395                                                                                local-name(..), 
     396                                                                                local-name(w:sdtContent/*[1]), 
    126397                                                                                                w:sdtPr/w:rPr, 
    127                                                                                                 $multiLine )" /> 
     398                                                                                                $multiLine, 
     399                                                                                                $tag )" /> 
    128400                                                                </w:p> 
    129401                                                        </w:tc> 
     
    143415                                                                                        string(w:sdtPr/w:dataBinding/@w:xpath), 
    144416                                                                                        string(w:sdtPr/w:dataBinding/@w:prefixMappings), 
     417                                                                                local-name(..), 
     418                                                                                local-name(w:sdtContent/*[1]), 
    145419                                                                                        w:sdtPr/w:rPr, 
    146                                                                                         $multiLine )" /> 
     420                                                                                        $multiLine, 
     421                                                                                        $tag )" /> 
    147422                                                        </w:p> 
    148423                                                </xsl:when> 
     
    157432                                                                                string(w:sdtPr/w:dataBinding/@w:xpath), 
    158433                                                                                string(w:sdtPr/w:dataBinding/@w:prefixMappings), 
     434                                                                                local-name(..), 
     435                                                                                local-name(w:sdtContent/*[1]), 
    159436                                                                                w:sdtPr/w:rPr, 
    160                                                                                 $multiLine )" /> 
     437                                                                                $multiLine, 
     438                                                                                $tag )" /> 
    161439                                                </xsl:otherwise>                 
    162440                                        </xsl:choose>     
     
    165443                        </xsl:copy>                                      
    166444                </xsl:when> 
    167                  
    168                 <xsl:when test="contains(string(w:sdtPr/w:tag/@w:val), 'od:xpath')"> 
    169                         <!--  honour extended bind (Word databinding only works when a element is returned); 
    170                                   (this used to be in OpenDoPEHandler, but moved 13 Sept 2011 for docx4j 2.7.1. 
    171                               here we support boolean, integer. What to do with node-set?? --> 
    172                         <xsl:copy> 
    173                              <xsl:apply-templates select="w:sdtPr"/> 
    174                               
    175                              <xsl:if test="w:stdEndPr"> 
    176                                 <xsl:copy-of select="w:sdtEndPr"/> 
    177                         </xsl:if> 
    178                               
    179                              <w:sdtContent> 
    180                                 <xsl:variable name="multiLine" select="w:sdtPr/w:text/@w:multiLine='1' or w:sdtPr/w:text/@w:multiLine='true' or w:sdtPr/w:text/@w:multiLine='yes'" />  
    181                                  
    182                                         <xsl:choose> 
    183                                                 <xsl:when test="w:sdtContent/w:tbl"> 
    184                                                         <w:tbl> 
    185                                                                 <xsl:copy-of select="w:sdtContent/w:tbl/w:tblPr"/> 
    186                                                                 <xsl:copy-of select="w:sdtContent/w:tbl/w:tblGrid"/> 
    187                                                                 <w:tr> 
    188                                                                         <xsl:copy-of select="w:sdtContent/w:tbl/w:tr/w:trPr"/> 
    189                                                                         <w:tc> 
    190                                                                                 <xsl:copy-of select="w:sdtContent/w:tbl/w:tr/w:trPr/w:tc/w:tcPr"/> 
    191                                                                                 <w:p> 
    192                                                                                         <xsl:copy-of select="w:sdtContent/w:tbl/w:tr/w:tc/w:p/w:pPr"/> 
    193                                                                                          
    194                                                                                         <xsl:copy-of 
    195                                                                                         select="java:org.docx4j.model.datastorage.BindingHandler.xpathGenerateRuns( 
    196                                                                                                                 $wmlPackage, 
    197                                                                                                                 $sourcePart, 
    198                                                                                                                 $customXmlDataStorageParts, 
    199                                                                                                                 $xPathsPart, 
    200                                                                                                                 string(w:sdtPr/w:tag/@w:val), 
    201                                                                                                                 w:sdtPr/w:rPr, 
    202                                                                                                                 $multiLine )" /> 
    203                                                                                 </w:p> 
    204                                                                         </w:tc> 
    205                                                                 </w:tr> 
    206                                                         </w:tbl> 
    207                                                 </xsl:when>                                              
    208                                                 <xsl:when test="w:sdtContent/w:tr"> 
    209                                                         <w:tr> 
    210                                                                 <xsl:copy-of select="w:sdtContent/w:tr/w:trPr"/> 
    211                                                                 <w:tc> 
    212                                                                         <xsl:copy-of select="w:sdtContent/w:tr/w:trPr/w:tc/w:tcPr"/> 
    213                                                                         <w:p> 
    214                                                                                 <xsl:copy-of select="w:sdtContent/w:tr/w:tc/w:p/w:pPr"/> 
    215                                                                                  
    216                                                                                 <xsl:copy-of 
    217                                                                                 select="java:org.docx4j.model.datastorage.BindingHandler.xpathGenerateRuns( 
    218                                                                                                         $wmlPackage, 
    219                                                                                                         $sourcePart, 
    220                                                                                                         $customXmlDataStorageParts, 
    221                                                                                                         $xPathsPart, 
    222                                                                                                         string(w:sdtPr/w:tag/@w:val), 
    223                                                                                                         w:sdtPr/w:rPr, 
    224                                                                                                         $multiLine )" /> 
    225                                                                         </w:p> 
    226                                                                 </w:tc> 
    227                                                         </w:tr> 
    228                                                 </xsl:when>                                              
    229                                                 <xsl:when test="w:sdtContent/w:tc"> 
    230                                                         <w:tc> 
    231                                                                 <!--  preserve existing w:tcPr --> 
    232                                                                 <xsl:copy-of select="w:sdtContent/w:tc/w:tcPr"/> 
    233                                                                 <w:p> 
    234                                                                         <!--  preserve existing w:pPr --> 
    235                                                                         <xsl:copy-of select="w:sdtContent/w:tc/w:p/w:pPr"/> 
    236                                                                          
    237                                                                         <!--  create runs --> 
    238                                                                         <xsl:copy-of 
    239                                                                         select="java:org.docx4j.model.datastorage.BindingHandler.xpathGenerateRuns( 
    240                                                                                                 $wmlPackage, 
    241                                                                                                 $sourcePart, 
    242                                                                                                 $customXmlDataStorageParts, 
    243                                                                                                 $xPathsPart, 
    244                                                                                                 string(w:sdtPr/w:tag/@w:val), 
    245                                                                                                 w:sdtPr/w:rPr, 
    246                                                                                                 $multiLine )" /> 
    247                                                                 </w:p> 
    248                                                         </w:tc> 
    249                                                 </xsl:when>                                              
    250                                                 <xsl:when test="w:sdtContent/w:p"> 
    251                                                         <w:p> 
    252                                                                 <!--  preserve existing w:pPr --> 
    253                                                                 <xsl:copy-of select="w:sdtContent/w:p/w:pPr"/> 
    254                                                                  
    255                                                                 <!--  create runs --> 
    256                                                                 <xsl:copy-of 
    257                                                                 select="java:org.docx4j.model.datastorage.BindingHandler.xpathGenerateRuns( 
    258                                                                                         $wmlPackage, 
    259                                                                                         $sourcePart, 
    260                                                                                         $customXmlDataStorageParts, 
    261                                                                                         $xPathsPart, 
    262                                                                                         string(w:sdtPr/w:tag/@w:val), 
    263                                                                                         w:sdtPr/w:rPr, 
    264                                                                                         $multiLine )" /> 
    265                                                         </w:p> 
    266                                                 </xsl:when> 
    267                                                 <xsl:otherwise>  <!--  run level -->  
    268                                                         <!--  can we insert a fragment ie multiple runs? -->             
    269                                                         <xsl:copy-of 
    270                                                         select="java:org.docx4j.model.datastorage.BindingHandler.xpathGenerateRuns( 
    271                                                                                 $wmlPackage, 
    272                                                                                 $sourcePart, 
    273                                                                                 $customXmlDataStorageParts, 
    274                                                                                 $xPathsPart, 
    275                                                                                 string(w:sdtPr/w:tag/@w:val), 
    276                                                                                 w:sdtPr/w:rPr, 
    277                                                                                 $multiLine )" /> 
    278                                                 </xsl:otherwise>                 
    279                                         </xsl:choose>     
    280                              </w:sdtContent> 
    281                               
    282                         </xsl:copy>                                      
    283                 </xsl:when> 
    284                  
    285445                 
    286446                 
  • trunk/docx4j/src/main/java/org/docx4j/model/properties/run/FontSize.java

    r923 r1706  
    4343                CSSPrimitiveValue cssPrimitiveValue = (CSSPrimitiveValue)value; 
    4444                // Assume size is in points; sanity test. 
    45                 if (cssPrimitiveValue.getPrimitiveType()!=CSSPrimitiveValue.CSS_PT) { 
    46                         log.error("TODO Handle units: " + cssPrimitiveValue.getPrimitiveType() ); 
     45                if (cssPrimitiveValue.getPrimitiveType()==CSSPrimitiveValue.CSS_IDENT) { 
     46                        // eg 'medium' 
     47                        String adjective = cssPrimitiveValue.getStringValue(); 
     48                        log.warn("TODO Handle FontSize units properly: " + adjective );                  
     49                        if (adjective.equals("medium")) { 
     50                                hpsMeasure.setVal( BigInteger.valueOf(22) ); //11 point for now 
     51                                this.setObject(hpsMeasure);                              
     52                        } 
     53                         
     54                } else  if (cssPrimitiveValue.getPrimitiveType()!=CSSPrimitiveValue.CSS_PT) { 
     55                        log.error("TODO FontSize Handle units: " + cssPrimitiveValue.getPrimitiveType() ); 
    4756                        debug(CSS_NAME, value); 
     57                } else { 
     58                        short ignored = 1; 
     59                        float fVal = cssPrimitiveValue.getFloatValue(ignored); // unit type ignored in cssparser 
     60                        int iVal = Math.round(fVal*2); 
     61                         
     62                        hpsMeasure.setVal( BigInteger.valueOf(iVal) ); 
     63                        this.setObject(hpsMeasure); 
    4864                } 
    49                 short ignored = 1; 
    50                 float fVal = cssPrimitiveValue.getFloatValue(ignored); // unit type ignored in cssparser 
    51                 int iVal = Math.round(fVal*2); 
    52                  
    53                 hpsMeasure.setVal( BigInteger.valueOf(iVal) ); 
    54                  
    55                 this.setObject(hpsMeasure); 
    5665        } 
    5766 
Note: See TracChangeset for help on using the changeset viewer.