2008-10-28 34 views
6

Tôi có dữ liệu YAML trông loại như thế này, nhưng ~ 150k của nó:Hiển thị phân cấp JSON/YAML dưới dạng cây trong HTML?

--- 
all: 
    foo: 1025 
    bar: 
    baz: 37628 
    quux: 
     a: 179 
     b: 7 

... hay những điều tương tự trong JSON:

{"all":{"bar":{"baz":"37628","quux":{"a":"179","b":"7"}},"foo":"1025"}} 

tôi muốn trình bày nội dung này trong chế độ xem dạng cây HTML JavaScripty có thể mở rộng (ví dụ: 1, 2) để giúp khám phá dễ dàng hơn. Làm thế nào để tôi làm điều này?

Tôi đoán những gì tôi thực sự muốn tìm ra là làm thế nào để lấy dữ liệu YAML/JSON này, và tự động hiển thị nó như một cái cây (với các khóa băm được sắp xếp theo bảng chữ cái). Cho đến nay, tôi đã được tussling với YUI's tree view, nhưng nó không chấp nhận JSON thẳng, và nỗ lực của tôi yếu để xoa bóp dữ liệu vào một cái gì đó hữu ích dường như không được làm việc.

Cảm ơn bạn đã được trợ giúp.

Trả lời

6

Cuối cùng tôi đã đưa ra một cách siêu thanh lịch để làm điều này trong khoảng 5 dòng mã, dựa trên thực tế rằng đơn giản YAML trông rất giống Markdown.

Chúng tôi đang bắt đầu ra với điều này:

--- 
all: 
    foo: 1025 
    bar: 
    baz: 37628 
    quux: 
     a: 179 
     b: 7 

Sử dụng regexps (trong trường hợp này, trong Perl) để loại bỏ các bắt đầu ---, và đặt dấu gạch nối trước khi chìa khóa trên mỗi dòng:

$data =~ s/^---\n//s; 
$data =~ s/^(\s*)(\S.*)$/$1- $2/gm; 

Voila, Markdown:

- all: 
    - foo: 1025 
    - bar: 
    - baz: 37628 
    - quux: 
     - a: 179 
     - b: 7 

Bây giờ, chỉ cần chạy nó thông qua một proces Markdown sor:

use Text::Markdown qw(markdown); 
print markdown($data); 

Và bạn nhận được một danh sách HTML - sạch, ngữ nghĩa, tương thích ngược:

<ul> 
<li>all: 
<ul> 
<li>foo: 1025</li> 
<li>bar:</li> 
<li>baz: 37628</li> 
<li>quux: 
<ul> 
<li>a: 179</li> 
<li>b: 7</li> 
</ul></li> 
</ul></li> 
</ul> 

YUI Treeview có thể nâng cao danh sách hiện có, vì vậy chúng tôi quấn nó tất cả lên:

<html><head> 
<!-- CSS + JS served via YUI hosting: developer.yahoo.com/yui/articles/hosting/ --> 
<link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/combo?2.6.0/build/treeview/assets/skins/sam/treeview.css"> 
<script type="text/javascript" src="http://yui.yahooapis.com/combo?2.6.0/build/yahoo-dom-event/yahoo-dom-event.js&2.6.0/build/treeview/treeview-min.js"></script> 
</head><body> 
<div id="markup" class="yui-skin-sam"> 
<!-- start Markdown-generated list --> 
<ul> 
<li>all: 
<ul> 
<li>foo: 1025</li> 
<li>bar:</li> 
<li>baz: 37628</li> 
<li>quux: 
<ul> 
<li>a: 179</li> 
<li>b: 7</li> 
</ul></li> 
</ul></li> 
</ul> 
<!-- end Markdown-generated list --> 
</div> 
<script type="text/javascript"> 
var treeInit = function() { 
    var tree = new YAHOO.widget.TreeView("markup"); 
    tree.render(); 
}; 
YAHOO.util.Event.onDOMReady(treeInit); 
</script> 
</body></html> 

Vì vậy, tất cả điều này làm việc ra khoảng 5 dòng mã (biến YAML thành Markdown, biến Markdown thành một danh sách HTML, và đặt danh sách HTML đó bên trong một tệp HTML mẫu.HTML được tạo/cải tiến dần dần của HTML được tạo ra, vì nó có thể xem được hoàn toàn trên các trình duyệt không phải là JavaScript dưới dạng danh sách cũ đơn giản.

+0

Điều này là tốt đẹp, nhưng lưu ý xin vui lòng, danh sách đánh dấu phải được thụt vào bởi 4 ký tự cho mỗi cấp độ được spec tương thích. (2 không gian thụt lề sẽ hoạt động trong nhiều trình kết xuất đồ họa, tuy nhiên việc tiếp tục và mã lồng sẽ thường xuyên không hoạt động.) – ocodo

1

Phiên bản 2.6 của TreeView của YUI hiện nhận một đối tượng JavaScript nhưng không có định dạng này và sẽ không sắp xếp nó tự động. Bạn sẽ phải sử dụng tiện ích JSON của YUI để chuyển đổi nó thành một JavaScript thực tế mà bạn sẽ phải duyệt qua. Mẫu của bạn sẽ phải được chuyển đổi thành một cái gì đó như thế này:

{label:"all", children[ 
    {label:"bar", children:[ 
     {label:"baz: 37628"}, 
     {label:"quux", children[ 
      {label:"a: 179"}, 
      {label:"b: 7"} 
     ]}, 
     {label:"foo: 1025"} 
    ]} 
]} 

Tôi có thể thiếu một số dấu phẩy hoặc cái gì đó. Dữ liệu đến của bạn có thể không được sắp xếp nên bạn sẽ phải sắp xếp từng mảng. Sau đó, bạn chỉ cần truyền đối tượng này làm đối số thứ hai cho hàm tạo TreeView và cây sẽ xuất hiện.

8

Bạn có thể chuyển đổi dữ liệu JSON của mình thành các DIV lồng nhau độc đáo với điều này. Tôi đã không thử nghiệm nó với một số lượng lớn các bộ dữ liệu, nhưng nó có vẻ làm việc.

function renderJSON(obj) { 
    'use strict'; 
    var keys = [], 
     retValue = ""; 
    for (var key in obj) { 
     if (typeof obj[key] === 'object') { 
      retValue += "<div class='tree'>" + key; 
      retValue += renderJSON(obj[key]); 
      retValue += "</div>"; 
     } else { 
      retValue += "<div class='tree'>" + key + " = " + obj[key] + "</div>"; 
     } 

     keys.push(key); 
    } 
    return retValue; 
} 
+0

Việc này lấy danh sách và biến nó thành các div lồng nhau, nhưng không biến các div thành danh sách có thể mở rộng/thu gọn. – Anirvan

Các vấn đề liên quan