Add ifdbgames example. Thanks pazz0! - brcon2024-hackathons - Bitreichcon 2024 … | |
git clone git://bitreich.org/brcon2024-hackathons git://enlrupgkhuxnvlhsf6lc3fz… | |
Log | |
Files | |
Refs | |
Tags | |
Submodules | |
--- | |
commit 657b359aba0a48bc973a0cffe152a941297f6543 | |
parent ad0bd2f3d8d0c6d5e4aa3209cbeb81d4d9751a1a | |
Author: Christoph Lohmann <[email protected]> | |
Date: Sun, 4 Aug 2024 20:47:53 +0200 | |
Add ifdbgames example. Thanks pazz0! | |
Diffstat: | |
M gopher/README.md | 3 +++ | |
A gopher/ifdbgames.sh | 349 +++++++++++++++++++++++++++++… | |
2 files changed, 352 insertions(+), 0 deletions(-) | |
--- | |
diff --git a/gopher/README.md b/gopher/README.md | |
@@ -42,6 +42,9 @@ fiction for gopher. | |
Is this enough? | |
+ https://ifarchive.org/indexes/if-archive/info/ifdb/ | |
+ gopher://gopher.0xfa.de/0/pazz0/p/ifdbgames.sh | |
+ | |
## Pharos Internet Archive Interface | |
Help pi31415 and extend his Internet Archive Interface for Gopher: | |
diff --git a/gopher/ifdbgames.sh b/gopher/ifdbgames.sh | |
@@ -0,0 +1,349 @@ | |
+#!/bin/sh | |
+getrawdata() { | |
+ printf "getrawdata: start\n" 1>&2 | |
+ sqlite3 "$1" <<-EOF | |
+ .separator "\x1f" "\x1e" | |
+ | |
+ with ratings as ( | |
+ select gameid, avg(rating) rawavg, round(avg(rating) *… | |
+ ) | |
+ select | |
+ games.id, | |
+ games.title, | |
+ games.sort_title, | |
+ games.author, | |
+ games.sort_author, | |
+ games.tags, | |
+ iif(time(games.published) = '00:00:00',strftime('%Y', … | |
+ games.license, | |
+ games.desc, | |
+ games.genre, | |
+ games.forgiveness, | |
+ games.language, | |
+ games.website, | |
+ games.downloadnotes, | |
+ | |
+ gamelinks.title, | |
+ gamelinks.desc, | |
+ gamelinks.url, | |
+ | |
+ filetypes.externid, | |
+ filetypes.fmtname, | |
+ filetypes.desc, | |
+ | |
+ extreviews.url, | |
+ extreviews.sourcename, | |
+ extreviews.sourceurl, | |
+ reviews.summary, | |
+ reviews.review, | |
+ reviews.rating, | |
+ | |
+ ratings.stars, | |
+ ratings.cnt | |
+ from games | |
+ left outer join gamelinks on gamelinks.gameid = games.id | |
+ left outer join filetypes on filetypes.id = gamelinks.fmtid | |
+ left outer join extreviews on extreviews.gameid = games.id | |
+ left outer join reviews on reviews.id = extreviews.reviewid | |
+ left outer join ratings on ratings.gameid = games.id | |
+ order by games.id, gamelinks.displayorder, extreviews.displayo… | |
+ EOF | |
+ printf "getrawdata: end\n" 1>&2 | |
+} | |
+ | |
+# Sadly OpenBSD's awk has some problems with some multibyte characters in the | |
+# dataset Maybe the encoding in the database is wonky. I don't know. Let's | |
+# ignore it! And just use gawk. I want to see something in the end. I doesn't | |
+# have to be correct. :) | |
+getrawdata "$1" | \ | |
+gawk -v"FS=\x1f" -v"RS=\x1e" ' | |
+function removehtmltags(s) { | |
+ gsub("<[^>]+>", "", s) | |
+ return s | |
+} | |
+# TODO Do it, future_pazz0! | |
+function resolvehtmlentities(s) { | |
+ return s | |
+} | |
+function trim(s) { | |
+ gsub("^[ ]+", "", s) | |
+ gsub("[ ]+$", "", s) | |
+ return s | |
+} | |
+function foldinto(input, w, indentstr, file, | |
+ p, t, l, linel, line, n) { | |
+ l = length(input) | |
+ p = 1 | |
+ line = indentstr | |
+ n = 0 | |
+ while (p <= l) { | |
+ for (t = p; t <= l && !index(" \t\n", substr(input, t, 1)); t+… | |
+ | |
+ # Doesnt fit in the current line | |
+ if (length(line) + t - p + 1 > w) { | |
+ print line >> file | |
+ line = indentstr | |
+ n++ | |
+ } | |
+ | |
+ # Doesnt fit anyways | |
+ if (t - p > w) { | |
+ print line >> file | |
+ } else { | |
+ if (line && line != indentstr) | |
+ line = line " " | |
+ line = line substr(input, p, t - p) | |
+ } | |
+ | |
+ for (; t <= l && index(" \t\n", substr(input, t, 1)); t++) { | |
+ if (substr(input, t, 1) == "\n" && substr(input, t - 1… | |
+ print line >> file | |
+ line = indentstr | |
+ print indentstr >> file | |
+ n++ | |
+ } | |
+ } | |
+ p = t | |
+ } | |
+ if (line) | |
+ print line >> file | |
+} | |
+function flushdescription2(file, | |
+ i) { | |
+ cmd = "groff -Tutf8 -ms > " file | |
+ | |
+ print ".nr LL 80n" | cmd | |
+ print ".nr LT 80n" | cmd | |
+ | |
+ print ".SH\n" data[2] | cmd | |
+ print ".IP Author(s)\n" data[4] | cmd | |
+ if (data[10]) | |
+ print ".IP Genre\n" data[10] | cmd | |
+ if (data[13]) | |
+ print ".IP Website\n" data[13] | cmd | |
+ if (data[12]) | |
+ print ".IP Language\n" data[12] | cmd | |
+ if (data[7]) | |
+ print ".IP \"First Publication Date\"\n" data[7] | cmd | |
+ if (data[8]) | |
+ print ".IP License\n" data[8] | cmd | |
+ if (data[11]) | |
+ print ".IP \"Forgiveness Rating\"\n" data[11] | cmd | |
+ if (ratings["stars"]) | |
+ printf(".IP Rating\n%s (based on %s rating%s)\n", ratings["sta… | |
+ | |
+ if (data[9]) { | |
+ print ".SH\nAbout the Story" | cmd | |
+ gsub("\n\n", "\n.LP\n", data[9]) | |
+ print ".LP\n" data[9] | cmd | |
+ } | |
+ | |
+ if (reviews["length"]) { | |
+ print ".SH\nEditorial Reviews" | cmd | |
+ for (i = 1; i <= reviews["length"]; i++) { | |
+ print ".SH\n" reviews[i, "sourcename"] | cmd | |
+ print ".IP URL\n" reviews[i, "url"] | cmd | |
+ if (reviews[i, "summary"]) | |
+ print ".SH\n" reviews[i, "summary"] | cmd | |
+ if (reviews[i, "review"]) | |
+ print ".IP\n" reviews[i, "review"] | cmd | |
+ } | |
+ } | |
+ if (links["length"]) { | |
+ print ".SH\nExternal Links" | cmd | |
+ if (data[14]) | |
+ print ".LP\n" data[14] | cmd | |
+ for (i = 1; i <= links["length"]; i++) { | |
+ print ".SH\n" links[i, "title"] | cmd | |
+ print ".IP URL\n" links[i, "url"] | cmd | |
+ if (links[i, "desc"]) | |
+ print ".IP\n" links[i, "desc"] | cmd | |
+ if (links[i, "fmtdesc"]) { | |
+ print ".IP\n" links[i, "fmtdesc"] | cmd | |
+ print ".IP\n" links[i, "fmtdesclink"] | cmd | |
+ } | |
+ } | |
+ } | |
+ | |
+ close(cmd) | |
+} | |
+function keyvalue(key, value, file, w) { | |
+ if (length(key ": " value) <= w) { | |
+ printf("%s: %s\n", key, value) >> file | |
+ return | |
+ } | |
+ printf("%s:\n", key) >> file | |
+ foldinto(sprintf("%s\n", value), w, " ", file) | |
+} | |
+function flushdescription_(file, | |
+ i, refs, temp) { | |
+# file = data[1] ".txt" | |
+# file = "/dev/stdout" | |
+ | |
+ printf("") > file | |
+ foldinto(sprintf("%s\n", data[2]), 80, "", file) | |
+ printf("--------------------------------------------------------------… | |
+ | |
+ keyvalue("Author(s)", data[4], file, 80) | |
+# foldinto(sprintf("Author(s): %s\n", data[4]), 80, " ", file) | |
+ if (data[10]) | |
+ printf("Genre: %s\n", data[10]) >> file | |
+ if (data[13]) | |
+ printf("Website: %s\n", data[13]) >> file | |
+ if (data[12]) | |
+ printf("Language: %s\n", data[12]) >> file | |
+ if (data[7]) | |
+ printf("First Publication Date: %s\n", data[7]) >> file | |
+ if (data[8]) | |
+ printf("License: %s\n", data[8]) >> file | |
+ if (data[11]) | |
+ printf("Forgiveness Rating: %s\n", data[11]) >> file | |
+ if (ratings["stars"]) | |
+ printf("Rating: %s (based on %s rating%s)\n", ratings["stars"]… | |
+ | |
+ if (data[9]) { | |
+ printf("\n\nABOUT THE STORY\n\n") >> file | |
+ foldinto(data[9], 80, " ", file) | |
+ } | |
+ | |
+ if (links["length"]) { | |
+ printf("\n\nEXTERNAL LINKS\n") >> file | |
+ for (i = 1; i <= links["length"]; i++) { | |
+ printf("\n %s <%s>\n", links[i, "title"], links[i, "u… | |
+ if (links[i, "desc"]) | |
+ foldinto(links[i, "desc"], 80, " ", file) | |
+ if (links[i, "fmtdesc"]) { | |
+ temp = links[i, "fmtdesc"] | |
+ if (links[i, "fmtdesclink"]) { | |
+ if (!refs["set", links[i, "fmtdesclink… | |
+ refs["length"]++ | |
+ refs[refs["length"]] = links[i… | |
+ refs["set", links[i, "fmtdescl… | |
+ } | |
+ temp = temp sprintf("[%s]", refs["set"… | |
+ } | |
+ foldinto(temp, 80, " ", file) | |
+ } | |
+ } | |
+ } | |
+ | |
+ if (reviews["length"]) { | |
+ printf("\n\nEDITORIAL REVIEWS\n") >> file | |
+ for (i = 1; i <= reviews["length"]; i++) { | |
+ printf("\n %s\n", reviews[i, "sourcename"]) >> file | |
+ printf(" ") >> file | |
+ if (reviews[i, "summary"]) | |
+ printf("%s ", reviews[i, "summary"]) >> file | |
+ printf("<%s>\n", reviews[i, "url"]) >> file | |
+ if (reviews[i, "review"]) | |
+ foldinto(reviews[i, "review"], 80, " > ", fil… | |
+ } | |
+ } | |
+ | |
+ if (refs["length"]) { | |
+ printf("\n\nREFERENCES\n\n") >> file | |
+ for (i = 1; i <= refs["length"]; i++) | |
+ printf(" [%s] <%s>\n", i, refs[i]) >> file | |
+ } | |
+ | |
+ close(file) | |
+} | |
+function gphescape(s, f) { | |
+ gsub(" ", " ", s) | |
+ gsub("\n", " ", s) | |
+ if (f) | |
+ gsub("^\\[", "[|&", s) | |
+ else | |
+ gsub("\\|", "\\|", s) | |
+ return s | |
+} | |
+function gphitem(type, text, selector, server, port, file) { | |
+ printf("[%c|%s|%s|%s|%s]\n", type, gphescape(text), gphescape(selector… | |
+} | |
+function flushmenu(file) { | |
+ printf("") > file | |
+ gphitem("0", sprintf("About \"%s\"", data[2]), "./" data[1] ".txt", "s… | |
+ foldinto(sprintf("%s\n", data[2]), 80, "", file) | |
+ | |
+ close(file) | |
+} | |
+function getlink(s, | |
+ i) { | |
+ if (!match(s, /href="[^"]*"/)) | |
+ return "" | |
+ return substr(s, RSTART + length("href=\""), RLENGTH - length("href=\"… | |
+} | |
+function flush(tuid) { | |
+ print tuid > "/dev/stderr" | |
+ flushdescription_(tuid ".txt") | |
+# flushmenu(tuid ".gph") | |
+ printf("%s\t%s\n", tuid ".txt", data[2]) >> "index.txt" | |
+} | |
+BEGIN { | |
+ printf("") > "index.txt" | |
+} | |
+tuid && $1 != tuid { | |
+ flush(tuid) | |
+ | |
+ delete links | |
+ delete reviews | |
+ delete ratings | |
+ delete data | |
+} | |
+$1 != tuid { | |
+ for (i = 1; i <= 14; i++) { | |
+ $i = removehtmltags($i) | |
+ $i = resolvehtmlentities($i) | |
+ data[i] = $i | |
+ } | |
+ ratings["stars"] = $27 | |
+ ratings["count"] = $28 | |
+ tuid = $1 | |
+} | |
+$17 && !links["url", $17] { | |
+ links["length"]++ | |
+ links[links["length"], "title"] = removehtmltags($15) | |
+ links[links["length"], "desc"] = removehtmltags($16) | |
+ links[links["length"], "url"] = removehtmltags($17) | |
+ | |
+ links[links["length"], "externid"] = removehtmltags($18) | |
+ links[links["length"], "fmtname"] = removehtmltags($19) | |
+ links[links["length"], "fmtdesc"] = removehtmltags($20) | |
+ links[links["length"], "fmtdesclink"] = getlink($20) | |
+ | |
+ links["url", $17]++ | |
+} | |
+$21 && !reviews["url", $21] { | |
+ reviews["length"]++ | |
+ reviews[reviews["length"], "url"] = removehtmltags($21) | |
+ reviews[reviews["length"], "sourcename"] = removehtmltags($22) | |
+ reviews[reviews["length"], "sourceurl"] = removehtmltags($23) | |
+ reviews[reviews["length"], "summary"] = removehtmltags($24) | |
+ reviews[reviews["length"], "review"] = removehtmltags($25) | |
+ reviews[reviews["length"], "rating"] = removehtmltags($26) | |
+ | |
+ reviews["url", $21]++ | |
+} | |
+END { | |
+ flush(tuid) | |
+} | |
+' | |
+ | |
+sort -t ' ' -k2 index.txt | \ | |
+gawk -v"FS=\t" ' | |
+function gphescape(s, f) { | |
+ gsub(" ", " ", s) | |
+ gsub("\n", " ", s) | |
+ if (f) | |
+ gsub("^\\[", "[|&", s) | |
+ else | |
+ gsub("\\|", "\\|", s) | |
+ return s | |
+} | |
+function gphitem(type, text, selector, server, port, file) { | |
+ printf("[%c|%s|%s|%s|%s]\n", type, gphescape(text), gphescape(selector… | |
+} | |
+{ | |
+ gphitem("0", $2, "./" $1, "servere", "port", "index.gph") | |
+} | |
+' |