You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

XMLRenderer.java 6.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. /*
  2. * $Id$
  3. * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
  4. * For details on use and redistribution please refer to the
  5. * LICENSE file included with these sources.
  6. */
  7. package org.apache.fop.render.xml;
  8. // FOP
  9. import org.apache.fop.svg.*;
  10. import org.apache.fop.render.Renderer;
  11. import org.apache.fop.render.AbstractRenderer;
  12. import org.apache.fop.image.ImageArea;
  13. import org.apache.fop.area.*;
  14. import org.apache.fop.area.inline.*;
  15. import org.apache.fop.pdf.*;
  16. import org.apache.fop.fo.properties.LeaderPattern;
  17. import org.apache.fop.layout.FontInfo;
  18. import org.apache.fop.apps.FOPException;
  19. import org.apache.log.Logger;
  20. // Java
  21. import java.io.IOException;
  22. import java.io.PrintWriter;
  23. import java.io.OutputStream;
  24. import java.util.Enumeration;
  25. import java.util.HashMap;
  26. import java.util.List;
  27. /**
  28. * Renderer that renders areas to XML for debugging purposes.
  29. */
  30. public class XMLRenderer extends AbstractRenderer {
  31. boolean startedSequence = false;
  32. public void setProducer(String producer) {
  33. }
  34. /**
  35. * indentation to use for pretty-printing the XML
  36. */
  37. protected int indent = 0;
  38. /**
  39. * the application producing the XML
  40. */
  41. protected String producer;
  42. /**
  43. * the writer used to output the XML
  44. */
  45. protected PrintWriter writer;
  46. /**
  47. * options
  48. */
  49. private boolean consistentOutput = false;
  50. public XMLRenderer() {}
  51. /**
  52. * write out spaces to make indent
  53. */
  54. protected void writeIndent() {
  55. StringBuffer s = new StringBuffer();
  56. for (int i = 0; i < this.indent; i++) {
  57. s = s.append(" ");
  58. }
  59. this.writer.write(s.toString());
  60. }
  61. /**
  62. * write out an element
  63. *
  64. * @param element the full text of the element including tags
  65. */
  66. protected void writeElement(String element) {
  67. writeIndent();
  68. this.writer.write(element + "\n");
  69. }
  70. /**
  71. * write out an empty-element-tag
  72. *
  73. * @param tag the text of the tag
  74. */
  75. protected void writeEmptyElementTag(String tag) {
  76. writeIndent();
  77. this.writer.write(tag + "\n");
  78. }
  79. /**
  80. * write out an end tag
  81. *
  82. * @param tag the text of the tag
  83. */
  84. protected void writeEndTag(String tag) {
  85. this.indent--;
  86. writeIndent();
  87. this.writer.write(tag + "\n");
  88. }
  89. /**
  90. * write out a start tag
  91. *
  92. * @param tag the text of the tag
  93. */
  94. protected void writeStartTag(String tag) {
  95. writeIndent();
  96. this.writer.write(tag + "\n");
  97. this.indent++;
  98. }
  99. /**
  100. * set up the font info
  101. *
  102. * @param fontInfo the font info object to set up
  103. */
  104. public void setupFontInfo(FontInfo fontInfo) {
  105. /* use PDF's font setup to get PDF metrics */
  106. org.apache.fop.render.pdf.FontSetup.setup(fontInfo);
  107. }
  108. private boolean isCoarseXml() {
  109. return ((Boolean)options.get("fineDetail")).booleanValue();
  110. }
  111. /**
  112. */
  113. public void startRenderer(OutputStream outputStream)
  114. throws IOException {
  115. log.debug("rendering areas to XML");
  116. this.writer = new PrintWriter(outputStream);
  117. this.writer.write( "<?xml version=\"1.0\"?>\n<!-- produced by " +
  118. this.producer + " -->\n");
  119. writeStartTag("<areaTree>");
  120. }
  121. /**
  122. */
  123. public void stopRenderer()
  124. throws IOException {
  125. writeEndTag("</pageSequence>");
  126. writeEndTag("</areaTree>");
  127. this.writer.flush();
  128. log.debug("written out XML");
  129. }
  130. public void renderPage(PageViewport page)
  131. throws IOException, FOPException {
  132. writeStartTag("<pageViewport>");
  133. writeStartTag("<page>");
  134. super.renderPage(page);
  135. writeEndTag("</page>");
  136. writeEndTag("</pageViewport>");
  137. }
  138. public void startPageSequence(Title seqTitle) {
  139. if(startedSequence) {
  140. writeEndTag("</pageSequence>");
  141. }
  142. startedSequence = true;
  143. writeStartTag("<pageSequence>");
  144. if(seqTitle != null) {
  145. writeStartTag("<title>");
  146. List children = seqTitle.getInlineAreas();
  147. for (int count = 0; count < children.size(); count++) {
  148. InlineArea inline = (InlineArea) children.get(count);
  149. inline.render(this);
  150. }
  151. writeEndTag("</title>");
  152. }
  153. }
  154. protected void renderRegionViewport(RegionViewport port) {
  155. if(port != null) {
  156. writeStartTag("<regionViewport>");
  157. Region region = port.getRegion();
  158. if (region.getRegionClass() == Region.BEFORE) {
  159. writeStartTag("<regionBefore>");
  160. renderRegion(region);
  161. writeEndTag("</regionBefore>");
  162. } else if (region.getRegionClass() == Region.START) {
  163. writeStartTag("<regionStart>");
  164. renderRegion(region);
  165. writeEndTag("</regionStart>");
  166. } else if (region.getRegionClass() == Region.BODY) {
  167. writeStartTag("<regionBody>");
  168. renderBodyRegion((BodyRegion)region);
  169. writeEndTag("</regionBody>");
  170. } else if (region.getRegionClass() == Region.END) {
  171. writeStartTag("<regionEnd>");
  172. renderRegion(region);
  173. writeEndTag("</regionEnd>");
  174. } else if (region.getRegionClass() == Region.AFTER) {
  175. writeStartTag("<regionAfter>");
  176. renderRegion(region);
  177. writeEndTag("</regionAfter>");
  178. }
  179. writeEndTag("</regionViewport>");
  180. }
  181. }
  182. protected void renderBeforeFloat(BeforeFloat bf) {
  183. writeStartTag("<beforeFloat>");
  184. super.renderBeforeFloat(bf);
  185. writeEndTag("</beforeFloat>");
  186. }
  187. protected void renderFootnote(Footnote footnote) {
  188. writeStartTag("<footnote>");
  189. super.renderFootnote(footnote);
  190. writeEndTag("</footnote>");
  191. }
  192. protected void renderMainReference(MainReference mr) {
  193. writeStartTag("<mainReference>");
  194. super.renderMainReference(mr);
  195. writeEndTag("</mainReference>");
  196. }
  197. protected void renderBlock(Block block) {
  198. writeStartTag("<block>");
  199. super.renderBlock(block);
  200. writeEndTag("</block>");
  201. }
  202. protected void renderLineArea(LineArea line) {
  203. writeStartTag("<lineArea>");
  204. super.renderLineArea(line);
  205. writeEndTag("</lineArea>");
  206. }
  207. public void renderCharacter(org.apache.fop.area.inline.Character ch) {
  208. writeElement("<char>" + ch.getChar() + "</char>");
  209. }
  210. public void renderInlineSpace(Space space) {
  211. writeElement("<space width=\"" + space.getWidth() + "\"/>");
  212. }
  213. }