From 9bd65f35a76414b804d7b4a31f6437381bb17914 Mon Sep 17 00:00:00 2001 From: mhiretskiy Date: Wed, 27 Aug 2008 13:30:16 +0000 Subject: [PATCH] git-svn-id: http://svn.calculate.ru/calculate2/calculate-lib/trunk@146 c91db197-33c1-4113-bf15-f8a5c547ca64 --- pym/cl_utils2.py | 107 ++++++++++++++++++++++++++++------------------- 1 file changed, 63 insertions(+), 44 deletions(-) diff --git a/pym/cl_utils2.py b/pym/cl_utils2.py index 59e9323..a445765 100644 --- a/pym/cl_utils2.py +++ b/pym/cl_utils2.py @@ -25,11 +25,48 @@ import fcntl import cl_utils pcs = cl_utils.prettyColumnStr -CONWIDTH = 78 - -class cl_params: +class cl_help: + """Объект для работы со справкой, и обработкой параметров. + + Конструктор __init__ должен определить следующие переменные: + + self.chapter список разделов справки, каждый элементы состоит из + имени раздела, флаг видимый/скрытый, кол-во переводов строк + после названия раздела, количество строк после раздела, + тип раздела + Пример: [("Copyright",False,0,2),"options"] + self.relService словарь связей сервисов и действующих опций + ключ - название сервиса, значение - список отображаемых + разделов отмеченных как "options" + Пример: {"samba":[_("Common options"), + _("Service Samba options")]} + self.relOptions словарь связей длинных опций помощи и выводимых разделов + помощи с опциями + ключ - параметр справки, значение список отображаемых + разделов справки + Пример: {"help-ldap":[_("Common options"), + _("Service LDAP options)]} + self.progName словарь имена используемых программ и их номера для + доступа к переменным + Пример: {'cl-groupadd':0, 'cl-groupdel':1} + self.data список данных для словаря, каждый эленмент словарь: + progAccess: список номеров программ отображающих + Пример: {'progAccess':(0,), + 'shortOption':"g", + 'longOption':"gid", + 'optVal':"GID", + 'helpChapter':_("Options"), + 'help':_("use GID for the new group") + }, + после заполнения параметров необходимо выполнить + self._cl_help__setParamHelp() для заполнения справки + + """ def __init__(self, cmdName): + # ширина консоли взята 80 + # -1 чтобы компенсировать расстрояние между колонками + self.consolewidth = 79 self.column_width = 32 self.cmdName = cmdName #короткие опции командной строки @@ -41,7 +78,7 @@ class cl_params: #optEnd = _("user") #elif "group" in self.cmdName and not "mod" in self.cmdName: #optEnd = _("group") - self.__setParamHelp() + #self.__setParamHelp() def getChapterNumber(self,NameChapter): # Показать номер раздела по его имени @@ -53,6 +90,8 @@ class cl_params: return False def __setParamHelp(self): + # сформировать нужное количество блоков раздела + self.chapterBloc = [""]*len(self.chapter) # записать параметры в справку sp = [] for par in self.data: @@ -78,12 +117,12 @@ class cl_params: helpTxt = pcs( " -%s, --%s "%(par["shortOption"],longOption), self.column_width, par['help'], - CONWIDTH-self.column_width) + self.consolewidth-self.column_width) else: helpTxt = pcs( " -%s "%(par["shortOption"]), self.column_width, par['help'], - CONWIDTH-self.column_width) + self.consolewidth-self.column_width) self.addChapterHelp(numChapter,helpTxt) break elif par.has_key("longOption") and self.access(par): @@ -212,49 +251,29 @@ class cl_params: break return "" -BG_BLACK = "40" -BG_RED = "41" -BG_GREEN = "42" -BG_YELLOW = "43" -BG_BLUE = "44" -BG_PURPLE = "45" -BG_CYAN = "46" -BG_WHITE = "47" - -FG_BLACK = "30" -FG_RED = "31" -FG_GREEN = "32" -FG_YELLOW = "33" -FG_BLUE = "34" -FG_PURPLE = "35" -FG_CYAN = "36" -FG_WHITE = "37" - -ATTR_RESET = "0" -ATTR_BRIGHTOFF = "1" -ATTR_BRIGHTON = "2" -ATTR_UNDERLINE = "3" -ATTR_FLASH = "5" -ATTR_REVERSE = "7" -ATTR_INVISIBLE = "8" - -def colorstr(s, *attrs): - return "\033[%sm" % ";".join(attrs) + s - -def colorwrite(s, *attrs): - print colorstr(s, *attrs) - -class cl_smartconsole: - def printRight(self, offsetLeft, offsetRight): - """Добавляет необходимое количество пробелов: +class cl_smartcon(object): + selfobj = None - количество пробелов = (ширина консоли - offsetLeft - offsetRight) - """ + def __new__(cls, *args,**kw): + """Механизм синглтона""" + if cls.selfobj is None: + cls.selfobj = object.__new__(cls,*args,**kw) + return cls.selfobj + + def getconsolewidth(self): + """Получить ширину текущей консоли""" s = struct.pack("HHHH", 0, 0, 0, 0) fd_stdout = sys.stdout.fileno() x = fcntl.ioctl(fd_stdout, termios.TIOCGWINSZ, s) #(rows, cols, x pixels, y pixels) - cols = struct.unpack("HHHH", x)[1] + return struct.unpack("HHHH", x)[1] + + def printRight(self, offsetLeft, offsetRight): + """Добавляет необходимое количество пробелов: + + количество пробелов = (ширина консоли - offsetLeft - offsetRight) + """ + cols = self.getconsolewidth() for i in range(cols - offsetLeft - offsetRight): sys.stdout.write(" ")