HTMLのインデント、連続する半角スペース、改行を取り除くJavaScript

改行がスペースになったり、連続したスペースは1文字扱いだったりとややこしいレンダリング周り。さらに、ブラウザ間で差があるから発狂物。どのブラウザで見ても同じにしたい。スペース1つが命取りな場合もある。なんとかしたい!


そんなことは、サーバ側でやれよ。って話ですが、UserScriptでゴニョゴニョしたいときはjavascriptでがんばるしかないので、なんとかしてみました。

JavaScript

var b = document.body;
// body.innerHTMLを1行ごと配列に格納
var l = b.innerHTML.split("\n");

for (var i = 0, j = l.length; i < j; i++) {
  // 前後の空白文字を取り除く
  // 連続する半角スペースを1つにまとめる
  l[i] = l[i].replace(/^\s+|\s+$/g,'').replace(/ +/g,' ');
}

// 改行を削除してbody.innerHTML書き換える
b.innerHTML=l.join('');

Bookmarklet

どのブラウザでもいける
javascript:(function(){var b=document.body,l=b.innerHTML.split("\n");for(var i=0,j=l.length;i<j;i++)l[i]=l[i].replace(/^\s+|\s+$/g,'').replace(/ +/g,' ');b.innerHTML=l.join('');})()
JavaScript 1.6をサポートしているブラウザ(IE以外)
javascript:(function(){var b=document.body,l=b.innerHTML.split("\n");l.forEach(function(m,i){l[i]=m.replace(/^\s+|\s+$/g,'').replace(/ +/g,' ')});b.innerHTML=l.join('');})()
JavaScript 1.8.1をサポートしているブラウザ(Firefox3.5)
javascript:(function(){var b=document.body,l=b.innerHTML.split("\n");l.forEach(function(m,i){l[i]=m.trim().replace(/ +/g,' ')});b.innerHTML=l.join('');})()

今後の課題

<html>
  <body>
    <ul>
      <li><span>    aiu   eo    </span>
      <li><a href="hoge.html">あいう</a> (2008/08/28更新)          </li>
    </ul>
  </body>
<html>


<html>
  <body>
<ul><li><span> aiu eo </span><li><a href="hoge.html">あいう</a> (2008/08/28更新) </li></ul>
  </body>
<html>


までは、整形できたのですが、まだブラウザで差が出る。具体的には、「(2008/08/28更新) 」赤くなっている部分をIEではスペースありとみなす。