txt转换到mobi在kindle上看书的脚本。

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
xzap
帖子: 256
注册时间: 2006-08-24 21:25
送出感谢: 0
接收感谢: 0

txt转换到mobi在kindle上看书的脚本。

#1

帖子 xzap » 2011-06-18 3:59

不知道有没有兄弟也用kindle的。

好久没发脚本了,随便发个txt转mobi的脚本。好处是可以自动生成目录等,比直接看txt爽点。

调用markdown 附件里有,还有就是亚马逊官方的kindlegen ,20m了,太大了,大家可以去亚马逊官方下载,也可以去我的115盘下载

使用方法:./txt2mobi 文件名 书名 作者名 后两项也可以不加
如果要封面就直接扔张图片进去。

废话不多说直接上源码

代码: 全选

#!/bin/bash

bangzhu (){

cat  << EOF 	
用法: `basename $0` 文件名 [书名] [作者] 
	
    其中文件名是必须的,书名、作者什么的可以不添加,书名默认为文件名。作者则留空。至于出版社什么的就都浮云了。其实修改也很简单,但是我不需要所以就从简了。
EOF
}
if [ $1 ]
then
	myfn="${1%%.txt}"
	
else
	bangzhu
	exit
fi
if [ $2 ]
then
	shuming="$2"
else
	shuming="$myfn"
fi
echo "测试文件格式"		
if [ "`file $1 |grep UTF-8`" ] 
then 
  	 cp $1 work.txt
elif 	[ "`file $1 |grep UTF-16`" ] 
then
	 iconv -f utf16 -t utf8 $1 -o work.txt	
else
	 iconv -f gbk -t utf8 $1 -o work.txt	
	 
fi

if [ ! "`file work.txt |grep UTF-8`" ] 
then
	echo "编码不支持,请手动转成utf8再试"
	exit
fi
########################################################
echo "尝试将目录下的图片文件转换成封面"

if [ ! -f "cover.gif" ]
then 
find . -iname "*.gif" -exec convert {} cover.gif \; 2>/dev/null
find . -iname "*.jpeg" -exec convert {} cover.gif \; 2>/dev/null
find . -iname "*.png" -exec convert {} cover.gif \; 2>/dev/null
find . -iname "*.jpg" -exec convert {} cover.gif \; 2>/dev/null
fi
if [ -f "cover.gif" ]
then
	echo "封面创建成功。"
else
	echo "封面创建失败。请安装ImageMagick,然后找张图片放在目录下"

fi
######################################################
echo "开始转换,处理文本……"
sed -i 's/^ *//g' work.txt
sed -i 's/^ *//g' work.txt
sed -i 's/^\s*//g' work.txt
sed -i '/^$/d' work.txt
sed  -i '/^[[]]*$/d' work.txt
sed -i '/^\s*$/d' work.txt 
sed -i 's/^/  /g' work.txt

sed -i 's/\*/zhegeshixinghao/g' work.txt
awk '/ 第[0-9|一|二|三|四|五|六|七|八|九|十|百|千|万|零| | |]*[章|卷|节||集]+/{sub(/^/,"## ")}{print $0} ' work.txt > temp
sed -i 's/$/<br>/g' temp
./markdown  temp >work.html
sed -i 's/<p><br>/<p>/g' work.html
echo "markdown ok"

cp work.html bak.html
sed -i 's/zhegeshixinghao/\*/g' work.html
awk -vi=0  '{if ($0 ~ "<h2>") {i++;cpt=sub(/  /,"");print($0"@"i) > "list" }} {print($0) > i".html"}' work.html


################################################################################################################
cat >he <<EOF
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>$myfn</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf8" /> 
<link rel="stylesheet" href="KUG.css" type="text/css" />
</head>
<body>
EOF
cat >bo <<EOF
</body>
</html>
EOF
for i in *.html ;do cat he $i bo >temp;mv temp $i;done
rm he
rm bo

if [ -f list ]
then 
sed -i 's/<h2>//g' list 
sed -i 's/<\/h2>//g' list 
sed -i 's/<br>//g' list 
#######################################################################################################
echo "为创建html文件作准备"
while read j 
 	do
	biaoti=`echo $j|awk -F@ '{print $1}'`
	fname=`echo $j|awk -F@ '{print $2}'`

