From d9eda1d274eb18d85609d83830a9c6c620204cb3 Mon Sep 17 00:00:00 2001 From: mhiretskiy Date: Thu, 28 Aug 2008 13:43:54 +0000 Subject: [PATCH] git-svn-id: http://svn.calculate.ru/calculate2/calculate-lib/trunk@152 c91db197-33c1-4113-bf15-f8a5c547ca64 --- pym/cl_utils2.py | 215 +++++++++++++++++++++++++++++------------------ 1 file changed, 133 insertions(+), 82 deletions(-) diff --git a/pym/cl_utils2.py b/pym/cl_utils2.py index 23f9022..13d1602 100644 --- a/pym/cl_utils2.py +++ b/pym/cl_utils2.py @@ -64,7 +64,7 @@ class cl_help: """ def __init__(self, cmdName): - # ширина консоли взята 80 + # ширина консоли взята за 80 # -1 чтобы компенсировать расстрояние между колонками self.consolewidth = 79 self.column_width = 32 @@ -73,6 +73,8 @@ class cl_help: self.shortOpt = [] #длинные опции командной строки self.longOpt = [] + # массив разделов (заполняется в __setParamHelp) + self.chapterBloc = [] #optEnd = "" #if "user" in self.cmdName and not "mod" in self.cmdName: #optEnd = _("user") @@ -81,7 +83,7 @@ class cl_help: #self.__setParamHelp() def getChapterNumber(self,NameChapter): - # Показать номер раздела по его имени + """Получить номер раздела по имени""" num = 0 for i in self.chapter: if i[0] == NameChapter: @@ -90,91 +92,104 @@ class cl_help: return False def __setParamHelp(self): + """Внутренняя функция формирования справки по данным + + Перебирает все элементы списка data, проверяет их на доступность + данной программы, разбирает опции на среди data и формирует + для по ним справку. + """ # сформировать нужное количество блоков раздела self.chapterBloc = [""]*len(self.chapter) # - sp = [] - # перебираем все элементы справки + sp = {} + i = 0 + # перебираем все элементы справки собираем элементы опции + # так же формируем разделы не опции for par in self.data: - # если у элемента есть коротка опция, - if par.has_key("shortOption"): - # проверям подходит ли данный элемент программе (progAccess) - if self.access(par): - # добавляем в предварительный массив короткую опцию - sp.append(par["shortOption"]) - # если - elif par.has_key("longOption"): - if self.access(par): - sp.append(par["longOption"]) - #sp.sort() + # перебираем только те опции, которые принадлежат команде + if self.access(par): + # есть короткая (возможно есть и длинная) + if par.has_key("shortOption"): + sp[par["shortOption"]] = i + # есть только длинная опция + elif par.has_key("longOption"): + sp[par["longOption"]] = i + # формирование разделов не опций + else: + helpTxt = par['help'] + numChapter = self.getChapterNumber(par['helpChapter']) + self.addChapterHelp(numChapter,helpTxt) + i += 1 # перебираем все "собранные" опции - for shortOption in sp: - for par in self.data: - if par.has_key("shortOption") and self.access(par): - if par["shortOption"] == shortOption: - numChapter = self.getChapterNumber(par['helpChapter']) - if par.has_key("longOption"): - if par.has_key("optVal"): - longOption = par["longOption"] + " " +\ - par["optVal"] - else: - longOption = par["longOption"] - - helpTxt = pcs( - " -%s, --%s "%(par["shortOption"],longOption), - self.column_width, par['help'], - self.consolewidth-self.column_width) - else: - helpTxt = pcs( - " -%s "%(par["shortOption"]), - self.column_width, par['help'], - self.consolewidth-self.column_width) - self.addChapterHelp(numChapter,helpTxt) - break - elif par.has_key("longOption") and self.access(par): - if par["longOption"] == shortOption: - numChapter = self.getChapterNumber(par['helpChapter']) - longOption = par["longOption"] - helpTxt = pcs( - " --%s "%(longOption), - self.column_width, par['help'], - self.consolewidth-self.column_width) - self.addChapterHelp(numChapter,helpTxt) - break - for par in self.data: - if not (par.has_key("shortOption") or\ - par.has_key("longOption")) and\ - self.access(par): - helpTxt = par['help'] - numChapter = self.getChapterNumber(par['helpChapter']) - self.addChapterHelp(numChapter,helpTxt) + # опции перебираются по порядку в списке date + # для сортировки по ключам следует применить код: + # for index in sorted(sp.keys()): + # par = self.data[sp[index]] + for index in sorted(sp.values()): + par = self.data[index] + numChapter = self.getChapterNumber(par['helpChapter']) + # если есть и короткая и длинная + if "shortOption" in par and "longOption" in par: + paraminfo = "-%s, --%s "%(par["shortOption"],par["longOption"]) + # если есть только короткая + elif "shortOption" in par: + paraminfo = "-%s "%par["shortOption"] + # если только длинная + else: + paraminfo = "--%s "%par["longOption"] + # если указан параметр для опции + if "optVal" in par: + optVal = par["optVal"] + else: + optVal = "" + + # вывод вида: " [-o, ][--option] [PARAM]" "helpstring" + helpTxt = pcs(" "+paraminfo+optVal, self.column_width, \ + par['help'], self.consolewidth-self.column_width) + # добавить строку в нужный раздел + self.addChapterHelp(numChapter,helpTxt) def getHelp(self, optionsChapters=False): + """Выдать справку. + + Выдает справку в случае если указан optionsChapters, то фильтрует по + типу разделов. + + Параметры: + optionsChapters Flase или список опциональных разделов для + отображения + + Возвращаемые параметры: + Строка со справкой. + """ # Выдать справку help = "" - for numChapter in range(len(self.chapter)): - chapter = self.chapter[numChapter] - typeChapter = chapter[4] - nameChapter = chapter[0] + # перебираем все элементы справочных блоков + iterChapterBloc = iter(self.chapterBloc) + # перебираем все разделы по параметрам + for (nameChapter, visibleChapter, beforeStrChapter, \ + afterStrChapter, typeChapter) in self.chapter: + # получаем следующий блок (т.о. textChapterBloc соответ, chapter) + textChapterBloc = iterChapterBloc.next() + # если тип раздела опциональный if optionsChapters and typeChapter=="options": + # проверяем нужно ли его отображать if not (nameChapter in optionsChapters): continue - visibleChapter = chapter[1] - beforeStrChapter = chapter[2] - afterStrChapter = chapter[3] - bef = "" - for i in range(beforeStrChapter): - bef += "\n" - aft = "" - for i in range(afterStrChapter): - aft += "\n" + bef = "\n"*beforeStrChapter + aft = "\n"*afterStrChapter if visibleChapter: help += nameChapter + ": " + bef - help += self.chapterBloc[numChapter] + aft + help += textChapterBloc + aft return help.encode("UTF-8") def addChapterHelp(self, numChapter, helpTxt): - # Добавить в раздел помощи numChapteк тектстовую строку helpTxt + """Добавить в раздел помощи numChapteк тектстовую строку helpTxt + + Параметры: + numChapter номер раздела в который нужно добавить данные справки + helpTxt строка, содержащая данные + """ self.chapterBloc[numChapter] += helpTxt return True @@ -184,9 +199,18 @@ class cl_help: return True def access(self,dataHash): + """Доступна ли опция вызывающей программе + + Параметры: + dataHash словарь элемент типа self.data + + Возвращаемые параметры: + True/False доступна/недоступна + """ # доступна ли опция вызывающей программе + # опция без progAccess доступна numProg = self.progName[self.cmdName] - if dataHash.has_key('progAccess'): + if 'progAccess' in dataHash: if numProg in dataHash['progAccess']: return True else: @@ -195,21 +219,28 @@ class cl_help: return True def getTypeChapter(self, nameChapter): - """Показать тип раздела по его имени""" - flagFind = False - for numChapter in range(len(self.chapter)): - chapter = self.chapter[numChapter] - name = chapter[0] - if nameChapter == name: - typeChapter = chapter[4] - flagFind = True - break - if flagFind: - return typeChapter + """Получить тип раздела по его имени + + Параметры: + nameChapter название раздела + + Возвращаемые параметры: + строка тип раздела + Flase(Boolean) такой раздел отсутствует + """ + # фильтруем список по имени раздела, помещаем в список тип раздела + filtered = [typeChapter for name, na, na, na, typeChapter \ + in self.chapter if name == nameChapter] + # если среди фильтрованных есть хоть один элемент + if len(filtered) > 0: + # возвращаем - он запрашиваемый + return filtered[0] else: + # такой раздел отсутствует return False def clearAllOpt(self): + """Очистить все опции, полученные посредством getAllOpt""" if len(self.shortOpt) > 0: self.shortOpt = [] if len(self.longOpt) > 0: @@ -217,6 +248,15 @@ class cl_help: return True def getAllOpt(self,typeOpt="short", optionsChapters=False): + """Получить все доступные опции + + Параметры: + typeOpt 'short'/'long', вернуть короткие или длинные опции + optionsChapters фильтр для опций по типам разделов (список,кортеж) + + Возвращаемые параметры: + строка коротки или список строк длинных опций ('hb:c:wg:G:k:ms:u:') + """ # Выдать все действующие опции if typeOpt=="short": if len(self.shortOpt) == 0: @@ -247,6 +287,17 @@ class cl_help: return self.longOpt def getShortOpt(self,option): + """Из любой опции получить короткую опцию. + + Фильтрация также происходит и по названию команды. + + Параметры: + option запрашиваемая опция + + Возвращаемые параметры: + короткая опция, если же для длинной опции нет короткой, возвращается + пустая строка. + """ # Из любой опции получаем короткую опцию for par in self.data: if par.has_key("shortOption") and self.access(par):