/** VB用のカウンタを作成します。 */
 private static DefaultStepCounter createVBCounter(String name) {
   DefaultStepCounter counter = new DefaultStepCounter();
   counter.addLineComment("'");
   counter.addLineComment("REM");
   counter.setFileType(name);
   return counter;
 }
 /** Java用のカウンタを作成します。 */
 private static DefaultStepCounter createJavaCounter(String name) {
   DefaultStepCounter counter = new DefaultStepCounter();
   counter.addLineComment("//");
   counter.addAreaComment(new AreaComment("/*", "*/"));
   counter.setFileType(name);
   //		counter.addSkipPattern("^package .+;$");
   //		counter.addSkipPattern("^import .+;$");
   return counter;
 }
  /**
   * ステップカウンタのインスタンスを取得します。 未対応の形式の場合、nullを返します。
   *
   * @param fileName ファイル名
   * @return ファイル名に対応したステップカウンタのインスタンス。未対応の場合null。
   */
  public static StepCounter getCounter(String fileName) {
    // 小文字に変換
    fileName = fileName.toLowerCase();

    if (fileName.endsWith(".java")) {
      // Java用カウンタを作成
      return createJavaCounter("Java");

    } else if (fileName.endsWith(".scala")) {
      // Scala用カウンタを作成
      return createJavaCounter("Scala");

    } else if (fileName.endsWith(".cpp") || fileName.endsWith(".c")) {
      // C/C++用カウンタを作成
      return createJavaCounter("C/C++");

    } else if (fileName.endsWith(".h")) {
      // ヘッダファイル用カウンタを作成
      return createJavaCounter("h");

    } else if (fileName.endsWith(".cs")) {
      // C#用カウンタを作成
      return createJavaCounter("C#");

    } else if (fileName.endsWith(".jsp")) {
      // JSP用カウンタを作成
      DefaultStepCounter counter = new DefaultStepCounter();
      counter.addLineComment("//");
      counter.addAreaComment(new AreaComment("/*", "*/"));
      counter.addAreaComment(new AreaComment("<%--", "--%>"));
      counter.addAreaComment(new AreaComment("<!--", "-->"));
      counter.setFileType("JSP");
      return counter;

    } else if (fileName.endsWith(".php") || fileName.endsWith(".php3")) {
      // PHP用カウンタを作成
      DefaultStepCounter counter = new DefaultStepCounter();
      counter.addLineComment("//");
      counter.addAreaComment(new AreaComment("/*", "*/"));
      counter.addAreaComment(new AreaComment("<!--", "-->"));
      counter.setFileType("PHP");
      return counter;

    } else if (fileName.endsWith(".asp") || fileName.endsWith(".asa")) {
      // ASP用カウンタを作成
      DefaultStepCounter counter = new DefaultStepCounter();
      counter.addLineComment("'");
      counter.addAreaComment(new AreaComment("<!--", "-->"));
      counter.setFileType("ASP");
      return counter;

    } else if (fileName.endsWith(".html") || fileName.endsWith(".htm")) {
      // HTML用カウンタを作成
      return createXMLCounter("HTML");

    } else if (fileName.endsWith(".xhtml")) {
      // XHTML用カウンタを作成
      return createXMLCounter("XHTML");

    } else if (fileName.endsWith(".js")) {
      // JavaScript用カウンタを作成
      return createJavaCounter("js");

    } else if (fileName.endsWith(".json")) {
      // JSON用カウンタを作成
      return createJavaCounter("JSON");

    } else if (fileName.endsWith(".vbs")) {
      // VBScript用カウンタを作成
      return createVBCounter("vbs");

    } else if (fileName.endsWith(".bas")
        || fileName.endsWith(".frm")
        || fileName.endsWith(".cls")) {
      // VB用カウンタを作成
      return createVBCounter("VB");

    } else if (fileName.endsWith(".vb")) {
      // VB.NET用カウンタを作成
      return createVBCounter("VB.NET");

    } else if (fileName.endsWith(".pl") || fileName.endsWith(".pm")) {
      // Perl用カウンタを作成
      DefaultStepCounter counter = new DefaultStepCounter();
      counter.addLineComment("#");
      counter.addAreaComment(new AreaComment("=pod", "=cut"));
      counter.setFileType("Perl");
      return counter;

    } else if (fileName.endsWith(".py")) {
      // Python用カウンタを作成
      //			DefaultStepCounter counter = new DefaultStepCounter();
      //			counter.addLineComment("#");
      //			counter.setFileType("Python");
      return new PythonCounter();

    } else if (fileName.endsWith(".rb")) {
      // Ruby用カウンタを作成
      DefaultStepCounter counter = new DefaultStepCounter();
      counter.addLineComment("#");
      counter.addAreaComment(new AreaComment("=begin", "=end"));
      counter.setFileType("Ruby");
      return counter;

    } else if (fileName.endsWith(".tcl")) {
      // Tcl用カウンタを作成
      return createShellCounter("Tcl");

    } else if (fileName.endsWith(".sql")) {
      // SQL用カウンタを作成
      DefaultStepCounter counter = new DefaultStepCounter();
      counter.addLineComment("#");
      counter.addLineComment("--");
      counter.addLineComment("REM");
      counter.addAreaComment(new AreaComment("/*", "*/"));
      counter.setFileType("SQL");
      return counter;

    } else if (fileName.endsWith(".cfm")) {
      // ColdFusion用カウンタを作成
      DefaultStepCounter counter = new DefaultStepCounter();
      counter.addAreaComment(new AreaComment("<!--", "-->"));
      counter.addAreaComment(new AreaComment("<!---", "--->"));
      counter.setFileType("CFM");
      return counter;

    } else if (fileName.endsWith(".properties")) {
      // プロパティファイル用カウンタを作成
      return createShellCounter("Properties");

    } else if (fileName.endsWith(".xml") || fileName.endsWith(".dicon")) {
      // XML用カウンタを作成
      return createXMLCounter("XML");

    } else if (fileName.endsWith(".xsl")) {
      // XSLT用カウンタを作成
      return createXMLCounter("XSLT");

    } else if (fileName.endsWith(".xi")) {
      // Xi用カウンタを作成
      return createXMLCounter("Xi");

    } else if (fileName.endsWith(".dtd")) {
      // DTD用カウンタを作成
      return createXMLCounter("DTD");

    } else if (fileName.endsWith(".tld")) {
      // TLD用カウンタを作成
      return createXMLCounter("TLD");

    } else if (fileName.endsWith(".xsd")) {
      // XMLSchema用カウンタを作成
      return createXMLCounter("XMLSchema");

    } else if (fileName.endsWith(".bat")) {
      // BATファイル用カウンタを作成
      DefaultStepCounter counter = new DefaultStepCounter();
      counter.addLineComment("REM");
      counter.setFileType("BAT");
      return counter;

    } else if (fileName.endsWith(".css")) {
      // CSS用カウンタを作成
      DefaultStepCounter counter = new DefaultStepCounter();
      counter.addAreaComment(new AreaComment("/*", "*/"));
      counter.setFileType("CSS");
      return counter;

    } else if (fileName.endsWith(".l") || fileName.endsWith(".el") || fileName.endsWith(".cl")) {
      // Lisp用カウンタを作成
      return createListCounter("Lisp");

    } else if (fileName.endsWith(".clj")) {
      // Clojure用カウンタを作成
      return createListCounter("Clojure");

    } else if (fileName.endsWith(".scm")) {
      // Scheme用カウンタを作成
      return createListCounter("Scheme");

    } else if (fileName.endsWith(".st")) {
      // Smalltalk用カウンタを作成
      DefaultStepCounter counter = new DefaultStepCounter();
      counter.addAreaComment(new AreaComment("\"", "\""));
      counter.setFileType("Smalltalk");
      return counter;

    } else if (fileName.endsWith(".vm") || fileName.endsWith(".vsl")) {
      // Velocity用カウンタを作成
      DefaultStepCounter counter = new DefaultStepCounter();
      counter.addLineComment("##");
      counter.setFileType("Velocity");
      return counter;

    } else if (fileName.endsWith(".ini")) {
      // INI用カウンタを作成
      DefaultStepCounter counter = new DefaultStepCounter();
      counter.addLineComment(";");
      counter.setFileType("INI");
      return counter;

    } else if (fileName.endsWith(".lua")) {
      // Luaカウンタを作成
      DefaultStepCounter counter = new DefaultStepCounter();
      counter.addLineComment("--");
      counter.addAreaComment(new AreaComment("--[[", "]]"));
      counter.addAreaComment(new AreaComment("--[===[", "]===]"));
      counter.setFileType("Lua");
      return counter;

    } else if (fileName.endsWith(".hs")) {
      // Haskellカウンタを作成
      DefaultStepCounter counter = new DefaultStepCounter();
      counter.addLineComment("--");
      counter.addAreaComment(new AreaComment("{-", "-}"));
      counter.setFileType("Haskell");
      return counter;

    } else if (fileName.endsWith(".f") || fileName.endsWith(".for") || fileName.endsWith(".ftn")) {
      // Fortran(固定形式)カウンタを作成
      DefaultStepCounter counter = new DefaultStepCounter();
      counter.addLineComment("*");
      counter.setFileType("Fortran");
      return counter;

    } else if (fileName.endsWith(".f90") || fileName.endsWith(".f95")) {
      // Fortran(自由形式)カウンタを作成
      DefaultStepCounter counter = new DefaultStepCounter();
      counter.addLineComment("!");
      counter.setFileType("Fortran");
      return counter;

    } else if (fileName.equals("Makefile")) {
      // Makefile用カウンタを作成
      return createShellCounter("Makefile");

    } else if (fileName.endsWith(".as")) {
      // ActionScript3用カウンタを作成
      return createJavaCounter(".as");

    } else if (fileName.endsWith(".mxml")) {
      // MXML用カウンタを作成
      return createXMLCounter(".mxml");

    } else {
      return null;
    }
  }