一直以来喜欢在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. 开通博客第一天 写一个hello world

    申请的博客第一天便被批准了,有了一个和大家交流学习的园地.在今后的日子里期待一起进步.

  2. 【转载】Jmeter关联-正则表达式提取器

            今天研发同事提供了一个验证token的接口,要验证token的正确性,现在将整个过程做如下记录: 场景:验证token的正确性 原理:首先用户登录成功后,会在Response head ...

  3. C语言整理复习——指针

    指针是C的精华,不会指针就等于没学C.但指针又是C里最难理解的部分,所以特意写下这篇博客整理思路. 一.指针类型的声明 C的数据类型由整型.浮点型.字符型.布尔型.指针这几部分构成.前四种类型比较好理 ...

  4. MongoDB 监控指标

    MongoDB uptime 启动时长 asserts.user 用户的断言数量 asserts.warning 警告的断言数量 connections.current 当前的连接数 大于 650co ...

  5. 在html中创建自定义标签

    创建并使用自定义标签 Web Components 标准非常重要的一个特性是,它使开发者能够将HTML页面的功能封装为 custom elements(自定义标签),本篇介绍使用 CustomElem ...

  6. 前端IT攻城狮--网址搜藏(-- 欢迎留言补充 --)

    一. 插件 1.validator: https://validator.niceue.com/docs/                 (一款专业表单验证插件) 2.jQuery Tabs-Eas ...

  7. GoJS实例3

    复制如下内容保存到空白的.html文件中,用浏览器打开即可查看效果 <!DOCTYPE html> <html> <head> <meta charset=& ...

  8. 使用vue框架开发前端项目的步骤

    前端项目的开发 1. 本地安装nodejs https://nodejs.org/en/download/ 2. 测试安装 > node -v 3. 本地安装git > git --ver ...

  9. List<string>绑定到DataGridView控件

    问题 将一个简单的List<string>作为数据源绑定到 DataGridView myDataGridView.DataSource = myStringList; 但是只得到一个名为 ...

  10. sql 报错问题

    SQLServer数据库密码已过期问题 处理