develop
mhiretskiy 16 years ago
parent 8eebeb360c
commit d9eda1d274

@ -64,7 +64,7 @@ class cl_help:
""" """
def __init__(self, cmdName): def __init__(self, cmdName):
# ширина консоли взята 80 # ширина консоли взята за 80
# -1 чтобы компенсировать расстрояние между колонками # -1 чтобы компенсировать расстрояние между колонками
self.consolewidth = 79 self.consolewidth = 79
self.column_width = 32 self.column_width = 32
@ -73,6 +73,8 @@ class cl_help:
self.shortOpt = [] self.shortOpt = []
#длинные опции командной строки #длинные опции командной строки
self.longOpt = [] self.longOpt = []
# массив разделов (заполняется в __setParamHelp)
self.chapterBloc = []
#optEnd = "" #optEnd = ""
#if "user" in self.cmdName and not "mod" in self.cmdName: #if "user" in self.cmdName and not "mod" in self.cmdName:
#optEnd = _("user") #optEnd = _("user")
@ -81,7 +83,7 @@ class cl_help:
#self.__setParamHelp() #self.__setParamHelp()
def getChapterNumber(self,NameChapter): def getChapterNumber(self,NameChapter):
# Показать номер раздела по его имени """Получить номер раздела по имени"""
num = 0 num = 0
for i in self.chapter: for i in self.chapter:
if i[0] == NameChapter: if i[0] == NameChapter:
@ -90,91 +92,104 @@ class cl_help:
return False return False
def __setParamHelp(self): def __setParamHelp(self):
"""Внутренняя функция формирования справки по данным
Перебирает все элементы списка data, проверяет их на доступность
данной программы, разбирает опции на среди data и формирует
для по ним справку.
"""
# сформировать нужное количество блоков раздела # сформировать нужное количество блоков раздела
self.chapterBloc = [""]*len(self.chapter) self.chapterBloc = [""]*len(self.chapter)
# #
sp = [] sp = {}
# перебираем все элементы справки i = 0
# перебираем все элементы справки собираем элементы опции
# так же формируем разделы не опции
for par in self.data: for par in self.data:
# если у элемента есть коротка опция, # перебираем только те опции, которые принадлежат команде
if par.has_key("shortOption"): if self.access(par):
# проверям подходит ли данный элемент программе (progAccess) # есть короткая (возможно есть и длинная)
if self.access(par): if par.has_key("shortOption"):
# добавляем в предварительный массив короткую опцию sp[par["shortOption"]] = i
sp.append(par["shortOption"]) # есть только длинная опция
# если elif par.has_key("longOption"):
elif par.has_key("longOption"): sp[par["longOption"]] = i
if self.access(par): # формирование разделов не опций
sp.append(par["longOption"]) else:
#sp.sort() helpTxt = par['help']
numChapter = self.getChapterNumber(par['helpChapter'])
self.addChapterHelp(numChapter,helpTxt)
i += 1
# перебираем все "собранные" опции # перебираем все "собранные" опции
for shortOption in sp: # опции перебираются по порядку в списке date
for par in self.data: # для сортировки по ключам следует применить код:
if par.has_key("shortOption") and self.access(par): # for index in sorted(sp.keys()):
if par["shortOption"] == shortOption: # par = self.data[sp[index]]
numChapter = self.getChapterNumber(par['helpChapter']) for index in sorted(sp.values()):
if par.has_key("longOption"): par = self.data[index]
if par.has_key("optVal"): numChapter = self.getChapterNumber(par['helpChapter'])
longOption = par["longOption"] + " " +\ # если есть и короткая и длинная
par["optVal"] if "shortOption" in par and "longOption" in par:
else: paraminfo = "-%s, --%s "%(par["shortOption"],par["longOption"])
longOption = par["longOption"] # если есть только короткая
elif "shortOption" in par:
helpTxt = pcs( paraminfo = "-%s "%par["shortOption"]
" -%s, --%s "%(par["shortOption"],longOption), # если только длинная
self.column_width, par['help'], else:
self.consolewidth-self.column_width) paraminfo = "--%s "%par["longOption"]
else: # если указан параметр для опции
helpTxt = pcs( if "optVal" in par:
" -%s "%(par["shortOption"]), optVal = par["optVal"]
self.column_width, par['help'], else:
self.consolewidth-self.column_width) optVal = ""
self.addChapterHelp(numChapter,helpTxt)
break # вывод вида: " [-o, ][--option] [PARAM]" "helpstring"
elif par.has_key("longOption") and self.access(par): helpTxt = pcs(" "+paraminfo+optVal, self.column_width, \
if par["longOption"] == shortOption: par['help'], self.consolewidth-self.column_width)
numChapter = self.getChapterNumber(par['helpChapter']) # добавить строку в нужный раздел
longOption = par["longOption"] self.addChapterHelp(numChapter,helpTxt)
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)
def getHelp(self, optionsChapters=False): def getHelp(self, optionsChapters=False):
"""Выдать справку.
Выдает справку в случае если указан optionsChapters, то фильтрует по
типу разделов.
Параметры:
optionsChapters Flase или список опциональных разделов для
отображения
Возвращаемые параметры:
Строка со справкой.
"""
# Выдать справку # Выдать справку
help = "" help = ""
for numChapter in range(len(self.chapter)): # перебираем все элементы справочных блоков
chapter = self.chapter[numChapter] iterChapterBloc = iter(self.chapterBloc)
typeChapter = chapter[4] # перебираем все разделы по параметрам
nameChapter = chapter[0] for (nameChapter, visibleChapter, beforeStrChapter, \
afterStrChapter, typeChapter) in self.chapter:
# получаем следующий блок (т.о. textChapterBloc соответ, chapter)
textChapterBloc = iterChapterBloc.next()
# если тип раздела опциональный
if optionsChapters and typeChapter=="options": if optionsChapters and typeChapter=="options":
# проверяем нужно ли его отображать
if not (nameChapter in optionsChapters): if not (nameChapter in optionsChapters):
continue continue
visibleChapter = chapter[1] bef = "\n"*beforeStrChapter
beforeStrChapter = chapter[2] aft = "\n"*afterStrChapter
afterStrChapter = chapter[3]
bef = ""
for i in range(beforeStrChapter):
bef += "\n"
aft = ""
for i in range(afterStrChapter):
aft += "\n"
if visibleChapter: if visibleChapter:
help += nameChapter + ": " + bef help += nameChapter + ": " + bef
help += self.chapterBloc[numChapter] + aft help += textChapterBloc + aft
return help.encode("UTF-8") return help.encode("UTF-8")
def addChapterHelp(self, numChapter, helpTxt): def addChapterHelp(self, numChapter, helpTxt):
# Добавить в раздел помощи numChapteк тектстовую строку helpTxt """Добавить в раздел помощи numChapteк тектстовую строку helpTxt
Параметры:
numChapter номер раздела в который нужно добавить данные справки
helpTxt строка, содержащая данные
"""
self.chapterBloc[numChapter] += helpTxt self.chapterBloc[numChapter] += helpTxt
return True return True
@ -184,9 +199,18 @@ class cl_help:
return True return True
def access(self,dataHash): def access(self,dataHash):
"""Доступна ли опция вызывающей программе
Параметры:
dataHash словарь элемент типа self.data
Возвращаемые параметры:
True/False доступна/недоступна
"""
# доступна ли опция вызывающей программе # доступна ли опция вызывающей программе
# опция без progAccess доступна
numProg = self.progName[self.cmdName] numProg = self.progName[self.cmdName]
if dataHash.has_key('progAccess'): if 'progAccess' in dataHash:
if numProg in dataHash['progAccess']: if numProg in dataHash['progAccess']:
return True return True
else: else:
@ -195,21 +219,28 @@ class cl_help:
return True return True
def getTypeChapter(self, nameChapter): def getTypeChapter(self, nameChapter):
"""Показать тип раздела по его имени""" """Получить тип раздела по его имени
flagFind = False
for numChapter in range(len(self.chapter)): Параметры:
chapter = self.chapter[numChapter] nameChapter название раздела
name = chapter[0]
if nameChapter == name: Возвращаемые параметры:
typeChapter = chapter[4] строка тип раздела
flagFind = True Flase(Boolean) такой раздел отсутствует
break """
if flagFind: # фильтруем список по имени раздела, помещаем в список тип раздела
return typeChapter filtered = [typeChapter for name, na, na, na, typeChapter \
in self.chapter if name == nameChapter]
# если среди фильтрованных есть хоть один элемент
if len(filtered) > 0:
# возвращаем - он запрашиваемый
return filtered[0]
else: else:
# такой раздел отсутствует
return False return False
def clearAllOpt(self): def clearAllOpt(self):
"""Очистить все опции, полученные посредством getAllOpt"""
if len(self.shortOpt) > 0: if len(self.shortOpt) > 0:
self.shortOpt = [] self.shortOpt = []
if len(self.longOpt) > 0: if len(self.longOpt) > 0:
@ -217,6 +248,15 @@ class cl_help:
return True return True
def getAllOpt(self,typeOpt="short", optionsChapters=False): def getAllOpt(self,typeOpt="short", optionsChapters=False):
"""Получить все доступные опции
Параметры:
typeOpt 'short'/'long', вернуть короткие или длинные опции
optionsChapters фильтр для опций по типам разделов (список,кортеж)
Возвращаемые параметры:
строка коротки или список строк длинных опций ('hb:c:wg:G:k:ms:u:')
"""
# Выдать все действующие опции # Выдать все действующие опции
if typeOpt=="short": if typeOpt=="short":
if len(self.shortOpt) == 0: if len(self.shortOpt) == 0:
@ -247,6 +287,17 @@ class cl_help:
return self.longOpt return self.longOpt
def getShortOpt(self,option): def getShortOpt(self,option):
"""Из любой опции получить короткую опцию.
Фильтрация также происходит и по названию команды.
Параметры:
option запрашиваемая опция
Возвращаемые параметры:
короткая опция, если же для длинной опции нет короткой, возвращается
пустая строка.
"""
# Из любой опции получаем короткую опцию # Из любой опции получаем короткую опцию
for par in self.data: for par in self.data:
if par.has_key("shortOption") and self.access(par): if par.has_key("shortOption") and self.access(par):

Loading…
Cancel
Save