一直以来喜欢在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. 图的数据结构的实现与遍历(DFS,BFS)

    //图的存储结构:const int MAXSIZE = 10;//邻接矩阵template<class T>class MGraph {public:    MGraph(T a[], ...

  2. MyEclipse 8.5整合Git,并在Github上发布项目

    我们在闲暇时间想加入些团队做点属于自己有意义的东西,那Github就是为你准备的.但是用惯SVN的我们就得学习学习了. 工具/原料 myeclipse8.5 github 方法/步骤 1 下载Ecli ...

  3. 2-10 就业课(2.0)-oozie:6、通过oozie执行mr任务,以及执行sqoop任务的解决思路

    执行sqoop任务的解决思路(目前的问题是sqoop只安装在node03上,而oozie会随机分配一个节点来执行任务): ======================================= ...

  4. 2-10 就业课(2.0)-oozie:5、通过oozie执行hive的任务

    4.2.使用oozie调度我们的hive 第一步:拷贝hive的案例模板 cd /export/servers/oozie-4.1.0-cdh5.14.0 cp -ra examples/apps/h ...

  5. jackson处理json

    原文连接 工具下载: jackson-core-2.2.3.jar 核心jar包,下载地址 jackson-annotations-2.2.3.jar 该包提供Json注解支持,下载地址 jackso ...

  6. Golang gin开源实例——表设计

    UML Model 基本模型定义 type Model struct { ID int `gorm:"primary_key" json:"id"` Creat ...

  7. php的排序算法

    *对于算法来说,对于每个小伙伴来说都是比较头疼的,但是,为什么要学习算法? 算法是基础,算法能够提升智力,我想这两点就值得我们花时间去学习了.不要放弃,实在不会,先死记硬背下来,以后慢慢理解,一下是我 ...

  8. 计算机是如何计算的、运行时栈帧分析(神奇i++续)

    关于i++的疑问 通过JVM javap -c 查看字节码执行步骤了解了i++之后,衍生了一个问题: int num1=50; num1++*2执行的是imul(将栈顶两int类型数相乘,结果入栈), ...

  9. Most simple basic of internet programming based on two different machines sharing the same local net

    This blog is just shown for the most simple basic of internet programming based on two different mac ...

  10. JuJu团队11月30号工作汇报

    JuJu团队11月30号工作汇报 JuJu   Scrum 团队成员 今日工作 剩余任务 困难 于达  提供类似generator的数据产生接口  改进代码  对julia不够熟悉 婷婷  和队友一起 ...