首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用Java或Javascript将ASCII艺术解析为HTML?

如何使用Java或Javascript将ASCII艺术解析为HTML?
EN

Stack Overflow用户
提问于 2013-09-05 21:28:14
回答 1查看 2.9K关注 0票数 16

我看到Neo4j应用程序接口非常巧妙地使用了ASCII艺术:

http://jaxenter.com/getting-started-with-neo4j-the-java-graph-database-47955.html

我想尝试类似的东西,但与ASCI艺术HTML。如何解析ASCII艺术,例如,给定如下的ASCII艺术输入:

代码语言:javascript
复制
--------------------------------
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输出,如下所示:

代码语言:javascript
复制
<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解决方案,结果如下:

代码语言:javascript
复制
$ 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>
EN

回答 1

Stack Overflow用户

发布于 2013-09-20 05:34:04

这是一个相当简单的JavaScript解决方案,通过Node进行了测试。当然,您需要调整输入和输出方法。

代码语言:javascript
复制
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)
    );
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18637676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档