Changeset 1715 for trunk/docx4j
- Timestamp:
- 11/16/11 13:53:09 (6 months ago)
- Location:
- trunk/docx4j/src/main/java/org/docx4j
- Files:
-
- 1 added
- 4 edited
-
convert/in/css/Importer.java (modified) (10 diffs)
-
convert/in/css/ListHelper.java (added)
-
model/datastorage/BindingHandler.java (modified) (2 diffs)
-
openpackaging/parts/WordprocessingML/NumberingDefinitionsPart.java (modified) (1 diff)
-
wml/Numbering.java (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/docx4j/src/main/java/org/docx4j/convert/in/css/Importer.java
r1708 r1715 8 8 import java.util.List; 9 9 import java.util.Map; 10 11 import javax.xml.bind.JAXBException; 10 12 11 13 import org.apache.log4j.Logger; … … 72 74 73 75 private RelationshipsPart rp; 74 75 private Importer(RelationshipsPart rp) { 76 this.rp = rp; 77 } 78 79 public static List<Object> convert(File file, RelationshipsPart rp) throws IOException { 76 private NumberingDefinitionsPart ndp; 77 78 private ListHelper listHelper; 79 80 private Importer(RelationshipsPart rp, NumberingDefinitionsPart ndp) { 81 this.rp = rp; 82 this.ndp = ndp; 83 listHelper = new ListHelper(); 84 } 85 86 public static List<Object> convert(File file, RelationshipsPart rp, NumberingDefinitionsPart ndp) throws IOException { 80 87 81 88 DocxRenderer renderer = new DocxRenderer(); … … 83 90 renderer.layout(); 84 91 85 Importer importer = new Importer(rp );92 Importer importer = new Importer(rp, ndp); 86 93 importer.traverse(renderer.getRootBox(), ""); 87 94 … … 89 96 } 90 97 91 public static List<Object> convert(String uri, RelationshipsPart rp ) {98 public static List<Object> convert(String uri, RelationshipsPart rp, NumberingDefinitionsPart ndp) { 92 99 93 100 DocxRenderer renderer = new DocxRenderer(); … … 95 102 renderer.layout(); 96 103 97 Importer importer = new Importer(rp );104 Importer importer = new Importer(rp, ndp); 98 105 importer.traverse(renderer.getRootBox(), ""); 99 106 … … 101 108 } 102 109 103 public static List<Object> convertFromString(String content, RelationshipsPart rp ) {110 public static List<Object> convertFromString(String content, RelationshipsPart rp, NumberingDefinitionsPart ndp) { 104 111 105 112 DocxRenderer renderer = new DocxRenderer(); … … 107 114 renderer.layout(); 108 115 109 Importer importer = new Importer(rp );116 Importer importer = new Importer(rp, ndp); 110 117 importer.traverse(renderer.getRootBox(), ""); 111 118 … … 203 210 if (e.getNodeName().equals("li")) { 204 211 205 log.info( cssMap.get("list-style-type" ) );206 212 207 // TODO: code to generate appropriate numbering on first use, and store it in map 208 // Then we can just fetch it. 209 210 paraStillEmpty = false; 211 212 // Create and add <w:numPr> 213 NumPr numPr = Context.getWmlObjectFactory().createPPrBaseNumPr(); 214 currentP.getPPr().setNumPr(numPr); 215 216 // The <w:numId> element 217 NumId numIdElement = Context.getWmlObjectFactory().createPPrBaseNumPrNumId(); 218 numPr.setNumId(numIdElement); 219 numIdElement.setVal(BigInteger.valueOf(1)); 220 221 // The <w:ilvl> element 222 Ilvl ilvlElement = Context.getWmlObjectFactory().createPPrBaseNumPrIlvl(); 223 numPr.setIlvl(ilvlElement); 224 ilvlElement.setVal(BigInteger.valueOf(0)); 225 226 // TMP: don't let this override our numbering 227 currentP.getPPr().setInd(null); 228 213 Numbering.Num num = null; 214 try { 215 if ( cssMap.get("list-style-type" ).getCssText().equals("decimal")) { 216 num = listHelper.getOrderedList(ndp); 217 } 218 if (cssMap.get("list-style-type" ).getCssText().equals("disc")) { 219 num = listHelper.getUnorderedList(ndp); 220 } 221 222 // TODO: support other list-style-type 223 224 // TODO: generate list definitions based on CSS 225 // (and multiple list definitions) 226 227 } catch (JAXBException je) { 228 // Shouldn't happen 229 je.printStackTrace(); 230 log.error(e); 231 } 232 233 if (num==null) { 234 log.warn( "No support for list-style-type: " 235 + cssMap.get("list-style-type" ).getCssText() ); // eg decimal, disc 236 237 } else { 238 239 paraStillEmpty = false; 240 241 // Create and add <w:numPr> 242 NumPr numPr = Context.getWmlObjectFactory().createPPrBaseNumPr(); 243 currentP.getPPr().setNumPr(numPr); 244 245 // The <w:numId> element 246 NumId numIdElement = Context.getWmlObjectFactory().createPPrBaseNumPrNumId(); 247 numPr.setNumId(numIdElement); 248 numIdElement.setVal( num.getNumId() ); // point to the correct list 249 250 // The <w:ilvl> element 251 Ilvl ilvlElement = Context.getWmlObjectFactory().createPPrBaseNumPrIlvl(); 252 numPr.setIlvl(ilvlElement); 253 ilvlElement.setVal(BigInteger.valueOf(0)); 254 255 // TMP: don't let this override our numbering 256 currentP.getPPr().setInd(null); 257 } 229 258 } 230 259 … … 473 502 NumberingDefinitionsPart ndp = new NumberingDefinitionsPart(); 474 503 wordMLPackage.getMainDocumentPart().addTargetPart(ndp); 475 ndp. setJaxbElement( (Numbering) XmlUtils.unmarshalString(initialNumbering));504 ndp.unmarshalDefaultNumbering(); 476 505 477 506 wordMLPackage.getMainDocumentPart().getContent().addAll( 478 convert(f, wordMLPackage.getMainDocumentPart().getRelationshipsPart() ) );507 convert(f, wordMLPackage.getMainDocumentPart().getRelationshipsPart(), ndp ) ); 479 508 480 509 System.out.println( … … 485 514 } 486 515 487 static final String initialNumbering = "<w:numbering xmlns:ve=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\" xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" xmlns:w10=\"urn:schemas-microsoft-com:office:word\" xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\">"488 +"<w:abstractNum w:abstractNumId=\"0\">"489 +"<w:nsid w:val=\"16892FB7\"/>"490 +"<w:multiLevelType w:val=\"hybridMultilevel\"/>"491 +"<w:tmpl w:val=\"5A4EB96A\"/>"492 +"<w:lvl w:ilvl=\"0\" w:tplc=\"0C090001\">"493 +"<w:start w:val=\"1\"/>"494 +"<w:numFmt w:val=\"bullet\"/>"495 +"<w:lvlText w:val=\"ï·\"/>"496 +"<w:lvlJc w:val=\"left\"/>"497 +"<w:pPr>"498 +"<w:ind w:left=\"720\" w:hanging=\"360\"/>"499 +"</w:pPr>"500 +"<w:rPr>"501 +"<w:rFonts w:ascii=\"Symbol\" w:hAnsi=\"Symbol\" w:hint=\"default\"/>"502 +"</w:rPr>"503 +"</w:lvl>"504 +"<w:lvl w:ilvl=\"1\" w:tplc=\"0C090003\" w:tentative=\"1\">"505 +"<w:start w:val=\"1\"/>"506 +"<w:numFmt w:val=\"bullet\"/>"507 +"<w:lvlText w:val=\"o\"/>"508 +"<w:lvlJc w:val=\"left\"/>"509 +"<w:pPr>"510 +"<w:ind w:left=\"1440\" w:hanging=\"360\"/>"511 +"</w:pPr>"512 +"<w:rPr>"513 +"<w:rFonts w:ascii=\"Courier New\" w:hAnsi=\"Courier New\" w:cs=\"Courier New\" w:hint=\"default\"/>"514 +"</w:rPr>"515 +"</w:lvl>"516 +"<w:lvl w:ilvl=\"2\" w:tplc=\"0C090005\" w:tentative=\"1\">"517 +"<w:start w:val=\"1\"/>"518 +"<w:numFmt w:val=\"bullet\"/>"519 +"<w:lvlText w:val=\"ï§\"/>"520 +"<w:lvlJc w:val=\"left\"/>"521 +"<w:pPr>"522 +"<w:ind w:left=\"2160\" w:hanging=\"360\"/>"523 +"</w:pPr>"524 +"<w:rPr>"525 +"<w:rFonts w:ascii=\"Wingdings\" w:hAnsi=\"Wingdings\" w:hint=\"default\"/>"526 +"</w:rPr>"527 +"</w:lvl>"528 +"<w:lvl w:ilvl=\"3\" w:tplc=\"0C090001\" w:tentative=\"1\">"529 +"<w:start w:val=\"1\"/>"530 +"<w:numFmt w:val=\"bullet\"/>"531 +"<w:lvlText w:val=\"ï·\"/>"532 +"<w:lvlJc w:val=\"left\"/>"533 +"<w:pPr>"534 +"<w:ind w:left=\"2880\" w:hanging=\"360\"/>"535 +"</w:pPr>"536 +"<w:rPr>"537 +"<w:rFonts w:ascii=\"Symbol\" w:hAnsi=\"Symbol\" w:hint=\"default\"/>"538 +"</w:rPr>"539 +"</w:lvl>"540 +"<w:lvl w:ilvl=\"4\" w:tplc=\"0C090003\" w:tentative=\"1\">"541 +"<w:start w:val=\"1\"/>"542 +"<w:numFmt w:val=\"bullet\"/>"543 +"<w:lvlText w:val=\"o\"/>"544 +"<w:lvlJc w:val=\"left\"/>"545 +"<w:pPr>"546 +"<w:ind w:left=\"3600\" w:hanging=\"360\"/>"547 +"</w:pPr>"548 +"<w:rPr>"549 +"<w:rFonts w:ascii=\"Courier New\" w:hAnsi=\"Courier New\" w:cs=\"Courier New\" w:hint=\"default\"/>"550 +"</w:rPr>"551 +"</w:lvl>"552 +"<w:lvl w:ilvl=\"5\" w:tplc=\"0C090005\" w:tentative=\"1\">"553 +"<w:start w:val=\"1\"/>"554 +"<w:numFmt w:val=\"bullet\"/>"555 +"<w:lvlText w:val=\"ï§\"/>"556 +"<w:lvlJc w:val=\"left\"/>"557 +"<w:pPr>"558 +"<w:ind w:left=\"4320\" w:hanging=\"360\"/>"559 +"</w:pPr>"560 +"<w:rPr>"561 +"<w:rFonts w:ascii=\"Wingdings\" w:hAnsi=\"Wingdings\" w:hint=\"default\"/>"562 +"</w:rPr>"563 +"</w:lvl>"564 +"<w:lvl w:ilvl=\"6\" w:tplc=\"0C090001\" w:tentative=\"1\">"565 +"<w:start w:val=\"1\"/>"566 +"<w:numFmt w:val=\"bullet\"/>"567 +"<w:lvlText w:val=\"ï·\"/>"568 +"<w:lvlJc w:val=\"left\"/>"569 +"<w:pPr>"570 +"<w:ind w:left=\"5040\" w:hanging=\"360\"/>"571 +"</w:pPr>"572 +"<w:rPr>"573 +"<w:rFonts w:ascii=\"Symbol\" w:hAnsi=\"Symbol\" w:hint=\"default\"/>"574 +"</w:rPr>"575 +"</w:lvl>"576 +"<w:lvl w:ilvl=\"7\" w:tplc=\"0C090003\" w:tentative=\"1\">"577 +"<w:start w:val=\"1\"/>"578 +"<w:numFmt w:val=\"bullet\"/>"579 +"<w:lvlText w:val=\"o\"/>"580 +"<w:lvlJc w:val=\"left\"/>"581 +"<w:pPr>"582 +"<w:ind w:left=\"5760\" w:hanging=\"360\"/>"583 +"</w:pPr>"584 +"<w:rPr>"585 +"<w:rFonts w:ascii=\"Courier New\" w:hAnsi=\"Courier New\" w:cs=\"Courier New\" w:hint=\"default\"/>"586 +"</w:rPr>"587 +"</w:lvl>"588 +"<w:lvl w:ilvl=\"8\" w:tplc=\"0C090005\" w:tentative=\"1\">"589 +"<w:start w:val=\"1\"/>"590 +"<w:numFmt w:val=\"bullet\"/>"591 +"<w:lvlText w:val=\"ï§\"/>"592 +"<w:lvlJc w:val=\"left\"/>"593 +"<w:pPr>"594 +"<w:ind w:left=\"6480\" w:hanging=\"360\"/>"595 +"</w:pPr>"596 +"<w:rPr>"597 +"<w:rFonts w:ascii=\"Wingdings\" w:hAnsi=\"Wingdings\" w:hint=\"default\"/>"598 +"</w:rPr>"599 +"</w:lvl>"600 +"</w:abstractNum>"601 +"<w:abstractNum w:abstractNumId=\"1\">"602 +"<w:nsid w:val=\"7E706046\"/>"603 +"<w:multiLevelType w:val=\"hybridMultilevel\"/>"604 +"<w:tmpl w:val=\"336E8F2C\"/>"605 +"<w:lvl w:ilvl=\"0\" w:tplc=\"0C09000F\">"606 +"<w:start w:val=\"1\"/>"607 +"<w:numFmt w:val=\"decimal\"/>"608 +"<w:lvlText w:val=\"%1.\"/>"609 +"<w:lvlJc w:val=\"left\"/>"610 +"<w:pPr>"611 +"<w:ind w:left=\"720\" w:hanging=\"360\"/>"612 +"</w:pPr>"613 +"</w:lvl>"614 +"<w:lvl w:ilvl=\"1\" w:tplc=\"0C090019\" w:tentative=\"1\">"615 +"<w:start w:val=\"1\"/>"616 +"<w:numFmt w:val=\"lowerLetter\"/>"617 +"<w:lvlText w:val=\"%2.\"/>"618 +"<w:lvlJc w:val=\"left\"/>"619 +"<w:pPr>"620 +"<w:ind w:left=\"1440\" w:hanging=\"360\"/>"621 +"</w:pPr>"622 +"</w:lvl>"623 +"<w:lvl w:ilvl=\"2\" w:tplc=\"0C09001B\" w:tentative=\"1\">"624 +"<w:start w:val=\"1\"/>"625 +"<w:numFmt w:val=\"lowerRoman\"/>"626 +"<w:lvlText w:val=\"%3.\"/>"627 +"<w:lvlJc w:val=\"right\"/>"628 +"<w:pPr>"629 +"<w:ind w:left=\"2160\" w:hanging=\"180\"/>"630 +"</w:pPr>"631 +"</w:lvl>"632 +"<w:lvl w:ilvl=\"3\" w:tplc=\"0C09000F\" w:tentative=\"1\">"633 +"<w:start w:val=\"1\"/>"634 +"<w:numFmt w:val=\"decimal\"/>"635 +"<w:lvlText w:val=\"%4.\"/>"636 +"<w:lvlJc w:val=\"left\"/>"637 +"<w:pPr>"638 +"<w:ind w:left=\"2880\" w:hanging=\"360\"/>"639 +"</w:pPr>"640 +"</w:lvl>"641 +"<w:lvl w:ilvl=\"4\" w:tplc=\"0C090019\" w:tentative=\"1\">"642 +"<w:start w:val=\"1\"/>"643 +"<w:numFmt w:val=\"lowerLetter\"/>"644 +"<w:lvlText w:val=\"%5.\"/>"645 +"<w:lvlJc w:val=\"left\"/>"646 +"<w:pPr>"647 +"<w:ind w:left=\"3600\" w:hanging=\"360\"/>"648 +"</w:pPr>"649 +"</w:lvl>"650 +"<w:lvl w:ilvl=\"5\" w:tplc=\"0C09001B\" w:tentative=\"1\">"651 +"<w:start w:val=\"1\"/>"652 +"<w:numFmt w:val=\"lowerRoman\"/>"653 +"<w:lvlText w:val=\"%6.\"/>"654 +"<w:lvlJc w:val=\"right\"/>"655 +"<w:pPr>"656 +"<w:ind w:left=\"4320\" w:hanging=\"180\"/>"657 +"</w:pPr>"658 +"</w:lvl>"659 +"<w:lvl w:ilvl=\"6\" w:tplc=\"0C09000F\" w:tentative=\"1\">"660 +"<w:start w:val=\"1\"/>"661 +"<w:numFmt w:val=\"decimal\"/>"662 +"<w:lvlText w:val=\"%7.\"/>"663 +"<w:lvlJc w:val=\"left\"/>"664 +"<w:pPr>"665 +"<w:ind w:left=\"5040\" w:hanging=\"360\"/>"666 +"</w:pPr>"667 +"</w:lvl>"668 +"<w:lvl w:ilvl=\"7\" w:tplc=\"0C090019\" w:tentative=\"1\">"669 +"<w:start w:val=\"1\"/>"670 +"<w:numFmt w:val=\"lowerLetter\"/>"671 +"<w:lvlText w:val=\"%8.\"/>"672 +"<w:lvlJc w:val=\"left\"/>"673 +"<w:pPr>"674 +"<w:ind w:left=\"5760\" w:hanging=\"360\"/>"675 +"</w:pPr>"676 +"</w:lvl>"677 +"<w:lvl w:ilvl=\"8\" w:tplc=\"0C09001B\" w:tentative=\"1\">"678 +"<w:start w:val=\"1\"/>"679 +"<w:numFmt w:val=\"lowerRoman\"/>"680 +"<w:lvlText w:val=\"%9.\"/>"681 +"<w:lvlJc w:val=\"right\"/>"682 +"<w:pPr>"683 +"<w:ind w:left=\"6480\" w:hanging=\"180\"/>"684 +"</w:pPr>"685 +"</w:lvl>"686 +"</w:abstractNum>"687 +"<w:num w:numId=\"1\">"688 +"<w:abstractNumId w:val=\"1\"/>"689 +"</w:num>"690 +"<w:num w:numId=\"2\">"691 +"<w:abstractNumId w:val=\"0\"/>"692 +"</w:num>"693 +"</w:numbering>";694 516 695 517 } -
trunk/docx4j/src/main/java/org/docx4j/model/datastorage/BindingHandler.java
r1706 r1715 34 34 import org.docx4j.openpackaging.parts.WordprocessingML.HeaderPart; 35 35 import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart; 36 import org.docx4j.openpackaging.parts.WordprocessingML.NumberingDefinitionsPart; 36 37 import org.docx4j.openpackaging.parts.opendope.XPathsPart; 37 38 import org.docx4j.openpackaging.parts.relationships.Namespaces; … … 276 277 log.info("Unescaped: " + unescaped); 277 278 278 List<Object> results = Importer.convertFromString(unescaped, sourcePart.getRelationshipsPart() ); 279 NumberingDefinitionsPart ndp = null; 280 if (sourcePart instanceof MainDocumentPart) { 281 ndp = ((MainDocumentPart)sourcePart).getNumberingDefinitionsPart(); 282 } 283 284 List<Object> results = Importer.convertFromString(unescaped, sourcePart.getRelationshipsPart(), ndp ); 279 285 log.info("Got results: " + results.size() ); 280 286 -
trunk/docx4j/src/main/java/org/docx4j/openpackaging/parts/WordprocessingML/NumberingDefinitionsPart.java
r1610 r1715 305 305 } 306 306 307 /** 308 * Add the specified definition, allocating it a new w:abstractNumId. 309 * 310 * Also create and add an associated ListNumberingDefinition, and return 311 * the w:numId of this associated ListNumberingDefinition (since that is 312 * what you are likely to use in the document). 313 * 314 * @param abstractNum 315 * @return 316 */ 317 public Numbering.Num addAbstractListNumberingDefinition(Numbering.AbstractNum abstractNum) { 318 319 ////////////////////////////////////////////// 320 // Numbering.AbstractNum abstractNum 321 322 // Generate a unique w:abstractNumId for it 323 int nextId = getAbstractListDefinitions().size(); 324 do { 325 nextId++; 326 } while (getAbstractListDefinitions().containsKey( "" + nextId )); 327 abstractNum.setAbstractNumId( BigInteger.valueOf(nextId) ); 328 329 // Add it to our JAXB object 330 this.jaxbElement.getAbstractNum().add(abstractNum); 331 332 // Add it to our hashmap 333 AbstractListNumberingDefinition absNumDef = new AbstractListNumberingDefinition(abstractNum); 334 abstractListDefinitions.put(absNumDef.getID(), absNumDef); 335 336 ////////////////////////////////////////////// 337 // Numbering.Num num 338 339 // Now make an associated ListNumberingDefinition 340 // <w:num w:numId="1"> 341 // <w:abstractNumId w:val="1"/> 342 // </w:num>" 343 Numbering.Num num = Context.wmlObjectFactory.createNumberingNum(); 344 Numbering.Num.AbstractNumId abstractNumId = Context.wmlObjectFactory.createNumberingNumAbstractNumId(); 345 abstractNumId.setVal(BigInteger.valueOf(nextId) ); 346 num.setAbstractNumId(abstractNumId); 347 348 nextId = getInstanceListDefinitions().size(); 349 do { 350 nextId++; 351 } while (getInstanceListDefinitions().containsKey( "" + nextId )); 352 num.setNumId( BigInteger.valueOf(nextId) ); 353 354 // Add it to our JAXB object 355 this.jaxbElement.getNum().add(num); 356 357 // Add it to our hashmap 358 ListNumberingDefinition listDef = new ListNumberingDefinition(num, abstractListDefinitions); 359 instanceListDefinitions.put(listDef.getListNumberId(), listDef); 360 361 // 362 return num; 363 364 } 365 366 public Numbering unmarshalDefaultNumbering() throws JAXBException { 367 368 java.io.InputStream is = null; 369 try { 370 is = org.docx4j.utils.ResourceUtils.getResource( 371 "org/docx4j/openpackaging/parts/WordprocessingML/numbering.xml"); 372 } catch (IOException e) { 373 // TODO Auto-generated catch block 374 e.printStackTrace(); 375 } 376 377 return unmarshal( is ); // side-effect is to set jaxbElement 378 } 307 379 308 380 } -
trunk/docx4j/src/main/java/org/docx4j/wml/Numbering.java
r546 r1715 422 422 "lvl" 423 423 }) 424 @XmlRootElement(name = "abstractNum") 424 425 public static class AbstractNum 425 426 implements Child
Note: See TracChangeset
for help on using the changeset viewer.