echo "	<item id=\"item${fname}\" media-type=\"application/xhtml+xml\" href=\"${fname}.html\"></item>" >>ma
echo "	<itemref idref=\"item${fname}\"/>" >>sp
echo "    <navPoint class=\"chapter\" id=\"chapter_${fname}\" playOrder=\"${fname}\">
      <navLabel>
        <text>${biaoti}</text>
      </navLabel>
      <content src=\"${fname}.html\"/>
   </navPoint>" >>nav
echo "<li><a href=\"${fname}.html\">${biaoti}</a></li>" >>toc

done <list

######################################################################################################
echo "开始创建${myfn}.opf"
cat >"${myfn}".opf<<EOF
<?xml version="1.0" encoding="utf-8"?>

<package xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="BookId">	
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">
  	<dc:title>${shuming}</dc:title>  
	<dc:language>en-US</dc:language>
  <meta name="cover" content="My_Cover" />
 	<dc:identifier id="BookId" opf:scheme="ISBN"></dc:identifier>
	<dc:creator>${3}</dc:creator>
 	<dc:publisher></dc:publisher>
 	<dc:subject></dc:subject>
  	<dc:date></dc:date>
  <dc:description></dc:description>
	
</metadata>
<manifest>
  <!-- HTML content files [mandatory] -->
EOF
cat ma >>"${myfn}".opf
rm ma
cat >> "${myfn}".opf<<EOF
  <item id="itemx" media-type="application/xhtml+xml" href="toc.html"></item>
  <item id="My_Table_of_Contents" media-type="application/x-dtbncx+xml" href="KUG.ncx"/>
  <item id="My_Cover" media-type="image/gif" href="cover.gif"/>
</manifest>
	

<spine toc="My_Table_of_Contents">
  <!-- the spine defines the linear reading order of the book -->
	<itemref idref="itemx"/>
EOF
cat sp >>"${myfn}".opf
rm sp
cat >>"${myfn}".opf<<EOF
</spine>
	
<guide>
	<reference type="toc" title="Table of Contents" href="toc.html"></reference>
	</guide>

</package>
EOF

#################################################################################
echo "开始创建KUG.ncx"
cat >KUG.ncx <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ncx PUBLIC "-//NISO//DTD ncx 2005-1//EN"
	"http://www.daisy.org/z3986/2005/ncx-2005-1.dtd">

<!--
	For a detailed description of NCX usage please refer to:
	http://www.idpf.org/2007/opf/OPF_2.0_final_spec.html#Section2.4.1
-->

<ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1" xml:lang="en-US">
<head>
<meta name="dtb:uid" content="BookId"/>
<meta name="dtb:depth" content="2"/>
<meta name="dtb:totalPageCount" content="0"/>
<meta name="dtb:maxPageNumber" content="0"/>
</head>
<docTitle><text>${shuming}</text></docTitle>
<docAuthor><text>${3}</text></docAuthor>
  <navMap>
    <navPoint class="toc" id="toc" playOrder="0">
      <navLabel>
        <text>目录</text>
      </navLabel>
      <content src="toc.html"/>
    </navPoint>
EOF
cat nav >>KUG.ncx
rm nav
cat >>KUG.ncx <<EOF
 </navMap>
</ncx>
EOF
##############################################################################
echo "开始创建toc.html"
cat >toc.html <<EOF
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>Table of Contents</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf8" /> 
</head>
<body>

<div>
 <h1><b>目录</b></h1>
 <div><ul>
EOF
cat toc >>toc.html
rm toc
cat >>toc.html <<EOF
 </ul></div><br />
 <h1 class="centered">* * *</h1>
</div>
</body>
</html>
EOF
#################################################################################
mulu=0
else
mulu=1
sed -i 's/zhegeshixinghao/\*/g' bak.html
echo "开始创建${myfn}.opf"

cat >"${myfn}".opf<<EOF
<?xml version="1.0" encoding="utf-8"?>

