|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
C++ ed HTML
ho scritto un programma in C/C++ nel quale sono presenti una miriade di stringhe, redirette su disco di questo tipo:
fprintf(fp,"<body bgcolor=\"#000000\">\n"); fprintf(fp,"<center>\n"); fprintf(fp,"<table border="1">\n"); fprintf(fp,"<tr>\n"); ..................................... queste, sono ancora delle più semplici, molte sono di gran lunga molto più complesse; il risultato è che tra: codice C/C++/HTML/javascript il tutto diviene alquanto illeggibile e poco manutentabile non volevo pensare ad un file esterno sul quale salvare il codice HTML o javascipt e poi richiamarlo all'occorrenza, ma ad un qualcosa che rimanga all'interno dell'eseguibile se avete suggerimenti o esperienze analoghe grazie 1000 ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Un #define ?
#define HTMLHEADER "<body bgcolor=\"#000000\">\n<center>\n<table border=\"1\">\n<tr>\n" Altrimenti puoi sempre definire una variabile che contiene quel codice... |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
la domanda è nata in quanto mi sono chiesto come fanno ad esempio word o excel quando si esporta una tabella o un documento in formato HTML
sicuramente per non perdersi hanno adottato qualche tecnica particolare che rende il codice ancora leggibile |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Jun 2002
Città: Firenze
Messaggi: 630
|
Quote:
__________________
---> Lombardp CSS Certified Expert (Master Level) at Experts-Exchange Proud user of LITHIUM forum : CPU technology Webmaster of SEVEN-SEGMENTS : Elettronica per modellismo |
|
![]() |
![]() |
![]() |
#5 |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Non e' piu' semplice un normale
const string s = "blablabla" oppure un const char* s = "..." ![]() usando il const char* tra l'altro il compilatore e' in grado di ottimizzare il codice come se avessi usato un #define (e senza i rischi del caso) poi, non sarebbe piu' leggibile usare gli stream ? |
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
Quote:
e i doppi apici che ti servono all'interno delle linee HTML? const string s = "blablabla=\"%s\" pincopallino" ![]() |
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
![]() |
![]() |
![]() |
#8 | ||
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
Quote:
![]() |
||
![]() |
![]() |
![]() |
#9 |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Per gli apici non e' cosi' facile, visto che e' una cosa intrinseca del c++
due cose semplici che mi vengono in mente: 1- Usare un altro carattere al posto degli apici (ad esempio un apice singolo), che dovra' essere successivamente cambiato. Si potrebbe fare ad esempio buttando l'output su uno stream su stringa e poi mandare la stringa (modificata) allo stream vero e proprio "<body bgcolor=\"#000000\">\n<center>\n<table border=\"1\">\n<tr>\n" diventerebbe quindi "<body bgcolor='#000000'>\n<center>\n<table border='1'>\n<tr>\n" In alternativa scrivi i caratteri scomodi come costanti e usi quelle: fp << "<body bgcolor=" << quote << "#0000" << .. dove const char quote = '"'; Pero' forse la cosa migliore e' lavorare ad un livello piu' alto, crearsi degli oggettini per le parti piu' ripetitive; Un qualcosa del tipo HtmlBody hb; hb.color = green; ( opportuni typedefs qui ) hb.align = center; ... out << hb<< text << table << ... una cosa del genere... dipende cosa devi fare ovviamente ! |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
marco, tanto per entrare nel vivo dell'argomento: guarda questa porzione di codice che salva uno scipt; ho idea che nessuna regola sia valida; in pratica è un caos immane
Codice:
fprintf(fp,"<script language=\"JavaScript\"><!--\n"); fprintf(fp,"function apri(nomefile)\n"); fprintf(fp,"{\n"); fprintf(fp,"nw=window.open('','nwin','top=0 , left=0 , width=' + (screen.width-100) + ',height=' + (screen.height-100));\n"); fprintf(fp,"nw.document.writeln(\"<script>\");\n"); fprintf(fp,"nw.document.writeln(\"function zp(){\");\n"); fprintf(fp,"nw.document.writeln(\"immagine.height = immagine.height + 50;\");\n"); fprintf(fp,"nw.document.writeln(\"}\");\n"); fprintf(fp,"nw.document.writeln(\"function zm(){\");\n"); fprintf(fp,"nw.document.writeln(\"immagine.height = immagine.height - 50;\");\n"); fprintf(fp,"nw.document.writeln(\"}\");\n"); fprintf(fp,"nw.document.writeln(\"function full(){\");\n"); fprintf(fp,"nw.document.writeln(\"immagine.height = document.body.clientHeight-50\");\n"); fprintf(fp,"nw.document.writeln(\"}\");\n"); fprintf(fp,"nw.document.writeln(\"</script>\");\n"); fprintf(fp,"nw.document.writeln(\"<body topmargin='0' leftmargin='0'>\")\n"); fprintf(fp,"nw.document.writeln(\"<table border='1'>\");\n"); fprintf(fp,"nw.document.writeln(\"<td><h3><a href='javascript:zp()'>Z+</a></td><td><h3><a href='javascript:zm()'>Z-</a></td><td><h3><a href='javascript:full();'>Full</a></td><td><h3><a href='javascript:window.close()'>chiudi</a></td>\");\n"); fprintf(fp,"nw.document.writeln(\"</table>\");\n"); fprintf(fp,"nw.document.writeln(\"<img src='\" + nomefile + \"' name='immagine'>\");\n"); fprintf(fp,"nw.document.writeln(\"<script>\");\n"); fprintf(fp,"nw.document.writeln(\"immagine.height = document.body.clientHeight-50\");\n"); fprintf(fp,"nw.document.writeln(\"</script>\");\n"); fprintf(fp,"nw.document.writeln(\"</body>\")\n"); fprintf(fp,"}\n"); fprintf(fp,"// --></script>\n"); fprintf(fp,"<style>");\n"); fprintf(fp,".mio\t{\n");\n"); fprintf(fp,"font-family:Arial;\n"); fprintf(fp,"font-size:12px;\n"); fprintf(fp,"height:21px;\n"); fprintf(fp,"border-width:4px;\n"); fprintf(fp,"border-style:solid;\n"); fprintf(fp,"border-color:#C0C0C0;}\n"); fprintf(fp,"</style>\n"); fprintf(fp,"<body bgcolor=\"#000000\">\n"); fprintf(fp,"<center>\n"); fprintf(fp,"<table border=\"1\" cellpadding=\"5\" cellspacing=\"5\" bordercolor=\"#C0C0C0\" bordercolorlight=\"#C0C0C0\">\n"); |
![]() |
![]() |
![]() |
#11 |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Una prima cosa che si puo' fare secondo me e' quella di usare gli stream.
Il tuo codice diverrebbe qualcosa del tipo: Codice:
fp << "<script language=\"JavaScript\"><!--" << endl << "function apri(nomefile)" << endl << "{\n" << "nw=window.open('','nwin','top=0 , left=0 , width=' + (screen.width-100) + ',height=' + (screen.height-100));\n" << ... tonde. Altra cosa: ricordati che puoi concatenare piu' stringhe in modo semplice: Codice:
"nw.document.writeln(\"<script>\");\n" "nw.document.writeln(\"function zp(){\");\n" Codice:
"nw.document.writeln(\"<script>\");\nnw.document.writeln(\"function zp(){\");\n" se quindi il codice html e' statico potresti quindi prima scrivere la stringa a parte e poi stamparla con una unica chiamata ad esempio Codice:
const char* c = "<script language=\"JavaScript\"><!--\n" "function apri(nomefile)\n" "{\n" "nw=window.open('','nwin','top=0 , left=0 , width=' + (screen.width-100) + ',height=' + (screen.height-100));\n" "nw.document.writeln(\"<script>\");\n" "nw.document.writeln(\"function zp(){\");\n" "nw.document.writeln(\"immagine.height = immagine.height + 50;\");\n"; ... fp << c << endl; Un'altra soluzione potrebbe essere quella di leggere il codice html da file, dove puoi scrivertelo in modo "tradizionale" Se invece il codice e' dinamico (e numeroso) secondo me come dicevo piu' sopra ti conviene aggiungere un po' di astrazione: ad esempio crearti una struttura dati gerarchica che rappresenti la pagina e i suoi elementi. In questo modo il codice 'sporco' va a finire solo in piccoli oggetti che provvedono alla stampa. Ad esempio una HtmlList a cui puoi aggiungere a runtime gli elementi della lista che ti servono; al momento di stamparla scrivera' da se il codice per la lista e in piu' provvedera' a far stampare gli oggetti che contiene (in modo simile a quanto accade con le Awt o le Swing di Java , se hai presente ).Perderai la visione del codice html ma ti restera' quello della struttura della pagina ( che e' quello che conta penso ). Tra l'altro dovrebbero esserci gia' delle librerie C o C++ che fanno qualcosa di simile ( scommetto si chiameranno libwww o libhtml ![]() |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Basterebbe richiamare il costruttore con i parametri da inaserire al posto dei %s
![]() Ad esempio basterebbe sovrascrivere l'operatore << per dare in output il codice modificato con i parametri passati al costruttore... Una cosa del genere : file << HTMLHeader(titolo, commento) << OpenWindowJScript(nomeFinestra, link) << HTMLLink(link, HTMLImg(pathImmagine)); Per fare l'ultima cosa questo bisogna ad esempio sovrascrivere l'operatore di conversine a string... Una cosa del genere : Codice:
#include <iostream> #include <string> using namespace std; class HTMLInterface { protected: string txt; HTMLInterface() { }; public: virtual operator string() { return txt; }; friend ostream &operator << (ostream &out, const HTMLInterface &html); }; inline ostream &operator << (ostream &os, const HTMLInterface &html) { os << html.txt; return os;}; class HTMLImg : public HTMLInterface { public: HTMLImg(const string path, const string l, const string h); }; HTMLImg::HTMLImg(const string path, const string l, const string h) { txt = "<img src=\"" + path + "\" width=\"" + l + "\" height=\"" + h + "\" border=\"0\">"; } class HTMLLink : public HTMLInterface { public: HTMLLink(const string link, const string target, const string onclick, const string body); }; HTMLLink::HTMLLink(const string link, const string target, const string onclick, const string body) { txt = "<a href=\"" + link + "\""; if(target.length() > 0) txt += " target=\"" + target + "\""; if(onclick.length() > 0) txt += "onclick=\"" + onclick + "\""; txt += ">"+ body + "</a>"; } Codice:
cout << HTMLLink("pippo.html", "", "", HTMLImg("ciao.jpg", "100", "200")); |
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
Quote:
non lo metto in dubbio ma, se per usarle devi leggerti chilometri di documentazione ![]() lasciamole a che le ha scritte ![]() |
|
![]() |
![]() |
![]() |
#14 |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
cionci ha colto nel segno quel che volevo dire, magari ridefinendo gli operatori di output invece che creando la stringa, rendendo piu' semplice la modifica on-the-fly della struttura.
|
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
sicuramente esiste un metoo ancora + semplice; le classi non mi sono molto simpatiche
![]() ![]() |
![]() |
![]() |
![]() |
#16 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
![]() ![]() |
|
![]() |
![]() |
![]() |
#17 | ||
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
Quote:
e lo so cionci; ma mi riferivo solo a questo caso in specifico ![]() |
||
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
un esempio banale; non vi sembra un pò macchinoso questo codice per effettuare una semplice conversione?
daccordo che il codice, prelevato su html.it ha la sola funzione di far capire i concetti che stanno alla base della programmazione ad oggetti: ma sembrerebbe che non in tutti i casi rappresenti una comodità ![]() Codice:
/* * Un semplice programma che converte le lire in Euro * File Conversione.h */ class Conversione { public: Conversione(); ~Conversione(); long valore_lira; float valore_euro; void ottieni_valore(); float converti_lira_in_euro( ); }; /* * File Conversione.cpp */ #include <iostream.h> #inclde "Conversione.h" Conversione( ) { cout << "Inizio della conversione\n"; valore_lira = 0; // Inizializzazione della variabile valore_lira valore_euro = 0.0; // Inizializzazione della variabile valore_euro } ~Conversione( ) { cout << "Fine della conversione\n"; } void Conversione::ottieni_valore( ) { cout << "Inserire il valore in lire: " ; cin >> valore_lira; cout << endl; } float Conversione:: converti_lira_in_euro( ) { float risultato; risultato = ((float) valore_lira) / (float) 1936.27; return risultato; } main( ) { Conversione conv; conv.ottieni_valore( ); conv.valore_euro = conv.converti_lira_in_euro( ); cout << conv.valore_lira << " in lire, vale " << conv.valore_euro << " Euro." cout << endl; return(0); } |
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Certo, ma è chiaramente un esempio didattico...
|
![]() |
![]() |
![]() |
#20 | |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Quote:
![]() ![]() |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:41.