moving stable to 0.9.2, cleaning up pagination display

master
endorphant 2016-10-10 17:53:02 -04:00
parent 281d8cda06
commit 90b8828ba5
4 changed files with 258 additions and 96 deletions

View File

@ -87,7 +87,64 @@ RAINBOW = True
EDITORS = ["vim", "vi", "emacs", "pico", "nano", "ed"] EDITORS = ["vim", "vi", "emacs", "pico", "nano", "ed"]
SUBJECTS = ["help request", "bug report", "feature suggestion", "general comment"] SUBJECTS = ["help request", "bug report", "feature suggestion", "general comment"]
## ## ttbp specific utilities
def menu_handler(options, prompt, pagify=10, rainbow=False, top=""):
'''
This menu handler takes an incoming list of options, pagifies to a
pre-set value, and queries via the prompt. Calls print_menu() and
list_select() as helpers.
'top' is an optional list topper, to be passed to redraw()
'''
optCount = len(options)
page = 0
total = optCount / pagify
# don't display empty pages
if optCount % pagify == 0:
total = total - 1
if total < 2:
print_menu(options, rainbow)
return list_select(options, prompt)
else:
return page_helper(options, prompt, pagify, rainbow, page, total, top)
def page_helper(options, prompt, pagify, rainbow, page, total, top):
'''
A helper to process pagination.
'''
## make short list
x = 0 + page * pagify
y = x + pagify
optPage = options[x:y]
util.print_menu(optPage, prompt)
print("\n\t( page {page} of {total}; type 'u' or 'd' to scroll up and down )").format(page=page+1, total=total+1)
ans = util.list_select(optPage, prompt)
if ans in util.NAVS:
error = ""
if ans == 'u':
if page == 0:
error = "can't scroll up anymore!\n\n> "
else:
page = page - 1
else:
if page == total:
error = "can't scroll down anymore!\n\n> "
else:
page = page + 1
redraw(error+top)
return page_helper(options, prompt, pagify, rainbow, page, total, top)
return ans
def redraw(leftover=""): def redraw(leftover=""):
''' '''
@ -482,7 +539,6 @@ def review_menu(intro=""):
redraw(intro) redraw(intro)
return review_menu() return review_menu()
def view_neighbors(users): def view_neighbors(users):
''' '''
generates list of all users on ttbp, sorted by most recent post generates list of all users on ttbp, sorted by most recent post
@ -585,7 +641,7 @@ def view_feels(townie):
pub = "(nopub)" pub = "(nopub)"
entries.append(""+entry[4]+" ("+p.no("word", entry[2])+") "+"\t"+pub) entries.append(""+entry[4]+" ("+p.no("word", entry[2])+") "+"\t"+pub)
return list_entries(metas, entries, owner+" recorded feels, listed by date: \n") return list_entries(metas, entries, owner+" recorded feels, listed by date: ")
else: else:
redraw("no feels recorded by ~"+townie) redraw("no feels recorded by ~"+townie)
@ -706,7 +762,7 @@ def list_entries(metas, entries, prompt):
choice = util.list_select(entries, "pick an entry from the list, or type 'back' or 'q' to go back: ") choice = util.list_select(entries, "pick an entry from the list, or type 'back' or 'q' to go back: ")
''' '''
choice = util.menu_handler(entries, "pick an entry from the list, or type 'q' to go back: ", 10, RAINBOW) choice = menu_handler(entries, "pick an entry from the list, or type 'q' to go back: ", 10, RAINBOW, prompt)
if choice is not False: if choice is not False:
@ -1065,7 +1121,7 @@ ver 0.9.1 features:
print(""" print("""
ver 0.9.2 features: ver 0.9.2 features:
* paginated entry view * paginated entry view
* expanded menu for viewing your own feels (further * expanded menu for viewing your own feels (further
features to be implemented) features to be implemented)
""") """)

View File