<package xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="BookId">	
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">
  	<dc:title>${shuming}</dc:title>  
	<dc:language>en-US</dc:language>
  <meta name="cover" content="My_Cover" />
 	<dc:identifier id="BookId" opf:scheme="ISBN"></dc:identifier>
	<dc:creator>${3}</dc:creator>
 	<dc:publisher></dc:publisher>
 	<dc:subject></dc:subject>
  	<dc:date></dc:date>
  <dc:description></dc:description>
	
</metadata>
<manifest>
  <!-- HTML content files [mandatory] -->
  <item id="itemx" media-type="application/xhtml+xml" href="bak.html"></item>
  <item id="My_Cover" media-type="image/gif" href="cover.gif"/>
</manifest>
	

<spine toc="My_Table_of_Contents">
  <!-- the spine defines the linear reading order of the book -->
	<itemref idref="itemx"/>


</spine>
	
<guide>
	
	</guide>

</package>
EOF



fi
#############################################################################

echo "开始创建KUG.css"
cat >KUG.css<<EOF
 /* Style Definitions */
 
p
{
	margin-top: 1em;
	text-indent: 0em
}

.pagebreak
{
	page-break-before: always;
}

.centered
{
	text-align: center;
}

.bottom
{
	vertical-align: text-bottom;
}

.tablehead
{
	text-align: center;
	font-weight: bold
}

H1 {margin-top: 1em}
H2 {margin-top: 1em}
H3 {margin-top: 1em}
H4 {margin-top: 1em}

EOF

##############################################################################
echo "开始转换成mobi"

./kindlegen "${myfn}".opf

rm *.html 2>/dev/null
rm KUG.css 2>/dev/null
rm KUG.ncx 2>/dev/null
rm "${myfn}".opf 2>/dev/null
rm list 2>/dev/null
rm work.txt 2>/dev/null
echo
echo
if (( $mulu == 0 ))
then
echo "   ${myfn}.mobi 创建完成了,这本书带目录的"
else
echo "   ${myfn}.mobi 创建完成了,可惜无法创建目录。"
fi
echo
echo

t2m.tar.gz
(15.47 KiB) 下载 134 次
头像
ChenFengyuan
帖子: 770
注册时间: 2008-03-23 0:39
送出感谢: 0
接收感谢: 4 次

Re: txt转换到mobi在kindle上看书的脚本。

#2

帖子 ChenFengyuan » 2011-07-11 9:48

顶一下 :em11
ashf
帖子: 23
注册时间: 2009-01-02 21:41
送出感谢: 0
接收感谢: 0

Re: txt转换到mobi在kindle上看书的脚本。

#3

帖子 ashf » 2011-08-13 14:41

能改成epub的吗
头像
我就是我2
帖子: 1215
注册时间: 2008-12-13 10:55
来自: the Earth
送出感谢: 1 次
接收感谢: 3 次
联系:

Re: txt转换到mobi在kindle上看书的脚本。

#4

帖子 我就是我2 » 2011-08-14 0:40

纯支持,代码有点长呢。
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!
头像
xzap
帖子: 256
注册时间: 2006-08-24 21:25
送出感谢: 0
接收感谢: 0

Re: txt转换到mobi在kindle上看书的脚本。

#5

帖子 xzap » 2011-08-17 4:43

3楼,我用的k3 不支持epub 所以连测试都不能。epub应该也差不多的格式,自己改改吧。

4楼,这个不是代码长,大部分都是网页的模版而已
头像
Strange
帖子: 1823
注册时间: 2006-05-19 9:54
来自: Shanghai
送出感谢: 2 次
接收感谢: 10 次

Re: txt转换到mobi在kindle上看书的脚本。

#6

帖子 Strange » 2011-08-17 8:05

图省事,直接用calibre了
ニンニク入れますか?
x60 with gentoo
ashf
帖子: 23
注册时间: 2009-01-02 21:41
送出感谢: 0
接收感谢: 0

Re: txt转换到mobi在kindle上看书的脚本。

#7

帖子 ashf » 2011-08-18 18:59

xzap 写了:3楼,我用的k3 不支持epub 所以连测试都不能。epub应该也差不多的格式,自己改改吧。

4楼,这个不是代码长,大部分都是网页的模版而已
epub也是先生成html然后转的,只是不知linux下是否有类似kindlegen的cli程序
回复

回到 “Shell脚本”