finalmente se le ocurrió una manera súper elegante de hacer esto en unos 5 líneas de código, basado en el hecho de que el simple YAML se parece mucho a Markdown.
Estamos empezando con esto:
---
all:
foo: 1025
bar:
baz: 37628
quux:
a: 179
b: 7
Use expresiones regulares (en este caso, en Perl) para eliminar el ---
de partida, y poner guiones antes de la tecla en cada línea:
$data =~ s/^---\n//s;
$data =~ s/^(\s*)(\S.*)$/$1- $2/gm;
Voila, de rebajas:
- all:
- foo: 1025
- bar:
- baz: 37628
- quux:
- a: 179
- b: 7
Ahora, simplemente se ejecuta a través de un proces de rebajas sor:
use Text::Markdown qw(markdown);
print markdown($data);
Y se obtiene una lista HTML - limpio, semántica, compatible hacia atrás:
<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 puede mejorar las listas existentes, por lo que envolverlo todo:
<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>
Así que todo esto funciona en unas 5 líneas de código (convertir YAML en Markdown, convertir Markdown en una lista HTML y colocar esa lista HTML dentro de un archivo HTML de plantilla.El HTML generado es progresivamente mejorado/degradable, ya que es completamente visible en navegadores que no son JavaScript como una simple lista anterior.
Esto es agradable, pero tenga en cuenta que las listas de rebajas deben tener una sangría de 4 caracteres por nivel para que sean compatibles con las especificaciones. (2 sangría espacial funcionará en muchos procesadores, sin embargo, la continuación y el código de anidación no funcionarán regularmente). – ocodo