• ベストアンサー

オートインデントの実装

ふと、思いついたのですが、JavaScriptのソース専用でいいので テキストエリアに入れたソースを自動的に(tabで)インデントしてそのテキストエリアに表示って出来ますか? なお、ソースは途中までで、{}で囲みきれていないかもしれない、と言う場合も対応できるとなお良いです。 ちなみに私は2時間で諦めました・・・

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

ちょっと修正:-P <script type="text/javascript"> <!-- window.onload=function(){ var source=document.getElementById("Source"); var a = new Array(); var editText=""; var level=0; a=source.value.split(/\n/); for(var i=0;i<a.length;i++){ var aLine=""; var ch; var inStr=false; a[i]=trim(a[i]); for(var pos=0;pos<a[i].length;pos++){ ch=a[i].charAt(pos); if("{"==ch && inStr==false){ editText+=makeTab(level++)+aLine+ch+"\n"; aLine=""; do{ ch=a[i].charAt(pos+1); if(ch==" " || ch=="\t") pos++;//{の後の空白のスキップ else break; }while(true); } else if("}"==ch && inStr==false){ if(pos!=0) editText+=makeTab(level)+aLine+"\n"; aLine=ch; level--; } else if("\\"==ch && inStr){ aLine+="\\"+a[i].charAt(++pos);//¥のエスケープ処理 } else { if(ch=="\""){ inStr=!inStr;//文字列の中か?''は、考慮してない♪ } aLine+=ch; } } if(a[i]=="") editText+="\n";//元々空行の時単に改行出力 if(aLine!="")//編集の結果の行が空行で無い時、インデントして出力 editText+=makeTab(level)+aLine+"\n"; } source.value=editText; } function trim(str){ str=str.replace(/^\s+/,"");//先頭からの空白文字を取り除く str=str.replace(/\s+$/m,"");//後ろからの空白文字を取り除く return(str); } function rtrim(str){ str=str.replace(/\s+$/m,"");//後ろからの空白文字を取り除く return(str); } function makeTab(n){ var nTab=""; for(var i=0;i<n;i++) // nTab+="\t";//n個のタブを作る nTab+=" ";//n個のタブ(空白4個)を作る return(nTab); } //--> </script>

m035
質問者

お礼

実はJavaScriptで簡易エディタ(js用)を作ろうと思いまして。 自動インデントは絶対にほしい機能だったのでかなり助かりました。 また、何かエディタの機能で出来ないものがあったら質問させていただきます。 ありがとうございました。

その他の回答 (3)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#2>おかしな動作 さしあたり、文字列中の{}も動作に含めるのがおかしいっすね。

m035
質問者

補足

そうですね。それ以外は問題ありませんでした。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

かなり、適当ですけど、一応作ってみました。 おかしな動作の場合は、補足して下さい。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=SHIFT_JIS"> <title>{}によるインデント整形</title> <script type="text/javascript"> <!-- window.onload=function(){ var source=document.getElementById("Source"); var a = new Array(); var editText=""; var level=0; a=source.value.split(/\n/); for(var i=0;i<a.length;i++){ var aLine=""; var ch; a[i]=trim(a[i]); for(var pos=0;pos<a[i].length;pos++){ ch=a[i].charAt(pos); if("{"==ch){ editText+=makeTab(level++)+aLine+ch+"\n"; aLine=""; do{ ch=a[i].charAt(pos+1); if(ch==" " || ch=="\t") pos++;//{の後の空白のスキップ else break; }while(true); } else if("}"==ch){ if(pos!=0) editText+=makeTab(level)+aLine+"\n"; aLine=ch; level--; } else { aLine+=ch; } } if(a[i]=="") editText+="\n";//元々空行の時単に改行出力 if(aLine!="")//編集の結果の行が空行で無い時、インデントして出力 editText+=makeTab(level)+aLine+"\n"; } source.value=editText; } function trim(str){ str=str.replace(/^\s+/,"");//先頭からの空白文字を取り除く str=str.replace(/\s+$/m,"");//後ろからの空白文字を取り除く return(str); } function rtrim(str){ str=str.replace(/\s+$/m,"");//後ろからの空白文字を取り除く return(str); } function makeTab(n){ var nTab=""; for(var i=0;i<n;i++) nTab+="\t";//n個のタブを作る // nTab+=" ";//n個のタブ(空白4個)を作る return(nTab); } //--> </script> </head> <body> <textarea id="Source" cols="120" rows="30"> サンプル <script type="text/javascript"> <!-- for(i=0;i<42;i++){ no[i] = document.getElementById("No" + i.toString());} function preYear(){ var y; y= parseInt(DispYear.childNodes[0].nodeValue); if( y > 1){ y = y -1; } DispYear.childNodes[0].nodeValue = y.toString(); setCalendar();} for(a in test) { a++; } // --> </script>

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

真面目にやったら、かなり難しいと言わざるを得ません。 {を見つけたらインデントして }を見つけたら、逆インデント(?)する といった簡略なものなら結構簡単にできるかもしれませんが、(その場合、途中のものには当然対応できません) 上記のやり方は、実際には、 文が1つだけの時には、 ifとかforとか{}を必ずしもつけないということがよくあるので、すごく限定した書き方にしか対応できないので、あまり使えないものにしかなりません。 javaScriptの場合、特殊な場合になりますが、文末で行末の「;」を省略できるということも、真面目にやる時の文法の解釈をとても難しいものにします。 こういうちゃんとしたプリティプリントがあったら私も欲しいです。 ただまあ、 概ねC用のindent(インデントをして整形するツール)が使えるような気がします。

m035
質問者

補足

やはり難しいですか・・・。 > {を見つけたらインデントして > }を見つけたら、逆インデント(?)する ↑これだけでもいいので作ってもらえないでしょうか?

関連するQ&A