一直以来喜欢在kindle上看小说,kindle不伤眼,也可以帮助控制玩手机的时间。但在kindle上看txt格式的网络小说就很头疼了,这类小说在kindle上是没有目录的,而且篇幅巨长。所以一直以来我都想加上目录。于是就有了这篇文章。

  在这里,要想加上目录,就要将txt格式的小说转换为mobi格式。我借助了kindlegen,它的一些语法不再这里详说了,给个示意图,如下:

  

  总思路就是生成html和ncx、opf文件,代码如下:

  1.read.cpp

  

#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <regex>
#include <windows.h>
#include "productHtml.h" using namespace std; int main(int argc,char * * argv)
{
fstream fin(argv[],fstream::in);
string test="";
vector<string> vec_menu;
vector<string> vec_text;
string rs="^[0-9]";
regex expression(rs);
smatch wm;
string str_text="<p>"; while(getline(fin,test))
{
if (regex_search (test,wm,expression)) {
vec_menu.push_back(test);
//cout<<str_text<<endl;
str_text+="</p>";
vec_text.push_back(str_text);
str_text="<p>";
}
else
{
str_text+=test;
str_text+="<br/>";
}
}
vec_text.push_back(str_text);
cout<<vec_menu.size()<<" "<<vec_text.size()<<endl;
for(int i=;i<vec_text.size();i++)
{
/*
cout<<vec_menu[i]<<endl;
cout<<vec_text[i+1]<<endl;
*/
string str=vec_text[i];
string str_name=i==?"前言":vec_menu[i-];
productHtml(str_name,str,i);
}
productNcx(vec_menu);
productOpf(vec_menu);
cout<<"finished"<<endl;
fin.close(); int ret=(int)ShellExecute(NULL,"open","kindlegen.exe","test.opf",NULL,SW_SHOWNORMAL);
cout<<"ret: "<<ret<<endl;
return ;
}

2.productHtml.h

#include <iostream>
#include <string>
#include <fstream> using namespace std; void productHtml(string str_name,string str_text,int no)
{
string fileName="./chapter"+to_string(no)+".html";
fstream fout(fileName,ios::out);
fout<<"<html>"<<endl<<"<head>"<<endl<<"<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">"
<<endl<<"<link rel=\"stylesheet\" type=\"text/css\" href=\"online.css\">"
<<endl<<"</head>"<<endl<<"<body>";
fout<<"<title>"<<str_name<<"</title>"<<endl<<str_text;
fout<<" </body>"<<endl<<"</html>"; fout.close();
} void productNcx(vector<string> & menu_name)
{ fstream fout("./menu.ncx",ios::out);
fout<<"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"<<endl<<"<!DOCTYPE ncx PUBLIC \"-//NISO//DTD ncx 2005-1//EN\" \"http://www.daisy.org/z3986/2005/ncx-2005-1.dtd\">"
<<endl<<"<ncx xmlns=\"http://www.daisy.org/z3986/2005/ncx/\" version=\"2005-1\" xml:lang=\"en-US\">"<<endl<<"<head>"<<endl<<
"<meta name=\"dtb:uid\" content=\"BookId\"/>"<<endl<<
"<meta name=\"dtb:depth\" content=\"2\"/>"<<endl<<
"<meta name=\"dtb:totalPageCount\" content=\"0\"/>"<<endl<<
"<meta name=\"dtb:maxPageNumber\" content=\"0\"/>"<<endl<<
"</head>"<<endl<<
"<docTitle><text>藏地密码</text></docTitle>"<<endl<<
"<docAuthor><text>何马</text></docAuthor>"<<endl<<
"<navMap>";
fout<<"<navPoint class=\"toc\" id=qianyan playOrder=\"1\">"<<endl<<
"<navLabel>"<<endl<<
"<text>前言</text>"<<endl<<
"</navLabel>"<<endl<<
"<content src=\"chapter0.html\"/>"<<endl<<
"</navPoint>";
for(int i=;i<menu_name.size();i++)
{
fout<<"<navPoint class=\"toc\" id=\""+menu_name[i]+"\" playOrder=\"1\">"<<endl<<
"<navLabel>"<<endl<<
"<text>"+menu_name[i]+"</text>"<<endl<<
"</navLabel>"<<endl<<
"<content src=\"chapter"+to_string(i+)+".html\"/>"<<endl<<
"</navPoint>";
}
fout<<" </navMap>"<<endl<<"</ncx>";
fout.close();
cout<<"finished ncx"<<endl;
} void productOpf(vector<string> & menuName)
{
fstream fout("./test.opf",fstream::out);
fout<<"<package xmlns=\"http://www.idpf.org/2007/opf\" version=\"2.0\" unique-identifier=\"BookId\">"<<endl<<
"<metadata xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:opf=\"http://www.idpf.org/2007/opf\">"<<endl<<
"<dc:title>电子书标题</dc:title>"<<endl<<
"<dc:language>en-us</dc:language>"<<endl<<
"</metadata>"<<endl<<
"<manifest>";
fout<<"<item id=\"My_Table_of_Contents\" media-type=\"application/x-dtbncx+xml\" href=\"menu.ncx\"/>"<<endl;
for(int i=;i<menuName.size()+;i++)
{
fout<<"<item id=\"item"+to_string(i)+"\" media-type=\"application/xhtml+xml\" href=\"chapter"+to_string(i)+".html\"/>"<<endl;
}
fout<<"</manifest>"<<endl<<"<spine toc=\"My_Table_of_Contents\">";
for(int i=;i<menuName.size()+;i++)
{
fout<<"<itemref idref=\"item"+to_string(i)+"\"/>"<<endl;
}
fout<<" </spine>"<<endl<<"</package>";
fout.close();
cout<<"finished opf"<<endl;
}

