org.stathissideris.ascii2image.core.CommandLineConverter.java Source code

Java tutorial

Introduction

Here is the source code for org.stathissideris.ascii2image.core.CommandLineConverter.java

Source

/**
 * ditaa - Diagrams Through Ascii Art
 * 
 * Copyright (C) 2004-2011 Efstathios Sideris
 *
 * ditaa 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.
 *
 * ditaa 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 Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with ditaa.  If not, see <http://www.gnu.org/licenses/>.
 *   
 */
package org.stathissideris.ascii2image.core;

import java.awt.image.RenderedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;

import javax.imageio.ImageIO;

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.PosixParser;
import org.stathissideris.ascii2image.graphics.BitmapRenderer;
import org.stathissideris.ascii2image.graphics.Diagram;
import org.stathissideris.ascii2image.text.TextGrid;

/**
 * 
 * @author Efstathios Sideris
 */
public class CommandLineConverter {

    private static String notice = "ditaa version 0.9, Copyright (C) 2004--2009  Efstathios (Stathis) Sideris";

    private static String[] markupModeAllowedValues = { "use", "ignore", "render" };

    public static void main(String[] args) {

        long startTime = System.currentTimeMillis();

        Options cmdLnOptions = new Options();
        cmdLnOptions.addOption(OptionBuilder.withLongOpt("help").withDescription("Prints usage help.").create());
        cmdLnOptions.addOption("v", "verbose", false, "Makes ditaa more verbose.");
        cmdLnOptions.addOption("o", "overwrite", false,
                "If the filename of the destination image already exists, an alternative name is chosen. If the overwrite option is selected, the image file is instead overwriten.");
        cmdLnOptions.addOption("S", "no-shadows", false, "Turns off the drop-shadow effect.");
        cmdLnOptions.addOption("A", "no-antialias", false, "Turns anti-aliasing off.");
        cmdLnOptions.addOption("W", "fixed-slope", false,
                "Makes sides of parallelograms and trapezoids fixed slope instead of fixed width.");
        cmdLnOptions.addOption("d", "debug", false, "Renders the debug grid over the resulting image.");
        cmdLnOptions.addOption("r", "round-corners", false, "Causes all corners to be rendered as round corners.");
        cmdLnOptions.addOption("E", "no-separation", false, "Prevents the separation of common edges of shapes.");
        cmdLnOptions.addOption("h", "html", false,
                "In this case the input is an HTML file. The contents of the <pre class=\"textdiagram\"> tags are rendered as diagrams and saved in the images directory and a new HTML file is produced with the appropriate <img> tags.");
        cmdLnOptions.addOption("T", "transparent", false,
                "Causes the diagram to be rendered on a transparent background. Overrides --background.");

        cmdLnOptions.addOption(OptionBuilder.withLongOpt("encoding")
                .withDescription("The encoding of the input file.").hasArg().withArgName("ENCODING").create('e'));

        cmdLnOptions.addOption(OptionBuilder.withLongOpt("scale").withDescription(
                "A natural number that determines the size of the rendered image. The units are fractions of the default size (2.5 renders 1.5 times bigger than the default).")
                .hasArg().withArgName("SCALE").create('s'));

        cmdLnOptions.addOption(OptionBuilder.withLongOpt("tabs").withDescription(
                "Tabs are normally interpreted as 8 spaces but it is possible to change that using this option. It is not advisable to use tabs in your diagrams.")
                .hasArg().withArgName("TABS").create('t'));

        cmdLnOptions.addOption(OptionBuilder.withLongOpt("background").withDescription(
                "The background colour of the image. The format should be a six-digit hexadecimal number (as in HTML, FF0000 for red). Pass an eight-digit hex to define transparency. This is overridden by --transparent.")
                .hasArg().withArgName("BACKGROUND").create('b'));

        //TODO: uncomment this for next version:
        //      cmdLnOptions.addOption(
        //            OptionBuilder.withLongOpt("config")
        //            .withDescription( "The shape configuration file." )
        //            .hasArg()
        //            .withArgName("CONFIG_FILE")
        //            .create('c') );

        CommandLine cmdLine = null;

        ///// parse command line options
        try {
            // parse the command line arguments
            CommandLineParser parser = new PosixParser();

            cmdLine = parser.parse(cmdLnOptions, args);

            // validate that block-size has been set
            if (cmdLine.hasOption("block-size")) {
                // print the value of block-size
                System.out.println(cmdLine.getOptionValue("block-size"));
            }

        } catch (org.apache.commons.cli.ParseException e) {
            System.err.println(e.getMessage());
            new HelpFormatter().printHelp("java -jar ditaa.jar <INPFILE> [OUTFILE]", cmdLnOptions, true);
            System.exit(2);
        }

        if (cmdLine.hasOption("help") || args.length == 0) {
            new HelpFormatter().printHelp("java -jar ditaa.jar <INPFILE> [OUTFILE]", cmdLnOptions, true);
            System.exit(0);
        }

        ConversionOptions options = null;
        try {
            options = new ConversionOptions(cmdLine);
        } catch (UnsupportedEncodingException e2) {
            System.err.println("Error: " + e2.getMessage());
            System.exit(2);
        } catch (IllegalArgumentException e2) {
            System.err.println("Error: " + e2.getMessage());
            new HelpFormatter().printHelp("java -jar ditaa.jar <INPFILE> [OUTFILE]", cmdLnOptions, true);
            System.exit(2);
        }

        args = cmdLine.getArgs();

        if (args.length == 0) {
            System.err.println("Error: Please provide the input file filename");
            new HelpFormatter().printHelp("java -jar ditaa.jar <inpfile> [outfile]", cmdLnOptions, true);
            System.exit(2);
        }

        if (cmdLine.hasOption("html")) {
            /////// print options before running
            printRunInfo(cmdLine);
            String filename = args[0];

            boolean overwrite = false;
            if (options.processingOptions.overwriteFiles())
                overwrite = true;

            String toFilename;
            if (args.length == 1) {
                toFilename = FileUtils.makeTargetPathname(filename, "html", "_processed", true);
            } else {
                toFilename = args[1];
            }
            File target = new File(toFilename);
            if (!overwrite && target.exists()) {
                System.out.println("Error: File " + toFilename
                        + " exists. If you would like to overwrite it, please use the --overwrite option.");
                System.exit(0);
            }

            new HTMLConverter().convertHTMLFile(filename, toFilename, "ditaa_diagram", "images", options);
            System.exit(0);

        } else { //simple mode

            TextGrid grid = new TextGrid();
            if (options.processingOptions.getCustomShapes() != null) {
                grid.addToMarkupTags(options.processingOptions.getCustomShapes().keySet());
            }

            // "-" means stdin / stdout
            String fromFilename = args[0];
            boolean stdIn = "-".equals(fromFilename);

            String toFilename;
            boolean stdOut;

            boolean overwrite = false;
            if (options.processingOptions.overwriteFiles())
                overwrite = true;

            if (args.length == 1) {
                if (stdIn) { // if using stdin and no output specified, use stdout
                    stdOut = true;
                    toFilename = "-";
                } else {
                    toFilename = FileUtils.makeTargetPathname(fromFilename, "png", overwrite);
                    stdOut = false;
                }
            } else {
                toFilename = args[1];
                stdOut = "-".equals(toFilename);
            }

            if (!stdOut) {
                /////// print options before running
                printRunInfo(cmdLine);
                System.out.println("Reading " + (stdIn ? "standard input" : "file: " + fromFilename));
            }

            try {
                if (!grid.loadFrom(fromFilename, options.processingOptions)) {
                    System.err.println("Cannot open file " + fromFilename + " for reading");
                }
            } catch (UnsupportedEncodingException e1) {
                System.err.println("Error: " + e1.getMessage());
                System.exit(1);
            } catch (FileNotFoundException e1) {
                System.err.println("Error: File " + fromFilename + " does not exist");
                System.exit(1);
            } catch (IOException e1) {
                System.err.println("Error: Cannot open file " + fromFilename + " for reading");
                System.exit(1);
            }

            if (options.processingOptions.printDebugOutput()) {
                if (!stdOut)
                    System.out.println("Using grid:");
                grid.printDebug();
            }

            Diagram diagram = new Diagram(grid, options);
            if (!stdOut)
                System.out.println("Rendering to file: " + toFilename);

            RenderedImage image = new BitmapRenderer().renderToImage(diagram, options.renderingOptions);

            try {
                OutputStream os = stdOut ? System.out : new FileOutputStream(toFilename);
                ImageIO.write(image, "png", os);
            } catch (IOException e) {
                //e.printStackTrace();
                System.err.println("Error: Cannot write to file " + toFilename);
                System.exit(1);
            }

            //BitmapRenderer.renderToPNG(diagram, toFilename, options.renderingOptions);

            long endTime = System.currentTimeMillis();
            long totalTime = (endTime - startTime) / 1000;
            if (!stdOut)
                System.out.println("Done in " + totalTime + "sec");

            //         try {
            //         Thread.sleep(Long.MAX_VALUE);
            //         } catch (InterruptedException e) {
            //         e.printStackTrace();
            //         }

        }
    }

    private static void printRunInfo(CommandLine cmdLine) {
        System.out.println("\n" + notice + "\n");

        System.out.println("Running with options:");
        Option[] opts = cmdLine.getOptions();
        for (Option option : opts) {
            if (option.hasArgs()) {
                for (String value : option.getValues()) {
                    System.out.println(option.getLongOpt() + " = " + value);
                }
            } else if (option.hasArg()) {
                System.out.println(option.getLongOpt() + " = " + option.getValue());
            } else {
                System.out.println(option.getLongOpt());
            }
        }
    }
}