Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * #%L
   * JRst :: Api
   * 
   * $Id: JRSTGenerator.java 581 2011-05-17 14:17:34Z kcardineaud $
   * $HeadURL: http://svn.nuiton.org/svn/jrst/tags/jrst-1.4/jrst/src/main/java/org/nuiton/jrst/JRSTGenerator.java $
   * %%
   * Copyright (C) 2004 - 2010 CodeLutin
   * %%
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU Lesser General Public License as 
  * published by the Free Software Foundation, either version 3 of the 
  * License, or (at your option) any later version.
  * 
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Lesser Public License for more details.
  * 
  * You should have received a copy of the GNU General Lesser Public 
  * License along with this program.  If not, see
  * <http://www.gnu.org/licenses/lgpl-3.0.html>.
  * #L%
  */
 
 
 package org.nuiton.jrst;
 
 import static org.nuiton.jrst.ReStructuredText.*;
 
 import java.io.File;
 import java.io.Writer;
 import java.net.URL;
 
 
 import org.dom4j.Node;
 import org.dom4j.Text;
Cette classe contient plusieurs methodes pour générer, soit en utilisant une feuille de style generate(org.dom4j.Document,java.net.URL,java.io.Writer), soit un org.xml.sax.ContentHandler avec generate(org.dom4j.Document,org.xml.sax.ContentHandler), soit DocumentHandler avec generate(org.dom4j.Document,org.xml.sax.ContentHandler) ou bien regénérer du RST avec generate(org.dom4j.Document) dans les deux derniers cas il faut passer un java.io.Writer en parametre du constructeur.

On peut aussi transformer le org.dom4j.Document en un autre org.dom4j.Document avec transform(org.dom4j.Document,java.net.URL,java.lang.String[]) Created: 30 oct. 06 00:14:18

