当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 7 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : txt转换到mobi在kindle上看书的脚本。
帖子发表于 : 2011-06-18 3:59 
头像

注册: 2006-08-24 21:25
帖子: 256
送出感谢: 0 次
接收感谢: 0 次
不知道有没有兄弟也用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 次


页首
 用户资料  
 
2 楼 
 文章标题 : Re: txt转换到mobi在kindle上看书的脚本。
帖子发表于 : 2011-07-11 9:48 
头像

注册: 2008-03-23 0:39
帖子: 770
送出感谢: 0 次
接收感谢: 4
顶一下 :em11


页首
 用户资料  
 
3 楼 
 文章标题 : Re: txt转换到mobi在kindle上看书的脚本。
帖子发表于 : 2011-08-13 14:41 

注册: 2009-01-02 21:41
帖子: 23
送出感谢: 0 次
接收感谢: 0 次
能改成epub的吗


_________________
http://db.tt/gfENpA2


页首
 用户资料  
 
4 楼 
 文章标题 : Re: txt转换到mobi在kindle上看书的脚本。
帖子发表于 : 2011-08-14 0:40 
头像

注册: 2008-12-13 10:55
帖子: 1215
地址: the Earth
送出感谢: 2
接收感谢: 3
纯支持,代码有点长呢。


_________________
苏东坡问佛印道:“人人皆念观世音菩萨,观世音菩萨念谁?”
佛印答道:“念观世音菩萨。”
苏东坡诧异:“为何亦念观世音菩萨?”
曰:“求人不如求己。”


dropbox 誰好奇,誰來點
勞碌一生又如何,虛度一生又如何,你過得開心嗎?人活著就要開心嘛!


页首
 用户资料  
 
5 楼 
 文章标题 : Re: txt转换到mobi在kindle上看书的脚本。
帖子发表于 : 2011-08-17 4:43 
头像

注册: 2006-08-24 21:25
帖子: 256
送出感谢: 0 次
接收感谢: 0 次
3楼,我用的k3 不支持epub 所以连测试都不能。epub应该也差不多的格式,自己改改吧。

4楼,这个不是代码长,大部分都是网页的模版而已


页首
 用户资料  
 
6 楼 
 文章标题 : Re: txt转换到mobi在kindle上看书的脚本。
帖子发表于 : 2011-08-17 8:05 
头像

注册: 2006-05-19 9:54
帖子: 1823
地址: Shanghai
送出感谢: 2
接收感谢: 11
图省事,直接用calibre了


_________________
ニンニク入れますか?
x60 with gentoo


页首
 用户资料  
 
7 楼 
 文章标题 : Re: txt转换到mobi在kindle上看书的脚本。
帖子发表于 : 2011-08-18 18:59 

注册: 2009-01-02 21:41
帖子: 23
送出感谢: 0 次
接收感谢: 0 次
xzap 写道:
3楼,我用的k3 不支持epub 所以连测试都不能。epub应该也差不多的格式,自己改改吧。

4楼,这个不是代码长,大部分都是网页的模版而已


epub也是先生成html然后转的,只是不知linux下是否有类似kindlegen的cli程序


_________________
http://db.tt/gfENpA2


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 7 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译