1
0
rtx/rtxHelpers.py
2016-05-23 16:01:04 +02:00

164 lines
4.6 KiB
Python

# -*- coding: UTF-8 -*-
'''
rtx - RetroText
rtxHelpers: verschiedene Hilfsfunktionen
by Anna Christina Naß <acn@acn.wtf>
released under GPL
'''
from cept import *
from rtxPage import rtxPage
import glob
import logging
def process_byte(in_byte):
""" takes the received byte and processes the command line
if a new command has been entered, it will call process_command()
if a short link has been entered, the link_list of the current page will be searched
and the found target will be sent to process_command()
"""
instr=str(in_byte, encoding="latin-1")
logging.debug("> %s < CD: %s", instr, glob.ser.getCD())
# what to send back to the client
if instr == cept['INI']:
logging.debug("INI")
echo_char = "*"
elif instr == cept['TER']:
logging.debug("TER")
echo_char = "#"
else:
echo_char=instr
# start of line: clear rest of cmdline
if len(glob.cmdline) == 0:
glob.ser.write(bytes(cept['CLEARLINE'], "latin-1"))
# echo the character to the client
glob.ser.write(bytes(echo_char, "latin-1"))
glob.cmdline += instr
# Backspace:
if instr == cept['BSP']:
glob.cmdline = glob.cmdline[:-1]
return
logging.debug("Cmdline: >%s<", glob.cmdline)
# process links inside the page:
if ( len(glob.cmdline) == 1 or len(glob.cmdline) == 2 ) and glob.curpage.get_link(glob.cmdline):
glob.cmdline = cept['INI'] + glob.curpage.get_link(glob.cmdline) + cept['TER']
process_command(glob.cmdline)
return
# reset cmdline:
if instr == cept['INI'] and glob.cmdline[-2:] == cept['INI']+cept['INI']:
logging.debug("reset cmdline")
glob.cmdline = ""
glob.ser.write(bytes(clear_line24, "latin-1"))
return
# goto last page:
if instr == cept['TER'] and glob.cmdline == cept['INI']+cept['TER']:
if glob.prevpage.get_page_id() == -1:
glob.cmdline = ""
send_error("Keine vorige Seite vorhanden.")
return
glob.cmdline = "" # reset cmdline
goto_last_page()
return
# "Make it so":
if instr == cept['TER']:
# or instr == cept['SEND'] or instr == cept['CR']:
logging.info("Kommando: >%s<", glob.cmdline)
process_command(glob.cmdline)
return
def process_command(cmd):
""" processes the given command line
"""
# reset cmdline
glob.cmdline = ""
# process *cmdline#, normally a page-loading command:
if cmd[0] == cept['INI'] and cmd[-1:] == cept['TER']:
pgnr = cmd[1:-1]
check_and_send_page(pgnr, "Die Seite kann nicht gefunden werden.")
# if only # is entered, either go to the link behind '#'
# or to the next sub-page (2000a => 2000b) if it exists
if cmd == cept['TER']:
if glob.curpage.get_link("#"):
pgnr = glob.curpage.get_link("#")
check_and_send_page(pgnr, "Die Seite kann nicht gefunden werden.")
else:
# check if the next page exists, e.g. 2000a => 2000b
curid = glob.curpage.get_page_id()
if curid[-1:].isalpha():
# aus 2000a 2000b machen:
nextid = curid[:-1] + chr(ord(curid[-1:])+1)
check_and_send_page(nextid, "Keine n"+str(cept['UMLAUT'])+"achste Seite gefunden.")
# special commands:
if cmd == "!1" + cept['TER']:
glob.ser.write(bytes(btxlogo, "latin-1"))
return
if cmd == "!2" + cept['TER']:
glob.ser.write(bytes(init_screen, "latin-1"))
return
def goto_last_page():
""" go back to the previous page and make the current page the previous page
"""
logging.info("Letzte Seite: %s", str(glob.prevpage.get_page_id()))
# swap prevpage and curpage
temp = glob.curpage
glob.curpage = glob.prevpage
glob.prevpage = temp
# send the previous page (now curpage) to the client
send_page(glob.curpage)
def send_welcome_page():
""" get the btxlogo, make a rtxPage of it and send it to the client """
wpage = rtxPage()
wpage.set_page(bytes(btxlogo, "latin-1"))
send_page(wpage)
def check_and_send_page(pgnr, errormsg):
""" checks if the page "pgnr" exists
if yes, it loads it into curpage and sends it to the client
if not, it sends the error message "errormsg" to the client
"""
logging.info("suche Seite: >%s<", pgnr)
if rtxPage.exists(pgnr):
glob.prevpage = glob.curpage
glob.curpage = rtxPage(pgnr)
send_page(glob.curpage) # takes a rtxPage object!
return True
elif pgnr[-1:].isnumeric() and rtxPage.exists(pgnr + "a"):
glob.prevpage = glob.curpage
glob.curpage = rtxPage(pgnr + "a")
send_page(glob.curpage) # takes a rtxPage object!
return True
else:
send_error(errormsg)
return False
def send_error(msg):
""" send an error message to the client """
## TODO: make it appear in the status line in the correct colors etc
## and jump back to the current cursor position
glob.ser.write(bytes(error_prefix + msg + error_suffix, "latin-1"))
def send_page(page):
""" sends a page to the client """
glob.ser.write(page.get_page())