git地址如下:https://github.com/JsonZhangAA/Txt2Mobi,有兴趣的朋友,大家一起改良。

利用kindlegen实现txt格式小说转换为mobi格式小说(C++实现)的更多相关文章

  1. [实用分享]Kindle电子书格式AZW3转换为MOBI

    [实用分享]Kindle电子书格式AZW3转换为MOBI 思路:先拆解成源文件再转换成 MOBI 推荐首选这种方法.此方法的思路是,首先用 KindleUnpack 把 azw3 文件拆解成源文件,然 ...

  2. 【转】将 azw3 格式转换为 mobi 格式并保持原有排版格式

    小伙伴多次向 Kindle 伴侣提出一个问题,那就是通过 Calibre 将排版精美的 azw3 格式电子书转换成 mobi 格式后推送到 Kindle,排版格式会发生很大的变化,比如行距过窄.内嵌字 ...

  3. mysql内置函数,在mysql里面利用str_to_date()把字符串转换为日期格式

    mysql内置函数,在mysql里面利用str_to_date()把字符串转换为日期格式 示例:分隔符一致,年月日要用%号 select str_to_date('2008-4-2 15:3:28', ...

  4. linux格式批量转换为dos格式

    注:写的只是基本知识,望高手勿喷,写这个不是为了炫耀,只是为了方便其他人,仅此而已. 一:脚本功能: 批量处理目录以及子目录下的文件格式问题,能够轻易的将linux格式转换为dos格式. 二:写此博客 ...

  5. java 调用OpenOffice将word格式文件转换为pdf格式

    一:环境搭建 OpenOffice 下载地址http://www.openoffice.org/ JodConverter 下载地址http://sourceforge.net/projects/jo ...

  6. vmware的vmdk格式虚拟机转换为qcow2格式

      今天应其他部门的需求,把一个笔记本里的vmware的window2008的虚拟机转换为qcow2格式,在公司服务器上运行. 第一次做,用了许多时间 首先: 虚拟机的镜像分为多个vmdk文件,所以我 ...

  7. 将dos格式文件转换为unix格式

    在windows下换行符是\r\n,表示回到行首并换到下一行 而unix系统中换行符是\n 这样就存在一个问题,在windows上的文档到了unix上可能就无法使用了 针对这个情况有几种解决办法: 1 ...

  8. python json格式字符串转换为字典格式

    不废话,看代码 #_*_ coding:utf- _*_ import os import json course=open('C:\\Users\\ly199\\Desktop\\list.txt' ...

  9. 使用OpenSSL(Windows x64版)将pem格式证书转换为p12格式

    今天同事遇到一个问题,他获得的证书只有pem格式,而服务器要求提交p12格式,一时搞不定,来找我帮忙. 我之前也从未接触过证书类型的转换,所以上网大致搜索了一下,又亲自动手试了试,现将有关心得经验记录 ...

随机推荐

  1. Spring JMSTemplate 与 JMS 原生API比较

    博客分类: JMS Spring 2.x   JMSUtil与Spring JmsTemplate的对比 Author:信仰 Date:2012-4-20 未完待续,截止日期2012-4-20 从以下 ...

  2. 浅谈Spring发展史

    1 码农的春天----------Spring来了 Spring官网 :http://www.springframework.org 关于Spring的发展起源要回溯到2002年,当时正是Java E ...

  3. 二十二 动态代理&解决网站的字符集编码问题

    设计模式: 软件开发过程中,遇到相似问题,将问题的解决方式抽取模型(套路) 单例,工厂,装饰者,适配器,动态代理 谷歌汽车场景: 谷歌汽车场景Car Interface Icar{  start  r ...

  4. python2学习------基础语法2(函数)

    1.函数 # 无参数函数 def loopTest2(): a=1; while a<40: print a; a=a+1; if a==35: continue; else: print 'o ...

  5. zabbix监控memcached服务

    zabbix监控memcached服务 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装并配置memcached服务 1>.使用yum方式安装memcached [ro ...

  6. 使用命令行连接远程DB2数据库

    1. 打开命令窗口 win + r  输入 db2cmd 2. 首先在客户机上对远程节点进行编目 CATALOG  TCPIP                    //编目一个TCP/IP节点NOD ...

  7. XV6源代码阅读-中断与系统调用

    Exercise1 源代码阅读 1.启动部分: bootasm.S bootmain.c 和xv6初始化模块:main.c bootasm.S 由16位和32位汇编混合编写成的XV6引导加载器.boo ...

  8. R 再也不用愁变量太多跑回归太麻烦!R语言循环常用方法总结

    在高维数据分析过程中,为了筛选出与目标结局相关的变量,通常会用到回归分析,但是因为自变量较多,往往要进行多次回归.这就是统计编程语言发挥作用的时候了 有些大神们认为超过3次的复制粘贴就可以考虑使用循环 ...

  9. Day6 - J - Cartesian Tree POJ - 2201

    Let us consider a special type of a binary search tree, called a cartesian tree. Recall that a binar ...

  10. mysq 事务管理入门

    设置隔离级别: