2012年10月28日

EmEditor・URLデコードマクロ改良版

 今回の日記も含めて、EmEditorについてのまとめはこちら。

EmEditorまとめ



 以前の日記、EmEditor・URLデコードマクロで、Googleの検索URLから一括で検索文字を抽出・変換するマクロを書いたけど、この問題点。
正しいURL
https://www.google.co.jp/search?q=%E6%9C%80%E7%B5%82%E5%B9%B3%E5%92%8C%E5%85%B5%E5%99%A8&ie=UTF-8

検索文字間違い
https://www.google.co.jp/search?q=%E6%80%92%E9%A6%96%E9%A0%98%E8%9C%82%E5%8A&ie=UTF-8

コード違い
https://www.google.co.jp/search?q=%91%93%E2u%8Dg%98%40%91%E0&ie=SHIFT_JIS
 1つめのURLをデコードすると「最終平和兵器」と変換してくれるが、2つめは「怒首領蜂」の後に「%E5%8A」と間違った文字が入っているため、エラーが出て止まる。
 また、Shift JISなどUTF-8以外のコードでも同様にエラーが出る。

 私はこれをブログのアクセス解析でよく使うが、そこで見る限りURL間違いは必ず、検索文字の最後が途切れている。
 また、Javascriptでは「try〜catch(e)」命令で、エラーが出た場合の処理を追加する事が可能。

 つまり、検索URLデコードでエラーが出たら、
『1つ前の「%」まで戻る〜再デコードを繰り返し、行の先頭まで行けばデコード不可と判断』
 とすればいい。そこで作ったのが次のマクロ。

// URL一括デコードマクロ(改良版)
document.selection.Replace("^.*q=","" , eeReplaceAll |
eeFindReplaceRegExp); // 検索ワードの前を削除
document.selection.Replace("&.*$","" , eeReplaceAll |
eeFindReplaceRegExp); // 検索ワードの後を削除
document.selection.
EndOfDocument(false); // 最下段まで移動
YEnd = document.selection.GetActivePointY
( eePosLogical ); // 最下段の行数取得

// デコード処理
for( Y = 1; Y < YEnd; Y++) { // 先頭〜最下段までループ
document.selection.SetActivePoint
( eePosLogical , 1 , Y , false ); // 指定行に移動
document.selection.EndOfLine
(false,eeLineLogical); // 指定行の最後に移動
X = document.selection.GetActivePointX
( eePosLogical ); // 現在桁を記録
Flag = 0; // フラグ指示
while (Flag == 0) { // フラグ0の間ループ
document.selection.SetActivePoint
( eePosLogical , 1 , Y , false ); // 行の先頭
document.selection.SetActivePoint
( eePosLogical , X , Y , true ); // 範囲指定
try {
document.selection.Text = decodeURI
(document.selection.Text); // デコード
Flag = 1; // デコードできればフラグ
} catch(e) { // デコード不可の場合
if ( document.selection.Find( "%" ,
eeFindPrevious | eeFindReplaceRegExp) != 0
&&
document.selection.
GetActivePointY( eePosLogical ) == Y
) { // 同じ行で「%」があれば
X = document.selection.GetActivePointX
( eePosLogical ) - 1; // %の前が次の桁
}
}
}
}
document.HighlightFind = false; // 検索強調解除
document.selection.StartOfDocument(false); // 先頭に戻る
 最初で検索文字のみにしてから何行あるかを取得して、1行ずつ最後までデコードしていく。
 1行のデコード時にエラーが出たら、検索を使って一つ前の「%」まで戻って再デコードを繰り返すが、「%が無い」もしくは「別の行で%が見つかった」にならない限りはループを続ける、という動作をしている。
 でもこれ、デコード不可の行では「行の先頭まで行って何も無い文字をデコードしたからエラーが出なかった」でループを抜ける処理という、若干姑息な事をやっている。

 さっきのURLが入った文書でこのマクロを実行すると、
https://www.google.co.jp/search?q=%E6%9C%80%E7%B5%82%E5%B9%B3%E5%92%8C%E5%85%B5%E5%99%A8&ie=UTF-8
https://www.google.co.jp/search?q=%E6%80%92%E9%A6%96%E9%A0%98%E8%9C%82%E5%8A&ie=UTF-8
https://www.google.co.jp/search?q=%91%93%E2u%8Dg%98%40%91%E0&ie=SHIFT_JIS
   ↓
最終平和兵器
怒首領蜂%E5%8A
%91%93%E2u%8Dg%98%40%91%E0
 と、間違った部分やUTF-8以外を残した形でデコードしてくれる。


(2012/10/29 追記)
 リストの中で、ちょっと意味無し変数があったので修正。
 実は、文中でも書いている「行の先頭で何も無い文字をデコードしたからエラーが出ずにループを抜ける」の処理のため、本当はcatch(e)内はif文無しで処理できるが、こういう事がしたいという意味で残しておいた。




posted by 司隆 at 18:45 | Comment(0) | Computer
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

×

この広告は180日以上新しい記事の投稿がないブログに表示されております。