機能としては
- 行番号をつける
- ダブルクリックで新規ウィンドウで表示
- 指定行へのリンク機能
構文の色づけとかもしたかったけど長くなりそうなので挫折。
最新版はgitHub - yosiloveに置いておくとして、実行サンプル代わりに現在のところのソースコードを張っておく。
/* クラス名を「code」にしたpreタグについて - 中身を行番号付きにする - 中身をダブルクリックで、タグを削除した内容を新規Windowで開く - <a href="#preタグのid+行番号">でその行まで飛べる 作者:yosilove 作成:2010/11/03 */ //======================= // 補助用の関数 //======================= /*タグの削除 ただし、liは改行コードに置き換え */ function tag_delete(html){ //liを改行に置き換える li2n = new RegExp(/<\/li>/g); html = html.replace(li2n, "\n"); //タグをすべて削除 rgexp = new RegExp(/<("[^"]*"|'[^']*'|[^'">])*>/g); plain = html.replace(rgexp, ""); return plain; } /*olを使って行番号の追加 */ function addLineNum(source,aid){ if(aid == "undefined") { aid = "def"; } //改行コードで分割 var lines = source.split("\n"); //olタグを使って行番号をつける var newSource = "<code class\"srcFile\"><ol class=\"srcCode\">\n"; for (n = 0; n < lines.length; n++) { //行番号へのリンク用のaタグを準備 var aTag = "<a id=\""+ aid + (n+1) + "\"></a>" newSource = newSource + aTag + "<li class=\"lineNum\">" + lines[n] +"</li>"; } newSource = newSource + "</ol></code>" return newSource; } /*ソースコードを新しいウィンドウで表示 */ function openByNewWindow() { //head内 //id要素を新しいWindowのタイトルに設定 var head = "<title>"+this.id+"</title>"; //body部分 var txt = tag_delete(this.innerHTML); html = txt.replace('\n',"<br>"); var body = "<pre>"+html+"</pre>"; //HTMLを作る var newhtml = "<html><head>"+head+"</head><body>"+body+"</body></html>"; //新しいWindowで表示 var win = window.open(); win.document.open(); win.document.write(newhtml); win.document.close(); } //======================= // Mainの関数 //======================= window.onload = function pre2code_exec(){ //preタグを検索 for (i = 0; i < document.all.tags("pre").length; i++) { var preTag = document.all.tags("pre")(i); //クラス名がcodeだったら if(preTag.className.indexOf("code") !=-1 ){ var html = preTag.innerHTML; //行番号を追加 preTag.innerHTML = addLineNum(html,preTag.id); //イベントリスナを追加(ダブルクリックでopenByNewWindow実行) preTag.addEventListener("dblclick" , openByNewWindow , true); } } }
ちなみに色とかの設定は別のCSSでやってるのでスクリプトは関係ないです。
上の例では「pre class="code" id="pre2code.js"」というようにしてある。
classを「code」、idを「pre2code.js」にしてあるので、ソースコード内をダブルクリックすると「pre2code.js」というタイトルで新規ウィンドウが表示されるはず。
あと「a href="#pre2code.js31"」とするとソースコードの31行目に飛べる、、、はず。
さーて、ちゃんと動くかな?どう?Safari以外でテストしてないんだけど動いてる?
3 comments:
2010年11月3日 18:53
リンクのところ、どうやらブロッガーだとちょっとめんどくさいらしい。
というのも、Bloggerで「a href="#pre2code.js31"」としてページを保存すると、勝手に「a href="http://hogehoge/#pre2code.js31"」と補完されてしまう!ので、一度保存した後にURLを調べてリンクを指定しないといけないらしい。
ちなみに
リンクの編集で「#pre2code.js31」とすると「http:/#pre2code.js31」にアクセスしようとしてしまい、やっぱりできない orz
まぁ肝心の印刷画面表示ができたからいいか。
2010年11月3日 20:03
安全のため、普段はActiveXもJavaScriptもいろいろと無効にしている俺に死角はなかった。。。
>ソースコードの31行目に飛べる、、、はず。
世界のIEエンジン(笑)では動いてるっぽいよ!
2010年11月3日 20:18
>>匿名 さん
世界のIE(笑)で動けば問題ないなw
しかし、そうか
JavaScriptが無効な人ってのも結構いるのかもしれんね。。。
JavaScript無効でも見やすいサイト作りを心がけて行こうと思いますです。
コメントを投稿