TITLE:JavaScriptでソースコードからJavaのファイル名を取得する
#navi(../)
RIGHT:Posted by [[aterai]] at 2012-09-11
* JavaScriptでソースコードからJavaのファイル名を取得する [#b6c86e5c]

#contents

** 概要 [#ve7c744d]
preタグで囲まれたソースコードなどから、public classなどを検索して、Javaのファイル名を取得するテスト。
- ユーザーJavaScriptフォルダにコピー [http://terai.xrea.jp/data/javascript/java_file_name.user.js java_file_name.user.js]
- pre要素をダブルクリックすると、検索したJava名を表示

** ソースコード [#d2ebc1c2]
#code{{
(function() {
  function getFileName(code) {
    var ext = '.java';
    //class, interface, or enum
    if(code.match(/public\s*[\r\n]*class\s*[\r\n]*([^{\s\n\r]+)/m) ||
       code.match(/public\s*[\r\n]*interface\s*[\r\n]*([^{\s\n\r]+)/m) ||
       code.match(/public\s*[\r\n]*enum\s*[\r\n]*([^{\s\n\r]+)/m)) {
      return RegExp.$1+ext;
    }else{
      return 'Unknown'+ext;
    }
  }
  function pre2text(pre) {
    var div = document.createElement('div');
    div.innerHTML = pre.innerHTML.replace(/<br[ \/]*>/ig, '\n').replace(/<.*?>/mg, '');
    return div.childNodes[0].nodeValue.replace(/\xA0/g, ' ');
  }
  var listener = function(e) {
    alert(getFileName(pre2text(this)));
  },
  pre = document.getElementsByTagName('pre'),
  i = 0, len = pre.length;
  for(; i<len; i++) {
    pre[i].addEventListener('dblclick', listener, false);
  }
}());
}}

** Bookmarklet版 [#g50b36cd]
- 名前
-- java_file_name
- アドレス(YUI Compressor で圧縮)
 javascript:(function(){function c(h){var g=".java";if(h.match(/public\s*[\r\n]*class\s*[\r\n]*([^{\s\n\r]+)/m)||h.match(/public\s*[\r\n]*interface\s*[\r\n]*([^{\s\n\r]+)/m)||h.match(/public\s*[\r\n]*enum\s*[\r\n]*([^{\s\n\r]+)/m)){return RegExp.$1+g}else{return"Unknown"+g}}function d(g){var h=document.createElement("div");h.innerHTML=g.innerHTML.replace(/<br[ \/]*>/ig,"\n").replace(/<.*?>/mg,"");return h.childNodes[0].nodeValue.replace(/\xA0/g," ")}var e=function(g){alert(c(d(this)))},f=document.getElementsByTagName("pre"),b=0,a=f.length;for(;b<a;b++){f[b].addEventListener("dblclick",e,false)}}());

** 制限 [#db6ab432]
- %%interface, enum に未対応%%
-- %%public enum Test {A, B, C}%%
- %%改行に未対応%%
- コメントを考慮していない
-- public /*comment*/ class Main {...}
- finalに未対応
-- public final class Main {...}

** テスト用 [#oa0a9909]
#code{{
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.Position;
import javax.swing.tree.*;

	public
 class         
 		JTreeNextMatchTest
{
  public JComponent makeUI() {
    JTree tree = new JTree() {
      @Override public TreePath getNextMatch(
          String prefix, int startingRow, Position.Bias bias) {
        return null;
      }
    };
    JPanel p = new JPanel(new BorderLayout());
    p.add(new JScrollPane(tree));
    return p;
  }
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() {
        createAndShowGUI();
      }
    });
  }
  public static void createAndShowGUI() {
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.getContentPane().add(new JTreeNextMatchTest().makeUI());
    f.setSize(320, 240);
    f.setLocationRelativeTo(null);
    f.setVisible(true);
  }
}
}}

#code{{
public interface CloseableTabbedPaneListener extends EventListener {
    /**
     * Informs all CloseableTabbedPaneListeners when a tab should be
     * closed
     * @param tabIndexToClose the index of the tab which should be closed
     * @return true if the tab can be closed, false otherwise
     */
    boolean closeTab(int tabIndexToClose);
}
}}

#code{{
public enum Flip {
    NONE, VERTICAL, HORIZONTAL
}
}}

#code{{
public final enum Flip {
    NONE, VERTICAL, HORIZONTAL
}
}}

#code{{
public /* comment */ enum Flip {
    NONE, VERTICAL, HORIZONTAL
}
}}

//** 参考リンク

** コメント [#af6e4bf0]
#comment