//------------------------------------------------------------------------------
// COMPONENT NAME: LPEX Editor
//
// © Copyright IBM Corporation 2002, 2008
// All Rights Reserved.
//
// DESCRIPTION:
// HtmlSource - sample windowless use of LPEX / command: generate HTML listing
//------------------------------------------------------------------------------

package com.ibm.lpex.samples;

import com.ibm.lpex.core.LpexCommand;
import com.ibm.lpex.core.LpexConstants;
import com.ibm.lpex.core.LpexResources;
import com.ibm.lpex.core.LpexStringTokenizer;
import com.ibm.lpex.core.LpexView;

/**
 * Sample windowless use of the LPEX widget / command <b>html</b> -
 * generate HTML listing.  This utility generates the HTML listing of a file.
 * See also the <b>saveAsHtml</b> editor command.
 *
 * <p>Here is the HtmlSource
 * <a href="doc-files/HtmlSource.java.html">source code</a>
 * (listing created with HtmlSource itself).</p>
 *
 * <p>To run this sample:
 * <pre>
 *   java com.ibm.lpex.samples.HtmlSource <i>inputFile</i> [<i>outputFile</i>]</pre>
 * The class implements LpexCommand, so it can also be run from the command line:
 * <ul>
 *  <li>Define the command via an editor preference page, where available,
 *   or from the editor command line:
 *   <pre>set commandClass.html com.ibm.lpex.samples.HtmlSource</pre></li>
 *  <li>Run it from the editor command line:
 *   <pre>html <i>inputFile</i> [<i>outputFile</i>]</pre></li>
 * </ul></p>
 *
 * @see com.ibm.lpex.samples All the samples
 */
public class HtmlSource implements LpexCommand
{
 /**
  * Entry point when running this utility from the system prompt.
  *
  * @param args the input, and optionally output, file names
  */
 public static void main(String[] args)
 {
  System.exit(generateListing(args, null)? 0 : 1);
 }

 /**
  * Entry point when running this utility as an editor command.
  *
  * @param lpexView the document view in which the command was issued
  * @param parameters the input, and optionally output, file names
  */
 public boolean doCommand(LpexView lpexView, String parameters)
 {
  return generateListing(LpexStringTokenizer.split(parameters), lpexView);
 }

 /**
  * Generates the HTML listing.
  *
  * @param args input file, optional output file parameters
  * @param runFromView the editor view from which the command is run, or
  *                    null if run from the system prompt
  * @return true if successful
  */
 private static boolean generateListing(String[] args, LpexView runFromView)
 {
  // validate arguments
  if (args.length == 0 || args.length > 2 || args[0].length() == 0)
   {
    if (runFromView == null)
     {
      System.err.println("ERROR HtmlSource.  Usage:");
      System.err.println(" java com.ibm.lpex.samples.HtmlSource inputFile [outputFile]");
     }
    else
     {
      runFromView.doCommand("set messageText Error. Command parameters: inputFile [outputFile]");
     }
    return false;
   }

  // determine input and output files
  String inputFile = LpexStringTokenizer.trimQuotes(args[0]);
  String outputFile =
   (args.length == 2)? LpexStringTokenizer.trimQuotes(args[1]) : inputFile + ".html";

  // load input file, do an explicit "updateProfile" later
  LpexView lpexView = new LpexView(inputFile, false);
  String status = lpexView.query("status");
  if (status == null)
   {
    // define and use a light-blue background palette regardless of current user settings
    lpexView.doCommand("set updateProfile.paletteAttributes.default._blue 0 0 0 248 248 254");
    lpexView.doCommand("set updateProfile.palette _blue");

    // initialize and run the appropriate document parser
    lpexView.doCommand("updateProfile");
    // add some extra styles to Java source files
    String parser = lpexView.query("parser");
    if ("java".equals(parser))
     {
      String style = lpexView.query("styleAttributes.c"); // comments in italics
      lpexView.doCommand("set styleAttributes.c " + style + " italic");
      style = lpexView.query("styleAttributes.C");        // javadoc comments in italics
      lpexView.doCommand("set styleAttributes.C " + style + " italic");
      style = lpexView.query("styleAttributes.k");        // keywords in bold
      lpexView.doCommand("set styleAttributes.k " + style + " bold");
      style = lpexView.query("styleAttributes.r");        // keyword 'return' in bold
      lpexView.doCommand("set styleAttributes.r " + style + " bold");
      style = lpexView.query("styleAttributes.t");        // javadoc comment tags in bold italics
      lpexView.doCommand("set styleAttributes.t " + style + " bold italic");
     }
    // and to Java properties files
    else if ("prop".equals(parser))
     {
      String style = lpexView.query("styleAttributes.c"); // comments in italics
      lpexView.doCommand("set styleAttributes.c " + style + " italic");
      style = lpexView.query("styleAttributes.k");        // keywords in bold
      lpexView.doCommand("set styleAttributes.k " + style + " bold");
     }
    // save the parsed view as HTML
    lpexView.doCommand("saveAsHtml \"" + outputFile + "\"");
    status = lpexView.query("status");
   }

  // analyze any problems encountered
  if (status != null)
   {
    // see if an LPEX error message is available for this status
    String error = status.equals(LpexConstants.STATUS_FILE_NOTFOUND)?
                    LpexResources.message(status, inputFile) : LpexResources.message(status);

    // write an error message
    String message = (error != null)? error : "LPEX status=\"" + status + "\".";
    if (runFromView == null)
     {
      String command = "ERROR HtmlSource " + inputFile +
                        ((args.length == 2)? " " + outputFile : "");
      System.err.println(command + ": " + message);
     }
    else
     {
      runFromView.doCommand("set messageText " + message);
     }
   }

  // clean up
  lpexView.dispose();
  return status == null;
 }
}