diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/gtex-letter/utils.py |
Initial commit
Diffstat (limited to 'support/gtex-letter/utils.py')
-rw-r--r-- | support/gtex-letter/utils.py | 309 |
1 files changed, 309 insertions, 0 deletions
diff --git a/support/gtex-letter/utils.py b/support/gtex-letter/utils.py new file mode 100644 index 0000000000..214d1ca68c --- /dev/null +++ b/support/gtex-letter/utils.py @@ -0,0 +1,309 @@ +import os, string, sys, ConfigParser +FALSE = 0 +TRUE = -1 + +import error, gettext +import time + +gettext.bindtextdomain('gtex-letter', '/usr/share/locale') +gettext.textdomain('gtex-letter') +_ = gettext.gettext + + +def add_slashes (str): + string.rstrip (str) + return string.replace (str, "\n", "\\\\\n") + +def switch_yesno (mystr, default=FALSE): + # Submit yes, no, true, false, 0, -1 and 1 and this function will return TRUE and FALSE + # Default is FALSE + mystr= str(mystr) + if string.lower(mystr) == 'yes' or string.lower(mystr) == 'true' or mystr == '-1' or mystr == '1': + return TRUE + elif string.lower(mystr) == 'no' or string.lower(mystr) == 'false' or mystr == '0': + return FALSE + else: + return default + +def set_guilevel(str): + # 0 = beginner, 1 = normal, 2=expert + str = string.lower(str) + if str == 'novice' or str == 'beginner' or str == '0': + return 'beginner' + elif str == 'normal' or str == 'intermediate' or str == '1': + return 'normal' + elif str == 'advanced' or str == 'expert' or str == '2': + return 'advanced' + else: + print _("Error: I do not know the guilevel '%s'. Please check spelling.") % str + sys.exit() + +def stripmarks(str): + if str[0] == "'" or str[0] == "\"": + str = str [1:] + if str[-1] == "'" or str[-1] == "\"": + str = str [:-1] + return str + + +def rc_set(section, arg, rc): + try: + val= rc.get(section, arg) + except ConfigParser.NoSectionError: + print _("No section '%s' in config-file. Aborting.") % section + sys.exit() + except ConfigParser.NoOptionError: + print _("No option '%s' in section '%s' of config-file. Aborting.") % arg, section + sys.exit() + return val + +def simplify_txt(text): + # Simplify the text by removing the clauses and variables by setting '...' instead. + # This is used for the buttons + a0 = string.find(text, "[") + a1 = string.find(text, "__") + if a0 == -1: + a = a1 + elif a1 == -1: + a = a0 + else: + a = min(a0,a1) + + if a>0: + return text[0:a] + " ..." + else: + return text + +def get_path(file, *paths): + # if the file can be found in the cwd, this is returned. if not + # the joined filename is returned. + # If you just want to expand a pathname like ~, you just submit ~ as file and no path + if file[0] == '~': + file = os.environ['HOME'] + file[1:] + if not paths and os.path.isdir(file): + return file + if os.path.isfile(file): + return file + else: + for path in paths: + if path: + if path[0] == '~': + path = os.environ['HOME'] + path[1:] + joined=os.path.join(path, file) + if os.path.isfile(joined): + return joined + +def mk_adr(ac, addressformats, mycountry=''): + adr = '' + def mkup_text(text, ac, mycountry=mycountry): + save = text + try: + while 1: + start = string.find(text, "__") + end = string.find(text, "__", start + 1) + if start == -1: + break + key = text[start+2:end] + o_start = string.find(text, '[', 0, end) + end_optrange = string.find(text, "__", end+2) + if end_optrange == -1: + end_optrange = len(text) + o_end = string.find(text, ']', o_start, end_optrange) + if (o_start <> -1) <> (o_end <> -1): + raise error.AddressFormatMalformed, save + sys.exit() + optional = o_start <> -1 + + a = string.replace(text[start:end+2], '__' + key + '__', ac.get_by_name(key)) + + if key == 'country' and a == mycountry and optional: + a = None + + if a: + if optional: + text = text[:o_start] + text[o_start+1:start] \ + + a + text[end+2:o_end] + text[o_end+1:] + else: + text = text[:start] + a + text[end+2:] + else: + if optional: + text = text[:o_start] + text[o_end+1:] + else: + text = text[:start] + a + text[end+2:] + + return text + + except error.AddressFormatMalformed, str: + print _("There is an error in the clause '%s' of the addressformat in the rc-file. Aborting.") % str + sys.exit() + + + for line in addressformats: + line = mkup_text(line, ac) + if line: + adr = adr + line + "\n" + return adr + +def file_strip_path(file): + return os.path.split(file)[1] + +def file_strip_suffix(file): + path = os.path.split(file)[0] + file = os.path.split(file)[1] + file = os.path.splitext(file)[0] + file = os.path.join(path, file) + return file + +def get_path_from_file(file): + return os.path.split(file)[0] + +def guess_filename(letter, rc): + def mkup_text(text, letter, rc): # XXX This routine is very close to mkup_text in mk_adr, + # however, i can not see how i could melt them into one + # The problem is that mycountry-thing among others + while 1: + start = string.find(text, "__") + end = string.find(text, "__", start + 1) + if start == -1: + break + key = text[start+2:end] + o_start = string.find(text, '[', 0, end) + end_optrange = string.find(text, "__", end+2) + if end_optrange == -1: + end_optrange = len(text) + o_end = string.find(text, ']', o_start, end_optrange) + if (o_start <> -1) <> (o_end <> -1): + print "error: there is an error in the guess_filename_format." + sys.exit() + optional = o_start <> -1 + + if key in ('id', 'name_prefix', 'firstname', 'middlename', \ + 'lastname', 'name_suffix', 'extended', 'post_office', \ + 'street', 'zip', 'city', 'region', 'country') and len(letter.addresscards) > 1: + a = 'series' + else: + a = string.replace(text[start:end+2], '__' + key + '__', \ + get_attr_by_name(letter, key, rc)) + if a: + if optional: + text = text[:o_start] + text[o_start+1:start] \ + + a + text[end+2:o_end] + text[o_end+1:] + else: + text = text[:start] + a + text[end+2:] + else: + if optional: + text = text[:o_start] + text[o_end+1:] + else: + text = text[:start] + a + text[end+2:] + + return text + + file = mkup_text(rc.filename_guess_format, letter, rc) + file = string.replace(file, ' ', '_') + file = string.replace(file, ':', '_') + file = string.replace(file, '/', '_') + + file = os.path.join(rc.filename_guess_path, file) + + if file[0] == '~': + file = os.environ['HOME'] + file[1:] + + if len(os.path.split(file)[1]) > 4: + try: + if os.path.isfile(file): + raise error.FileExists, file + except error.FileExists, str: + print "File '%s' exists. It will be overwritten." % str + return file + + +def get_attr_by_name(letter, key, rc, address_counter = 0): + try: + if key in ('id', 'name_prefix', 'firstname', 'middlename', \ + 'lastname', 'name_suffix', 'extended', 'post_office', \ + 'street', 'zip', 'city', 'region', 'country'): + if letter.addresscards: + return letter.addresscards[address_counter].get_by_name(key) + else: + return '' + elif key == 'subject': + return letter.subject + elif key == 'opening': + return letter.opening + elif key == 'closing': + return letter.closing + elif key == 'filename': + return letter.filename + elif key == 'short_filename': + return file_strip_suffix(letter.filename) + elif key == 'date': + return time.strftime(rc.dateformat, time.localtime(time.time())) + else: + raise error.KeyNotSupported, key + except error.KeyNotSupported, str: + print _("Key '%s' not supported.") % str + + +def general_mkup_text(letter, text, rc, address_counter = 0): + while 1: + class clause: + def __init__ (self, clause): + self.clause=clause + def key(self): + if string.find(self.clause, '=') > -1: + return self.clause[0+2:string.find(self.clause, '=')-2] + def param(self): + if string.find(self.clause, '=') > -1: + return stripmarks(self.clause[string.find(self.clause, '=')+1:string.find(self.clause, ':')]) + def value(self): + if string.find(self.clause, ':') > -1: + return stripmarks(self.clause[string.find(self.clause, ':')+1:]) + def check(self, letter, rc, address_counter): + try: + err=FALSE + if not self.key(): + err=TRUE + if not self.param(): + err=TRUE + if not self.value(): + err=TRUE + if get_attr_by_name(letter, self.key(), rc, address_counter)==None: + err=TRUE + if err: + raise error.MalformedClause, self.clause + except error.MalformedClause, clause: + print _("The clause '%s' is malformed. Aborting.") % clause + sys.exit() + while 1: + try: + br_start = string.find(text, "[") + br_end = string.find(text, "]") + if (br_start>-1 and not br_end > -1) \ + or (br_end >-1 and not br_start >-1) \ + or br_start > br_end: + raise error.MalformedClause, text + except error.MalformedClause, clause: + print _("The clause '%s' is malformed. Aborting.") % clause + sys.exit() + + if br_start > -1: + cl = clause(text[br_start+1:br_end]) + cl.check(letter, rc, address_counter) + if get_attr_by_name(letter, cl.key(), rc, address_counter) == cl.param(): + text = text[0:br_start] + cl.value() + text[br_end+1:] + else: + text = text[0:br_start] + text[br_end+1:] + else: + break + + start = string.find(text, "__") + end = string.find(text, "__", start + 1) + if start == -1: + break + + key = text[start+2:end] + + text = string.replace(text, '__' + key + '__', \ + get_attr_by_name(letter, key, rc, address_counter)) + + return text |