Java tutorial
/** * 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()); } } } }