Changeset 1706
- Timestamp:
- 11/12/11 09:27:55 (6 months ago)
- Location:
- trunk/docx4j/src
- Files:
-
- 5 edited
-
main/java/org/docx4j/convert/in/css/Importer.java (modified) (17 diffs)
-
main/java/org/docx4j/model/datastorage/BindingHandler.java (modified) (7 diffs)
-
main/java/org/docx4j/model/datastorage/bind.xslt (modified) (7 diffs)
-
main/java/org/docx4j/model/properties/run/FontSize.java (modified) (1 diff)
-
test/resources/OpenDoPE/escaped-xhtml.xml (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/docx4j/src/main/java/org/docx4j/convert/in/css/Importer.java
r1700 r1706 9 9 10 10 import org.apache.log4j.Logger; 11 import org.docx4j.XmlUtils; 11 12 import org.docx4j.jaxb.Context; 12 13 import org.docx4j.model.properties.Property; … … 15 16 import org.docx4j.model.properties.run.AbstractRunProperty; 16 17 import org.docx4j.openpackaging.packages.WordprocessingMLPackage; 18 import org.docx4j.openpackaging.parts.relationships.Namespaces; 19 import org.docx4j.openpackaging.parts.relationships.RelationshipsPart; 17 20 import org.docx4j.org.xhtmlrenderer.css.constants.CSSName; 18 21 import org.docx4j.org.xhtmlrenderer.css.constants.IdentValue; … … 26 29 import org.docx4j.org.xhtmlrenderer.render.Box; 27 30 import org.docx4j.org.xhtmlrenderer.render.InlineBox; 31 import org.docx4j.relationships.Relationships; 28 32 import org.docx4j.wml.P; 29 33 import org.docx4j.wml.PPr; … … 31 35 import org.docx4j.wml.RPr; 32 36 import org.docx4j.wml.Text; 37 import org.docx4j.wml.P.Hyperlink; 33 38 import org.w3c.dom.Element; 34 39 import org.w3c.dom.css.CSSValue; 35 40 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 */ 36 56 public class Importer { 37 57 … … 39 59 40 60 private List<Object> imports = new ArrayList<Object>(); 61 // public List<Object> getImportedContent() { 62 // return imports; 63 // } 41 64 42 65 private P currentP; 43 66 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 { 47 74 48 75 DocxRenderer renderer = new DocxRenderer(); … … 50 77 renderer.layout(); 51 78 52 Importer importer = new Importer( );79 Importer importer = new Importer(rp); 53 80 importer.traverse(renderer.getRootBox(), ""); 54 81 … … 56 83 } 57 84 58 public List<Object> convert(String uri) {85 public static List<Object> convert(String uri, RelationshipsPart rp) { 59 86 60 87 DocxRenderer renderer = new DocxRenderer(); … … 62 89 renderer.layout(); 63 90 64 Importer importer = new Importer( );91 Importer importer = new Importer(rp); 65 92 importer.traverse(renderer.getRootBox(), ""); 66 93 … … 68 95 } 69 96 70 public List<Object> convertFromString(String content) {97 public static List<Object> convertFromString(String content, RelationshipsPart rp) { 71 98 72 99 DocxRenderer renderer = new DocxRenderer(); … … 74 101 renderer.layout(); 75 102 76 Importer importer = new Importer( );103 Importer importer = new Importer(rp); 77 104 importer.traverse(renderer.getRootBox(), ""); 78 105 … … 114 141 } 115 142 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) { 117 148 118 149 //log.info(box.getClass().getName() ); … … 146 177 if (currentP==null) { 147 178 currentP = Context.getWmlObjectFactory().createP(); 179 imports.add(currentP); 180 paraStillEmpty = true; 148 181 } 149 182 } else { 150 183 currentP = Context.getWmlObjectFactory().createP(); 151 184 imports.add(currentP); 185 paraStillEmpty = true; 152 186 153 187 // Paragraph level styling … … 176 210 Styleable s = ((InlineBox)o); 177 211 212 boolean isHyperlink = false; 213 178 214 String debug = ""; 179 215 if (s==null) { … … 182 218 if (s.getElement()!=null) { 183 219 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 } 184 240 } 185 241 if (s.getStyle()!=null) { … … 188 244 } 189 245 246 190 247 log.info(debug ); 191 248 //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 { 193 252 log.info( ((InlineBox)o).getTextNode().getTextContent() ); // don't use .getText() 253 254 String theText = ((InlineBox)o).getTextNode().getTextContent(); 194 255 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 // } 202 291 } 203 run.getContent().add(text);204 205 currentP.getContent().add(run);206 207 // Run level styling208 if (s.getStyle()!=null) { // shouldn't happen209 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 p216 // //Map cssMap = styleReference.getCascadedPropertiesMap(e);217 // run.setRPr(218 // addRunProperties( cssMap ));219 // }220 221 292 } 222 223 293 224 294 } else if (o instanceof BlockBox ) { … … 291 361 } 292 362 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 293 405 public static void main(String[] args) throws Exception { 294 406 … … 298 410 299 411 WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage(); 300 wordMLPackage.getMainDocumentPart().getContent().addAll( convert(f ) );412 wordMLPackage.getMainDocumentPart().getContent().addAll( convert(f, null) ); 301 413 302 414 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 3 3 import java.io.IOException; 4 4 import java.util.HashMap; 5 import java.util.List; 5 6 import java.util.Map; 6 7 import java.util.StringTokenizer; … … 17 18 18 19 import org.apache.commons.codec.binary.Base64; 20 import org.apache.commons.lang.StringEscapeUtils; 19 21 import org.apache.log4j.Logger; 20 22 import org.apache.xmlgraphics.image.loader.ImageSize; 21 23 import org.docx4j.XmlUtils; 24 import org.docx4j.convert.in.css.Importer; 22 25 import org.docx4j.dml.wordprocessingDrawing.Inline; 23 26 import org.docx4j.jaxb.Context; … … 35 38 import org.docx4j.openpackaging.parts.relationships.RelationshipsPart; 36 39 import org.docx4j.relationships.Relationship; 40 import org.docx4j.wml.P; 37 41 import org.docx4j.wml.P.Hyperlink; 38 42 import org.docx4j.wml.RPr; … … 244 248 } 245 249 250 //<html><body> <p>hello </p> </body></html> 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 } 246 323 247 324 … … 253 330 Map<String, CustomXmlDataStoragePart> customXmlDataStorageParts, 254 331 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) { 256 336 257 337 /** … … 561 641 XPathsPart xPathsPart, 562 642 String odTag, 643 String sdtParent, 644 String contentChild, 563 645 NodeIterator rPrNodeIt, boolean multiLine) { 564 646 … … 582 664 customXmlDataStorageParts, 583 665 storeItemId, xpathExp, prefixMappings, 584 rPrNodeIt, multiLine); 666 sdtParent, contentChild, 667 rPrNodeIt, multiLine, odTag); 585 668 586 669 } -
trunk/docx4j/src/main/java/org/docx4j/model/datastorage/bind.xslt
r1662 r1706 31 31 32 32 <xsl:template match="w:sdt"> 33 34 <xsl:variable name="tag" select="string(w:sdtPr/w:tag/@w:val)"/> 35 33 36 <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 34 297 <xsl:when test="w:sdtPr/w:dataBinding and not(w:sdtPr/w:richText) and not(w:sdtPr/w:docPartGallery)"> 35 298 <!-- honour w:dataBinding --> … … 78 341 string(w:sdtPr/w:dataBinding/@w:xpath), 79 342 string(w:sdtPr/w:dataBinding/@w:prefixMappings), 343 local-name(..), 344 local-name(w:sdtContent/*[1]), 80 345 w:sdtPr/w:rPr, 81 $multiLine )" /> 346 $multiLine, 347 $tag )" /> 82 348 </w:p> 83 349 </w:tc> … … 101 367 string(w:sdtPr/w:dataBinding/@w:xpath), 102 368 string(w:sdtPr/w:dataBinding/@w:prefixMappings), 369 local-name(..), 370 local-name(w:sdtContent/*[1]), 103 371 w:sdtPr/w:rPr, 104 $multiLine )" /> 372 $multiLine, 373 $tag )" /> 105 374 </w:p> 106 375 </w:tc> … … 124 393 string(w:sdtPr/w:dataBinding/@w:xpath), 125 394 string(w:sdtPr/w:dataBinding/@w:prefixMappings), 395 local-name(..), 396 local-name(w:sdtContent/*[1]), 126 397 w:sdtPr/w:rPr, 127 $multiLine )" /> 398 $multiLine, 399 $tag )" /> 128 400 </w:p> 129 401 </w:tc> … … 143 415 string(w:sdtPr/w:dataBinding/@w:xpath), 144 416 string(w:sdtPr/w:dataBinding/@w:prefixMappings), 417 local-name(..), 418 local-name(w:sdtContent/*[1]), 145 419 w:sdtPr/w:rPr, 146 $multiLine )" /> 420 $multiLine, 421 $tag )" /> 147 422 </w:p> 148 423 </xsl:when> … … 157 432 string(w:sdtPr/w:dataBinding/@w:xpath), 158 433 string(w:sdtPr/w:dataBinding/@w:prefixMappings), 434 local-name(..), 435 local-name(w:sdtContent/*[1]), 159 436 w:sdtPr/w:rPr, 160 $multiLine )" /> 437 $multiLine, 438 $tag )" /> 161 439 </xsl:otherwise> 162 440 </xsl:choose> … … 165 443 </xsl:copy> 166 444 </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-of195 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-of217 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-of239 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-of257 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-of270 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 285 445 286 446 -
trunk/docx4j/src/main/java/org/docx4j/model/properties/run/FontSize.java
r923 r1706 43 43 CSSPrimitiveValue cssPrimitiveValue = (CSSPrimitiveValue)value; 44 44 // 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() ); 47 56 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); 48 64 } 49 short ignored = 1;50 float fVal = cssPrimitiveValue.getFloatValue(ignored); // unit type ignored in cssparser51 int iVal = Math.round(fVal*2);52 53 hpsMeasure.setVal( BigInteger.valueOf(iVal) );54 55 this.setObject(hpsMeasure);56 65 } 57 66 -
trunk/docx4j/src/test/resources/OpenDoPE/escaped-xhtml.xml
r1705 r1706 122 122 </w:pPr> 123 123 <w:r> 124 <w:t>multiple p </w:t>124 <w:t>multiple p in body</w:t> 125 125 </w:r> 126 126 </w:p> … … 133 133 </w:placeholder> 134 134 <w:dataBinding w:xpath="/yourxml/case4" w:storeItemID="{20B8AAA6-2C95-41E0-AB0F-D96D3E3AA22F}"/> 135 <w:text/> 136 </w:sdtPr> 137 <w:sdtContent> 138 <w:p> 139 <w:r> 140 <w:t xml:space="preserve"> <div> <p>hello 1</p> <p>hello 2</p> </div> </w:t> 141 </w:r> 142 </w:p> 143 </w:sdtContent> 144 </w:sdt> 145 <w:p> 146 <w:pPr> 147 <w:pStyle w:val="Heading1"/> 148 </w:pPr> 149 <w:r> 150 <w:t>multiple p in div</w:t> 151 </w:r> 152 </w:p> 153 <w:sdt> 154 <w:sdtPr> 155 <w:tag w:val="od:xpath=case4B&od:ContentType=application/xhtml+xml"/> 156 <w:id w:val="7800137800"/> 157 <w:placeholder> 158 <w:docPart w:val="DefaultPlaceholder_22675703"/> 159 </w:placeholder> 160 <w:dataBinding w:xpath="/yourxml/case4B" w:storeItemID="{20B8AAA6-2C95-41E0-AB0F-D96D3E3AA22F}"/> 135 161 <w:text/> 136 162 </w:sdtPr> … … 676 702 <case3> <p>hello </p> </case3> 677 703 <case4> 704 <body> 705 <p>hello 1</p> 706 <p>hello 2</p> 707 </body> 708 </case4> 709 <case4B> 678 710 <div> 679 711 <p>hello 1</p> 680 712 <p>hello 2</p> 681 713 </div> 682 </case4 >683 <case5> <span>Please <a href="mailto:foo@bar">click to email</a> < /span> now!</case5>714 </case4B> 715 <case5> <span>Please <a href="mailto:foo@bar">click to email</a> <b>now!</b> </span></case5> 684 716 </yourxml> 685 717 </pkg:xmlData>
Note: See TracChangeset
for help on using the changeset viewer.
