]> Sergey Matveev's repositories - galgen.git/blob - galgen.zsh
55e24e84300dc39da2d62a4b82ec8a9bf5289421
[galgen.git] / galgen.zsh
1 #!/usr/bin/env zsh
2 # Copyright (C) 2022-2023 Sergey Matveev <stargrave@stargrave.org>
3
4 set -e
5
6 pagesize=${PAGESIZE:-100}
7 ordering=${ORDERING:-Om}
8 style=$STYLE
9
10 djxl2ppm() {
11     djxl $1 $1.ppm
12     [[ -r ${1}-ec0.ppm ]] || return 0
13     mv ${1}-ec0.ppm $1.ppm
14     rm ${1}-ec1.pgm
15 }
16
17 [[ -z $style ]] || style="<link rel=\"stylesheet\" type=\"text/css\" href=\"$style\">"
18
19 setopt EXTENDED_GLOB
20 imgs=((*.jxl|*.webp~*.preview.webp)($ordering))
21 for (( i=1 ; i <= ${#imgs} ; i++ )) {
22     local img=${imgs[$i]}
23     echo $i $img
24     local dst=$i.img.html
25     cat > $dst <<EOF
26 <!DOCTYPE html>
27 <html><head>${style}<title>Image ${i}/${#imgs}: $img</title></head><body>
28 EOF
29     [[ $i -eq 1 ]] ||
30         echo "<a href=\"$(( $i - 1 )).img.html\">&lt;&lt;&lt;</a>" >> $dst
31     [[ $i -eq ${#imgs} ]] ||
32         echo "<a href=\"$(( $i + 1 )).img.html\">&gt;&gt;&gt;</a>" >> $dst
33     echo "<hr/><img alt=\"$img\" src=\"$img\"/>" >> $dst
34     [[ -r ${img}.txt ]] && {
35         echo "<hr/><pre>" >> $dst
36         cat ${img}.txt >> $dst
37         echo "</pre>" >> $dst
38     }
39     echo "<hr/>" >> $dst
40     if [[ $img:e = jxl ]] ; then
41         echo "<pre>" >> $dst
42         jxlinfo $img > $img.info
43         cat $img.info >> $dst
44         echo "</pre>" >> $dst
45         echo "Alternative formats:" >> $dst
46         if grep -q "JPEG bitstream reconstruction" $img.info ; then
47             [[ -r $img.jpg ]] || {
48                 djxl $img $img.jpg
49                 touch -r $img $img.jpg
50             }
51             echo "<a href=\"$img.jpg\">JPEG</a>" >> $dst
52         else
53             [[ -r $img.png ]] || {
54                 djxl2ppm $img
55                 pamtopng < $img.ppm > $img.png
56                 rm $img.ppm
57                 pngcrush -rem alla -rem allb -z 2 $img.png $img.png.png
58                 mv $img.png.png $img.png
59                 advpng -z -4 $img.png
60                 touch -r $img $img.png
61             }
62             echo "<a href=\"$img.png\">PNG</a>" >> $dst
63         fi
64         rm $img.info
65         [[ -r $img.preview.webp ]] || djxl2ppm $img
66     else
67         echo "<pre>" >> $dst
68         webpinfo $img >> $dst
69         echo "</pre>" >> $dst
70         [[ -r $img.preview.webp ]] || dwebp $img -ppm -o $img.ppm
71     fi
72     echo "<hr/><pre>" >> $dst
73     exiftool -a -u -g1 $img >> $dst
74     echo "</pre>" >> $dst
75     [[ -r $img.ppm ]] && {
76         pnmscale -w 100 < $img.ppm > $img.ppm.ppm
77         mv $img.ppm.ppm $img.ppm
78         cwebp -pass 10 -alpha_filter best -m 6 -mt -o $img.preview.webp $img.ppm
79         rm $img.ppm
80         touch -r $img $img.preview.webp
81     }
82     echo "</body></html>" >> $dst
83     touch -r $img $dst
84 }
85
86 pages=$(( ${#imgs} / $pagesize ))
87 [[ $(( $pages * $pagesize )) -lt ${#imgs} ]] && pages=$(( $pages + 1 ))
88 for (( p=1 ; p <= $pages ; p++ )) {
89     local dst=$p.page.html
90     cat > $dst <<EOF
91 <!DOCTYPE html>
92 <html><head>${style}<title>Page ${p}/$pages</title></head><body>
93 EOF
94     [[ $p -eq 1 ]] && [[ -r .txt ]] && {
95         echo "<pre>" >> $dst
96         cat .txt >> $dst
97         echo "</pre>" >> $dst
98     }
99     [[ $p -eq 1 ]] ||
100         echo "<a href=\"$(( $p - 1 )).page.html\">&lt;&lt;&lt;</a>" >> $dst
101     [[ $p -eq $pages ]] ||
102         echo "<a href=\"$(( $p + 1 )).page.html\">&gt;&gt;&gt;</a>" >> $dst
103     echo "| <a href=\"1.page.html\">home</a>" >> $dst
104     echo "| <a href=\"${pages}.page.html\">end</a>" >> $dst
105     echo "<hr/>" >> $dst
106     for (( i=1 ; i <= $pagesize ; i++ )) {
107         img=$(( ( $p - 1 ) * $pagesize + $i ))
108         [[ $img -le ${#imgs} ]] || break
109         echo "<a href=\"${img}.img.html\">" >> $dst
110         alt="preview ${img}"
111         title=""
112         [[ -r ${imgs[$img]}.txt ]] && {
113             alt=`cat ${imgs[$img]}.txt`
114             title="title=\"$alt\""
115         }
116         echo "<img alt=\"$alt\" $title src=\"${imgs[$img]}.preview.webp\"/></a>" >> $dst
117     }
118     echo "</body></html>" >> $dst
119     echo page $p
120 }