JavaScript/JavaFileName のバックアップの現在との差分(No.1)
- バックアップ一覧
- 差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- JavaScript/JavaFileName へ行く。
- 1 (2012-09-11 (火) 10:45:12)
- 2 (2012-09-11 (火) 11:55:01)
- 3 (2012-09-19 (水) 08:47:06)
- 4 (2012-09-19 (水) 11:44:12)
- 5 (2012-09-19 (水) 14:30:22)
- 6 (2012-09-20 (木) 12:44:30)
- 7 (2012-09-20 (木) 18:53:10)
- 8 (2014-06-04 (水) 00:54:09)
- 9 (2014-09-04 (木) 01:31:30)
- 10 (2014-09-26 (金) 19:16:59)
- 11 (2014-11-08 (土) 01:41:12)
- 12 (2014-12-10 (水) 17:19:14)
- 13 (2017-10-27 (金) 16:26:13)
- 14 (2019-03-12 (火) 18:14:04)
- 15 (2019-04-02 (火) 17:31:03)
- 16 (2024-02-21 (水) 02:08:40)
- 追加された行はこの色です。
- 削除された行はこの色です。
TITLE:JavaScriptでソースコードからJavaのファイル名を取得する #navi(../) RIGHT:Posted by [[aterai]] at 2012-09-11 * JavaScriptでソースコードからJavaのファイル名を取得する [#b6c86e5c] --- title: JavaScriptでソースコードからJavaのファイル名を取得する author: aterai pubdate: 2012-09-11T10:45:12+09:00 description: JavaScriptでソースコードからJavaのファイル名を取得するBookmarkletを作成する --- #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名を表示 * 概要 [#summary] - `pre`タグで囲まれたソースコードなどから、`public class`を検索して`Java`のファイル名を取得する -- [[JavaScriptでpreタグで囲まれたソースコードをtextareaにコピーする>JavaScript/pre2textarea]] で`pre`内のコードを`textarea`に変換する代わりに、直接名前付きで保存できるようにするために使用することを想定 -- [https://ateraimemo.com/JavaScript/pre2textarea.html#ua1c0148 ローカルにドロップして保存(ファイル名付き)] - 使用方法 -- ユーザー`JavaScript`フォルダにコピー: [https://ateraimemo.com/data/javascript/java_file_name.user.js java_file_name.user.js] -- `pre`要素をダブルクリックすると、検索した`Java`のファイル名を表示 ** ソースコード [#d2ebc1c2] * ソースコード [#sourcecode] #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; } var r = code.match(/public(?:\s|final)+(?:class|interface|enum)\s+([^<{\s]+)/m); return (r ? r[1] : 'Unknown') + '.java'; } 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, ' '); return div.childNodes[0].nodeValue.replace(/\xA0/g, ' '); //replace } 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] * Bookmarklet版 [#bookmarklet] - 名前 -- 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)}}()); -- `java_file_name` - アドレス(`YUI Compressor`で圧縮) javascript:(function(){function c(h){var g=h.match(/public(?:\s|final)+(?:class|interface|enum)\s+([^<{\s]+)/m);return(g?g[1]:"Unknown")+".java"}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 {...} * 制限 [#limitation] - 対象は`Java`のファイル名のみ - 字句解析は行わない - `public`なクラスが存在しない場合には未対応 - 以下の様な形式のコメントは考慮しない -- `public /* comment */ class Main {...}` ** テスト用 [#oa0a9909] #code{{ function getFileName(code) { var ext = '.java', f = false, name = 'Unknown', array = code.split(/[{\s\r\n]+/), i, len = array.length; for(i=0;i<len;i++) { switch(array[i]) { case 'public': f = true; continue; case 'class': case 'interface': case 'enum': name = array[i+1]; if(f) break; f = false; continue; case 'final': continue; default: f = false; } } return name+ext; } }} * テスト用のサンプルソースコード [#test] #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{{ // aaaaaaaaaaa // bbbbbbb public enum Flip { NONE, VERTICAL, HORIZONTAL } }} #code{{ public final enum Flip { NONE, VERTICAL, HORIZONTAL } }} #code{{ public /* comment */ enum Flip { public /* comment aaa bbb ccc */ enum Flip { NONE, VERTICAL, HORIZONTAL } }} //** 参考リンク #code{{ public enum /* comment aaa bbb ccc */ Flip { NONE, VERTICAL, HORIZONTAL } }} ** コメント [#af6e4bf0] #code{{ public enum テスト { NONE, VERTICAL, HORIZONTAL } }} #code{{ enum Flip { NONE, VERTICAL, HORIZONTAL } public interface CloseableTabbedPaneListener extends EventListener { /** * Informs all CloseableTabbedPaneListeners when a tab should be aaa * closed < > & ©right; <>&© * @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 class HashMapComboBoxModel<K, V> extends AbstractListModel<K> implements MutableComboBoxModel<K>, Serializable { // @Override ... } }} // * 参考リンク [#reference] * コメント [#comment] #comment #comment