//レイアウト部分のタグフィルタ function filtrateLayout(mainStr){ var CR=getCRChars() var mainCode=new makeCode(mainStr,P_NO_USE) var lineCode var bufName="" var nameStr="" var slashSym="" var bufAttribute="" var bufStr="" var ltCnt=0 //無効な"<"の数をカウント var tagFlg=false //有効なタグ var gtFlg=false //有効なタグ内で">"が出現した //一行ずつ取り出してフィルタリング mainCode.getChr() while(mainCode.Chr!=""){ //タグフラグ初期化 tagFlg=false //一行取り出す lineCode=new makeCode(mainCode.getFront(CR),P_NO_USE) //取り出した行をフィルタリング lineCode.getChr() while(lineCode.Chr!=""){ //"<"のとき if(lineCode.Chr=="<"){ if(tagFlg){ bufAttribute+="<" }else{ //バッファクリア bufName="" bufAttribute="" //"<"の次の文字をチェック lineCode.getChr() if(lineCode.Chr=="/"){ slashSym="/" lineCode.getChr() }else{ slashSym="" } //エレメント名を取得 //最初の一文字はa-z,A-Z で、二文字目以降は 制御文字(半角スペースも含む),"<",">"以外の文字 if(lineCode.Chr>="a" && lineCode.Chr<="z" || lineCode.Chr>="A" && lineCode.Chr<="Z"){ while(lineCode!="" && lineCode.Chr>" " && lineCode.Chr!="<" && lineCode.Chr!=">"){ bufName+=lineCode.Chr lineCode.getChr() } } //タグ判別 nameStr=bufName.toLowerCase() if(nameStr==""|| nameStr.indexOf("body")==0 || nameStr.indexOf("head")==0 || nameStr.indexOf("html")==0 || nameStr.indexOf("meta")==0 || nameStr.indexOf("title")==0 ){ //使用不可なタグの場合 ltCnt++ bufStr+="<"+slashSym+bufName }else{ //使用可能なタグの場合 tagFlg=true gtFlg=false } continue } //">"のとき }else if(lineCode.Chr==">"){ if(tagFlg){ //タグの"<"に対応する">"が出現したとき if(ltCnt>0){ gtFlg=true ltCnt-- bufAttribute+=">" //ltCnt==0の場合 }else{ tagFlg=false bufStr+="<"+slashSym+nameStr+bufAttribute+">" } }else{ if(ltCnt>0){ ltCnt-- } bufStr+=">" } //"<",">",改行 以外のとき }else{ if(tagFlg){ bufAttribute+=lineCode.Chr }else{ bufStr+=lineCode.Chr } } //次の文字を取り出す lineCode.getChr() } //行末処理 if(tagFlg){ if(gtFlg){ bufStr+="<"+slashSym+nameStr+bufAttribute }else{ ltCnt++ bufStr+="<"+slashSym+bufName+bufAttribute } } //改行の場合 if(mainCode.Chr!="") bufStr+=CR mainCode.getChr() } return bufStr }