172 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			172 lines
		
	
	
		
			5.3 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
 | 
						|
import rtxMask
 | 
						|
 | 
						|
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:
 | 
						|
                send_error("Keine n"+ cept.UMLAUT +"achste Seite gefunden.")
 | 
						|
            elif str(curid[-1:]).isalpha():
 | 
						|
                # aus 2000a 2000b machen:
 | 
						|
                nextid = curid[:-1] + chr(ord(curid[-1:])+1)
 | 
						|
                check_and_send_page(nextid, "Keine n" + 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"))
 | 
						|
        maske = rtxMask.rtxMask()
 | 
						|
        maske.addLine(3,1,10)
 | 
						|
        maske.addLine(4,4,10)
 | 
						|
        maske.process_input()
 | 
						|
        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 """
 | 
						|
    glob.curpage = rtxPage()
 | 
						|
    glob.curpage.set_page(bytes(cept.btxlogo, "latin-1"))
 | 
						|
    send_page(glob.curpage)
 | 
						|
 | 
						|
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())
 | 
						|
 |