Website Summary Files Commits Branches @commit @diff @stats
path: root / homework / 81625 / cpp2html / src / main.cpp
blob: 92f4d30d59e5003eddfb3e919b5cfc901e5e040c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <iostream>
#include <fstream>
#include <vector>
#include "Lexer.h"

void printTokens(std::vector<Token> &tokens)
{
    for(int i = 0;i<tokens.size();i++)
    {
        std::cout<<tokens[i].type<<" "<<tokens[i].lexeme <<" on line " << tokens[i].line <<std::endl;
    }
}

void cpp2html(std::vector<Token> &tokens, const char* code)
{
    std::ofstream out("../cpp2.html");
    std::string header = "<!DOCTYPE html>\n"
                            "<html lang=\"en\">\n"
                            "<head>\n"
                            "  <style>\n"
                            "    body {\n"
                            "      font-size: 20px;\n"
                            "    }\n\n"
                            "    .number {\n"
                            "      color: pink;\n"
                            "    }\n\n"
                            "    .string {\n"
                            "      color: blue;\n"
                            "    }\n\n"
                            "    .keyword {\n"
                            "      color: purple;\n"
                            "      font-weight: bold;\n"
                            "    }\n\n"
                            "    .operator {\n"
                            "      color: red;\n"
                            "    }\n\n"
                            "    .comment {\n"
                            "      color: gray;\n"
                            "      font-style: italic;\n"
                            "    }\n\n"
                            "    .preprocessor {\n"
                            "      color: green;\n"
                            "      font-weight: bold;\n"
                            "    }\n\n"
                            "  </style>\n"
                            "</head>\n"
                            "<body>\n";
    out << header;
    unsigned codeInd = 0;
    for(int i = 0;i < tokens.size();i++)
    {
        while(code[codeInd] == ' ' || code[codeInd] == '\t' || code[codeInd] == '\n')
        {
            if(code[codeInd] == '\n') out << "<br>";
            else out << "&nbsp";
            //else out <<
            ++codeInd;
        }
        if(tokens[i].type == TokenType::NUMBER)
        {
            out << "<span class=\"number\">" << tokens[i].value <<"</span>";
        }
        else if(tokens[i].type == TokenType::STRING)
        {
            out << "<span class=\"string\">" << tokens[i].lexeme <<"</span>";
        }
        else if(tokens[i].type == TokenType::COMMENT)
        {
            out << "<span class=\"comment\">" << tokens[i].lexeme <<"</span>";
        }
        else if(tokens[i].type <= TokenType::RIGHT_SHIFT_EQUAL)
        {
            out << "<span class=\"operator\">" << tokens[i].lexeme <<"</span>";
        }
        else if(tokens[i].type <= TokenType::XOR_EQ)
        {
            out << "<span class=\"keyword\">" << tokens[i].lexeme <<"</span>";
        }
        else if(tokens[i].type <= TokenType::PRE_PRAGMA)
        {
            out << "<span class=\"preprocessor\">" << tokens[i].lexeme <<"</span>";
        }
        else
        {
            out << tokens[i].lexeme;
        }
        codeInd += tokens[i].lexeme.length();
    }
    out << "\n</body>\n</html>";
    out.close();
}

int main()
{
    char code[] = "#include<iostream>\nbool isCapitalCase(char c)\n{\n    return c >= 'A' && c <= 'Z';\n}\nm_KeyWordsTable[\"break\"] = TokenType::Break;\n// this is a comment test\n"
                    "/* another one */";
    Tokenizer tokenizer(code);
    std::vector<Token> tokens;

    if(tokenizer.tokenize(tokens))
    {
        cpp2html(tokens, code);
    }
    //printTokens(tokens);
    return 0;
}