Introduction
Introduction Statistics Contact Development Disclaimer Help
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")
+}
+'
You are viewing proxied material from bitreich.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.