chess-diagram: add scripts to convert woodpecker PDF to HTML pages - randomcrap - random crap programs of varying quality
 (HTM) git clone git://git.codemadness.org/randomcrap
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit cb5abb0ea91d543870238a5bf847c7eec2d640f7
 (DIR) parent 97d003ba8b60c71862053019f76a2b1ea2c863c7
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Sat,  2 Aug 2025 13:18:18 +0200
       
       chess-diagram: add scripts to convert woodpecker PDF to HTML pages
       
       Bunch of ugly scripts specificly for this book.
       
       Worksforme(tm) ;)
       
       Diffstat:
         A opencv/chess-diagram/scripts/woodp… |       9 +++++++++
         A opencv/chess-diagram/scripts/woodp… |      32 +++++++++++++++++++++++++++++++
         A opencv/chess-diagram/scripts/woodp… |     122 +++++++++++++++++++++++++++++++
         A opencv/chess-diagram/scripts/woodp… |      19 +++++++++++++++++++
         A opencv/chess-diagram/scripts/woodp… |      22 ++++++++++++++++++++++
       
       5 files changed, 204 insertions(+), 0 deletions(-)
       ---
 (DIR) diff --git a/opencv/chess-diagram/scripts/woodpecker/convert.sh b/opencv/chess-diagram/scripts/woodpecker/convert.sh
       @@ -0,0 +1,9 @@
       +#!/bin/sh
       +# easy: 33 - 69
       +# intermediate: 71 - 197 
       +# hard: 199 - 222
       +
       +mkdir -p pages/easy pages/intermediate pages/hard
       +mutool convert -O 'resolution=300' -o "pages/easy/p%d.png" woodpecker.pdf 33-69
       +mutool convert -O 'resolution=300' -o "pages/intermediate/p%d.png" woodpecker.pdf 71-197
       +mutool convert -O 'resolution=300' -o "pages/hard/p%d.png" woodpecker.pdf 199-222
 (DIR) diff --git a/opencv/chess-diagram/scripts/woodpecker/convert_text.sh b/opencv/chess-diagram/scripts/woodpecker/convert_text.sh
       @@ -0,0 +1,32 @@
       +#!/bin/sh
       +# easy: 33 - 69
       +# intermediate: 71 - 197 
       +# hard: 199 - 222
       +
       +mkdir -p txt
       +mutool convert -F text -o "txt/easy.txt" woodpecker.pdf 33-69
       +mutool convert -F text -o "txt/intermediate.txt" woodpecker.pdf 71-197
       +mutool convert -F text -o "txt/hard.txt" woodpecker.pdf 199-222
       +
       +for n in easy intermediate hard; do
       +
       +LC_ALL=C awk '
       +length($0) <= 3 { next; }
       +/solutions/ || /Solutions/ { next; }
       +/^\xef/ { next; }
       +/^[0-9]*[ ]*$/ { next; }
       +{
       +        l = $0;
       +        gsub("–", "-", l); # normal ASCII dash
       +        # trim leading and trailing spaces.
       +        gsub("^[ ]*", "", l);
       +        gsub("[ ]*$", "", l);
       +        print l;
       +}
       +' < "txt/$n.txt" > "$n.txt"
       +done
       +
       +for n in easy intermediate hard; do
       +        cat "$n.txt"
       +done > labels.txt
       +
 (DIR) diff --git a/opencv/chess-diagram/scripts/woodpecker/html.sh b/opencv/chess-diagram/scripts/woodpecker/html.sh
       @@ -0,0 +1,122 @@
       +#!/bin/sh
       +
       +cat <<!
       +<style type="text/css">
       +div.p {
       +        margin: 0 auto;
       +        border: 2px solid #aaa;
       +        box-shadow: #777 0px 10px 10px;
       +        margin-bottom: 10px;
       +        width: 975px;
       +        padding: 5px;
       +}
       +h1, h2 {
       +        text-align: center;
       +}
       +.puzzles {
       +        columns: 2;
       +}
       +.puzzle {
       +        text-align: center;
       +        font-weight: bold;
       +        padding-bottom: 15px;
       +}
       +.diagram {
       +        width: 480px;
       +        height: 515px;
       +}
       +.label {
       +        height: 50px;
       +}
       +img {
       +        width: 480px;
       +        height: 480px;
       +        border: 1px solid #aaa;
       +}
       +</style>
       +<div id="#main">
       +<h1>The Woodpecker Method</h1>
       +!
       +
       +LC_ALL=C awk '
       +BEGIN {
       +        easy=1;
       +}
       +/easy/ {
       +        pageoffset = 31;
       +        if (section != "easy")
       +                page = 0;
       +        section = "easy";
       +}
       +/intermediate/ {
       +        pageoffset = 69;
       +        if (section != "intermediate")
       +                page = 0;
       +        section = "intermediate";
       +}
       +/hard/ {
       +        pageoffset = 197;
       +        if (section != "hard")
       +                page = 0;
       +        section = "hard";
       +}
       +/^FILE:/ {
       +        totalpage++;
       +        page++; # page per section.
       +        # DEBUG
       +#        if (p != 6) {
       +#                print "ERROR";
       +#        }
       +        p=0;
       +        if (i) {
       +                print "</div>";
       +                print "</div>";
       +        }
       +        i=1;
       +
       +        print "<div class=\"p\">";
       +        print "<h2>Page " (page + pageoffset) " (" section ")</h2>";
       +        print "<div class=\"puzzles\">";
       +        next;
       +}
       +length($0) {
       +        number++;
       +        fen = $0;
       +        name = $0;
       +
       +        gsub("/", "_", name);
       +        gsub(" ", "_", name);
       +
       +        getline label <"labels.txt";
       +
       +        p++;
       +        print "<div class=\"puzzle\">";
       +        print "<div class=\"label\">" number ". " label "</div>";
       +
       +        linkfen = fen;
       +        gsub(" ", "_", linkfen);
       +
       +#        link = "https://lichess.org/editor/" linkfen "?color=white";
       +#        link = "https://codemadness.org/onlyfens?fen=" fen;
       +#        link = "https://lichess.org/analysis/" linkfen "?color=white";
       +        link = "https://lichess.org/analysis/" linkfen;
       +
       +        print "<div class=\"diagram\">";
       +        print "<a href=\"" link "\">";
       +        print "<img src=\"svg/" name ".svg\" loading=\"lazy\" width=\"480\" height=\"480\" />";
       +        print "</a>";
       +        print "</div>";
       +
       +        print "</div>";
       +}
       +END {
       +        if (i) {
       +                print "</div>";
       +                print "</div>";
       +        }
       +}
       +'
       +
       +cat <<!
       +</div>
       +!
 (DIR) diff --git a/opencv/chess-diagram/scripts/woodpecker/scan.sh b/opencv/chess-diagram/scripts/woodpecker/scan.sh
       @@ -0,0 +1,19 @@
       +#!/bin/sh
       +for n in easy intermediate hard; do
       +        for i in $(seq 300); do
       +                d="woodpecker_pages/pages/$n"
       +                f="$d/p$i.png"
       +                test -f "$f" || continue
       +
       +                # DEBUG
       +                rm -f /tmp/debug.png
       +
       +                echo "FILE: $f"
       +                python3 main.py < "$f"
       +
       +                # DEBUG
       +                db="woodpecker_pages/debug/pages/$n"
       +                mkdir -p "$db"
       +                cp /tmp/debug.png "$db/p$i.png"
       +        done
       +done
 (DIR) diff --git a/opencv/chess-diagram/scripts/woodpecker/svg.sh b/opencv/chess-diagram/scripts/woodpecker/svg.sh
       @@ -0,0 +1,22 @@
       +#!/bin/sh
       +
       +FEN="$HOME/p/chess-puzzles/fen"
       +mkdir -p svg
       +
       +LC_ALL=C awk '
       +/^FILE:/ {
       +        next;
       +}
       +length($0) {
       +        fen = $0;
       +        name = $0;
       +        
       +        gsub("/", "_", name);
       +        gsub(" ", "_", name);
       +
       +        print fen "\t" name;
       +}
       +' |
       +while IFS="        " read -r fen name; do
       +        "$FEN" -o svg -t print "$fen" > "svg/$name.svg"
       +done