⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 verbatim.java

📁 Java的面向对象数据库系统的源代码
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
// Verbatim.java - Saxon extensions supporting DocBook verbatim environmentspackage com.nwalsh.saxon;import java.util.Stack;import java.util.StringTokenizer;import org.xml.sax.*;import org.w3c.dom.*;import javax.xml.transform.TransformerException;import com.icl.saxon.Controller;import com.icl.saxon.expr.*;import com.icl.saxon.om.*;import com.icl.saxon.pattern.*;import com.icl.saxon.Context;import com.icl.saxon.tree.*;import com.icl.saxon.functions.Extensions;import com.nwalsh.saxon.NumberLinesEmitter;import com.nwalsh.saxon.CalloutEmitter;/** * <p>Saxon extensions supporting DocBook verbatim environments</p> * * <p>$Id: Verbatim.java,v 1.2 2001/08/05 22:35:38 nwalsh Exp $</p> * * <p>Copyright (C) 2000 Norman Walsh.</p> * * <p>This class provides a * <a href="http://users.iclway.co.uk/mhkay/saxon/">Saxon</a> * implementation of two features that would be impractical to * implement directly in XSLT: line numbering and callouts.</p> * * <p><b>Line Numbering</b></p> * <p>The <tt>numberLines</tt> method takes a result tree * fragment (assumed to contain the contents of a formatted verbatim * element in DocBook: programlisting, screen, address, literallayout, * or synopsis) and returns a result tree fragment decorated with * line numbers.</p> * * <p><b>Callouts</b></p> * <p>The <tt>insertCallouts</tt> method takes an * <tt>areaspec</tt> and a result tree fragment * (assumed to contain the contents of a formatted verbatim * element in DocBook: programlisting, screen, address, literallayout, * or synopsis) and returns a result tree fragment decorated with * callouts.</p> * * <p><b>Change Log:</b></p> * <dl> * <dt>1.0</dt> * <dd><p>Initial release.</p></dd> * </dl> * * @author Norman Walsh * <a href="mailto:ndw@nwalsh.com">ndw@nwalsh.com</a> * * @version $Id: Verbatim.java,v 1.2 2001/08/05 22:35:38 nwalsh Exp $ * */public class Verbatim {  /** True if the stylesheet is producing formatting objects */  private static boolean foStylesheet = false;  /** The modulus for line numbering (every 'modulus' line is numbered). */  private static int modulus = 0;  /** The width (in characters) of line numbers (for padding). */  private static int width = 0;  /** The separator between the line number and the verbatim text. */  private static String separator = "";  /** True if callouts have been setup */  private static boolean calloutsSetup = false;  /** The default column for callouts that have only a line or line range */  private static int defaultColumn = 60;  /** The path to use for graphical callout decorations. */  private static String graphicsPath = null;  /** The extension to use for graphical callout decorations. */  private static String graphicsExt = null;  /** The largest callout number that can be represented graphically. */  private static int graphicsMax = 10;  /** The FormatCallout object to use for formatting callouts. */  private static FormatCallout fCallout = null;  /**   * <p>Constructor for Verbatim</p>   *   * <p>All of the methods are static, so the constructor does nothing.</p>   */  public Verbatim() {  }  /**   * <p>Find the string value of a stylesheet variable or parameter</p>   *   * <p>Returns the string value of <code>varName</code> in the current   * <code>context</code>. Returns the empty string if the variable is   * not defined.</p>   *   * @param context The current stylesheet context   * @param varName The name of the variable (without the dollar sign)   *   * @return The string value of the variable   */  protected static String getVariable(Context context, String varName) {    Value variable = null;    String varString = null;    try {      variable = Extensions.evaluate(context, "$" + varName);      varString = variable.asString();      return varString;    } catch (TransformerException te) {      System.out.println("Undefined variable: " + varName);      return "";    } catch (IllegalArgumentException iae) {      System.out.println("Undefined variable: " + varName);      return "";    }  }  /**   * <p>Setup the parameters associated with line numbering</p>   *   * <p>This method queries the stylesheet for the variables   * associated with line numbering. It is called automatically before   * lines are numbered. The context is used to retrieve the values,   * this allows templates to redefine these variables.</p>   *   * <p>The following variables are queried. If the variables do not   * exist, builtin defaults will be used (but you may also get a bunch   * of messages from the Java interpreter).</p>   *   * <dl>   * <dt><code>linenumbering.everyNth</code></dt>   * <dd>Specifies the lines that will be numbered. The first line is   * always numbered. (builtin default: 5).</dd>   * <dt><code>linenumbering.width</code></dt>   * <dd>Specifies the width of the numbers. If the specified width is too   * narrow for the largest number needed, it will automatically be made   * wider. (builtin default: 3).</dd>   * <dt><code>linenumbering.separator</code></dt>   * <dd>Specifies the string that separates line numbers from lines   * in the program listing. (builtin default: " ").</dd>   * <dt><code>stylesheet.result.type</code></dt>   * <dd>Specifies the stylesheet result type. The value is either 'fo'   * (for XSL Formatting Objects) or it isn't. (builtin default: html).</dd>   * </dl>   *   * @param context The current stylesheet context   *   */  private static void setupLineNumbering(Context context) {    // Hardcoded defaults    modulus = 5;    width = 3;    separator = " ";    foStylesheet = false;    String varString = null;    // Get the modulus    varString = getVariable(context, "linenumbering.everyNth");    try {      modulus = Integer.parseInt(varString);    } catch (NumberFormatException nfe) {      System.out.println("$linenumbering.everyNth is not a number: " + varString);    }    // Get the width    varString = getVariable(context, "linenumbering.width");    try {      width = Integer.parseInt(varString);    } catch (NumberFormatException nfe) {      System.out.println("$linenumbering.width is not a number: " + varString);    }    // Get the separator    varString = getVariable(context, "linenumbering.separator");    separator = varString;    // Get the stylesheet type    varString = getVariable(context, "stylesheet.result.type");    foStylesheet = (varString.equals("fo"));  }  /**   * <p>Number lines in a verbatim environment</p>   *   * <p>The extension function expects the following variables to be   * available in the calling context: $linenumbering.everyNth,   * $linenumbering.width, $linenumbering.separator, and   * $stylesheet.result.type.</p>   *   * <p>This method adds line numbers to a result tree fragment. Each   * newline that occurs in a text node is assumed to start a new line.   * The first line is always numbered, every subsequent 'everyNth' line   * is numbered (so if everyNth=5, lines 1, 5, 10, 15, etc. will be   * numbered. If there are fewer than everyNth lines in the environment,   * every line is numbered.</p>   *   * <p>Every line number will be right justified in a string 'width'   * characters long. If the line number of the last line in the   * environment is too long to fit in the specified width, the width   * is automatically increased to the smallest value that can hold the   * number of the last line. (In other words, if you specify the value 2   * and attempt to enumerate the lines of an environment that is 100 lines   * long, the value 3 will automatically be used for every line in the   * environment.)</p>   *   * <p>The 'separator' string is inserted between the line   * number and the original program listing. Lines that aren't numbered   * are preceded by a 'width' blank string and the separator.</p>   *   * <p>If inline markup extends across line breaks, markup changes are   * required. All the open elements are closed before the line break and   * "reopened" afterwards. The reopened elements will have the same   * attributes as the originals, except that 'name' and 'id' attributes   * are not duplicated if the stylesheet.result.type is "html" and   * 'id' attributes will not be duplicated if the result type is "fo".</p>   *   * @param rtf The result tree fragment of the verbatim environment.   *   * @return The modified result tree fragment.   */  public static NodeSetValue numberLines (Context context,					  NodeSetValue rtf_ns) {    FragmentValue rtf = (FragmentValue) rtf_ns;    setupLineNumbering(context);    try {      LineCountEmitter lcEmitter = new LineCountEmitter();      rtf.replay(lcEmitter);      int numLines = lcEmitter.lineCount();      int listingModulus = numLines < modulus ? 1 : modulus;      double log10numLines = Math.log(numLines) / Math.log(10);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -