/*//
文件名: h2t.c v0.2
作者:  苏晓(suxiaojack)
日期:  2008.7
用途:  转换HTML内容为TXT文本
许可 ( License ): GPL
v0.2
处理Bug
1、修正无法识别&#数字;问题 UNICODE=>GB2312
2、添加©和 ® 处理
3、修正&处理死循环.
v0.1
//*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <locale.h>
UnicodeToGB2312(char* pOut,unsigned short uData)
{
WideCharToMultiByte(CP_ACP,NULL,&uData,1,pOut,sizeof(WCHAR),NULL,NULL);
return;
}
#define BUFSIZE 1024*1024*2
char buf[1024*1024*20];
char shadowbuf[1024*1024*20];
char buffer[BUFSIZE];
long size;
int type=0;
#define tocsize 14
//这个东西太多了!常用的可能也就这些吧。
//Windows控制台太变态!注册商标等一些符号无法输出!
char* toc[tocsize]={"&nbsp;"," ","&lt;","<","&gt;",">","&quot;","/"","&amp;","&","&copy;","◎版权","&reg;","◎注册"};
void usage(char** argv)
{
char *us="用来转换html =>txt. ver0.2/n"
"suxiaojack写于2008.7/n";
char *ue="tstart_in_tag_text:开始的Tag标记中的特征文字,好理解end_in_tag_text了。/n"
"jump_num:跳过几次开始找到的,默认为0./n"
"注意不支持正则式!未曾处理水印文字。/n";
printf("%s",us);
printf("使用方法:%s <file> [ <start_in_tag_text> [jump_num] <end_in_tag_text> ] /n",argv[0]);
printf("%s",ue);
};
//strstr快速比较
int ministrstr(char* s,char* f)
{
char minibuf[16];
memcpy(minibuf,s,15);
minibuf[15]=0;
return strstr(minibuf,f)-minibuf;
};
//strstr转换为小写快速比较。
int ministrstri(char* s,char *f)
{
char minibuf[16];
memcpy(minibuf,s,15);
minibuf[15]=0;
strlwr(minibuf);
return strstr(minibuf,f)-minibuf;
}
// 等标记转换
int isintoc(char* streamstart)
{
int i=0;
int ret=0;
while(i<tocsize)
{
if(!ministrstr(streamstart,toc[i]))
{
printf("%s",toc[i+1]);
ret=strlen(toc[i]);
break;
};
i+=2;
};
if(ret==0) //没有转换处理
{
printf("&");
ret=1;
};
return ret;
};
int num2txt(char* numstart)
{
char tmp[256];
int pos=0;
char* s=numstart;
unsigned short word;
char os[3];
while( *s>='0' && *s <='9' )
{
tmp[pos++]=*s++;
};
tmp[pos]=0;
word=atoi(tmp);
memset(os,0,3);
UnicodeToGB2312(os,word);
printf("%s",os);
//s是;跳过
s++;
return  s-numstart;
}
//文件全部进入缓存
void read2buf(FILE* fp)
{
buf[0]=0;
size=0;
while(!feof(fp))
{
fgets(buffer,sizeof(buffer),fp);
strcat(buf+size,buffer);
size+=strlen(buffer);
};
buf[size]=0;
memcpy(shadowbuf,buf,size+1);
strlwr(shadowbuf);
};
//找标记的开始位置。返回找到后'>'之后的第一个字符位置。
int findstart(char* start,int jump)
{
char* pos=shadowbuf;
strlwr(start);
do
{
pos=strstr(pos,start);
if(pos-shadowbuf < 0 )return -1;
pos++;
}while(jump--);
while(*pos++ != '>')
{};
return pos-shadowbuf;
};
//找标记的结束位置。返回找到后'<'之前的最后字符位置。
int findend(char* end,int start)
{
char* pos=shadowbuf+start;
strlwr(end);
pos=strstr(pos,end);
if(pos-shadowbuf<0)return -1;
while(*pos-- != '<')
{
};
return pos-shadowbuf;
};
void printline()
{
switch(type)
{
case 1:
printf("%c",'/r');
break;
case 2:
printf("%s","/r/n");
break;
case 3:
printf("%c",'/n');
break;
default:
break;
};
};
//转换输出
void h2t(char* s,int len)
{
char* ss=s;
while(ss-s<len)
{
//判断一下文章换行符号类型
if(type==0 && ( *ss=='/r'|| *ss=='/n'))
{
if(*ss=='/r' &&*(ss+1)=='/n')
{
type=2;
}else if(*ss=='/n')
{
type=3;
}else
{
type=1;
};
};
if(*ss!='<')
{//非标记
if(*ss=='&')
{
if(*(ss+1)=='#')
{
ss+=2;
int may=num2txt(ss);
ss+=may;
}else
{
int may=isintoc(ss);
if(may>0)
{
ss+=may;
};
}
}
else
{
printf("%c",*ss);
ss++;
};
}
else
{
//<script标记
if(!ministrstri(ss,"<script"))
{
ss++;
findnext:
while(*ss!='<' && ss-s <len)
{
ss++;
};
if(ss-s>=len)break;
while(ministrstri(ss,"</script")!=0 && ss-s<len)
{
ss++;
goto findnext;
};
if(ss-s>=len)break;
while(*ss!='>')ss++;
ss++;
}else if(!ministrstri(ss,"<style")) //<style标记
{
ss++;
findnext2:
while(*ss!='<' && ss-s <len)
{
ss++;
};
if(ss-s>=len)break;
while(ministrstri(ss,"</style")!=0 && ss-s<len)
{
ss++;
goto findnext2;
};
if(ss-s>=len)break;
while(*ss!='>')ss++;
ss++;
}else if(!ministrstri(ss,"</br>"))
{
printline();
ss+=5;
}else if(!ministrstri(ss,"</p>"))
{
printline();
ss+=4;
}else if(!ministrstri(ss,"<br>"))
{
printline();
ss+=4;
}
else //普通标记
{
while(*ss!='>' && ss-s<len)
{
ss++;
};
if(ss-s>=len)break;
ss++;
};
};
};
};
int main(int argc,char *argv[])
{
FILE* fp=0;
int start,end,jump;
if(argc==2)
{
fp=fopen(argv[1],"r");
if(!fp)
{
usage(argv);
exit(0);
};
read2buf(fp);
h2t(buf,size);
fclose(fp);
}else if(argc==4)
{
fp=fopen(argv[1],"r");
if(!fp)
{
usage(argv);
exit(0);
};
read2buf(fp);
start=findstart(argv[2],0);
if(start<0)
{
printf("can't find:%s/n",argv[2]);
exit(1);
};
end=findend(argv[3],start);
if(end<0)
{
printf("can't find:%s/n",argv[3]);
exit(1);
}
if(start<end)
{
h2t(buf+start,end-start);
}else
{
usage(argv);
};
fclose(fp);
}else if(argc == 5)
{
fp=fopen(argv[1],"r");
if(!fp)
{
usage(argv);
exit(0);
};
read2buf(fp);
jump=atoi(argv[3]);
start=findstart(argv[2],jump);
if(start<0)
{
printf("can't find:%s/n",argv[2]);
exit(1);
};
end=findend(argv[4],start);
if(end<0)
{
printf("can't find:%s/n",argv[4]);
exit(1);
}
if(start<end)
{
h2t(buf+start,end-start);
}else
{
usage(argv);
};
fclose(fp);
}
else
{
usage(argv);
}
return 0;
}
/*
与noblank联合使用
h2t filename.htm |noblank >out.txt
*/