Author(s):
poussin
Version:
$Revision: 581 $ Last update: $Date: 2011-05-17 16:17:34 +0200 (Tue, 17 May 2011) $ by : $Author: kcardineaud $
 
 public class JRSTGenerator implements DocumentHandler {
 
     static boolean DEBUG = true;
 
     static private Log log = LogFactory.getLog(JRSTGenerator.class);
 
     protected Writer out;
     protected int sectionLevel;
     protected int indent;
 
     protected String listType = "bullet|enumerated|...";
     protected int enumStart = 1;
 
     protected URIResolver uriResolver;
 
     public JRSTGenerator() {
     }
 
     public JRSTGenerator(Writer out) {
         this. = out;
     }

    

Returns:
the uriResolver
    public URIResolver getUriResolver() {
        return ;
    }

    

Parameters:
uriResolver the uriResolver to set
    public void setUriResolver(URIResolver uriResolver) {
        this. = uriResolver;
    }

    
Generate using this class as handler, this generate RST text to out passed in constructor

Parameters:
doc
Throws:
java.io.IOException
    public void generate(Document docthrows IOException {
        generate(docthis);
    }
    public void generate(Document docDocumentHandler handler) {
        DocumentWalker walker = new DocumentWalker(handler);
        walker.walk(doc);
    }

    
Generate using handler passed in argument

    public void generate(Document docContentHandler handler)
            throws IOExceptionTransformerException {
        // load the transformer using JAXP
        TransformerFactory factory = TransformerFactory.newInstance();
        if ( != null) {
            factory.setURIResolver();
        }
        Transformer transformer = factory.newTransformer();
        // now lets style the given document
        DocumentSource source = new DocumentSource(doc);
        SAXResult result = new SAXResult(handler);
        transformer.transform(sourceresult);
    }

    
Used writer passed in construction class

    public void generate(Document docURL stylesheetthrows IOException,
            TransformerException {
        generate(docstylesheet);
    }

    
Generate out from document using stylesheet

    public void generate(Document docURL stylesheetWriter out)
            throws IOExceptionTransformerException {
        // load the transformer using JAXP
        TransformerFactory factory = TransformerFactory.newInstance();
        if ( != null) {
            factory.setURIResolver();
        } else {
            factory.setURIResolver(new DocumentResolver(stylesheet));
        }
        Transformer transformer = factory.newTransformer(new StreamSource(
                stylesheet.openStream()));
        // now lets style the given document
        DocumentSource source = new DocumentSource(doc);
        StreamResult result = new StreamResult(out);
        transformer.transform(sourceresult);
        out.flush();
    }

    
Transform doc in another XML document.

Parameters:
doc
stylesheet
args
Returns:
the transformed document
Throws:
javax.xml.transform.TransformerException
java.io.IOException
    public Document transform(Document docURL stylesheetString... args)
            throws TransformerExceptionIOException {
        if (.isInfoEnabled()) {
            .debug("Transform document using : " + stylesheet);
        }
        // load the transformer using JAXP
        TransformerFactory factory = TransformerFactory.newInstance();
        if ( != null) {
            factory.setURIResolver();
        } else {
            factory.setURIResolver(new DocumentResolver(stylesheet));
        }
        Transformer transformer = factory.newTransformer(new StreamSource(
                stylesheet.openStream()));
        // now lets style the given document
        DocumentSource source = new DocumentSource(doc);
        DocumentResult result = new DocumentResult();
        transformer.transform(sourceresult);
        // return the transformed document
        Document transformedDoc = result.getDocument();
        return transformedDoc;
    }
    static public class DocumentResolver implements URIResolverEntityResolver {
        URL baseURL;
        public DocumentResolver(URL urlthrows MalformedURLException {
            String path = new File(url.getPath()).getParent();
             = new URL(url.getProtocol(), url.getHost(), url.getPort(),
                    path);
        }
        @Override
        public Source resolve(String hrefString base)
                throws TransformerException {
            try {
                URL url = null;
                if (href == null) {
                    url = ;
                } else {
                    String path = .getPath();
                    if (path.startsWith("file:")) {
                        path = "file:"
                                + new File(path.substring("file:".length()),
                                        href).getCanonicalPath();
                    } else {
                        path = new File(pathhref).getCanonicalPath();
                    }
                    url = new URL(.getProtocol(), .getHost(),
                            .getPort(), path);
                }
                .debug("** resolve href: '" + href + "' base: '" + base
                        + "' return: '" + url + "'");
                Source result = new StreamSource(url.openStream());
                return result;
            } catch (MalformedURLException eee) {
                throw new TransformerException("Can't create url "eee);
            } catch (IOException eee) {
                throw new TransformerException("Can't read url"eee);
            }
        }
        /*
         * @see org.xml.sax.EntityResolver#resolveEntity(java.lang.String, java.lang.String)
         */
        @Override
        public InputSource resolveEntity(String publicIdString systemId)
                throws SAXExceptionIOException {
            .debug("## resolveEntity publicId '" + publicId
                    + "' systemId: '" + systemId + "'");
            return null;
        }
    }
    protected String string(String sint number) {
        String result = "";
        for (int i = 0; i < numberi++) {
            result += s;
        }
        return result;
    }
    protected String enumtype(int iString type) {
        String result = null;
        if ("arabic".equals(type)) {
            result = String.valueOf(i);
        } else if ("loweralpha".equals(type)) {
            result = String.valueOf((char) ((int'a' + i));
        } else if ("upperalpha".equals(type)) {
            result = String.valueOf((char) ((int'A' + i));
        } else if ("lowerroman".equals(type) || "upperroman".equals(type)) {
            String[] c = new String[] { "i""v""x""l""c""d""m" };
            int[] d = new int[] { 1, 5, 10, 50, 100, 500, 1000 };
            result = "";
            for (int a = 0; a < c.lengtha++) {
                result = string(c[a], i / d[a]) + result;
                i = i % d[a];
            }
            if ("upperroman".equals(type)) {
                result = result.toUpperCase();
            }
        }
        return result;
    }

    
Determine la longueur du text dans l'element <emphasis<>toto</emphasis<> qui donne *toto* retournera 6

Parameters:
e
Returns:
la longueur du text dans l'element.
    @SuppressWarnings("unchecked")
    protected int inlineLength(Element e) {
        int result = 0;
        LinkedList<Nodeelems = new LinkedList<Node>();
        elems.addAll(e.content());
        while (elems.peek() != null) {
            Node elem = elems.poll();
            switch (elem.getNodeType()) {
            case .:
                elems.addAll(((Elementelem).content());
                if (.equals(elem.getName())) {
                    result += 2;
                } else if (.equals(elem.getName())) {
                    result += 4;
                } else if (.equals(elem.getName())) {
                    result += 4;
                } // perhaps do footnote_refence, ...
                break;
            case .:
                result += elem.getText().length();
                break;
            }
        }
        return result;
    }
    /*
     * (non-Javadoc)
     * 
     * @see org.nuiton.jrst.DocumentHandler#startDocument(org.dom4j.Document)
     */
    @Override
    public void startDocument(Document doc) {
    }
    /*
     * (non-Javadoc)
     * 
     * @see org.nuiton.jrst.DocumentHandler#endDocument(org.dom4j.Document)
     */
    @Override
    public void endDocument(Document doc) {
    }
    /*
     * (non-Javadoc)
     * 
     * @see org.nuiton.jrst.DocumentHandler#endElement(org.dom4j.Element)
     */
    @Override
    public void endElement(Element e) {
        boolean needNewLine = false;
        if (.equals(e.getName())) {
            --;
            needNewLine = true;
        } else if (.equals(e.getName())) {
            newLine();
            needNewLine = true;
        } else if (.equals(e.getName())) {
            newLine();
            if ( == 0) {
                write(string("="inlineLength(e)));
            } else {
                String c = .substring( + 1);
                write(string(cinlineLength(e)));
            }
            newLine();
            needNewLine = true;
        } else if (.equals(e.getName())) {
            write("*");
        } else if (.equals(e.getName())) {
            write("**");
        } else if (.equals(e.getName())) {
            write("``");
        } else if (.equals(e.getName())) {
            needNewLine = true;
        } else if (.equals(e.getName())) {
            --;
            newLine();
            needNewLine = true;
        } else if (.equals(e.getName())) {
            // TODO now we take table as LITERAL_BLOCK, but in near
            // futur we must parse correctly TABLE (show JRSTReader and
            // JRSTLexer too)
            newLine();
            needNewLine = true;
        } else if (.equals(e.getName())) {
            needNewLine = true;
        } else if (.equals(e.getName())) {
            needNewLine = true;
        } else if (.equals(e.getName())) {
            needNewLine = true;
        } else if (.equals(e.getName())) {
            --;
        } else if (.equals(e.getName())) {
            needNewLine = true;
        } else if (.equals(e.getName())) {
            --;
        } else if (.equals(e.getName())) {
            --;
        } else if (.equals(e.getName())) {
            newLine();
            --;
        } else if (.equals(e.getName())) {
            newLine();
            --;
        } else if (.equals(e.getName())) {
            newLine();
            --;
        } else if (.equals(e.getName())) {
            newLine();
            --;
        } else if (.equals(e.getName())) {
            newLine();
            --;
        } else if (.equals(e.getName())) {
            newLine();
            --;
        } else if (.equals(e.getName())) {
            newLine();
            --;
        } else if (.equals(e.getName())) {
            newLine();
            --;
        } else if (.equals(e.getName())) {
            newLine();
            --;
        } else if (.equals(e.getName())) {
            newLine();
            --;
        }
        if (needNewLine) {
            // on ajoute une nouvelle ligne que si on est pas le dernier
            // fils, cela evite que le fils, le pere, et le grand-pere ne
            // demande tous une nouvelle ligne et donc au lieu d'en avoir
            // une comme on le souhaite on en est 3 voir plus
            Element parent = e.getParent();
            Node lastNode = parent.node(parent.nodeCount() - 1);
            if (lastNode != e) {
                // write("** new line ** " + e.getName() + ":" +
                // lastNode.getName());
                newLine();
            }
        }
    }
    /*
     * (non-Javadoc)
     * 
     * @see org.nuiton.jrst.DocumentHandler#startElement(org.dom4j.Element)
     */
    @Override
    public void startElement(Element e) {
        if (.equals(e.getName())) {
            ++;
        } else if (.equals(e.getName())) {
            if ( == 0) {
                write(string("="inlineLength(e)));
                newLine();
            }
        } else if (.equals(e.getName())) {
            Element parent = e.getParent();
            if (!((.equals(parent.getName()) || 
                    .equals(parent.getName())) && parent.node(0) == e)) {
                writeIndent();
            }
        } else if (.equals(e.getName())) {
            write(string("-", 80));
            newLine();
            newLine();
        } else if (.equals(e.getName())) {
            write("*");
        } else if (.equals(e.getName())) {
            write("**");
        } else if (.equals(e.getName())) {
            write("``");
        } else if (.equals(e.getName())) {
            write(":Author: ");
            ++;
        } else if (.equals(e.getName())) {
            write(":Authors: ");
            ++;
        } else if (.equals(e.getName())) {
            write(":Organization: ");
            ++;
        } else if (.equals(e.getName())) {
            write(":Address: ");
            ++;
        } else if (.equals(e.getName())) {
            write(":Contact: ");
            ++;
        } else if (.equals(e.getName())) {
            write(":Version: ");
            ++;
        } else if (.equals(e.getName())) {
            write(":Revision: ");
            ++;
        } else if (.equals(e.getName())) {
            write(":Status: ");
            ++;
        } else if (.equals(e.getName())) {
            write(":Date: ");
            ++;
        } else if (.equals(e.getName())) {
            write(":Copyright: ");
            ++;
        } else if (.equals(e.getName())) {
            writeIndent(":");
        } else if (.equals(e.getName())) {
            write(": ");
            ++;
        } else if (.equals(e.getName())) {
            write(" : ");
        } else if (.equals(e.getName())) {
            // pour une fois on est obligé de passer une ligne dans le
            // start, car on ne sait pas determiner la fin des classifiers
            // qui doivent etre tous sur la ligne du TERM
            newLine();
            ++;
        } else if (.equals(e.getName())) {
            write("::");
            newLine();
            newLine();
            ++;
        } else if (.equals(e.getName())) {
            // TODO now we take table as LITERAL_BLOCK, but in near
            // futur we must parse correctly TABLE (show JRSTReader and
            // JRSTLexer too)
        } else if (.equals(e.getName())) {
             = ;
        } else if (.equals(e.getName())) {
             = ;
             = Integer.parseInt(e.attributeValue("start"));
        } else if (.equals(e.getName())) {
            if (.equals()) {
                writeIndent("- ");
            } else if (.equals()) {
                writeIndent(enumtype(++, e.getParent().attributeValue(
                        "enumtype"))
                        + ". ");
            }
            ++;
        }
    }
    /*
     * (non-Javadoc)
     * 
     * @see org.nuiton.jrst.DocumentHandler#text(org.dom4j.Text)
     */
    @Override
    public void text(Text t) {
        if (.equals(t.getParent().getName())) {
            writeIndent(t.getText());
        } else {
            write(t.getText());
        }
    }
    protected void newLine() {
        write("\n");
    }
    protected void write(String text) {
        write(textfalse);
    }
    protected void writeIndent() {
        write(""true);
    }
    protected void writeIndent(String text) {
        write(texttrue);
    }

    
Ecrit le text, si indent est vrai, alors chaque ligne est indentée

Parameters:
text text to write
doIndent do indent
    protected void write(String textboolean doIndent) {
        try {
            String blank = "";
            if (doIndent) {
                blank = string("  ");
            }
            .write(blank);
            for (char c : text.toCharArray()) {
                .write(c);
                if (c == '\n') {
                    .write(blank);
                }
            }
        } catch (IOException eee) {
            if (.isWarnEnabled()) {
                .warn("TODO untreated error"eee);
            }
        }
    }
New to GrepCode? Check out our FAQ X