update
[shellsnippets/shellsnippets.git] / mksh / unepub
1 #!/bin/mksh
2 # $MirOS: contrib/hosted/tg/unepub,v 1.2 2012/02/07 20:29:33 tg Exp $
3 #-
4 # Copyright (c) 2011, 2012
5 #       Thorsten Glaser <tg@mirbsd.org>
6 #
7 # Provided that these terms and disclaimer and all copyright notices
8 # are retained or reproduced in an accompanying document, permission
9 # is granted to deal in this work without restriction, including un-
10 # limited rights to use, publicly perform, distribute, sell, modify,
11 # merge, give away, or sublicence.
12 #
13 # This work is provided "AS IS" and WITHOUT WARRANTY of any kind, to
14 # the utmost extent permitted by applicable law, neither express nor
15 # implied; without malicious intent or gross negligence. In no event
16 # may a licensor, author or contributor be held liable for indirect,
17 # direct, other damage, loss, or other issues arising in any way out
18 # of dealing in the work, even if advised of the possibility of such
19 # damage or existence of a defect, except proven that it results out
20 # of said person's immediate fault when using the work as intended.
21 #-
22 # Convert args foo.epub, bar.epub, ... to {foo,bar...}/{*,index.htm}
23 # using perl (easy U+00A0 fixup), unzip and xmlstarlet from ports.
24
25 function ncx2html {
26         local state texts links docTitle=""
27
28         # I would use xmlstarlet sel, but it seems to be broken, or,
29         # XPath is not obvious to learn
30         <"$1" tr '\n\t' ' ' | sed -e 's/> *</></g' | xmlstarlet pyx |&
31         state=0
32         set -A texts
33         set -A links
34         while IFS= read -pr line; do
35                 case $state {
36                 (0)
37                         [[ $line = '(docTitle' ]] && state=1
38                         continue ;;
39                 (1)
40                         [[ $line = ')'* ]] && state=2
41                         [[ $line = '-'* ]] || continue
42                         docTitle+=${line#-}
43                         ;;
44                 (2)
45                         [[ $line = 'AplayOrder '+([0-9]) ]] || continue
46                         idx=${line#* }
47                         state=3 ;;
48                 (3)
49                         [[ $line = ')'* ]] && state=4
50                         [[ $line = '-'* ]] || continue
51                         texts[idx]+=${line#-}
52                         ;;
53                 (4)
54                         [[ $line = 'Asrc '* ]] || continue
55                         line=${line#* }
56                         [[ $line = *.xhtml ]] && line=${line%.xhtml}.htm
57                         links[idx]=$line
58                         state=2 ;;
59                 }
60         done
61         : ${docTitle:=unknown title}
62
63         print -r '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
64          "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
65         <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"><head>
66          <meta http-equiv="content-type" content="text/html; charset=utf-8" />
67          <title>'"$docTitle"'</title>
68         </head><body>
69         <h1>'"$docTitle</h1>
70         <ul>"
71         for idx in ${!links[*]}; do
72                 print -r " <li>$idx. <a href=\"${links[idx]}\">${texts[idx]:-〈${links[idx]}〉}</a></li>"
73         done
74         print '</ul>
75         </body></html>'
76 }
77
78 for fn in "$@"; do
79         dn=${fn%.epub}
80         [[ $dn = "$fn" ]] && dn=$dn.extracted
81         mkdir -p "$dn/tmp"
82         cd "$dn/tmp"
83         unzip "../../$fn"
84         cdir=$(tr -d '\n' <META-INF/container.xml | sed -n \
85             's/.*<rootfile[^>]*full-path="\([^"]*\)".*$/\1/p')
86         cdir=${cdir%/*}
87         mv "$cdir"/* ..
88         cd ..
89         rm -rf tmp
90         for i in *.xhtml; do
91                 [[ -e $i ]] || continue
92                 mv "$i" "${i%.xhtml}.htm"
93         done
94         perl -pi -e 's/ / /g' toc.ncx *.htm*
95         ncx2html toc.ncx >index.htm
96         cd ..
97 done