wtorek, 8 lutego 2011

C++/C to html



Zamieszczam program, który zamienia kod napisany w C++/C do kodu html, efekt jak poniżej. W tym poście program będzie aktualizowany. Żeby użyć programu musimy go na początku skompilować, później gotowy program umieszczamy w katalogu z plikiem, który chcemy zamienić na html. Włączamy program i wpisujemy nazwę pliku z rozszerzeniem np. "main.cpp". Po tej operacji w katalogu z programem pokaże się nowy plik main.cpp.html. I to tyle:D

    Program został napisany żeby wrzucać kod C++/C, na bloga w bardziej czytelny sposób.


main.cpp
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/*
*            Autor: Vevensi, onidpl@gmail.com
*            Wersja Programu: 0.2.1v
*/
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

int ilosc_lini(char[]);
void zamien(std::string&);
void koloruj(std::string&);

int main(){
    const int np = 20; //max důugoúă tekstu(nazwa pliku)
    char n_bgcolor[7] = "000000"; //kolor tůa numeracji
    char n_color[7] = "FFFFFF"; //kolor tekstu numeracji
    char bgcolor[7] = "000000"; //kolor tůa kodu
    char color[7] = "FFFFFF"; //kolor tekstu kodu
   
    //jest to program który bćdzie zamieniaă plik cpp na kod html który moýna
    //wrzuciă na stronć, póęniej zostanie moýliwoúă kolorowania skůadni i bćdzie
    //moýna wybraă czy linie majŕ byă ponumerowane czy nie
   
    //pierwszym krokiem jest zapytanie uýytkownika o nazwć pliku do otwarcia,
    //plik powinien byă w katalogu z programem
    //kolejny krok to odczytanie ile jest lini w programie i zapisanie tego do zmiennej
    //nastćpnie zacziemy od torzenie pliku html
    //pierw dodamy te poczŕtkowe znaczniki
    //póęniej numercaja a na końcu kaýdy wiersz bćdziemy odczytywany i zaisywany osobno
    //to do dzieůŕ
    //http://cpp0x.pl/kursy/Kurs-C++/Obsluga-plikow/305
   
    ifstream plikcpp; //tworzymy nowŕ zmienna która nam posůuýy do operacji na pilku
    ofstream plikhtml; //plik kótry utworzymy i zapiszemy w nim gotowy kod programu
    char nazwa_pliku[np];
    char nazwa_pliku_html[np];
    cout << "Podaj nazwe pliku do otwarcia: ";
    cin >> nazwa_pliku;
    //próbujemy otworzyă plik
    plikcpp.open(nazwa_pliku, ios_base::in);
    //sprawdzamy czy otworzono
    if(plikcpp.good()){
        cout << "Uzyskano dostep do pliku" << endl;
    }else{
        cout << "Nie mozna uzyskac dostepu!" << endl;
        return 1;
    }
    //kopiowanie nazwy pliku
    strcpy(nazwa_pliku_html,nazwa_pliku);
    //dopisanie rozszerzenia html
    strcat(nazwa_pliku_html,".html");
   
    plikhtml.open(nazwa_pliku_html, ios_base::out);
    //sprawdzamy czy otworzono
    if(plikhtml.good()){
        cout << "Utworzylem plik do zapisu" << endl;
    }else{
        cout << "Nie mozna otworzyc pliku!" << endl;
        return 1;
    }
   
    cout << "Plik: " << nazwa_pliku_html << endl;
   
    //wpisujemy do pliku poczŕtkowe elementy
    plikhtml << "<font face=\"Verdana\"><table cellspacing=\"0\" cellpadding=\"7\">";
    plikhtml << "<caption align=\"top\">" << nazwa_pliku <<"</caption>";
   
    //instrukcje wstawiajŕce numeracjć
    int linie = ilosc_lini(nazwa_pliku);
    //ustawiamy kolor tůa numercji
    plikhtml << "<td bgcolor=#" << bgcolor << ">";
    //ustawiamy kolor tesktu numeracji
    plikhtml << "<font color=#" << color << ">";
   
    //numeracja
    for(int i=1; i<=linie; i++){
        plikhtml << i << "<br />";
    }
    //koncowe elementy
    plikhtml << "</font></td>";
   
    //instrukcje wpisujŕce kod programu
    plikhtml << "<td nowrap=\"nowrap\" bgcolor=#" << bgcolor << ">";
    plikhtml << "<font color=#" << color << ">";
   
    //przepisujemy kolejno kaýdŕ linie z cpp do html
    string *buff = new string;
    while(getline(plikcpp,*buff)){
        //wywoůanie f. wykrywajŕcej znaki specjalne
        zamien(*buff);
        //kolorujemy skladnie
        koloruj(*buff);
        plikhtml << *buff << "<br />";
    };
   
    //wpisujemy do pliku końcowe elementy
    plikhtml << "</font></td></table></font>";
    delete buff;
    plikhtml.close();
    plikcpp.close();
   
    return 0;
   
   
}
//liczenie lini pliku
int ilosc_lini(char nazwa[]){
    ifstream *plik = new ifstream;
    plik->open(nazwa, ios_base::in);
    string *buff1 = new string;
    int linie = 0;
   
    while(getline(*plik,*buff1)){
        linie++;
    }
    delete buff1;
    plik->close();
    delete plik;
    return linie;
}

void zamien(std::string &tekst){
   
    for(int i=0; i<tekst.length(); i++){
        //sprawdzamy czy wystŕpi w tekscie jakiú znak specjalny, jeýeli
        //tak to go zastćpujemy odpowiednikiem html
        if(tekst[i]=='<') { tekst.erase(i,1); tekst.insert(i,"&lt;"); }
        else if(tekst[i]=='>') { tekst.erase(i,1); tekst.insert(i,"&gt;"); }
        else if((tekst[i]=='&')&&(tekst[i+1]!='n')&&(tekst[i+2]!='b')) {
            tekst.erase(i,1); tekst.insert(i,"&amp;"); }
        else if(tekst[i]=='\t') {
            tekst.erase(i,1); tekst.insert(i,"    "); }
    }
}

//funkcja w fazie alpha potrzeba poprawek i rozwinićcia
void koloruj(std::string &tekst){
    //důugoúă tekstu aktualnego wiersza
    int dlu = tekst.length();
    for(int i=0; i<dlu; i++){

        if((tekst[i]=='#')&&(i==0)) {
            tekst.insert(i,"<font color=#00FF00>");
            tekst.insert(dlu+20,"</font>");
           
        }
        else if((tekst[i]=='/')&&(tekst[i+1]=='/')) {
            tekst.insert(i,"<i><font color=#888888>");
            tekst.insert(dlu+23,"</font></i>");
        }
    }
}

Brak komentarzy:

Prześlij komentarz