From 6cf6ecd7ffdb368679c20f3c6da1bdaa2aab0d2a Mon Sep 17 00:00:00 2001
From: Wolfgang Nowak
Date: Wed, 23 Mar 2022 06:21:31 +0100
Subject: [PATCH] webgen v4.0.5 for batch usage
---
webgen-ni.py | 256 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 256 insertions(+)
create mode 100755 webgen-ni.py
diff --git a/webgen-ni.py b/webgen-ni.py
new file mode 100755
index 0000000..eb3149f
--- /dev/null
+++ b/webgen-ni.py
@@ -0,0 +1,256 @@
+#!/usr/bin/env python3
+
+import sys, os, uuid, shutil, signal, subprocess, markdown, re, datetime, locale, glob
+from dialog import Dialog
+
+
+# If not choosen stdout as output, where should the generated file go to and what
+# fileending (f.e. .html) shall it have
+webbasedir = os.path.expanduser("~/www/i21k.de/")
+targetdir = webbasedir + "posts/"
+sourcedir = os.path.expanduser("~/python/webgen/")
+### for module mkdirindex:
+filesdir = webbasedir + "files/"
+indexfilename = "index.html"
+filesdirheadline = "Files"
+####
+
+fileending = ""
+locale.setlocale(locale.LC_ALL, "")
+clear = "\x1b[2J\x1b[H"
+green = "\x1b[38;5;46m"
+red = "\x1b[38;5;9m"
+yellow = "\x1b[38;5;226m"
+greenonblack = "\x1b[38;5;46m\x1b[48;5;16m"
+redonblack = "\x1b[38;5;9m\x1b[48;5;16m"
+
+xwidth = os.get_terminal_size()[0] - 3
+ywidth = os.get_terminal_size()[1] - 3
+os.chdir(sourcedir)
+# Prepend an hourly tinestamp to the later name of the file
+creationtime = datetime.datetime.now().strftime("%Y-%m-%d %H:00 ")
+# generate a more precise ctime to be included in the resulting webpage
+creationtimeheader = datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
+
+
+# Initialize a dialog.Dialog instance
+d = Dialog(dialog="dialog")
+
+# Let's stop everything at CTRL-c
+
+
+def sigint_handler(signum, frame):
+ sys.exit(yellow + "\nPfff....I'll tell your mom!\n")
+
+
+signal.signal(signal.SIGINT, sigint_handler)
+
+
+# call favorite editor with filename to write the text
+def edit(headline):
+ editor = os.getenv("EDITOR")
+ if not editor:
+ editor = "vim"
+ subprocess.call([editor, headline])
+ return headline
+
+
+# Select a topic for the new post or reedit an existing one
+def selectfile():
+ # Put all .md files in sourcefolder into list with a format, which dialog can eat.
+
+ filelist = glob.glob("*.md")
+ filelist.sort()
+ tabelle = []
+ zahl = 0
+ for zeile in filelist:
+ tabelle.insert(zahl, (str(zahl), zeile))
+ zahl += 1
+
+ # Open list in menu and let user choose one
+ ausgewaehlt = d.menu(
+ "Such dir ne Datei:",
+ width=xwidth,
+ height=ywidth,
+ menu_height=ywidth,
+ title="Ein Thema wählen:",
+ choices=tabelle,
+ cancel="Neuen Namen eingeben",
+ )
+
+ # Nothing has been choosen, so lets ask for a topic to generate a filename
+ if ausgewaehlt[0] == "cancel":
+# newtopic = d.inputbox("Ok, gib hier ein neues Thema an:", width=xwidth, height=ywidth, title="Ein Thema wählen:", cancel="Exit")
+ if newtopic[0] == "cancel" or newtopic[1] == "":
+ sys.exit(yellow + "Na, dann eben nicht...")
+ headline = newtopic[1]
+ else:
+ headline = ""
+
+ # Clean filename from leading .md for later construction of a headline
+ if headline == "":
+
+ headline = re.sub("\.md$", "", tabelle[int(ausgewaehlt[1])][1])
+ print(headline)
+# a = input(yellow + "What do we dooo here?")
+
+ # if the searched filename doesnt match an existing file we construct a new one
+ if len(glob.glob(sourcedir + headline + ".md")) == 0:
+ sourcefile = sourcedir + headline + ".md"
+ else:
+ sourcefile = str(glob.glob(sourcedir + headline + ".md")[0])
+
+ # if the targetfilename doesnt match an existing file we construct a new one
+ targetfile = glob.glob(targetdir + "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-2][0-9]:[0-6][0-9] " + headline + "*")
+ targetfilelength = len(targetfile)
+ if targetfilelength >= 1:
+ targetfile = targetfile[targetfilelength - 1]
+ else:
+ targetfile = targetdir + datetime.datetime.now().strftime("%Y-%m-%d %H:00 ") + headline
+
+ return sourcefile, targetfile, headline
+
+def mkdirindex(filesdir, indexfilename, filesdirheadline):
+ """Dig the files-directory and generate an index."""
+
+ head1 = (
+ '\n \n'
+ + filesdirheadline
+ + '\n \n \n '
+ )
+
+ style_fn = ''
+ head2 = ""
+ body1 = 'Back
'
+ body1 += ' Some files. Maybe useful or not.
'
+ body1 += '
You can't avoid chaos.
\n"
+ linecounter=0
+
+ dirindexfile = open(filesdir + indexfilename, "w")
+
+ dirindexfile.write(head1 + style_fn + head2 + body1)
+
+ for file in os.listdir(filesdir):
+ if not re.match("^\.", file) and not file == indexfilename:
+ size = os.lstat(filesdir + file).st_size
+ if size > 100000000000:
+ sizestr = str(int(size / 1073741824)) + " GiB"
+ elif size > 100000000:
+ sizestr = str(int(size / 1048576)) + " MiB"
+ elif size > 10000:
+ sizestr = str(int(size / 1024)) + " KiB"
+ else:
+ sizestr = str(size) + " B"
+
+ line = str('' + str(file) + " | " + sizestr + " |
")
+ dirindexfile.write(line)
+ linecounter+=1
+
+ dirindexfile.write(foot)
+ return linecounter
+
+
+
+# Parse arguments "--html", "--stdout" and "Some Headline"
+# there are 3 parameters. if --html is given, the fileending will be .html.
+# Else, if stdout is choosen there can be no fileending, but it will still contain html
+# the name of the program is stored in myname
+# dont set a name to outfile, it just is initialised here and will be overwritten
+
+optwords = ["--html", "--stdout"]
+outfile = ""
+args = sys.argv
+myname = args.pop(0)
+for wish in optwords:
+ if args.count(wish):
+ if wish == "--html":
+ fileending = ".html"
+ args.pop(args.index(wish))
+ if wish == "--stdout":
+ outfile = sys.stdout
+ args.pop(args.index(wish))
+# Check, if that topic already exists and fetch the appropriate filename
+if len(args) == 1:
+ headline = args[0]
+ inputfile = headline + ".md"
+ outputfile = glob.glob(
+ targetdir + "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-2][0-9]:[0-6][0-9] " + headline + "*" + fileending
+ )
+ outputfilelength = len(outputfile)
+ if outputfilelength >= 1:
+ outputfile = outputfile[outputfilelength - 1]
+ else:
+ outputfile = targetdir + datetime.datetime.now().strftime("%Y-%m-%d %H:00 ") + headline + fileending
+
+
+elif len(args) == 0:
+ selection = selectfile()
+ inputfile = selection[0]
+ outputfile = selection[1] + fileending
+ headline = selection[2]
+elif len(args) > 1:
+ sys.exit(red + "Too much or wrong parameters:\n" + yellow + myname + ' [--html] [--stdout] ["Some Topic"] ')
+
+
+# This is informal asking yes/no for editing the text
+if outfile == sys.stdout:
+ outputfile = "STDOUT"
+print(yellow + "\nYou will edit now: '" + green + inputfile + yellow + "'\nOutputfile= '" + green + outputfile + "'")
+#a = input("\nPress to continue or to stop: ")
+#edit(inputfile)
+
+
+# Set ouput to stdout, if requested. Caution, the prompts of this script go there, too,
+# be careful with copy & paste
+if outfile != sys.stdout:
+ html_out_file = open(outputfile, "w")
+else:
+ html_out_file = outfile
+
+# The head of the output. Strip path from myname
+head1 = (
+ '\n\
+\n'
+ + headline
+ + '\n\
+\n\
+\n\
+\n\
+ '
+)
+
+# Some fancy css for minimalistic terminal style
+
+style_fn = ''
+head2 = "\n"
+body1 = 'BackMoin
'
+foot = "
\n"
+foot = "