|
Posted on 2005-08-10 11:02 这里的黄昏静悄悄 阅读(1408) 评论(2) 编辑 收藏 引用 所属分类: C/C++
很多时候都要把C/C++代码发到网页中来,但是直接拷贝、粘贴后的效果并不好,许多符号因为是html的特殊字符而造成显示的混乱(最常见的就是'<'和'>'符号),所以就想把C/C++文件简单处理成html代码,当然早就有人做过了,不过觉得自己想想如何实现还是挺不错的! 要实现的要求是: 1、高亮显示C/C++保留字,比如int、char、sizeof等,(可用蓝色显示) 2、对于#include开始的行用绿色显示 3、数字用红色显示 4、自动处理缩进,控制换行。也就是符合C/C++书写的常用规范,比如如下格式
int x1, x2 = 3;
for(; x2 <= 10; x2++)
  {
cout<< x2<< endl;
} 5、要把'<'、'>'转换成<和>
其实实现起来也不难,大体思路如下: 一行一行的扫描,如果是字母就组合成词,然后检验是不是保留字,是的话蓝色显示,html代码就是加上<font color=#0000FF>保留字</font>即可,不是保留字就输出。如果是数字,就拼数,然后红色显示。 如果是#就整行绿色输出(要注意转换<、>)。 如何控制缩进是个问题,可以设置int型全局变量tables,表示缩进的程度,遇到{时tables值增加,}时减少。 处理';'时要注意的是,如果不是在括号里面那么就要换行。
想想其实就像一个小的编译器了,呵呵,以后有时间再继续吧。
今天简单做了一下,代码如下,但是功能尚不完善:
/*---------------------------- c/c++2html.c author:JackRain date:08-13-2005 test in c-free 3.5 ----------------------------*/ #include <stdio.h>
#include <ctype.h>
 char szbaoliu[][10] = {"bool","char","class","do","double","else","float","goto","if","int","long",
"short","struct","sizeof","uion","unsigned"};
int tables = 0;
int kuohaos = 0;
bool isps = false;
bool isyinhao = false;
bool isover = false;
bool isfenhao = false;
bool testarray(char array[])
  {
for(int i = 0;i<16;i++)
 {
if(strcmp(array,szbaoliu[i])==0)
return true;
}
return false;
}
int main()
  {
FILE *c_file,*html_file;
int i=0;
char rbuffer[1024],wbuffer[1024],*cpoint, vararray[15],numarray[15];
c_file = fopen("readfile.cpp","rb");
html_file = fopen("readfile.html","a+");
fputs("<html><head><title>C/C++2Html</title>\n</head>\n<body>\n",html_file);
fputs("<table align=center border=0 bgcolor=#ffffff width=660><tr><td><pre>\n",html_file);
while(fgets(rbuffer, 1024, c_file)!=NULL)
 {
cpoint = rbuffer;
i = 0;
 /**//*while(*cpoint!='\0')
{
if(*cpoint!=' ') //虑掉空格
wbuffer[i++] = *(cpoint++);
else
cpoint++;
}
wbuffer[i] = '\0';
cpoint = wbuffer; */
if(tables&&*cpoint!='}')
fputs(" ",html_file);
while(*cpoint != '\0')
 {
if(isalpha(*cpoint))
 {
isover = true;
i = 0;
while((isalnum(*cpoint)||*cpoint=='_')&&*cpoint != '\0')
 {
vararray[i++] = *(cpoint++);
}
vararray[i] = '\0';
if(!isyinhao&&testarray(vararray))
 {
fprintf(html_file, "<font color=#0000FF>%s</font>",vararray);
}
else
fputs(vararray, html_file);
if(*cpoint!=';'&&!isyinhao)
fputc(' ',html_file);
if(*cpoint == '\0')
continue;
}
else if(isdigit(*cpoint))
 {
isover =true;
i = 0;
while(isalnum(*cpoint)&&*cpoint != '\0')
 {
numarray[i++] = *(cpoint++);
}
numarray[i] = '\0';
if(!isyinhao)
fprintf(html_file, "<font color=#ff0000>%s</font>", numarray);
else
fputs(numarray,html_file);
if(*cpoint == '\0')
continue;
}

else if(*cpoint == '#')
 {
if(isover)
 {
fputc('#',html_file);
cpoint++;continue;
}
fputs("<font color=green>", html_file);
while(*cpoint!='\0')
 {
if(*cpoint == '<')
 {
fputs("<",html_file);
}
else if(*cpoint == '>')
fputs(">",html_file);
else
fputc(*cpoint, html_file);
cpoint++;
}
fputs("</font>",html_file);
for(i = 0;i < tables; i++)
fputs(" ",html_file);
break;
}
else switch(*cpoint)
 {case ';':
fputc(*cpoint, html_file);
if(!kuohaos&&*(cpoint+1)!='\r'&&*(cpoint+1)!='\n')
 {
fputc('\n',html_file);
for(i = 0; i<tables-1;i++)
fputs(" ",html_file);}
cpoint++;
break;
case '}':
tables--;
fputc(*cpoint,html_file);
if(*(cpoint+1)!='\n'&&!isalpha(*(cpoint+1)))
 {
for(i = 0; i< tables-1;i++)
fputs(" ",html_file);
}
cpoint++;
break;
case '/':
if(*(cpoint+1)=='/')
 {
fputs("<font color=#dedfdf>",html_file);
while(*cpoint!='\0')
 {
if(*cpoint =='>')
fputs(">",html_file);
else if(*cpoint == '<')
fputs("<",html_file);
else
fputc(*cpoint,html_file);
cpoint++;
}
fputs("</font>",html_file);
for(i=0;i<tables-1;i++)
fputs(" ",html_file);
break;
}
else if(*(cpoint+1)=='*')
 {
fputs("<font color=#dedfdf>/",html_file);
// isps = true;
}
else if(*(cpoint-1)=='*')
 {
fputs("/</font>",html_file);
}
cpoint++;
break;
case '(':
kuohaos++;
fputc('(',html_file);
cpoint++;
break;
case ')':
kuohaos--;
fputc(')',html_file);
cpoint++;
break;
case '<':
fputs("<",html_file);
cpoint++;
break;
case '>':
fputs(">",html_file);
cpoint++;
break;
case ',':
fputs(" ,",html_file);
cpoint++;
break;
case '\n':
for(i = 0; i< tables -1;i++)
fputs(" ",html_file);
cpoint ++;
break;
case '\r':fputc('\n',html_file);cpoint++;break;
case '\'':
if(*(cpoint-1)!='\\')
 {
if(isyinhao)
 {
isyinhao = false;
fputs("\'</font>",html_file);
}
else
 {
isyinhao = true;
fputs("<font color=#dedfdf>\'",html_file);
}
}
else
 {
if(isfenhao)
fputs("\'</font>",html_file);
else
fputc('\'',html_file);
if(isyinhao)
isyinhao =false;
else
isyinhao = true;
}
cpoint++;
break;
case '\"':
if(*(cpoint-1)!='\\')
 {
if(isyinhao)
 {
isyinhao = false;
fputs("\'</font>",html_file);
}
else
 {
isyinhao = true;
fputs("<font color=#dedfdf>\"",html_file);
}

}
else
 {
if(isfenhao)
 {
fputs("\"</font>",html_file);
}
else
fputc('\"',html_file);
}
cpoint++;
break;
case ' ':cpoint++;break;
case '{':tables++;fputc('{',html_file);cpoint++;break;
 case '\\': if(*(cpoint+1)=='\\') {fputs("\\\\",html_file);cpoint+=2;isfenhao=true;break;}
 else {fputc('\\',html_file);cpoint++;isfenhao=false;break;}
default:
 if(*cpoint!='\0') {
fputc(*cpoint,html_file);
cpoint++;
break; } }
}
}
fputs("\n</pre></td></tr></table>\n</body></html>",html_file);
fclose(c_file);
fclose(html_file);
return 0;
} 在遇到引号和\\时会有问题,当然如果出现中文也会有问题。这些问题等有时间在修改。另外代码也需要优化才行
Feedback
# re: 关于把C/C++代码转换成Html的思考 回复 更多评论
2008-07-30 20:37 by
我来踩咯哦
# re: 关于把C/C++代码转换成Html的思考 回复 更多评论
2008-10-08 11:57 by
不错
|