@ -4,6 +4,5 @@
| ____ ____ ____ _ ____ ____ _ _ ____ _ _ _ ____ | | ____ ____ ____ _ ____ ____ _ _ ____ _ _ _ ____ |
| |___ |___ |___ | [__ |___ |\ | | __ | |\ | |___ | | |___ |___ |___ | [__ |___ |\ | | __ | |\ | |___ |
| | |___ |___ |___ ___] |___ | \| |__] | | \| |___ | | | |___ |___ |___ ___] |___ | \| |__] | | \| |___ |
| | | ver 0.9.2 (almost stable) |
| ver 0.9.1 (almost stable) |
|__________________________________________________________| |__________________________________________________________|

View File

@ -45,7 +45,7 @@ import chatter
import inflect import inflect
import util import util
__version__ = "0.9.1" __version__ = "0.9.2"
__author__ = "endorphant <endorphant@tilde.town)" __author__ = "endorphant <endorphant@tilde.town)"
## system globals ## system globals
@ -87,7 +87,64 @@ RAINBOW = False
EDITORS = ["vim", "vi", "emacs", "pico", "nano", "ed"] EDITORS = ["vim", "vi", "emacs", "pico", "nano", "ed"]
SUBJECTS = ["help request", "bug report", "feature suggestion", "general comment"] SUBJECTS = ["help request", "bug report", "feature suggestion", "general comment"]
## ## ttbp specific utilities
def menu_handler(options, prompt, pagify=10, rainbow=False, top=""):
'''
This menu handler takes an incoming list of options, pagifies to a
pre-set value, and queries via the prompt. Calls print_menu() and
list_select() as helpers.
'top' is an optional list topper, to be passed to redraw()
'''
optCount = len(options)
page = 0
total = optCount / pagify
# don't display empty pages
if optCount % pagify == 0:
total = total - 1
if total < 2:
print_menu(options, rainbow)
return list_select(options, prompt)
else:
return page_helper(options, prompt, pagify, rainbow, page, total, top)
def page_helper(options, prompt, pagify, rainbow, page, total, top):
'''
A helper to process pagination.
'''
## make short list
x = 0 + page * pagify
y = x + pagify
optPage = options[x:y]
util.print_menu(optPage, prompt)
print("\n\t( page {page} of {total}; type 'u' or 'd' to scroll up and down )").format(page=page+1, total=total+1)
ans = util.list_select(optPage, prompt)
if ans in util.NAVS:
error = ""
if ans == 'u':
if page == 0:
error = "can't scroll up anymore!\n\n> "
else:
page = page - 1
else:
if page == total:
error = "can't scroll down anymore!\n\n> "
else:
page = page + 1
redraw(error+top)
return page_helper(options, prompt, pagify, rainbow, page, total, top)
return ans
def redraw(leftover=""): def redraw(leftover=""):
''' '''
@ -161,6 +218,7 @@ def check_init():
if os.path.exists(os.path.join(os.path.expanduser("~"),".ttbp")): if os.path.exists(os.path.join(os.path.expanduser("~"),".ttbp")):
print(chatter.say("greet")+", "+USER+".\n") print(chatter.say("greet")+", "+USER+".\n")
'''
## ttbprc validation ## ttbprc validation
while not os.path.isfile(TTBPRC): while not os.path.isfile(TTBPRC):
setup_repair() setup_repair()
@ -168,6 +226,11 @@ def check_init():
SETTINGS = json.load(open(TTBPRC)) SETTINGS = json.load(open(TTBPRC))
except ValueError: except ValueError:
setup_repair() setup_repair()
'''
## ttbp env validation
if not valid_setup():
setup_repair()
## version checker ## version checker
mismatch = build_mismatch() mismatch = build_mismatch()
@ -262,6 +325,33 @@ def gen_header():
""" """
return header return header
def valid_setup():
'''
Checks to see if user has a sane ttbp environment.
'''
global SETTINGS
if not os.path.isfile(TTBPRC):
return False
try:
SETTINGS = json.load(open(TTBPRC))
except ValueError:
return False
if core.publishing():
if not SETTINGS.get("publish dir"):
return False
if not os.path.exists(WWW):
return False
if not os.path.exists(os.path.join(WWW, SETTINGS.get("pubish dir"))):
return False
return True
def setup_repair(): def setup_repair():
''' '''
setup repair function setup repair function
@ -331,17 +421,17 @@ def main_menu():
"review your feels", "review your feels",
"check out your neighbors", "check out your neighbors",
"browse global feels", "browse global feels",
"scribble some graffiti\t(new!)", "scribble some graffiti",
"change your settings", "change your settings",
"send some feedback", "send some feedback",
"see credits", "see credits",
"read documentation"] "read documentation"]
print("you're at ttbp home. remember, you can always press <ctrl-c> to come back here.\n\n") print("you're at ttbp home. remember, you can always press <ctrl-c> to come back here.\n")
util.print_menu(menuOptions, RAINBOW) util.print_menu(menuOptions, RAINBOW)
try: try:
choice = raw_input("\ntell me about your feels (or 'quit' to exit): ") choice = raw_input("\ntell me about your feels (or type 'q' to exit): ")
except KeyboardInterrupt: except KeyboardInterrupt:
redraw(EJECT) redraw(EJECT)
return main_menu() return main_menu()
@ -352,14 +442,21 @@ def main_menu():
write_entry(os.path.join(DATA, today+".txt")) write_entry(os.path.join(DATA, today+".txt"))
core.www_neighbors() core.www_neighbors()
elif choice == '1': elif choice == '1':
redraw("your recorded feels, listed by date:\n") if core.publishing():
view_feels(USER) intro = "here are some options for reviewing your feels:"
redraw(intro)
review_menu(intro)
core.load_files()
core.write("index.html")
else:
redraw("your recorded feels, listed by date:")
view_feels(USER)
elif choice == '2': elif choice == '2':
users = core.find_ttbps() users = core.find_ttbps()
redraw("the following "+p.no("user", len(users))+" "+p.plural("is", len(users))+" recording feels on ttbp:\n") redraw("the following "+p.no("user", len(users))+" "+p.plural("is", len(users))+" recording feels on ttbp:")
view_neighbors(users) view_neighbors(users)
elif choice == '3': elif choice == '3':
redraw("most recent global entries\n") redraw("most recent global entries")
view_feed() view_feed()
elif choice == '4': elif choice == '4':
graffiti_handler() graffiti_handler()
@ -371,7 +468,7 @@ def main_menu():
redraw(EJECT) redraw(EJECT)
redraw() redraw()
elif choice == '6': elif choice == '6':
redraw("you're about to send mail to ~endorphant about ttbp\n") redraw("you're about to send mail to ~endorphant about ttbp")
feedback_menu() feedback_menu()
elif choice == '7': elif choice == '7':
redraw() redraw()
@ -413,6 +510,34 @@ press <enter> to open an external text editor. mail will be sent once you save a
return feedback_menu() return feedback_menu()
def review_menu(intro=""):
'''
submenu for reviewing feels.
'''
menuOptions = [
"read over feels",
"modify feels publishing"
]
util.print_menu(menuOptions, RAINBOW)
choice = util.list_select(menuOptions, "what would you like to do with your feels? (or 'back' to return home) ")
if choice is not False:
if choice == 0:
redraw("your recorded feels, listed by date:")
view_feels(USER)
elif choice == 1:
redraw("here's your current nopub status:")
set_nopubs()
else:
redraw()
return
redraw(intro)
return review_menu()
def view_neighbors(users): def view_neighbors(users):
''' '''
generates list of all users on ttbp, sorted by most recent post generates list of all users on ttbp, sorted by most recent post
@ -471,7 +596,7 @@ def view_neighbors(users):
util.print_menu(sortedUsers, RAINBOW) util.print_menu(sortedUsers, RAINBOW)
#raw_input("\n\npress <enter> to go back home.\n\n") #raw_input("\n\npress <enter> to go back home.\n\n")
choice = util.list_select(sortedUsers, "pick a townie to browse their feels, or type 'back' to go home: ") choice = util.list_select(sortedUsers, "pick a townie to browse their feels, or type 'back' or 'q' to go home: ")
if choice is not False: if choice is not False:
redraw("~"+userIndex[choice]+"'s recorded feels, listed by date: \n") redraw("~"+userIndex[choice]+"'s recorded feels, listed by date: \n")
@ -490,10 +615,13 @@ def view_feels(townie):
''' '''
filenames = [] filenames = []
showpub = False
if townie == USER: if townie == USER:
entryDir = DATA entryDir = DATA
owner = "your" owner = "your"
if core.publishing():
showpub = True
else: else:
owner = "~"+townie+"'s" owner = "~"+townie+"'s"
entryDir = os.path.join("/home", townie, ".ttbp", "entries") entryDir = os.path.join("/home", townie, ".ttbp", "entries")
@ -507,9 +635,12 @@ def view_feels(townie):
if len(filenames) > 0: if len(filenames) > 0:
entries = [] entries = []
for entry in metas: for entry in metas:
entries.append(""+entry[4]+" ("+p.no("word", entry[2])+") ") pub = ""
if core.nopub(entry[0]):
pub = "(nopub)"
entries.append(""+entry[4]+" ("+p.no("word", entry[2])+") "+"\t"+pub)
return list_entries(metas, entries, owner+" recorded feels, listed by date: \n") return list_entries(metas, entries, owner+" recorded feels, listed by date: ")
else: else:
redraw("no feels recorded by ~"+townie) redraw("no feels recorded by ~"+townie)
@ -576,6 +707,13 @@ editor.
return return
def set_nopubs():
'''
handler for toggling nopub on individual entries
'''
raw_input(DUST)
def send_feedback(entered, subject="none"): def send_feedback(entered, subject="none"):
''' '''
main feedback/bug report handler main feedback/bug report handler
@ -591,28 +729,39 @@ def send_feedback(entered, subject="none"):
subprocess.call([SETTINGS["editor"], temp.name]) subprocess.call([SETTINGS["editor"], temp.name])
message = open(temp.name, 'r').read() message = open(temp.name, 'r').read()
id = "#"+util.genID(3) if message:
mail = MIMEText(message) id = "#"+util.genID(3)
mail['To'] = FEEDBOX mail = MIMEText(message)
mail['From'] = USER+"@tilde.town" mail['To'] = FEEDBOX
mail['Subject'] = " ".join(["[ttbp]", subject, id]) mail['From'] = USER+"@tilde.town"
m = os.popen("/usr/sbin/sendmail -t -oi", 'w') mail['Subject'] = " ".join(["[ttbp]", subject, id])
m.write(mail.as_string()) m = os.popen("/usr/sbin/sendmail -t -oi", 'w')
m.close() m.write(mail.as_string())
m.close()
return """\ exit = """\
thanks for writing! for your reference, it's been recorded thanks for writing! for your reference, it's been recorded
> as """+ " ".join([subject, id])+""". i'll try to respond to you soon.\ > as """+ " ".join([subject, id])+""". i'll try to respond to you soon.\
""" """
else:
exit = """\
i didn't send your blank message. if you made a mistake, please try
running through the feedback option again!\
"""
return exit
def list_entries(metas, entries, prompt): def list_entries(metas, entries, prompt):
''' '''
displays a list of entries for reading selection displays a list of entries for reading selection
''' '''
'''
util.print_menu(entries, RAINBOW) util.print_menu(entries, RAINBOW)
choice = util.list_select(entries, "pick an entry from the list, or type 'back' or 'q' to go back: ")
'''
choice = util.list_select(entries, "pick an entry from the list, or type 'back' to go back: ") choice = menu_handler(entries, "pick an entry from the list, or type 'q' to go back: ", 10, RAINBOW, prompt)
if choice is not False: if choice is not False:
@ -663,7 +812,7 @@ def view_feed():
entries.append("~"+entry[5]+pad+"\ton "+entry[3]+" ("+p.no("word", entry[2])+") ") entries.append("~"+entry[5]+pad+"\ton "+entry[3]+" ("+p.no("word", entry[2])+") ")
list_entries(metas, entries, "most recent global entries: \n\n") list_entries(metas, entries, "most recent global entries:")
redraw() redraw()
@ -675,7 +824,7 @@ def graffiti_handler():
''' '''
if os.path.isfile(WALL_LOCK): if os.path.isfile(WALL_LOCK):
redraw("sorry, "+chatter.say("friend")+", but someone's there right now. try again in a few!\n") redraw("sorry, "+chatter.say("friend")+", but someone's there right now. try again in a few!")
else: else:
subprocess.call(["touch", WALL_LOCK]) subprocess.call(["touch", WALL_LOCK])
redraw() redraw()
@ -705,9 +854,11 @@ def select_editor():
''' '''
util.print_menu(EDITORS, RAINBOW) util.print_menu(EDITORS, RAINBOW)
choice = raw_input("\npick your favorite text editor: ") choice = util.list_select(EDITORS, "pick your favorite text editor: ")
while choice not in ['0', '1', '2', '3', '4', '5']:
choice = raw_input("\nplease pick a number from the list: ") if choice is False:
redraw("please pick a text editor!")
select_editor()
return EDITORS[int(choice)] return EDITORS[int(choice)]
@ -770,7 +921,7 @@ please enter\
def unpublish(): def unpublish():
''' '''
remove user's published directory, if it exists remove user's published directory, if it exists. this should only remove the symlink in public_html.
''' '''
dir = SETTINGS.get("publish dir") dir = SETTINGS.get("publish dir")
@ -948,7 +1099,8 @@ somehing strange happened to you during this update.
""") """)
# show patch notes # show patch notes
if userVersion != "0.9.0" and userVersion != "0.9.0b": #if userVersion != "0.9.0" and userVersion != "0.9.0b":
if userVersion[0:5] < "0.9.0":
# version 0.9.0 patch notes: # version 0.9.0 patch notes:
print(""" print("""
ver. 0.9.0 features: ver. 0.9.0 features:
@ -956,11 +1108,21 @@ ver. 0.9.0 features:
* documentation browser * documentation browser
""") """)
# version 0.9.1 patch notes if userVersion[0:5] < "0.9.1":
print(""" # version 0.9.1 patch notes
print("""
ver 0.9.1 features: ver 0.9.1 features:
* graffiti wall * graffiti wall
""") """)
if userVersion[0:5] < "0.9.2":
# version 0.9.2 patch notes
print("""
ver 0.9.2 features:
* paginated entry view
* expanded menu for viewing your own feels (further
features to be implemented)
""")
##### #####

