从文件中读取HTML标记并正确显示在终端中

时间:2012-09-27 00:47:31

标签: c++ html enums terminal escaping

我是C ++的初学者,对JAVA有一个粗略的了解。我正在尝试阅读看起来像这样的HTML文件。

<red>Red <dim>dim and red</dim> back to red</red>

<blue>Blue <underline>underlined blue <dim>dim</dim> underlined blue</underline>
and <cyan>cyan</cyan> and blue again</blue>    

这是我正在使用的代码的一小部分。我的问题的一个例子是,我无法弄清楚如何清除dim的格式并保持文本红色,直到到达结束标记(上面第一行代码)。

void print_well_formed_file(ifstream& ifs) {
Lexer lexer; Token tok;
stack<string> tags;
string fstring;
term_colors_t scancolor;
term_attrib_t scanattrib;

while(getline(ifs,fstring)){
    lexer.set_input(fstring);
    while(lexer.has_more_token()){
    tok = lexer.next_token();
        switch(tok.type){
            case TAG:
                if(tok.value[0] != '/'){
                    tags.push(tok.value);
                    if(tok.value == "red")
                        scancolor = RED;
                    else if(tok.value == "green")
                        scancolor = GREEN;
                    else if(tok.value == "yellow")
                        scancolor = YELLOW;
                    else if(tok.value == "blue")
                        scancolor = BLUE;
                    else if(tok.value == "magenta")
                        scancolor = MAGENTA;
                    else if(tok.value == "cyan")
                        scancolor = CYAN;
                    else if(tok.value == "dim")
                        scanattrib = DIM;
                    else if(tok.value == "underline")
                        scanattrib = UNDERLINE;
                    else if(tok.value == "bright")
                        scanattrib = BRIGHT;
                    cout << term_cc(scancolor, DEFAULT_COLOR, scanattrib);

                }else if(tags.top() == tok.value.substr(1)){
                    tags.pop();
                    //THIS IS WHERE THE END TAGS WOULD BE PROCESSED.
                }

            break;
            case IDENT:
                cout << tok.value << " ";
            break;
            case ERRTOK:
                cout << "Syntax Error: " << tok.value;
                noerror = false;
            break;
        }
    }

}

以下实现的功能。

std::string term_cc(term_colors_t fg=DEFAULT_COLOR, 
                term_colors_t bg=DEFAULT_COLOR, 
                term_attrib_t attr=DEFAULT_ATTRIB);

std::string term_bg(term_colors_t bg=DEFAULT_COLOR);
std::string term_fg(term_colors_t fg=DEFAULT_COLOR);
std::string term_attrib(term_attrib_t attrib=DEFAULT_ATTRIB);
std::string term_clear();

我尝试在else循环中使用堆栈命令,但在运行时收到分段错误。

我知道我要问的是相对含糊不清但我使用终端转义命令和枚举类型来模拟终端读取HTML的方式。

enum term_attrib_t {
DEFAULT_ATTRIB = '0',
BRIGHT    = '1',
DIM       = '2',
UNDERLINE = '4',
BLINK     = '5',
REVERSE   = '7',
HIDDEN    = '8'
};

// the colors, background or foreground
enum term_colors_t {
BLACK   = '0',
RED     = '1',
GREEN   = '2',
YELLOW  = '3',
BLUE    = '4',
MAGENTA = '5',
CYAN    = '6',
WHITE   = '7',
DEFAULT_COLOR = '9'
};

1 个答案:

答案 0 :(得分:0)

您的文件看起来更像是XML文件而不是HTML。任何HTML文件的Html解析器都非常复杂。你不会在任何合理的时间内找到它,也不会自己写。

我建议您浏览互联网以获取XML阅读器。有几十个。最后,我有自己的一般情况。