我有一些制表符分隔的数据,并希望它在具有固定宽度字体的列中很好地排列,所以......
Head 1 Head2 Head 3
Item on is quite long Item 2 Item 3
变成...
Head 1 Head2 Head 3
Item on is quite long Item 2 Item 3
我不介意是否使用空格而不是制表符,并且最喜欢两者的混合,而不是像弹性制表位
我有一些制表符分隔的数据,并希望它在具有固定宽度字体的列中很好地排列,所以......
Head 1 Head2 Head 3
Item on is quite long Item 2 Item 3
变成...
Head 1 Head2 Head 3
Item on is quite long Item 2 Item 3
我不介意是否使用空格而不是制表符,并且最喜欢两者的混合,而不是像弹性制表位
我最终自己制作了一个函数,该函数大致遵循弹性制表位的格式,但没有我不需要的复杂性(我的表都是一个块,每行都有相同的列)
它适用于我的测试用例(和我的实际用例),我在函数中抛出第一个块align
并返回第二个块。
在 CoffeeScript 中:
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;
};