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

📄 syntaxfilters.java

📁 具有不同语法高亮的编辑器实例
💻 JAVA
字号:
/*
 * 03/08/2004
 *
 * SyntaxFilters.java - Manages a list of wildcard file filters and what
 *                      syntax highlighting styles they map to.
 */
package org.fife.rtext;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import javax.swing.JOptionPane;

import org.fife.ui.rsyntaxtextarea.SyntaxConstants;

/**
 * Manages a list of wildcard file filters and what syntax highlighting
 * styles they map to.
 *
 * @author Robert Futrell
 * @version 0.1
 */
public class SyntaxFilters
    implements SyntaxConstants {

  /**
   * One filter set for every file type except plain text.
   */
  private ArrayList[] filters;

  /**
   * Default extensions RText matches to syntax styles.
   */
  private static final String[][] DEFAULT_FILTERS = {
      /* X86 asm */ {
      "*.asm"}
      ,
      /* C */{
      "*.c"}
      ,
      /* C++ */{
      "*.cpp", "*.cxx", "*.h"}
      ,
      /* C# */{
      "*.cs"}
      ,
      /* CSS */{
      "*.css"}
      ,
      /* Fortran */{
      "*.f", "*.for", "*.fort", "*.f77", "*.f90"}
      ,
      /* HTML */{
      "*.htm", "*.html"}
      ,
      /* Java */{
      "*.java"}
      ,
      /* JavaScript */{
      "*.js"}
      ,
      /* Perl */{
      "*.perl", "*.pl", "*.pm"}
      ,
      /* Properties files */{
      "*.properties"}
      ,
      /* Python */{
      "*.py"}
      ,
      /* SAS */{
      "*.sas"}
      ,
      /* SQL */{
      "*.sql"}
      ,
      /* UNIX shell */{
      "*.sh", "*.?sh"}
      ,
      /* Win batch */{
      "*.bat", "*.cmd"}
      ,
      /* XML */{
      "*.xml", "*.macro", "*.manifest"}
      ,
  };

      /*****************************************************************************/

  /**
   * Creates a new <code>SyntaxFilters</code> with default values for
   * all filters.
   */
  public SyntaxFilters() {
    this(null);
  }

      /*****************************************************************************/

  /**
   * Creates a new <code>SyntaxFilters</code> from the given string.
   *
   * @param filterString Must be a <code>String</code> generated from
   *                     <code>SyntaxFilter.toString()</code>.  If its
   *                     format is invalid, then default filter strings are
   *                     used for all syntax styles.
   */
  public SyntaxFilters(String filterString) {

    // One filter set for every file type except plain text.
    filters = new ArrayList[MAX_SYNTAX_STYLE_NUMBER];

    for (int i = 0; i < MAX_SYNTAX_STYLE_NUMBER; i++) {
      filters[i] = new ArrayList();
    }
    restoreDefaultFileFilters();

    int i = 1; // Start at 1 to skip 0==NO_SYNTAX_STYLE.
    if (filterString != null) {
      int oldCommaPos = 0;
      int commaPos = filterString.indexOf(',', 0);
      while (commaPos != -1) {
        String token = filterString.substring(oldCommaPos, commaPos);
        setFiltersForSyntaxStyle(i++, token);
        oldCommaPos = commaPos + 1;
        commaPos = filterString.indexOf(',', oldCommaPos);
      }
      // Get the last one (with no trailing comma).
      setFiltersForSyntaxStyle(i, filterString.substring(oldCommaPos));
    }

    // Use the defaults for all file filters if the file filter string
    // was "too short" to cover all syntax styles.  This is because we may
    // have added a new syntax style somewhere in the middle, and this
    // would mess up our filter->style mapping.
    if (i != MAX_SYNTAX_STYLE_NUMBER) {
      restoreDefaultFileFilters();
    }

  }

      /*****************************************************************************/

  /**
   * Adds a file filter for a given syntax style.
   *
   * @param syntaxStyle The syntax style to add a file filter to.  If this
   *                    style is less than 1 or greater than
   *                    <code>MAX_SYNTAX_STYLE_NUMBER</code>, this method
   *                    will do nothing.
   * @param filter The filter to add.  If <code>null</code>, nothing will
   *               be done.
   */
  public void addFileFilter(final int syntaxStyle, final String filter) {

    if (syntaxStyle < 1 || syntaxStyle > MAX_SYNTAX_STYLE_NUMBER ||
        filter == null) {
      return;
    }

    // -1 because we don't have filters for NO_SYNTAX_STYLE.
    filters[syntaxStyle - 1].add(filter);

  }

      /*****************************************************************************/

  /**
   * Returns a list of all wildcard file filters associated with this
   * syntax type, separated by spaces.  For example, if the C++ syntax
   * style has filters <code>*.cpp</code> and <code>*.h</code> associated
   * with it, then <code>getFilterString(CPLUSPLUS_SYNTAX_STYLE)</code>
   * would return <code>"*.cpp *.h"</code>.
   *
   * @param syntaxStyle The syntax style for which to retrieve the
   *                    string.  If it is less than 1 or greater than
   *                    <code>SyntaxConstants.MAX_STYLE_NUMBER</code>,
   *                    <code>null</code> is returned.
   */
  public String getFilterString(int syntaxStyle) {

    if (syntaxStyle < 1 ||
        syntaxStyle > SyntaxConstants.MAX_SYNTAX_STYLE_NUMBER) {
      return null;
    }

    // -1 because we don't have filters for NO_SYNTAX_STYLE.
    Iterator iterator = filters[syntaxStyle - 1].iterator();

    String filterString = "";
    while (iterator.hasNext()) {
      filterString += (String) iterator.next() + " ";

    }
    return filterString;

  }

      /*****************************************************************************/

  /**
   * Returns the type of syntax highlighting to use for the given text
   * file based on its extension and the current filters.
   *
   * @param fileName The file to syntax highlight.
   * @return The syntax highlighting scheme to use, for example,
   *         <code>JAVA_SYNTAX_STYLE</code> or
   *         <code>CPLUSPLUS_SYNTAX_STYLE</code>.
   * @see org.fife.ui.rsyntaxtextarea.RSyntaxTextArea
   * @see org.fife.ui.rsyntaxtextarea.SyntaxConstants
   */
  public int getSyntaxStyleForFile(final String fileName) {

    if (fileName == null) {
      return NO_SYNTAX_STYLE;
    }

    Iterator iterator;
    String regEx;

    final String fileNameLowerCase = fileName.toLowerCase();

    for (int i = 0; i < MAX_SYNTAX_STYLE_NUMBER; i++) {
      iterator = filters[i].iterator();
      while (iterator.hasNext()) {
        regEx = RTextUtilities.getRegularExpressionForFileFilter(
            (String) iterator.next(), true);
        if (regEx != null && fileNameLowerCase.matches(regEx)) {

          // +1 because we have no file filters for NO_SYNTAX_STYLE.
          return i + 1;
        }
      }
    }

    return NO_SYNTAX_STYLE;

  }

      /*****************************************************************************/

  /**
   * Returns <code>true</code> if and only if the file filter string passed
   * in is "valid".  Currently valid file filter strings contain only the
   * following characters: A-Z, a-z, 0-9, '*', '?', '.', '-', '_', ' ', '$'.
   *
   * @param fileFilterString The file filter string to test.
   * @return <code>true</code> if the file filter string is valid, false
   *         otherwise.
   */
  public static boolean isValidFileFilterString(String fileFilterString) {
    int length = fileFilterString.length();
    for (int i = 0; i < length; i++) {
      char c = fileFilterString.charAt(i);
      switch (c) {
        case '*':
        case '?':
        case '.':
        case '-':
        case '_':
        case '$':
        case ' ':
          continue;
        default:
          if (!Character.isLetterOrDigit(c)) {
            return false;
          }
      }
    }
    return true;
  }

      /*****************************************************************************/

  /**
   * Sets default values for syntax filters.
   */
  public void restoreDefaultFileFilters() {

    // NOTE:  We loop through this way instead of hard-coding
    // filter-to-syntax-style values because if we ever add new
    // syntax styles in the future, this method will still be sound
    // (once the new styles are added in, of course).
    for (int i = 0; i < MAX_SYNTAX_STYLE_NUMBER; i++) {
      filters[i].clear();
      String[] defaults = DEFAULT_FILTERS[i];
      for (int j = 0; j < defaults.length; j++) {
        filters[i].add(defaults[j]);
      }
    }

  }

      /*****************************************************************************/

  /**
   * Sets all file filters for a given syntax style.
   *
   * @param syntaxStyle The syntax style for which to set the file filters.
   *                    If this parameter is less than 1 or greater than
   *                    <code>MAX_SYNTAX_STYLE_NUMBER</code> then nothing
   *                    happens.
   * @param filterString A string representing the file filters separated
   *                     by spaces.  If <code>null</code>, nothing happens.
   */
  public void setFiltersForSyntaxStyle(int syntaxStyle, String filterString) {

    if (syntaxStyle < 1 ||
        syntaxStyle > SyntaxConstants.MAX_SYNTAX_STYLE_NUMBER ||
        filterString == null) {
      return;
    }

    //StringTokenizer st = new StringTokenizer(filterString);
    ArrayList tempList = filters[syntaxStyle - 1]; // -1 since we have no NO_SYNTAX_STYLE filters.

    tempList.clear();
    int oldSpacePos = 0;
    int spacePos = filterString.indexOf(' ', 0);
    while (spacePos != -1) {
      String token = filterString.substring(oldSpacePos, spacePos);
      if (!token.equals("")) {
        tempList.add(token);
      }
      oldSpacePos = spacePos + 1;
      spacePos = filterString.indexOf(' ', oldSpacePos);
    }
    if (oldSpacePos < filterString.length() - 1) {
      tempList.add(filterString.substring(oldSpacePos));

    }
    tempList = null;

  }

      /*****************************************************************************/

  /**
   * Returns this object as a string.
   *
   * @return A string representing this <code>SyntaxFilters</code>.
   */
  public String toString() {
    String retVal = "";
    for (int i = 0; i < MAX_SYNTAX_STYLE_NUMBER; i++) {
      retVal += getFilterString(i + 1) + ",";
      // Get rid of the last comma.
    }
    retVal = retVal.substring(0, retVal.length() - 1);
    return retVal;
  }

      /*****************************************************************************/

}

⌨️ 快捷键说明

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