/* * Copyright 2004-2006 Geert Bevin <gbevin[remove] at uwyn dot com> * Distributed under the terms of either: * - the common development and distribution license (CDDL), v1.0; or * - the GNU Lesser General Public License, v2.1 or later * $Id: JHighlight.java 3108 2006-03-13 18:03:00Z gbevin $ */ package com.uwyn.jhighlight; import com.uwyn.jhighlight.renderer.XhtmlRendererFactory; import com.uwyn.jhighlight.tools.FileUtils; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.Set; import java.util.regex.Pattern; /** * Provides console access to the source code syntax highlighting for Java, * HTML, XHTML, XML and LZX files. The rendering will be done in HTML. * <p>The following file extensions will be processed: <code>.java</code>, * <code>.html</code>, <code>.htm</code>, <code>.xhtml</code>, * <code>.xml</code> and <code>.lzx</code>. * <p>Execute the highlighting with the following syntax: * <pre>java com.uwyn.jhighlight.JHighlight [--verbose] [--fragment] [-d destdir] [-e encoding] file|dir ...</pre> * <table border="0"> * <tr> * <td><code>--verbose</code></td> * <td>Output messages about what the parser is doing.</td> * </tr> * <tr> * <td><code>--fragment</code></td> * <td>Output fragments instead of complete documents.</td> * </tr> * <tr> * <td><code>-d</code></td> * <td>Specify the destination directory</td> * </tr> * <tr> * <td><code>-e</code></td> * <td>Specify the encoding of the files</td> * </tr> * </table> * <p><a href="https://rife.dev.java.net">RIFE</a> template tags are also * supported and will be clearly highlighted. * * @author Geert Bevin (gbevin[remove] at uwyn dot com) * @version $Revision: 3108 $ * @since 1.0 */ public class JHighlight { public static void main(String[] arguments) throws Throwable { String destdir_name = null; boolean verbose = false; String encoding = null; boolean fragment = false; ArrayList names = new ArrayList(); boolean valid_arguments = true; if (arguments.length < 1) { valid_arguments = false; } else { boolean next_is_destdir = false; boolean next_is_encoding = false; String argument; for (int i = 0; i < arguments.length; i++) { argument = arguments[i]; if (next_is_destdir) { destdir_name = argument; next_is_destdir = false; continue; } if (next_is_encoding) { encoding = argument; next_is_encoding = false; continue; } if (argument.equals("-d")) { next_is_destdir = true; continue; } if (argument.equals("-e")) { next_is_encoding = true; continue; } if (argument.equals("--verbose")) { verbose = true; continue; } if (argument.equals("--fragment")) { fragment = true; continue; } names.add(argument); } } if (0 == names.size()) { valid_arguments = false; } if (!valid_arguments) { System.err.println("Usage : java " + JHighlight.class.getName() + " [--verbose] [--fragment] [-d destdir] [-e encoding] file|dir ..."); System.err.println("Generates highlighted XHTML files from all Java and XML source files"); System.err.println("in the specified directories."); System.err.println(" --verbose Output messages about what the parser is doing"); System.err.println(" --fragment Output fragments instead of complete documents"); System.err.println(" -d Specify the destination directory"); System.err.println(" -e Specify the encoding of the files"); System.exit(1); } File destdir = null; if (destdir_name != null) { destdir = new File(destdir_name); if (!destdir.exists()) { throw new IOException("The destination directory '" + destdir_name + "' doesn't exist."); } if (!destdir.canWrite()) { throw new IOException("The destination directory '" + destdir_name + "' is not writable."); } if (!destdir.isDirectory()) { throw new IOException("The destination directory '" + destdir_name + "' is not a directory."); } } Iterator names_it = names.iterator(); String name; while (names_it.hasNext()) { name = (String)names_it.next(); File location = new File(name); if (!location.exists()) { throw new IOException("The source location '" + name + "' doesn't exist."); } if (!location.canRead()) { throw new IOException("The source location '" + name + "' is not readable."); } if (!location.isDirectory()) { File out = null; if (null == destdir) { out = new File(location.getAbsolutePath() + ".html"); } else { out = new File(destdir, location.getName() + ".html"); } highlightFile(location.getName(), location, out, encoding, fragment, verbose); } else { Set supported_types = XhtmlRendererFactory.getSupportedTypes(); Pattern[] included = new Pattern[supported_types.size()]; Pattern[] excluded = new Pattern[supported_types.size()+5]; excluded[0] = Pattern.compile(".*SCCS.*"); excluded[0] = Pattern.compile(".*svn.*"); excluded[0] = Pattern.compile(".*CVS.*"); excluded[0] = Pattern.compile(".*jetty.*"); excluded[0] = Pattern.compile(".*tomcat.*"); Iterator types_it = supported_types.iterator(); String type; int counter = 0; while (types_it.hasNext()) { type = (String)types_it.next(); included[counter] = Pattern.compile(".*\\."+type+"$"); excluded[counter+5] = Pattern.compile(".*\\."+type+"\\.html\\.*"); counter++; } ArrayList file_names = FileUtils.getFileList(location, included, excluded); Iterator file_names_it = file_names.iterator(); String file_name; while (file_names_it.hasNext()) { file_name = (String)file_names_it.next(); File in = new File(location.getAbsolutePath() + File.separator + file_name); File out = null; if (null == destdir) { out = new File(location.getAbsolutePath() + File.separator + file_name + ".html"); } else { out = new File(destdir, location.getName() + File.separator + file_name + ".html"); } highlightFile(location.getName() + File.separator + file_name, in, out, encoding, fragment, verbose); } } } } private static void highlightFile(String name, File in, File out, String encoding, boolean fragment, boolean verbose) throws IOException { out.getParentFile().mkdirs(); if (verbose) { System.out.print(name + " ... "); } XhtmlRendererFactory.getRenderer(FileUtils.getExtension(name)) .highlight(name, in.toURL().openStream(), new FileOutputStream(out), encoding, fragment); if (verbose) { System.out.println("done."); } } }