001    /**
002     * LTAG-spinal API, an interface to the treebank format introduced by Libin Shen.
003     * Copyright (C) 2007  Lucas Champollion
004     *
005     * This program is free software: you can redistribute it and/or modify
006     * it under the terms of the GNU General Public License as published by
007     * the Free Software Foundation, either version 3 of the License, or
008     * (at your option) any later version.
009     * 
010     * This program is distributed in the hope that it will be useful,
011     * but WITHOUT ANY WARRANTY; without even the implied warranty of
012     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
013     * GNU General Public License for more details.
014     *
015     * You should have received a copy of the GNU General Public License
016     * along with this program.  If not, see <http://www.gnu.org/licenses/>.
017     *
018     */
019    package edu.upenn.cis.spinal;
020    
021    import java.io.*;
022    
023    /**
024     * Walks through a treebank, reads it in, and outputs representations 
025     * of the trees in Graphviz format. Alternatively, selects a given sentence (identified by its location)
026     * in the treebank and outputs a Graphviz representation for that sentence.
027     * <pre>
028     * Usage: java edu.upenn.cis.spinal.GraphvizWalker &lt;infile&gt; [&lt;sentence_location&gt;] 
029     * Output will be placed in files named &lt;sentence_location&gt;.dot.
030     * If &lt;sentence_location&gt; is not given, then all the sentences in the file will be processed and placed into a separate file each.
031     * </pre>
032     *
033     * @author Lucas Champollion
034     */
035    public class GraphvizWalker extends AbstractWalker {
036    
037    // Some commented-out code indicates how this class can be modified to only 
038    // search for trees that fulfill certain criteria.
039    
040        // modify these to get different behavior.
041        boolean includeSpans = true;
042        boolean beanPoleStyle = false;
043        boolean showSpines = true;
044        
045        int numSentences=0, numMultirooted=0;
046        
047        
048        String location = null; // the location of the sentence we want to display
049        
050        BufferedWriter out;
051        
052        /** Creates a new instance of <code>GraphvizWalker</code>. */
053        public GraphvizWalker() {
054            
055        }
056        
057        protected void init() {
058             if (args.length == 0) {
059                 printUsage();
060                 System.exit(1);
061             }
062             
063             if (args.length > 1) {
064                 
065                 // the rest of the args specify a sentence location
066                 this.location = "";
067                 for (int i = 1; i < args.length; i++) {
068                    
069                     location += args[i];
070                     location += " ";
071                 }
072                 location = location.trim();
073             }
074            
075        }
076        
077        public void forEachSentence(Sentence s) {
078            
079            // The following filter can be used to find short sentences that exemplify both
080            // adjunction and coordination.
081            
082    //        if (s.isSkipped() || !s.containsAdjunction() || !s.containsCoordination() || s.length() > 18) {
083    //            return;
084    //        }
085            
086    
087            if (this.location == null || this.location.equals(s.getLocation())) {
088                try {
089                    this.out = new BufferedWriter
090                            (new FileWriter(s.getLocation().replaceAll(" ", "_")+".dot"));
091                    this.out.write(s.toGraphviz(includeSpans, beanPoleStyle, showSpines));
092                    this.out.close();
093                } catch (IOException ex) {
094                    ex.printStackTrace();
095                } finally {
096                    if (this.location != null && this.location.equals(s.getLocation())) {
097                        terminate();
098                    }
099                }
100            }
101        }
102        
103        protected void wrapUp() {
104            try {
105                out.close();
106            } catch (IOException ex) {
107                ex.printStackTrace();
108            }
109        }
110        
111        /**
112         * Prints out the following message:
113         * 
114         * <pre>
115         * Usage: java edu.upenn.cis.spinal.GraphvizWalker &lt;infile&gt; [&lt;sentence_location&gt;] 
116         * Output will be placed in files named &lt;sentence_location&gt;.dot.
117         * If &lt;sentence_location&gt; is not given, then all the sentences in the file will be processed and placed into a separate file each.
118         * </pre>
119         */
120        protected void printUsage() {
121            System.out.println("Usage: java edu.upenn.cis.spinal.GraphvizWalker " +
122                    "<infile> [<sentence_location>] ");
123            System.out.println("Output will be placed in files named <sentence_location>.dot.");
124            System.out.println("If <sentence_location> is not given, then all the sentences " +
125                    "in the file will be processed and placed into a separate file each.");
126        }
127        
128        /**
129         * Main method, call from command line.
130         * @param argv the command line arguments
131         */
132        public static void main(String argv[]) {
133            new GraphvizWalker().process(argv);
134        }
135    }
136