//レイアウト部分のタグフィルタ
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
}