2012-07-11 145 views
1

我有一些制表符分隔的数据,并希望所有在一个固定的宽度字体列很好地排队,所以......Javascript库对齐制表符分隔的数据(如elastictabstops)

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 

如果空间用于标签,而不是我不介意,并且将最喜欢二者的混合,而不是像弹性制表位

+0

我归巢有弹性制表位,在那里我可以给它纯文本库,并把它输出松紧列输出。我找不到弹性制表符的JavaScript实现。如果没有,我想用一个不同的库 - 几十年来肯定有很多,但我找不到一个JavaScript库,用于将制表符分隔的数据对齐到固定宽度的列中。 – 2012-07-11 14:28:37

+0

我没有看到一个快速搜索后,但它似乎相对简单的完成你自己。 – Wiseguy 2012-07-11 15:56:59

回答

2

我最终使后面洛斯函数自己(不包括我没有要求的复杂性)(我的表格全是一个块,并且每行有相同的列)

它适用于我的测试用例(和我的实际用例)第一个功能块在功能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; 
};