123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405 |
- /*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
- package org.apache.fop.render.xml;
-
- // FOP
- import org.apache.fop.svg.*;
- import org.apache.fop.render.Renderer;
- import org.apache.fop.render.AbstractRenderer;
- import org.apache.fop.render.RendererContext;
- import org.apache.fop.render.XMLHandler;
- import org.apache.fop.area.*;
- import org.apache.fop.area.inline.*;
- import org.apache.fop.pdf.*;
- import org.apache.fop.fo.properties.LeaderPattern;
- import org.apache.fop.fo.FOUserAgent;
- import org.apache.fop.layout.FontInfo;
- import org.apache.fop.apps.FOPException;
- import org.apache.fop.fo.properties.RuleStyle;
-
- // Avalon
- import org.apache.avalon.framework.logger.Logger;
-
- // Java
- import java.io.IOException;
- import java.io.PrintWriter;
- import java.io.OutputStream;
- import java.util.Enumeration;
- import java.util.List;
- import java.util.Map;
- import java.util.Iterator;
- import java.awt.geom.Rectangle2D;
-
- import org.w3c.dom.Document;
-
- /**
- * Renderer that renders areas to XML for debugging purposes.
- * This creates an xml that contains the information of the area
- * tree. It does not output any state or derived information.
- * The output can be used to build a new area tree (@see AreaTreeBuilder)
- * which can be rendered to any renderer.
- */
- public class XMLRenderer extends AbstractRenderer {
- public static final String mimeType = "text/xml";
-
- boolean startedSequence = false;
- RendererContext context;
-
- public void setProducer(String producer) {
- }
-
- /**
- * indentation to use for pretty-printing the XML
- */
- protected int indent = 0;
-
- /**
- * the application producing the XML
- */
- protected String producer;
-
- /**
- * the writer used to output the XML
- */
- protected PrintWriter writer;
-
- /**
- * options
- */
- private boolean consistentOutput = false;
-
- public XMLRenderer() {
- context = new RendererContext(mimeType);
- }
-
- public void setUserAgent(FOUserAgent agent) {
- super.setUserAgent(agent);
-
- //
- //userAgent.addExtensionHandler();
- XMLHandler handler = new XMLXMLHandler();
- userAgent.setDefaultXMLHandler(mimeType, handler);
- String svg = "http://www.w3.org/2000/svg";
- userAgent.addXMLHandler(mimeType, svg, handler);
- }
-
- /**
- * write out spaces to make indent
- */
- protected void writeIndent() {
- StringBuffer s = new StringBuffer();
- for (int i = 0; i < this.indent; i++) {
- s = s.append(" ");
- }
- this.writer.write(s.toString());
- }
-
- /**
- * write out an element
- *
- * @param element the full text of the element including tags
- */
- protected void writeElement(String element) {
- writeIndent();
- this.writer.write(element + "\n");
- }
-
- /**
- * write out an empty-element-tag
- *
- * @param tag the text of the tag
- */
- protected void writeEmptyElementTag(String tag) {
- writeIndent();
- this.writer.write(tag + "\n");
- }
-
- /**
- * write out an end tag
- *
- * @param tag the text of the tag
- */
- protected void writeEndTag(String tag) {
- this.indent--;
- writeIndent();
- this.writer.write(tag + "\n");
- }
-
- /**
- * write out a start tag
- *
- * @param tag the text of the tag
- */
- protected void writeStartTag(String tag) {
- writeIndent();
- this.writer.write(tag + "\n");
- this.indent++;
- }
-
- /**
- * set up the font info
- *
- * @param fontInfo the font info object to set up
- */
- public void setupFontInfo(FontInfo fontInfo) {
-
- /* use PDF's font setup to get PDF metrics */
- org.apache.fop.render.pdf.FontSetup.setup(fontInfo, null);
- }
-
- private boolean isCoarseXml() {
- return ((Boolean) options.get("fineDetail")).booleanValue();
- }
-
- /**
- */
- public void startRenderer(OutputStream outputStream)
- throws IOException {
- getLogger().debug("rendering areas to XML");
- this.writer = new PrintWriter(outputStream);
- this.writer.write( "<?xml version=\"1.0\"?>\n<!-- produced by " +
- this.producer + " -->\n");
- writeStartTag("<areaTree>");
- }
-
- /**
- */
- public void stopRenderer() throws IOException {
- writeEndTag("</pageSequence>");
- writeEndTag("</areaTree>");
- this.writer.flush();
- getLogger().debug("written out XML");
- }
-
- public void renderPage(PageViewport page) throws IOException,
- FOPException {
- writeStartTag("<pageViewport bounds=\"" +
- createString(page.getViewArea()) + "\">");
- writeStartTag("<page>");
- super.renderPage(page);
- writeEndTag("</page>");
- writeEndTag("</pageViewport>");
- }
-
- private String createString(Rectangle2D rect) {
- return "" + (int) rect.getX() + " " + (int) rect.getY() + " " +
- (int) rect.getWidth() + " " + (int) rect.getHeight();
- }
-
- public void startPageSequence(Title seqTitle) {
- if (startedSequence) {
- writeEndTag("</pageSequence>");
- }
- startedSequence = true;
- writeStartTag("<pageSequence>");
- if (seqTitle != null) {
- writeStartTag("<title>");
- List children = seqTitle.getInlineAreas();
-
- for (int count = 0; count < children.size(); count++) {
- InlineArea inline = (InlineArea) children.get(count);
- inline.render(this);
- }
-
- writeEndTag("</title>");
- }
- }
-
- protected void renderRegionViewport(RegionViewport port) {
- if (port != null) {
- writeStartTag("<regionViewport rect=\"" +
- createString(port.getViewArea()) + "\">");
- RegionReference region = port.getRegion();
- if (region.getRegionClass() == RegionReference.BEFORE) {
- writeStartTag("<regionBefore>");
- renderRegion(region);
- writeEndTag("</regionBefore>");
- } else if (region.getRegionClass() == RegionReference.START) {
- writeStartTag("<regionStart>");
- renderRegion(region);
- writeEndTag("</regionStart>");
- } else if (region.getRegionClass() == RegionReference.BODY) {
- writeStartTag("<regionBody>");
- renderBodyRegion((BodyRegion) region);
- writeEndTag("</regionBody>");
- } else if (region.getRegionClass() == RegionReference.END) {
- writeStartTag("<regionEnd>");
- renderRegion(region);
- writeEndTag("</regionEnd>");
- } else if (region.getRegionClass() == RegionReference.AFTER) {
- writeStartTag("<regionAfter>");
- renderRegion(region);
- writeEndTag("</regionAfter>");
- }
- writeEndTag("</regionViewport>");
- }
- }
-
- protected void renderBeforeFloat(BeforeFloat bf) {
- writeStartTag("<beforeFloat>");
- super.renderBeforeFloat(bf);
- writeEndTag("</beforeFloat>");
- }
-
- protected void renderFootnote(Footnote footnote) {
- writeStartTag("<footnote>");
- super.renderFootnote(footnote);
- writeEndTag("</footnote>");
- }
-
- protected void renderMainReference(MainReference mr) {
- writeStartTag("<mainReference columnGap=\"" +
- mr.getColumnGap() + "\" width=\"" + mr.getWidth() + "\">");
-
- Span span = null;
- List spans = mr.getSpans();
- for (int count = 0; count < spans.size(); count++) {
- span = (Span) spans.get(count);
- writeStartTag("<span>");
- for (int c = 0; c < span.getColumnCount(); c++) {
- Flow flow = (Flow) span.getFlow(c);
-
- renderFlow(flow);
- }
- writeEndTag("</span>");
- }
- writeEndTag("</mainReference>");
- }
-
- // the normal flow reference area contains stacked blocks
- protected void renderFlow(Flow flow) {
- writeStartTag("<flow>");
- super.renderFlow(flow);
- writeEndTag("</flow>");
- }
-
- protected void renderBlock(Block block) {
- String prop = "";
- Map map = block.getTraits();
- if (map != null) {
- prop = " props=\"" + getPropString(map) + "\"";
- }
- writeStartTag("<block" + prop + ">");
- super.renderBlock(block);
- writeEndTag("</block>");
- }
-
- protected void renderLineArea(LineArea line) {
- String prop = "";
- Map map = line.getTraits();
- if (map != null) {
- prop = " props=\"" + getPropString(map) + "\"";
- }
- writeStartTag("<lineArea height=\"" + line.getHeight() + "\"" +
- prop + ">");
- super.renderLineArea(line);
- writeEndTag("</lineArea>");
- }
-
- public void renderViewport(Viewport viewport) {
- writeStartTag("<viewport>");
- super.renderViewport(viewport);
- writeEndTag("</viewport>");
- }
-
- public void renderImage(Image image) {
- writeElement("<image url=\"" + image.getURL() + "\"/>");
- }
-
- public void renderContainer(Container cont) {
- writeStartTag("<container>");
-
- super.renderContainer(cont);
- writeEndTag("</container>");
- }
-
- public void renderForeignObject(ForeignObject fo) {
- writeStartTag("<foreignObject>");
- Document doc = fo.getDocument();
- String ns = fo.getNameSpace();
- context.setProperty(XMLXMLHandler.WRITER, writer);
- userAgent.renderXML(context, doc, ns);
- writeEndTag("</foreignObject>");
- }
-
- public void renderCharacter(org.apache.fop.area.inline.Character ch) {
- String prop = "";
- Map map = ch.getTraits();
- if (map != null) {
- prop = " props=\"" + getPropString(map) + "\"";
- }
- writeElement("<char" + prop + ">" + ch.getChar() + "</char>");
- }
-
- public void renderInlineSpace(Space space) {
- writeElement("<space width=\"" + space.getWidth() + "\"/>");
- }
-
- public void renderWord(Word word) {
- String prop = "";
- Map map = word.getTraits();
- if (map != null) {
- prop = " props=\"" + getPropString(map) + "\"";
- }
- writeElement("<word wsadjust=\"" + word.getWSadjust() + "\"" +
- prop + ">" + word.getWord() + "</word>");
- super.renderWord(word);
- }
-
- public void renderInlineParent(InlineParent ip) {
- String prop = "";
- Map map = ip.getTraits();
- if (map != null) {
- prop = " props=\"" + getPropString(map) + "\"";
- }
- writeStartTag("<inlineparent" + prop + ">");
- super.renderInlineParent(ip);
- writeEndTag("</inlineparent>");
- }
-
- public void renderLeader(Leader area) {
- String style = "solid";
- switch (area.getRuleStyle()) {
- case RuleStyle.DOTTED:
- style = "dotted";
- break;
- case RuleStyle.DASHED:
- style = "dashed";
- break;
- case RuleStyle.SOLID:
- break;
- case RuleStyle.DOUBLE:
- style = "double";
- break;
- case RuleStyle.GROOVE:
- style = "groove";
- break;
- case RuleStyle.RIDGE:
- style = "ridge";
- break;
- }
- writeElement("<leader width=\"" + area.getWidth() + "\" ruleStyle=\"" + style +
- "\" ruleThickness=\"" + area.getRuleThickness() + "\"/>");
- super.renderLeader(area);
- }
-
- protected String getPropString(Map traitMap) {
- StringBuffer strbuf = new StringBuffer();
- Iterator iter = traitMap.entrySet().iterator();
- while (iter.hasNext()) {
- Map.Entry traitEntry = (Map.Entry) iter.next();
- strbuf.append(Trait.getTraitName(traitEntry.getKey()));
- strbuf.append(':');
- strbuf.append(traitEntry.getValue().toString());
- strbuf.append(';');
- }
- return strbuf.toString();
- }
-
- }
|