一直以来喜欢在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. Python栈溢出【新手必学】

    python3.5.4 递归函数最恶心的时候莫非栈溢出(Stack overflow).PS:另外很多人在学习Python的过程中,往往因为没有好的教程或者没人指导从而导致自己容易放弃,为此我建了个P ...

  2. 产品原型 UI 设计工具

    产品原型设计工具 Balsamiq Mockups Axure RP 图像处理.绘制工具 ps,AI 跨平台 UI开发工具 QT , Unity3D

  3. [7b2美化]柒比贰 魔改系列|7B2-分类封面添加波浪效果&每日诗词

    本文转载自:钻芒博客 https://www.zmki.cn/5105.html 效果如图: 代码: 首先在style.css样式表里添加波浪样式 /*浪来了*/ .lang { overflow: ...

  4. 使用Hibernate+MySql+native SQL的BUG,以及解决办法

      本来是mssql+hibernate+native SQL 应用的很和谐 但是到了把mssql换成mysql,就出了错(同样的数据结构和数据). 查询方法是: String sql = " ...

  5. arm linux 移植 udhcp 与 使用

    背景 在一些网络环境下,需要静态IP不够现实,需要使用DHCP进行自动获取IP地址. udhcpc是一个面向嵌入式系统的非常小的DHCP客户端,字母的缩写微μ- DHCP -客户端client(μDH ...

  6. Kubernetes Dashboard 【转】

    前面章节 Kubernetes 所有的操作我们都是通过命令行工具 kubectl 完成的.为了提供更丰富的用户体验,Kubernetes 还开发了一个基于 Web 的 Dashboard,用户可以用 ...

  7. 解决Google浏览器不能打开kubernetes dashboard方法【转】

    在这片文章中,我将展示如何在Google Chrome上打开kubernetes dashboard.本文不叙述如何安装搭建docker和kubernetes,有关详情请上网查阅! 很多小伙伴们在自己 ...

  8. Unbutu下装oracle

    Ubuntu 16.04安装Oracle 11gR2入门教程图文详解 转自         https://www.linuxidc.com/Linux/2017-12/149797.htm  原文作 ...

  9. 刷题21. Merge Two Sorted Lists

    一.题目说明 这个题目是21. Merge Two Sorted Lists,归并2个已排序的列表.难度是Easy! 二.我的解答 既然是简单的题目,应该一次搞定.确实1次就搞定了,但是性能太差: R ...

  10. ARGB 颜色取值与透明度搭配

    ARGB 依次代表透明度(alpha).红色(red).绿色(green).蓝色(blue). #FF99CC00 为例,其中,FF 是透明度,99 是红色值, CC 是绿色值, 00 是蓝色值. 1 ...