From 0b77ad7c6a9132c0f06920d858242ac744d28bbb Mon Sep 17 00:00:00 2001 From: nate Date: Sun, 3 Dec 2017 19:37:43 -0800 Subject: [PATCH] WIP on gopher stuff --- ttbp/core.py | 37 ++++++++++++++--------- ttbp/gopher.py | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++ ttbp/ttbp.py | 19 +++++++++++- 3 files changed, 120 insertions(+), 15 deletions(-) create mode 100644 ttbp/gopher.py diff --git a/ttbp/core.py b/ttbp/core.py index 81fee3c..c7329d4 100644 --- a/ttbp/core.py +++ b/ttbp/core.py @@ -73,6 +73,28 @@ def reload_ttbprc(ttbprc={}): SETTINGS = ttbprc + +def get_files(): + """Returns a list of user's feels.""" + files = [] + for filename in os.listdir(config.USER_DATA): + if nopub(filename): + link = os.path.join(config.WWW, + os.path.splitext( + os.path.basename(filename))[0]+".html") + if os.path.exists(link): + subprocess.call(["rm", link]) + continue + filename = os.path.join(config.USER_DATA, filename) + if os.path.isfile(filename) and valid(filename): + files.append(filename) + + files.sort() + files.reverse() + + return files + + def load_files(): ''' file loader @@ -83,20 +105,7 @@ def load_files(): global FILES - FILES = [] - - for filename in os.listdir(config.USER_DATA): - if nopub(filename): - link = os.path.join(config.WWW, os.path.splitext(os.path.basename(filename))[0]+".html") - if os.path.exists(link): - subprocess.call(["rm", link]) - continue - filename = os.path.join(config.USER_DATA, filename) - if os.path.isfile(filename) and valid(filename): - FILES.append(filename) - - FILES.sort() - FILES.reverse() + FILES = get_files() ## html outputting diff --git a/ttbp/gopher.py b/ttbp/gopher.py new file mode 100644 index 0000000..a1ecabe --- /dev/null +++ b/ttbp/gopher.py @@ -0,0 +1,79 @@ +""" +This module contains gopher-related stuff. +""" +import getpass +import os + +from . import util + +GOPHER_PROMPT = """ +Would you like to publish your feels to gopher? + +gopher is a pre-web technology that is text-oriented and primarily used to +share folders of your files with the world. + +If you don't know what it is or don't want it that is totally ok! + +You can always change this later.""".lstrip() + +GOPHERMAP_HEADER = """ +welcome to {user}'s feels on gopher. + + .:: .:: + .: .:: +.:.: .: .:: .:: .:: .:::: + .:: .: .:: .: .:: .::.:: + .:: .::::: .::.::::: .:: .:: .::: + .:: .: .: .:: .:: + .:: .:::: .:::: .:::.:: .:: + +this file was created on their behalf by ttbp. + +""" + + +def select_gopher(): + return util.input_yn(GOPHER_PROMPT) + + +def publish_gopher(gopher_path, entry_filenames): + """This function (re)generates a user's list of feels posts in their gopher + directory and their gophermap.""" + entry_filenames = entry_filenames[:] # force a copy since this might be shared state in core.py + entry_filenames.reverse() + ttbp_gopher = os.path.join( + os.path.expanduser('~/public_gopher'), + gopher_path) + + if not os.path.isdir(ttbp_gopher): + print('\n\tERROR: something is wrong. your gopher directory is missing. re-enable gopher publishing.') + return + + with open(os.path.join(ttbp_gopher, 'gophermap'), 'w') as gophermap: + gophermap.write(GOPHERMAP_HEADER.format( + user=getpass.getuser())) + for entry_filename in entry_filenames: + gophermap.write('0{file_label}\t{filename}'.format( + file_label=os.path.basename(entry_filename), + filename=entry_filename)) + with open(os.path.join(ttbp_gopher, entry_filename), 'w') as gopher_entry: + with open(entry_filename, 'r') as source_entry: + gopher_entry.write(source_entry.read()) + + +def setup_gopher(gopher_path): + """Given a path relative to ~/public_gopher, this function: + + - creates a directory under public_gopher + - creates a landing page + + It doesn't create a gophermap as that is left to the publish_gopher + function. + """ + public_gopher = os.path.expanduser('~/public_gopher') + if not os.path.is_dir(public_gopher): + print("\n\tERROR: you don't seem to have gopher set up (no public_gopher directory)") + return + + ttbp_gopher = os.path.join(public_gopher, gopher_path) + os.mkdirs(ttbp_gopher) diff --git a/ttbp/ttbp.py b/ttbp/ttbp.py index bf31e17..6058ac8 100644 --- a/ttbp/ttbp.py +++ b/ttbp/ttbp.py @@ -30,6 +30,11 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. the complete codebase is available at: https://github.com/modgethanc/ttbp + + +TODO ability to opt into gopher publishing +TODO check for existing public_gopher / gophermap +TODO write out files ''' from __future__ import absolute_import @@ -46,6 +51,7 @@ import inflect from . import config from . import core from . import chatter +from . import gopher from . import util __version__ = "0.9.3" @@ -56,7 +62,8 @@ p = inflect.engine() ## user globals SETTINGS = { "editor": "none", - "publish dir": False + "publish dir": False, + "gopher": False, } ## ui globals @@ -401,6 +408,13 @@ def setup(): if core.publishing(): print("publish directory: ~"+config.USER+"/public_html/"+SETTINGS.get("publish dir")) + # gopher opt-in + SETTINGS.update({'gopher': gopher.select_gopher()}) + redraw('opting into gopher: ' + SETTINGS['gopher']) + # TODO for now i'm hardcoding where people's gopher stuff is generated. if + # there is demand for this to be configurable we can expose that. + gopher.setup_gopher('feels') + # save settings ttbprc = open(config.TTBPRC, "w") ttbprc.write(json.dumps(SETTINGS, sort_keys=True, indent=2, separators=(',',':'))) @@ -703,6 +717,9 @@ editor. core.load_files() core.write("index.html") left = "posted to "+config.LIVE+config.USER+"/"+str(SETTINGS.get("publish dir"))+"/index.html\n\n>" + + if SETTINGS['gopher']: + gopher.publish_gopher('feels', core.get_files()) redraw(left + " thanks for sharing your feels!") return