私は最終的に、柔軟なタブストップの形式に大まかに従う関数を自分で作成しましたが、複雑さは必要ありませんでした (私のテーブルはすべて 1 つのブロックであり、各行に等しい列があります)。
align
関数で最初のブロックをスローし、2 番目のブロックを返すテスト ケース (および実際のユース ケース) で機能します。
コーヒースクリプトで:
align = (d)->
b = []
l = []
$.each d.split(/\n/), ->
a = []
$.each this.split(/(\t+|\s\s+)/), ->
if this.match /\w/
a.push this.toString()
if l[a.length-1]? < this.length then l[a.length-1] = this.length
b.push a
pad = (txt, len)->
while (txt.length<len)
txt += " "
txt
o = "\n"
$.each b, ->
$.each this, (i)->
o += pad this.toString(), l[i]
o += "\t"
o += "\n"
o
JavaScript にコンパイル:
var align;
align = function(d) {
var b, l, o, pad;
b = [];
l = [];
$.each(d.split(/\n/), function() {
var a;
a = [];
$.each(this.split(/(\t+|\s\s+)/), function() {
if (this.match(/\w/)) {
a.push(this.toString());
if ((l[a.length - 1] != null) < this.length) {
return l[a.length - 1] = this.length;
}
}
});
return b.push(a);
});
pad = function(txt, len) {
while (txt.length < len) {
txt += " ";
}
return txt;
};
o = "\n";
$.each(b, function() {
$.each(this, function(i) {
o += pad(this.toString(), l[i]);
return o += "\t";
});
return o += "\n";
});
return o;
};