develop
mhiretskiy 16 years ago
parent 8eebeb360c
commit d9eda1d274

@ -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):

Loading…
Cancel
Save