2012-07-11 150 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; 
};