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