基于简单的YAML看起来很像Markdown的事实,我终于用大约 5 行代码想出了一个超级优雅的方法。
我们从这个开始:
---
all:
foo: 1025
bar:
baz: 37628
quux:
a: 179
b: 7
使用正则表达式(在这种情况下,在 Perl 中)删除开始---
,并在每行的键之前放置连字符:
$data =~ s/^---\n//s;
$data =~ s/^(\s*)(\S.*)$/$1- $2/gm;
瞧,降价:
- all:
- foo: 1025
- bar:
- baz: 37628
- quux:
- a: 179
- b: 7
现在,只需通过 Markdown 处理器运行它:
use Text::Markdown qw( markdown );
print markdown($data);
你会得到一个 HTML 列表——干净、语义化、向后兼容:
<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可以增强现有列表,因此我们将其全部包装起来:
<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>
所以这一切都需要大约 5 行代码(将 YAML 转换为 Markdown,将 Markdown 转换为 HTML 列表,并将该 HTML 列表放在模板 HTML 文件中。生成的 HTML 是渐进增强/可降解的,因为它在非-JavaScript 浏览器作为一个普通的旧列表。