stop maintaining non-Cython ANSI abstraction module

This commit is contained in:
Jeremy Penner 2020-06-27 23:17:42 -04:00
parent cf48b50481
commit a358579e87
7 changed files with 5 additions and 276 deletions

View file

@ -1,5 +0,0 @@
import config
if config.USE_CYTHON:
from ansi_cython import *
else:
from ansi_python import *

View file

@ -1,265 +0,0 @@
import config
import numpy
esc = '%s['%chr(27)
reset = '%s0m'%esc
cls = '%s2j'%esc
BLACK = 0
RED = 1
GREEN = 2
YELLOW = 3
BLUE = 4
MAGENTA = 5
CYAN = 6
WHITE = 7
FBRIGHT = 8
FBLINK = 16
rgcolorBg = range(8)
rgcolorFg = range(8)
rgcolorFg.extend([col | FBRIGHT for col in range(8)])
K_BACKSPACE = chr(8)
K_TAB = chr(9)
K_RETURN = chr(10)
K_DEL = chr(127)
K_LEFT = 256
K_RIGHT = 257
K_UP = 258
K_DOWN = 259
K_HOME = 260
K_END = 261
K_PGUP = 262
K_PGDN = 263
def StrKey(ch):
if type(ch) == str:
return ord(ch)
return str(ch)
def Ctrl(ch):
ch = ch.upper()
assert ch != 'M' and ch != 'J' and ch != 'H'
return chr(ord(ch - 'A' + 1))
def FEnter(key):
return key == "\n" or key == "\r"
# ANSI Character - contains prop and character
class Ach(object):
def __init__(self, ch, fgcol=WHITE, bgcol=BLACK):
self.ch = ch
self.fgCol = fgcol
self.bgCol = bgcol
def __eq__(self, ach):
return type(ach) is Ach and self.ch == ach.ch and self.fgCol == ach.fgCol and self.bgCol == ach.bgCol
def __ne__(self, ach):
return not (self == ach)
def MkAch(ch, fgcol=WHITE, bgcol=BLACK):
return Ach(ch, fgcol, bgcol)
def ChFromAch(ach):
return ach.ch
achBlank = Ach(' ')
achInvd = Ach(chr(255), -1, -1)
def AstFromAch(ach, achPrev = None):
ast = ach.ch
rgsgr = []
if (achPrev == None) or (achPrev.fgCol != ach.fgCol):
rgsgr.append(str((ach.fgCol & 7) + 30))
fBright = ach.fgCol & FBRIGHT
if (achPrev == None) or (fBright != achPrev.fgCol & FBRIGHT):
if fBright:
rgsgr.append("1")
else:
rgsgr.append("2")
fBlink = ach.fgCol & FBLINK
if (achPrev == None) or (fBlink != achPrev.fgCol & FBLINK):
if fBlink:
rgsgr.append("5")
else:
rgsgr.append("25")
if (achPrev == None) or (achPrev.bgCol != ach.bgCol):
rgsgr.append(str(ach.bgCol + 40))
if len(rgsgr) > 0:
ast = esc + ";".join(rgsgr) + "m" + ast
return ast
dtAch = numpy.dtype(object)
mpch_entity = [0, 9786, 9787, 9829, 9830, 9827, 9824, 8226, 9688, 9675, 9689, 9794, 9792, 9834, 9835, 9788, 9658, 9668, 8597, 8252,
182, 167, 9644, 8616, 8593, 8595, 8594, 8592, 8735, 8596, 9650, 9660, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43,
44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102,
103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
8962, 199, 252, 233, 226, 228, 224, 229, 231, 234, 235, 232, 239, 238, 236, 196, 197, 201, 230, 198, 244, 246, 242, 251,
249, 255, 214, 220, 162, 163, 165, 8359, 402, 225, 237, 243, 250, 241, 209, 170, 186, 191, 8976, 172, 189, 188, 161, 171,
187, 9617, 9618, 9619, 9474, 9508, 9569, 9570, 9558, 9557, 9571, 9553, 9559, 9565, 9564, 9563, 9488, 9492, 9524, 9516,
9500, 9472, 9532, 9566, 9567, 9562, 9556, 9577, 9574, 9568, 9552, 9580, 9575, 9576, 9572, 9573, 9561, 9560, 9554, 9555,
9579, 9578, 9496, 9484, 9608, 9604, 9612, 9616, 9600, 945, 223, 915, 960, 931, 963, 181, 964, 934, 920, 937, 948, 8734,
966, 949, 8745, 8801, 177, 8805, 8804, 8992, 8993, 247, 8776, 176, 8729, 183, 8730, 8319, 178, 9632, 160]
setch_unsafe = set(['&', '<', '>', '"', "'"])
mpcol_hcol = ["#000000", "#AA0000", "#00AA00", "#AA5500", "#0000AA", "#AA00AA", "#00AAAA", "#AAAAAA",
"#555555", "#FF5555", "#55FF55", "#FFFF55", "#5555FF", "#FF55FF", "#55FFFF", "#FFFFFF"]
def HstFromAch(ach, achPrev = None):
stStyle = None
if achPrev == None or achPrev.fgCol != ach.fgCol or achPrev.bgCol != ach.bgCol:
stStyle = "color:" + mpcol_hcol[ach.fgCol & 15] + ";background-color:" + mpcol_hcol[ach.bgCol & 15]
rgst = []
if stStyle != None and achPrev != None:
rgst.append("</span>")
if stStyle != None:
rgst.append("<span style='" + stStyle + "'>")
ch = ord(ach.ch)
entity = mpch_entity[ch]
if entity == ch and not ach.ch in setch_unsafe:
rgst.append(ach.ch)
else:
rgst.append("&#" + str(mpch_entity[ord(ach.ch)]) + ";")
return ''.join(rgst)
class Pos(object):
def __init__(self, w=config.W, h=config.H, x=1, y=1):
self.w = w
self.h = h
self.xz = x - 1
self.yz = y - 1
def X(self): return self.xz + 1
def Y(self): return self.yz + 1
def Inc(self):
if self.xz == self.w - 1:
if self.yz < self.h:
self.xz = 0
self.yz = self.yz + 1
else:
self.xz = self.xz + 1
def Up(self):
if self.yz > 0:
self.yz = self.yz - 1
def Down(self):
if self.yz < self.h - 1:
self.yz = self.yz + 1
def Left(self):
if self.xz > 0:
self.xz = self.xz - 1
def Right(self):
if self.xz < self.w - 1:
self.xz = self.xz + 1
# ANSI Screen
class Ascr(object):
def __init__(self, w=config.W, h=config.H, achFill = None):
self.mpyzxz_ach = numpy.empty((h,w), dtAch)
self.mpyzxz_ach[:] = achFill
self.w = w
self.h = h
def Zpos(self, xz, yz):
return Pos(self.w, self.h, xz + 1, yz + 1)
def W(self): return self.w
def H(self): return self.h
def PutAch(self, ach, x, y):
if not (x < 1 or y < 1 or x > self.w or y > self.h): #clip
self.mpyzxz_ach[y-1][x-1] = ach
def GetAch(self, x, y):
return self.mpyzxz_ach[y-1][x-1]
def PutRgach(self, rgach, x, y):
xz = x - 1
if xz < self.w:
if xz < 0:
rgach = rgach[min(-xz, len(rgach)):]
xz = 0
if xz + len(rgach) >= self.w:
rgach = rgach[:self.w - xz]
self.mpyzxz_ach[y-1][xz:xz + len(rgach)] = rgach
def PutSt(self, st, x, y, colFg = WHITE, colBg=BLACK):
self.PutRgach([MkAch(ch, colFg, colBg) for ch in st], x, y)
def Fill(self, ach, w, h, x = 1, y = 1):
if x > self.w or y > self.h:
return
xz = max(x - 1, 0)
yz = max(y - 1, 0)
w = min(self.w - xz, w)
h = min(self.h - yz, h)
for yzT in range(yz, yz + h):
self.mpyzxz_ach[yzT][xz:xz + w] = ach
def PutAscr(self, ascr, x=1, y=1):
for irow, rgachRow in enumerate(ascr.mpyzxz_ach):
iachPut = -1
for iach, ach in enumerate(rgachRow):
if iachPut < 0 and ach != None:
iachPut = iach
elif iachPut >= 0 and ach == None:
self.PutRgach(rgachRow[iachPut:iach], x + iachPut, y + irow)
iachPut = -1
if iachPut >= 0:
self.PutRgach(rgachRow[iachPut:], x + iachPut, y + irow)
iachPut = -1
def AstDiff(self, ascr):
assert self.w == ascr.w and self.h == ascr.h
rgast = []
achPrev = None
yz = 0
for rgachRowOld, rgachRowNew in zip(self.mpyzxz_ach, ascr.mpyzxz_ach):
xz = 0
xzPred = -1
for achOld, achNew in zip(rgachRowOld, rgachRowNew):
if xz == self.w - 2:
achBeforeEOL = achNew
if achOld != achNew:
achNew = achNew or achBlank
if xz == self.w - 1:
# Linewrap avoidance algorithm:
# when drawing the last character on a line, draw it in the space occupied by the character before.
rgast.append("%s%d;%dH" % (esc, yz + 1, xz))
rgast.append(AstFromAch(achNew, None))
# then, move the cursor back onto the character we just drew, and perform an insert.
rgast.append("%sD%s@" % (esc, esc))
# finally, draw the character before the last character in the line.
rgast.append(AstFromAch(achBeforeEOL or achBlank, achNew))
else:
if xz != xzPred:
xzPred = xz
rgast.append("%s%d;%dH" % (esc, yz + 1, xz + 1))
achPrev = None
rgast.append(AstFromAch(achNew, achPrev))
achPrev = achNew
xzPred = xzPred + 1
xz = xz + 1
yz = yz + 1
return "".join(rgast)
def Ast(self):
return Ascr(self.w, self.h, achInvd).AstDiff(self) #stupid implementation
def Hst(self):
rgst = ["<pre>"]
achPrev = None
for rgachRow in self.mpyzxz_ach:
for ach in rgachRow:
rgst.append(HstFromAch(ach or achBlank, achPrev))
achPrev = ach or achBlank
rgst.append("<br>")
rgst.append("</span></pre>")
return ''.join(rgst)
def FKeyPrintable(key):
return type(key) == str and (ord(key) >= 32 and ord(key) <= 126)