View File

@ -147,61 +147,6 @@ def genID(digits=5):
return id return id
def menu_handler(options, prompt, pagify=10, rainbow=False):
'''
This menu handler takes an incoming list of options, pagifies to a
pre-set value, and queries via the prompt. Calls print_menu() and
list_select() as helpers.
'''
optCount = len(options)
page = 0
total = optCount / pagify
# don't display empty pages
if optCount % pagify == 0:
total = total - 1
if total < 2:
print_menu(options, rainbow)
return list_select(options, prompt)
else:
return page_helper(options, prompt, pagify, rainbow, page, total)
def page_helper(options, prompt, pagify, rainbow, page, total):
'''
A helper to process pagination.
'''
## make short list
x = 0 + page * pagify
y = x + pagify
optPage = options[x:y]
print_menu(optPage, prompt)
print("\n\t( page {page} of {total}; type 'u' or 'd' to scroll up and down )").format(page=page+1, total=total+1)
ans = list_select(optPage, prompt)
if ans in NAVS:
if ans == 'u':
if page == 0:
print("can't scroll up anymore!")
else:
page = page - 1
else:
if page == total:
print("can't scroll down anymore!")
else:
page = page + 1
print("")
return page_helper(options, prompt, pagify, rainbow, page, total)
return ans
def print_menu(menu, rainbow=False): def print_menu(menu, rainbow=False):
''' '''
A pretty menu handler that takes an incoming lists of A pretty menu handler that takes an incoming lists of