iAdd lawn-mower and helper scripts. - gopher-lawn - The gopher lawn gopher directory project. Err bitreich.org 70 hgit clone git://bitreich.org/gopher-lawn/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/gopher-lawn/ URL:git://bitreich.org/gopher-lawn/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/gopher-lawn/ bitreich.org 70 1Log /scm/gopher-lawn/log.gph bitreich.org 70 1Files /scm/gopher-lawn/files.gph bitreich.org 70 1Refs /scm/gopher-lawn/refs.gph bitreich.org 70 1Tags /scm/gopher-lawn/tag bitreich.org 70 i--- Err bitreich.org 70 1commit 9b023bc426fe97f1f8e0f1a90a104f6bc6b8b666 /scm/gopher-lawn/commit/9b023bc426fe97f1f8e0f1a90a104f6bc6b8b666.gph bitreich.org 70 1parent 4eb1d74e0bcbd5a9395e9f4607eaa42c88f5d988 /scm/gopher-lawn/commit/4eb1d74e0bcbd5a9395e9f4607eaa42c88f5d988.gph bitreich.org 70 hAuthor: Christoph Lohmann <20h@r-36.net> URL:mailto:20h@r-36.net bitreich.org 70 iDate: Fri, 28 Aug 2020 12:47:17 +0200 Err bitreich.org 70 i Err bitreich.org 70 iAdd lawn-mower and helper scripts. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i A lawn-mower/LICENSE | 3 +++ Err bitreich.org 70 i A lawn-mower/db2categories.sh | 62 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i A lawn-mower/indexgph2db.sh | 117 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i A lawn-mower/lawn-mower.py | 278 ++++++++++++++++++++++++++++++ Err bitreich.org 70 i Err bitreich.org 70 i4 files changed, 460 insertions(+), 0 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/lawn-mower/LICENSE b/lawn-mower/LICENSE /scm/gopher-lawn/file/lawn-mower/LICENSE.gph bitreich.org 70 i@@ -0,0 +1,3 @@ Err bitreich.org 70 i+Initially contributed by Enzo 'KatolaZ' . Err bitreich.org 70 i+Modified by Christoph Lohmann <20h@r-36.net>. Err bitreich.org 70 i+ Err bitreich.org 70 1diff --git a/lawn-mower/db2categories.sh b/lawn-mower/db2categories.sh /scm/gopher-lawn/file/lawn-mower/db2categories.sh.gph bitreich.org 70 i@@ -0,0 +1,62 @@ Err bitreich.org 70 i+#!/bin/sh Err bitreich.org 70 i+ Err bitreich.org 70 i+set -x Err bitreich.org 70 i+ Err bitreich.org 70 i+titlemaxlength=74 Err bitreich.org 70 i+ Err bitreich.org 70 i+if [ $# -gt 0 ]; Err bitreich.org 70 i+then Err bitreich.org 70 i+ inputfile="$1" Err bitreich.org 70 i+else Err bitreich.org 70 i+ inputfile="/dev/stdin" Err bitreich.org 70 i+fi Err bitreich.org 70 i+ Err bitreich.org 70 i+printdbtmpl() { Err bitreich.org 70 i+ linetype="c" Err bitreich.org 70 i+ linetypetext="category" Err bitreich.org 70 i+ host="server" Err bitreich.org 70 i+ port="port" Err bitreich.org 70 i+ name="$1" Err bitreich.org 70 i+ selector="$2" Err bitreich.org 70 i+ linkname="$3" Err bitreich.org 70 i+ title="${name}" Err bitreich.org 70 i+ description="$4" Err bitreich.org 70 i+ parent="root" Err bitreich.org 70 i+ keywords="${name}" Err bitreich.org 70 i+ Err bitreich.org 70 i+ tmplfile="${name}.${linetypetext}" Err bitreich.org 70 i+ Err bitreich.org 70 i+ [ -e "$tmpfile" ] && return Err bitreich.org 70 i+ Err bitreich.org 70 i+ ustitle="$(printf "%s\n" "${title}" \ Err bitreich.org 70 i+ | tr 'a-z' 'A-Z' \ Err bitreich.org 70 i+ | sed 's,[a-zA-Z0-9],&_,g; s, ,__,g; s,_$,,; s,___,__,g')" Err bitreich.org 70 i+ Err bitreich.org 70 i+ printf "Type: %s\n" "${linetypetext}" > "${tmplfile}" Err bitreich.org 70 i+ printf "Name: %s\n" "${name}" >> "${tmplfile}" Err bitreich.org 70 i+ printf "Selector: %s\n" "${selector}" >> "${tmplfile}" Err bitreich.org 70 i+ printf "Host: %s\n" "${host}" >> "${tmplfile}" Err bitreich.org 70 i+ printf "Port: %s\n" "${port}" >> "${tmplfile}" Err bitreich.org 70 i+ printf "LinkName: %s\n" "${linkname}" >> "${tmplfile}" Err bitreich.org 70 i+ printf "Title: %s\n" "${ustitle}" >> "${tmplfile}" Err bitreich.org 70 i+ printf "Description: %s\n" "${description}" >> "${tmplfile}" Err bitreich.org 70 i+ printf "Parent: %s\n" "${parent}" >> "${tmplfile}" Err bitreich.org 70 i+ printf "Keywords: %s\n" "${keywords}" >> "${tmplfile}" Err bitreich.org 70 i+ printf "\n" >> "${tmplfile}" Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+cat "${inputfile}" \ Err bitreich.org 70 i+| grep Category \ Err bitreich.org 70 i+| cut -d ':' -f 2 \ Err bitreich.org 70 i+| sed -s 's:,:\n:g' \ Err bitreich.org 70 i+| cut -d' ' -f 2 \ Err bitreich.org 70 i+| sort \ Err bitreich.org 70 i+| uniq \ Err bitreich.org 70 i+| while read -r category; Err bitreich.org 70 i+do Err bitreich.org 70 i+ printdbtmpl "${category}" \ Err bitreich.org 70 i+ "/lawn/${category}" \ Err bitreich.org 70 i+ "${category}" \ Err bitreich.org 70 i+ "${category}" Err bitreich.org 70 i+done Err bitreich.org 70 i+ Err bitreich.org 70 1diff --git a/lawn-mower/indexgph2db.sh b/lawn-mower/indexgph2db.sh /scm/gopher-lawn/file/lawn-mower/indexgph2db.sh.gph bitreich.org 70 i@@ -0,0 +1,117 @@ Err bitreich.org 70 i+#!/bin/sh Err bitreich.org 70 i+ Err bitreich.org 70 i+set -x Err bitreich.org 70 i+ Err bitreich.org 70 i+if [ $# -gt 0 ]; Err bitreich.org 70 i+then Err bitreich.org 70 i+ inputfile="$1" Err bitreich.org 70 i+else Err bitreich.org 70 i+ inputfile="/dev/stdin" Err bitreich.org 70 i+fi Err bitreich.org 70 i+ Err bitreich.org 70 i+printdbtmpl() { Err bitreich.org 70 i+ linetype="$1" Err bitreich.org 70 i+ linktext="$2" Err bitreich.org 70 i+ selector="$3" Err bitreich.org 70 i+ host="$4" Err bitreich.org 70 i+ port="$5" Err bitreich.org 70 i+ description="$6" Err bitreich.org 70 i+ Err bitreich.org 70 i+ case "${linetype}" in Err bitreich.org 70 i+ 0|H) Err bitreich.org 70 i+ linetypetext="text" Err bitreich.org 70 i+ ;; Err bitreich.org 70 i+ 1|h|w) Err bitreich.org 70 i+ linetypetext="link" Err bitreich.org 70 i+ ;; Err bitreich.org 70 i+ 2) Err bitreich.org 70 i+ linetypetext="cso" Err bitreich.org 70 i+ ;; Err bitreich.org 70 i+ 3|+|i) Err bitreich.org 70 i+ linetypetext="error" Err bitreich.org 70 i+ ;; Err bitreich.org 70 i+ 6) Err bitreich.org 70 i+ linetypetext="uuencoded" Err bitreich.org 70 i+ ;; Err bitreich.org 70 i+ 7) Err bitreich.org 70 i+ linetypetext="search" Err bitreich.org 70 i+ ;; Err bitreich.org 70 i+ 8|T) Err bitreich.org 70 i+ linetypetext="telnet" Err bitreich.org 70 i+ ;; Err bitreich.org 70 i+ *) Err bitreich.org 70 i+ linetypetext="binary" Err bitreich.org 70 i+ ;; Err bitreich.org 70 i+ esac Err bitreich.org 70 i+ Err bitreich.org 70 i+ tmplfile="$host-$(printf "%s\n" "${selector}" \ Err bitreich.org 70 i+ | tr '/' '_').${linetypetext}" Err bitreich.org 70 i+ Err bitreich.org 70 i+ printf "Type: %s\n" "${linetypetext}" > "${tmplfile}" Err bitreich.org 70 i+ printf "Selector: %s\n" "${selector}" >> "${tmplfile}" Err bitreich.org 70 i+ printf "Host: %s\n" "${host}" >> "${tmplfile}" Err bitreich.org 70 i+ printf "Port: %s\n" "${port}" >> "${tmplfile}" Err bitreich.org 70 i+ printf "LinkName: %s\n" "${linktext}" >> "${tmplfile}" Err bitreich.org 70 i+ printf "Description: %s\n" "${description}" >> "${tmplfile}" Err bitreich.org 70 i+ printf "Category: \n" >> "${tmplfile}" Err bitreich.org 70 i+ printf "Keywords: \n" >> "${tmplfile}" Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+gphline="" Err bitreich.org 70 i+cat "${inputfile}" \ Err bitreich.org 70 i+| while read -r line; Err bitreich.org 70 i+do Err bitreich.org 70 i+ if [ -z "${line}" ]; Err bitreich.org 70 i+ then Err bitreich.org 70 i+ if [ -n "${gphline}" ]; Err bitreich.org 70 i+ then Err bitreich.org 70 i+ case "${gphline}" in Err bitreich.org 70 i+ '[1|<< back'*) Err bitreich.org 70 i+ ;; Err bitreich.org 70 i+ *) Err bitreich.org 70 i+ linetype="$(printf "%s\n" "${gphline}" \ Err bitreich.org 70 i+ | cut -d '[' -f 2 | cut -d '|' -f 1)"; Err bitreich.org 70 i+ linktext="$(printf "%s\n" "${gphline}" \ Err bitreich.org 70 i+ | cut -d '|' -f 2)"; Err bitreich.org 70 i+ selector="$(printf "%s\n" "${gphline}" \ Err bitreich.org 70 i+ | cut -d '|' -f 3)"; Err bitreich.org 70 i+ host="$(printf "%s\n" "${gphline}" \ Err bitreich.org 70 i+ | cut -d '|' -f 4)"; Err bitreich.org 70 i+ port="$(printf "%s\n" "${gphline}" \ Err bitreich.org 70 i+ | cut -d '|' -f 5 | cut -d ']' -f 1)"; Err bitreich.org 70 i+ Err bitreich.org 70 i+ printdbtmpl "${linetype}" "${linktext}" \ Err bitreich.org 70 i+ "${selector}" "${host}" "${port}" \ Err bitreich.org 70 i+ "${description}" Err bitreich.org 70 i+ ;; Err bitreich.org 70 i+ esac Err bitreich.org 70 i+ fi Err bitreich.org 70 i+ Err bitreich.org 70 i+ gphline="" Err bitreich.org 70 i+ description="" Err bitreich.org 70 i+ continue; Err bitreich.org 70 i+ fi Err bitreich.org 70 i+ Err bitreich.org 70 i+ case "${line}" in Err bitreich.org 70 i+ \[*) Err bitreich.org 70 i+ if [ -z "${gphline}" ]; Err bitreich.org 70 i+ then Err bitreich.org 70 i+ gphline="${line}" Err bitreich.org 70 i+ continue; Err bitreich.org 70 i+ fi Err bitreich.org 70 i+ ;; Err bitreich.org 70 i+ *) Err bitreich.org 70 i+ if [ -n "${gphline}" ]; Err bitreich.org 70 i+ then Err bitreich.org 70 i+ if [ -z "${description}" ]; Err bitreich.org 70 i+ then Err bitreich.org 70 i+ description="${line}" Err bitreich.org 70 i+ else Err bitreich.org 70 i+ description="${description} ${line}" Err bitreich.org 70 i+ fi Err bitreich.org 70 i+ fi Err bitreich.org 70 i+ continue; Err bitreich.org 70 i+ ;; Err bitreich.org 70 i+ esac Err bitreich.org 70 i+done Err bitreich.org 70 i+ Err bitreich.org 70 1diff --git a/lawn-mower/lawn-mower.py b/lawn-mower/lawn-mower.py /scm/gopher-lawn/file/lawn-mower/lawn-mower.py.gph bitreich.org 70 i@@ -0,0 +1,278 @@ Err bitreich.org 70 i+#!/usr/bin/env python Err bitreich.org 70 i+# coding=utf-8 Err bitreich.org 70 i+# Err bitreich.org 70 i+# © 2020 Christoph Lohmann <20h@r-36.net> Err bitreich.org 70 i+# Err bitreich.org 70 i+# This file is published under the terms of the GPLv3. Err bitreich.org 70 i+# Err bitreich.org 70 i+ Err bitreich.org 70 i+import os Err bitreich.org 70 i+import sys Err bitreich.org 70 i+import getopt Err bitreich.org 70 i+ Err bitreich.org 70 i+def usage(app): Err bitreich.org 70 i+ app = os.path.basename(app) Err bitreich.org 70 i+ print("usage: %s [-h] [-c categorydir] [-b basedir]" \ Err bitreich.org 70 i+ % (app), file=sys.stderr) Err bitreich.org 70 i+ sys.exit(1) Err bitreich.org 70 i+ Err bitreich.org 70 i+def main(args): Err bitreich.org 70 i+ try: Err bitreich.org 70 i+ opts, largs = getopt.getopt(args[1:], "hc:") Err bitreich.org 70 i+ except getopt.GetoptError as err: Err bitreich.org 70 i+ print(str(err)) Err bitreich.org 70 i+ usage(args[0]) Err bitreich.org 70 i+ Err bitreich.org 70 i+ basedir = "./" Err bitreich.org 70 i+ categorysubdir = "c" Err bitreich.org 70 i+ for o, a in opts: Err bitreich.org 70 i+ if o == "-h": Err bitreich.org 70 i+ usage(args[0]) Err bitreich.org 70 i+ elif o == "-b": Err bitreich.org 70 i+ basedir = a Err bitreich.org 70 i+ elif o == "-c": Err bitreich.org 70 i+ categorysubdir = a Err bitreich.org 70 i+ else: Err bitreich.org 70 i+ assert False, "unhandled option" Err bitreich.org 70 i+ Err bitreich.org 70 i+ categorydir = "%s%s" % (basedir, categorysubdir) Err bitreich.org 70 i+ Err bitreich.org 70 i+ filelist = largs Err bitreich.org 70 i+ if len(largs) == 0: Err bitreich.org 70 i+ filelist = ["/dev/stdin"] Err bitreich.org 70 i+ Err bitreich.org 70 i+ dbobjs = [] Err bitreich.org 70 i+ dbobj = {} Err bitreich.org 70 i+ for f in filelist: Err bitreich.org 70 i+ dbobj = {} Err bitreich.org 70 i+ dbkey = None Err bitreich.org 70 i+ dbval = None Err bitreich.org 70 i+ with open(f, "r") as fd: Err bitreich.org 70 i+ while True: Err bitreich.org 70 i+ line = fd.readline() Err bitreich.org 70 i+ # EOF Err bitreich.org 70 i+ if line == "": Err bitreich.org 70 i+ #print("EOF") Err bitreich.org 70 i+ if dbobj != {}: Err bitreich.org 70 i+ dbobjs.append(dbobj) Err bitreich.org 70 i+ dbobj = {} Err bitreich.org 70 i+ break Err bitreich.org 70 i+ Err bitreich.org 70 i+ if line[0] == "#": Err bitreich.org 70 i+ continue Err bitreich.org 70 i+ Err bitreich.org 70 i+ line = line.rstrip() Err bitreich.org 70 i+ #print("line = '%s'" % (line)) Err bitreich.org 70 i+ if line == "": Err bitreich.org 70 i+ #print("line empty") Err bitreich.org 70 i+ if dbobj != {}: Err bitreich.org 70 i+ dbobjs.append(dbobj) Err bitreich.org 70 i+ dbobj = {} Err bitreich.org 70 i+ continue Err bitreich.org 70 i+ Err bitreich.org 70 i+ # Multi line value. Err bitreich.org 70 i+ if line[0] in ["\f", "\t", "\v", " "]: Err bitreich.org 70 i+ #print("multi-line") Err bitreich.org 70 i+ if dbkey != None: Err bitreich.org 70 i+ dbobj[dbkey] += line.lstrip() Err bitreich.org 70 i+ continue Err bitreich.org 70 i+ Err bitreich.org 70 i+ try: Err bitreich.org 70 i+ (dbkey, dbval) = line.split(":", 1) Err bitreich.org 70 i+ except ValueError: Err bitreich.org 70 i+ sys.write(sys.stderr, "'%s' is invalid line at %s.\n" \ Err bitreich.org 70 i+ % (line, f)) Err bitreich.org 70 i+ continue Err bitreich.org 70 i+ Err bitreich.org 70 i+ #print("dbkey = %s; dbval = %s" % (dbkey, dbval)) Err bitreich.org 70 i+ Err bitreich.org 70 i+ dbkey = dbkey.strip().lower() Err bitreich.org 70 i+ dbval = dbval.lstrip() Err bitreich.org 70 i+ dbobj[dbkey] = dbval Err bitreich.org 70 i+ Err bitreich.org 70 i+ rootcategory = None Err bitreich.org 70 i+ categories = {} Err bitreich.org 70 i+ wantedcategories = {} Err bitreich.org 70 i+ wantedkeywords = {} Err bitreich.org 70 i+ keywords = {} Err bitreich.org 70 i+ links = [] Err bitreich.org 70 i+ noncategories = [] Err bitreich.org 70 i+ nonkeywords = [] Err bitreich.org 70 i+ for obj in dbobjs: Err bitreich.org 70 i+ if "category" in obj: Err bitreich.org 70 i+ ocats = obj["category"].split(", ") Err bitreich.org 70 i+ if len(ocats) == 0 or ocats[0] == '': Err bitreich.org 70 i+ noncategories.append(obj) Err bitreich.org 70 i+ obj["category"] = ocats Err bitreich.org 70 i+ for ocat in ocats: Err bitreich.org 70 i+ if ocat in wantedcategories: Err bitreich.org 70 i+ wantedcategories[ocat].append(obj) Err bitreich.org 70 i+ else: Err bitreich.org 70 i+ wantedcategories[ocat] = [obj] Err bitreich.org 70 i+ if "keywords" in obj: Err bitreich.org 70 i+ okeyws = obj["keywords"].split(", ") Err bitreich.org 70 i+ if len(okeyws) == 0 or okeyws[0] == '': Err bitreich.org 70 i+ nonkeywords.append(obj) Err bitreich.org 70 i+ for okeyw in okeyws: Err bitreich.org 70 i+ if okeyw in wantedkeywords: Err bitreich.org 70 i+ wantedkeywords[okeyw].append(obj) Err bitreich.org 70 i+ else: Err bitreich.org 70 i+ wantedkeywords[okeyw] = [obj] Err bitreich.org 70 i+ if obj["type"] == "category": Err bitreich.org 70 i+ if obj["parent"] == "none": Err bitreich.org 70 i+ rootcategory = obj Err bitreich.org 70 i+ if obj["name"] in categories: Err bitreich.org 70 i+ print("Duplication of category '%s'." \ Err bitreich.org 70 i+ % (obj["name"])) Err bitreich.org 70 i+ sys.exit(1) Err bitreich.org 70 i+ obj["links"] = [] Err bitreich.org 70 i+ obj["children"] = [] Err bitreich.org 70 i+ categories[obj["name"]] = obj Err bitreich.org 70 i+ else: Err bitreich.org 70 i+ links.append(obj) Err bitreich.org 70 i+ Err bitreich.org 70 i+ print(categories.keys()) Err bitreich.org 70 i+ keywords = wantedkeywords Err bitreich.org 70 i+ print(wantedkeywords.keys()) Err bitreich.org 70 i+ print(keywords.keys()) Err bitreich.org 70 i+ print(wantedcategories.keys()) Err bitreich.org 70 i+ print(noncategories) Err bitreich.org 70 i+ print(nonkeywords) Err bitreich.org 70 i+ Err bitreich.org 70 i+ for link in links: Err bitreich.org 70 i+ if "category" in link: Err bitreich.org 70 i+ for cate in link["category"]: Err bitreich.org 70 i+ categories[cate]["links"].append(link) Err bitreich.org 70 i+ Err bitreich.org 70 i+ for key in categories.keys(): Err bitreich.org 70 i+ parent = categories[key]["parent"] Err bitreich.org 70 i+ if parent in categories.keys(): Err bitreich.org 70 i+ categories[parent]["children"].append(key) Err bitreich.org 70 i+ else: Err bitreich.org 70 i+ if parent != "none": Err bitreich.org 70 i+ print("Undefined parent '%s' used in category '%s'." \ Err bitreich.org 70 i+ % (parent, key)) Err bitreich.org 70 i+ Err bitreich.org 70 i+ for obj in noncategories: Err bitreich.org 70 i+ print("'%s' has no categories defined." \ Err bitreich.org 70 i+ % (obj["linkname"])) Err bitreich.org 70 i+ for obj in nonkeywords: Err bitreich.org 70 i+ print("'%s' has no keywords defined." \ Err bitreich.org 70 i+ % (obj["linkname"])) Err bitreich.org 70 i+ Err bitreich.org 70 i+ def linktype2gopher(linktype): Err bitreich.org 70 i+ if linktype == "link": Err bitreich.org 70 i+ return "1" Err bitreich.org 70 i+ elif linktype == "text": Err bitreich.org 70 i+ return "0" Err bitreich.org 70 i+ elif linktype == "cso": Err bitreich.org 70 i+ return "2" Err bitreich.org 70 i+ elif linktype == "error": Err bitreich.org 70 i+ return "3" Err bitreich.org 70 i+ elif linktype == "uuencoded": Err bitreich.org 70 i+ return "6" Err bitreich.org 70 i+ elif linktype == "search": Err bitreich.org 70 i+ return "7" Err bitreich.org 70 i+ elif linktype == "telnet": Err bitreich.org 70 i+ return "8" Err bitreich.org 70 i+ else: Err bitreich.org 70 i+ return "9" Err bitreich.org 70 i+ Err bitreich.org 70 i+ def printdescription(desc): Err bitreich.org 70 i+ maxlinelen = 70 Err bitreich.org 70 i+ if len(desc) <= maxlinelen: Err bitreich.org 70 i+ return "t%s\n" % (desc) Err bitreich.org 70 i+ Err bitreich.org 70 i+ rtext = "" Err bitreich.org 70 i+ adesc = desc Err bitreich.org 70 i+ while len(adesc) > maxlinelen: Err bitreich.org 70 i+ pline = "" Err bitreich.org 70 i+ i = 70 Err bitreich.org 70 i+ while i > maxlinelen-20: Err bitreich.org 70 i+ if adesc[i] in [" ", "\t", "\v", "\f", "-"]: Err bitreich.org 70 i+ rtext += "t%s\n" % (adesc[:i]) Err bitreich.org 70 i+ adesc = adesc[i+1:] Err bitreich.org 70 i+ break Err bitreich.org 70 i+ i -= 1 Err bitreich.org 70 i+ if i <= maxlinelen-20: Err bitreich.org 70 i+ rtext += "t%s\n" % (adesc[:maxlinelen]) Err bitreich.org 70 i+ adesc = adesc[maxlinelen:] Err bitreich.org 70 i+ rtext += "t%s\n" % (adesc) Err bitreich.org 70 i+ Err bitreich.org 70 i+ return rtext Err bitreich.org 70 i+ Err bitreich.org 70 i+ def printlink(link): Err bitreich.org 70 i+ rtext = "[%s|%s|%s|%s|%s]\n" \ Err bitreich.org 70 i+ % (linktype2gopher(link["type"]),\ Err bitreich.org 70 i+ link["linkname"],\ Err bitreich.org 70 i+ link["selector"],\ Err bitreich.org 70 i+ link["host"],\ Err bitreich.org 70 i+ link["port"]) Err bitreich.org 70 i+ if "description" in link: Err bitreich.org 70 i+ rtext += printdescription(link["description"]) Err bitreich.org 70 i+ rtext += "\n" Err bitreich.org 70 i+ Err bitreich.org 70 i+ return rtext Err bitreich.org 70 i+ Err bitreich.org 70 i+ def printcategory(category, basedir): Err bitreich.org 70 i+ if "description" in category: Err bitreich.org 70 i+ name = "%s - %s" \ Err bitreich.org 70 i+ % (category["linkname"], \ Err bitreich.org 70 i+ category["description"]) Err bitreich.org 70 i+ else: Err bitreich.org 70 i+ name = category["linkname"] Err bitreich.org 70 i+ return "[1|%s|%s|%s|%s]\n" \ Err bitreich.org 70 i+ % (name,\ Err bitreich.org 70 i+ "%s/%s.gph" % (basedir, category["name"]),\ Err bitreich.org 70 i+ "server",\ Err bitreich.org 70 i+ "port") Err bitreich.org 70 i+ Err bitreich.org 70 i+ def mkcategory(category, cdir, csdir, tmplfile="category.gph.tmpl"): Err bitreich.org 70 i+ outfilename = tmplfile.replace(".tmpl", "") Err bitreich.org 70 i+ if "category" in tmplfile: Err bitreich.org 70 i+ outfilename = outfilename.replace("category",\ Err bitreich.org 70 i+ category["name"]) Err bitreich.org 70 i+ Err bitreich.org 70 i+ tmplfd = open(tmplfile, "r") Err bitreich.org 70 i+ try: Err bitreich.org 70 i+ outfd = open("%s/%s" % (cdir, outfilename), "x") Err bitreich.org 70 i+ except FileExistsError: Err bitreich.org 70 i+ outfd = open("%s/%s" % (cdir, outfilename), "w") Err bitreich.org 70 i+ Err bitreich.org 70 i+ line = "a" Err bitreich.org 70 i+ while len(line) > 0: Err bitreich.org 70 i+ line = tmplfd.readline() Err bitreich.org 70 i+ if "C_A_T_E_G_O_R_Y" in line: Err bitreich.org 70 i+ if len(category["links"]) > 0: Err bitreich.org 70 i+ line = line.replace("C_A_T_E_G_O_R_Y", \ Err bitreich.org 70 i+ category["title"]) Err bitreich.org 70 i+ outfd.write(line) Err bitreich.org 70 i+ if "description" in category: Err bitreich.org 70 i+ outfd.write(printdescription(\ Err bitreich.org 70 i+ category["description"])) Err bitreich.org 70 i+ outfd.write("\n") Err bitreich.org 70 i+ for link in category["links"]: Err bitreich.org 70 i+ outfd.write(printlink(link)) Err bitreich.org 70 i+ elif "C_A_T_E_G_O_R_I_E_S" in line: Err bitreich.org 70 i+ if len(category["children"]) > 0: Err bitreich.org 70 i+ outfd.write(line) Err bitreich.org 70 i+ for cate in category["children"]: Err bitreich.org 70 i+ outfd.write(\ Err bitreich.org 70 i+ printcategory(\ Err bitreich.org 70 i+ categories[cate],\ Err bitreich.org 70 i+ csdir)) Err bitreich.org 70 i+ else: Err bitreich.org 70 i+ outfd.write(line) Err bitreich.org 70 i+ Err bitreich.org 70 i+ tmplfd.close() Err bitreich.org 70 i+ outfd.close() Err bitreich.org 70 i+ Err bitreich.org 70 i+ mkcategory(rootcategory, basedir, categorysubdir, "index.gph.tmpl") Err bitreich.org 70 i+ for c in categories.keys(): Err bitreich.org 70 i+ mkcategory(categories[c], categorydir, categorysubdir,\ Err bitreich.org 70 i+ "category.gph.tmpl") Err bitreich.org 70 i+ return 0 Err bitreich.org 70 i+ Err bitreich.org 70 i+if __name__ == "__main__": Err bitreich.org 70 i+ sys.exit(main(sys.argv)) Err bitreich.org 70 i+ Err bitreich.org 70 .