package org.uli.wikitext; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintStream; import java.io.Reader; import java.io.Writer; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; 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.Options; import org.apache.commons.cli.ParseException; import org.apache.commons.cli.PosixParser; import org.eclipse.mylyn.wikitext.confluence.core.ConfluenceLanguage; import org.eclipse.mylyn.wikitext.core.parser.DocumentBuilder; import org.eclipse.mylyn.wikitext.core.parser.MarkupParser; import org.eclipse.mylyn.wikitext.core.parser.builder.DocBookDocumentBuilder; import org.eclipse.mylyn.wikitext.core.parser.builder.HtmlDocumentBuilder; import org.eclipse.mylyn.wikitext.core.parser.builder.XslfoDocumentBuilder; import org.eclipse.mylyn.wikitext.core.parser.markup.MarkupLanguage; import org.eclipse.mylyn.wikitext.markdown.core.MarkdownLanguage; import org.eclipse.mylyn.wikitext.mediawiki.core.MediaWikiLanguage; import org.eclipse.mylyn.wikitext.textile.core.TextileLanguage; import org.eclipse.mylyn.wikitext.tracwiki.core.TracWikiLanguage; import org.eclipse.mylyn.wikitext.twiki.core.TWikiLanguage; import org.uli.util.MyOptionBuilder; public class Main { static private final String NAME = "wikitext"; public static void main(String[] args) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, IOException { int exitCode = run(args); if (exitCode != 0) { System.exit(exitCode); } } private final static void printHelp(PrintStream out, Options options, ParseException e) { if (e != null) { out.println(NAME + ": Command line error - " + e.getMessage()); } HelpFormatter helpFormatter = new HelpFormatter(); helpFormatter.printHelp(NAME, options); } static public int run(String[] args) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, IOException { Main main = new Main(); Options options = new Options(); Option[] add = new Option[] { MyOptionBuilder.init().withLongOpt("help").withDescription("print help").create("h"), MyOptionBuilder.init().withLongOpt("from").hasArg().withDescription("input file").create("f"), MyOptionBuilder.init().withLongOpt("to").hasArg().withDescription("output file").create("t"), MyOptionBuilder.init().withLongOpt("input-format").hasArg().withDescription("input format").create("i"), MyOptionBuilder.init().withLongOpt("output-format").hasArg().withDescription("output format").create("o") }; for (Option o : add) { options.addOption(o); } int exitCode = 0; boolean fHelp = false; inputType it = inputType.UNKNOWN; outputType ot = outputType.UNKNOWN; Reader inputReader = null; Writer outputWriter = null; for (;;) { CommandLineParser commandLineParser = new PosixParser(); try { CommandLine commandLine = commandLineParser.parse(options, args); fHelp = commandLine.hasOption("h"); if (fHelp) { printHelp(System.out, options, null); break; } if (commandLine.hasOption("f")) { String fname = commandLine.getOptionValue("f"); inputReader = new FileReader(fname); it = inputType.fromName(getExtension(fname)); } if (commandLine.hasOption("i")) { String fmtname = commandLine.getOptionValue("i"); it = inputType.fromName(fmtname); } if (commandLine.hasOption("t")) { String fname = commandLine.getOptionValue("t"); outputWriter = new FileWriter(fname); ot = outputType.fromName(getExtension(fname)); } if (commandLine.hasOption("o")) { String fmtname = commandLine.getOptionValue("o"); ot = outputType.fromName(fmtname); } String[] remainingArgs = commandLine.getArgs(); if (remainingArgs.length != 0) { printHelp(System.err, options, null); System.err.println("Expecting no command line arguments - got " + remainingArgs.length); exitCode = 11; break; } if (inputReader == null) { inputReader = new InputStreamReader(System.in); } if (outputWriter == null) { outputWriter = new OutputStreamWriter(System.out); } if (it == inputType.UNKNOWN) { System.err.println("Unkown input type"); exitCode = 12; break; } if (ot == outputType.UNKNOWN) { System.err.println("Unkown output type"); exitCode = 13; break; } main.parse(it, inputReader, ot, outputWriter); break; } catch (ParseException e) { System.err.println(NAME + ": Command line error - " + e.getMessage()); HelpFormatter helpFormatter = new HelpFormatter(); helpFormatter.printHelp(NAME, options); exitCode = 10; break; } } return exitCode; } void parse(inputType inputFormat, Reader inputReader, outputType outputType, Writer outputWriter) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, IOException { DocumentBuilder builder = outputType.getBuilder(outputWriter); MarkupLanguage language = inputFormat.getMarkupLanguage(); MarkupParser parser = new MarkupParser(language, builder); parser.parse(inputReader); } private static final String getExtension(String filename) { String[] tokens = filename.split("\\.(?=[^\\.]+$)"); String result = ""; if (tokens.length > 1) { result = tokens[1]; } return result; } enum inputType { UNKNOWN("", null), TEXTILE("textile", new TextileLanguage()), TRAC("trac", new TracWikiLanguage()), MEDIAWIKI("mediawiki", new MediaWikiLanguage()), CONFLUENCE("confluence", new ConfluenceLanguage()), TWIKI("twiki", new TWikiLanguage()), MARKDOWN("md", new MarkdownLanguage()); String inputTypeName; MarkupLanguage language; inputType(String name, MarkupLanguage language) { this.inputTypeName = name; this.language = language; } public MarkupLanguage getMarkupLanguage() { return language; } private final static inputType fromName(String name) { inputType it = inputType.UNKNOWN; for (inputType thisInputType : inputType.values()) { if (thisInputType != inputType.UNKNOWN) { if (name.equals(thisInputType.inputTypeName)) { it = thisInputType; break; } } } return it; } } // inputType enum outputType { UNKNOWN("", null), HTML("html", HtmlDocumentBuilder.class), DOCBOOK("docbook", DocBookDocumentBuilder.class), XSLFO("xslfo", XslfoDocumentBuilder.class); String outputTypeName; Class<?> builderClass; outputType(String name, Class<?> builderClass) { this.outputTypeName = name; this.builderClass = builderClass; } public DocumentBuilder getBuilder(Writer out) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException { Constructor<?> ctor = builderClass.getConstructor(Writer.class); DocumentBuilder db = (DocumentBuilder) ctor.newInstance(new Object[] { out }); return db; } private final static outputType fromName(String name) { outputType ot = outputType.UNKNOWN; for (outputType thisOutputType : outputType.values()) { if (thisOutputType != outputType.UNKNOWN) { if (name.equals(thisOutputType.outputTypeName)) { ot = thisOutputType; break; } } } return ot; } } // outputType }