html2txt h2t.c相关推荐

  1. html2txt noblank.c

    /*// 文件名: noblank.c v0.2 作者: 苏晓(suxiaojack) 日期: 2008.7 用途: 移去文本中空行 许可 ( License ): GPL v0.2 添加智能分段功能 ...

  2. html转为exe格式文件格式,HTML、PDF文件格式转换工具一览

    这类软件挺多的,转换效果也有较大区别.仅名为HTML2TXT的软件就不止一个.我们就 以华语通HTML2TXT来看看其使用方法吧.虽然"个头"稍大了一点点(683KB),但Wind ...

  3. html txt doc pdf区别,HTML、PDF文件格式转换工具一览doc

    HTML.PDF文件格式转换工具一览 转换HTML为TXT文件 这类软件挺多的,转换效果也有较大区别.仅名为HTML2TXT的软件就不止一个.我们就 以华语通HTML2TXT来看看其使用方法吧.虽然& ...

  4. CompletableFuture:让你的代码免受阻塞之苦

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:https://juejin.cn/post/6844904024332828685 写在前面 通过阅读本篇文章你将了解到: ...

  5. HTTP客户端连接,选择HttpClient还是OkHttp?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者: 何甜甜在吗 juejin.im/post/5e156c80 ...

  6. illegalargumentexception是什么异常_线程出现异常!应该如何处理?

    点击上方 一个优秀的废人,选择 设为星标 优质文章,及时送达 juejin.im/post/6844903997388636174 之前使用线程执行任务的时候,总是忽略了线程异常的处理,直到最近看书~ ...

  7. python简单代码画皮卡丘-实现童年宝可梦,教你用Python画一只属于自己的皮卡丘...

    原标题:实现童年宝可梦,教你用Python画一只属于自己的皮卡丘 大数据文摘出品 作者:李雷.蒋宝尚 还记得小时候疯狂收集和交换神奇宝贝卡片的经历吗? 还记得和小伙伴拿着精灵球,一起召唤小精灵的中二模 ...

  8. Kubernetes之路 1 - Java应用资源限制的迷思

    摘要: 随着容器技术的成熟,越来越多的企业客户在企业中选择Docker和Kubernetes作为应用平台的基础.然而在实践过程中,还会遇到很多具体问题.本文分析并解决了Java应用在容器使用过程中关于 ...

  9. 什么是物联网?—Vecloud 微云

    什么是物联网? 物联网,顾名思义就是连接物品的网络. 物联网通过各种信息传感设备,实时采集任何需要监控.连接.互动的物体或过程等各种需要的信息,与互联网结合形成的一个巨大网络. 其目的是实现物与物.物 ...

最新文章

  1. 76 道 Oracle Goldengate 面试问题
  2. centos7搭建nexus
  3. C++中的hash_map和map的区别
  4. css 图文 上下 居中,CSS垂直居中的6种方法
  5. MySQL全文索引模糊查询_mysql全文索引之模糊查询
  6. Flutter进阶—自定义主题风格
  7. windows下sublime2 clojure环境配置
  8. rman一致性备份oracle数据库可以在非归档模式下么,探索ORACLE之RMAN_03一致性备份...
  9. 一种FIFO实现原理
  10. 【RK2206】3. 处理迪文屏事件
  11. 三星android 截图,三星手机如何截图?几种三星手机截屏的方法教程
  12. Unity3d+GameFramework:资源分析,资源依赖,循环依赖检测
  13. 把你问到哑口无言,HR是专业的!
  14. 全球与中国苯二亚甲基二异氰酸酯(XDI)市场发展形势与未来前景分析报告2022-2028年
  15. Android 动态加载多版本SDK之DexClassLoader实践
  16. git配置(SSH)
  17. postgresql查询本日,本周,本月,上月,今年,去年
  18. ORACLE 游标 cursor的基本用法
  19. c语言第五章课后答案冯山,C语言 四川师范大学 信息与计算科学 冯山实验五.doc...
  20. 金蝶显示无法创建kis服务器,金蝶kis新建账套未成功解决方案

热门文章

  1. 基于词向量空间专业化的动词类跨语言归纳与迁移
  2. zzuoj 10400: B.海岛争霸
  3. skycc淘宝客推广软件 V8.2免费版
  4. 伯南克回忆2008:金融危机如何演变为经济危机?------From凤凰财经20160430
  5. 二叉树,二叉树的归先序遍历,中序遍历,后序遍历,递归和非递归实现
  6. 内网,网关,外网三者的关系
  7. 使用Shader Graph实现《塞尔达传说:旷野之息》风格的着色器
  8. FPGA数字IC刷题58道Verilog题解代码及视频讲解【FPGA探索者】【同步/异步FIFO】【跨时钟】
  9. WPF 在编译时 显示 CS0426 类型“xxx”中不存在类型名“xxx”
  10. 撕开的黎明--孔庆东卷