164 lines
4.4 KiB
Python
164 lines
4.4 KiB
Python
# -*- coding: UTF-8 -*-
|
|
'''
|
|
rtx - RetroText
|
|
rtxHelpers: verschiedene Hilfsfunktionen
|
|
by Anna Christina Naß <acn@acn.wtf>
|
|
released under GPL
|
|
'''
|
|
|
|
from rtxPage import rtxPage
|
|
import cept
|
|
import glob
|
|
import logging
|
|
import config
|
|
|
|
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")
|
|
|
|
if config.MODE=="modem":
|
|
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(cept.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:
|
|
send_welcome_page()
|
|
return
|
|
if cmd == "!2" + cept.TER:
|
|
glob.ser.write(bytes(cept.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(cept.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 """
|
|
glob.ser.write(bytes(cept.error_prefix + msg + cept.error_suffix, "latin-1"))
|
|
|
|
def send_page(page):
|
|
""" sends a page to the client """
|
|
glob.ser.write(page.get_page())
|
|
|