我看到Neo4j应用程序接口非常巧妙地使用了ASCII艺术:
http://jaxenter.com/getting-started-with-neo4j-the-java-graph-database-47955.html
我想尝试类似的东西,但与ASCI艺术HTML。如何解析ASCII艺术,例如,给定如下的ASCII艺术输入:
--------------------------------
I I
I ------- ------- I
I I I I I I
I I A I I B I I
I I I I I I
I ------- ------- I
I I
I I
--------------------------------
:可能导致HTML输出,如下所示:
<div>
<div style='display:inline;'>
A
</div>
<div style='display:inline;'>
B
</div>
</div>
更新
这个问题结束了,因为我需要“展示对正在解决的问题的最低限度的理解”。我确实对要解决的问题有所了解。问题是,我想要解决的是让模板化的HTML更容易理解以下web框架的源代码:
https://github.com/zubairq/coils
:尽管该解决方案可以应用于任何web框架。从那以后,我看到有人试图在这里用C++制作一个初始版本:
https://github.com/h3nr1x/asciidivs2html/blob/master/asciidivs2html.cpp
:非常令人印象深刻!如果你可以让它在Java或Clojure中工作,那么如果我们可以重新打开问题,我将提名一个赏金,这样你就可以为解决方案获得更多分数:)
我运行了@meewok提供的Java解决方案,结果如下:
$ java AsciiToDIVs.RunConverter
Created a box(ID=0,X=0,Y=0,width=33,height=10)
Created a box(ID=1,X=2,Y=4,width=8,height=5,parent=0)
Created a char(Char=A,X=4,Y=7,parent=1)
Created a box(ID=2,X=2,Y=21,width=8,height=5,parent=0)
Created a char(Char=B,X=4,Y=24,parent=2)
<div><div><div>A</div></div><div><div>B</div></div></div>
发布于 2013-09-20 05:34:04
这是一个相当简单的JavaScript解决方案,通过Node进行了测试。当然,您需要调整输入和输出方法。
var s = "\n\
--------------------------------\n\
I I\n\
I ------- ------- I\n\
I I I I I I\n\
I I A I I B I I\n\
I I I I I I\n\
I ------- ------- I\n\
I I\n\
I I\n\
--------------------------------\n\
";
var lines = s.split('\n');
var outer_box_top_re = /--+/g;
var i;
for (i=0; i<lines.length; i++) {
while ((res = outer_box_top_re.exec(lines[i])) != null) {
L = res.index
R = outer_box_top_re.lastIndex
process_box(i, L, R)
}
}
function process_box(T, L, R) {
console.log('<div top="' + T + '" left="' + L + '" right="' + R + '">')
blank_out(T, L, R)
var i = T;
while (1) {
i += 1;
if (i >= lines.length) {
console.log('Fell off bottom of ascii-art without finding bottom of box');
process.exit(1);
}
var line = lines[i];
if (line[L] == 'I' && line[R-1] == 'I') {
// interior
// Look for (the tops of) sub-boxes.
// (between L+1 and R-2)
var inner_box_top_re = /--+/g;
// Inner and outer need to be separate so that
// inner doesn't stomp on outer's lastIndex.
inner_box_top_re.lastIndex = L+1;
while ((res = inner_box_top_re.exec(lines[i])) != null) {
sub_L = res.index;
sub_R = inner_box_top_re.lastIndex;
if (sub_L > R-1) { break; }
process_box(i, sub_L, sub_R);
}
// Look for any other content (i.e., a box label)
content = lines[i].substring(L+1, R-1);
if (content.search(/[^ ]/) != -1) {
console.log(content);
}
blank_out(i, L, R);
}
else if (line.substring(L,R).match(/^-+$/)) {
// bottom
blank_out(i, L, R);
break;
}
else {
console.log("line " + i + " doesn't contain a valid continuation of the box");
process.exit(1)
}
}
console.log('</div>')
}
function blank_out(i, L, R) {
lines[i] = (
lines[i].substring(0,L)
+ lines[i].substring(L,R).replace(/./g, ' ')
+ lines[i].substring(R)
);
}
https://stackoverflow.com/questions/18637676
复制相似问题