View file

@ -20,5 +20,3 @@ AUTH = "Noop"
# Port to run the command server on. Set to None to turn off. Only set this port for testing: it will allow anyone to take down the server! # Port to run the command server on. Set to None to turn off. Only set this port for testing: it will allow anyone to take down the server!
PORT_CMDSERVER = 20002 PORT_CMDSERVER = 20002
# Flag whether we should build and use Cython modules to improve performance.
USE_CYTHON = True

View file

@ -4,7 +4,7 @@ import random
import logging import logging
import pickle import pickle
import time import time
import ansi import ansi_cython as ansi
import auth import auth
import config import config
import telnet import telnet

View file

@ -1,5 +1,5 @@
from basetoken import * from basetoken import *
import ansi import ansi_cython as ansi
class LoginTerm(Terminal): class LoginTerm(Terminal):
def run(self): def run(self):

View file

@ -4,7 +4,7 @@ from twisted.internet.protocol import Factory,ServerFactory
from twisted.internet import protocol, reactor from twisted.internet import protocol, reactor
from zope.interface import implements from zope.interface import implements
from twisted.python import log from twisted.python import log
import ansi import ansi_cython as ansi
import engine import engine
import sys import sys
import config import config

View file

@ -1,5 +1,6 @@
from tpers import TPrs from tpers import TPrs
import ansi import ansi_cython as ansi
# probably reinventing the wheel :/ # probably reinventing the wheel :/
class Rgseq(TPrs): class Rgseq(TPrs):
def InitPersistent(self, *rgseq): def InitPersistent(self, *rgseq):