diff --git a/gramps/plugins/textreport/descendreport.py b/gramps/plugins/textreport/descendreport.py index 301ada5bd..9711f8868 100644 --- a/gramps/plugins/textreport/descendreport.py +++ b/gramps/plugins/textreport/descendreport.py @@ -4,10 +4,10 @@ # Copyright (C) 2000-2007 Donald N. Allingham # Copyright (C) 2007-2012 Brian G. Matherly # Copyright (C) 2009 Gary Burton -# Copyright (C) 2010 Craig J. Anderson # Copyright (C) 2010 Jakim Friant # Copyright (C) 2011 Matt Keenan (matt.keenan@gmail.com) # Copyright (C) 2013-2014 Paul Franklin +# Copyright (C) 2010,2015 Craig J. Anderson # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -58,10 +58,74 @@ from gramps.gen.proxy import CacheProxyDb from gramps.gen.display.place import displayer as _pd from gramps.gen.display.name import displayer as _nd +#------------------------------------------------------------------------ +# +# PrintDAboville +# +#------------------------------------------------------------------------ +class PrintDAboville(): + """ D'Aboville numbering system """ + + def __init__(self): + self.num = [0] + + def number(self, level): + """ Make the current number based upon the current level """ + # Set up the array based on the current level + while len(self.num) > level: # We can go from a level 8 to level 2 + self.num.pop() + if len(self.num) < level: + self.num.append(0) + + # Increment the current level - initalized with 0 + self.num[-1] += 1 + + # Display + return ".".join(map(str, self.num)) + + +#------------------------------------------------------------------------ +# +# PrintHenry +# +#------------------------------------------------------------------------ +class PrintHenry(): + """ Henry numbering system """ + + def __init__(self, modified=False): + self.henry = "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + self.modified = modified + self.num = [0] + + def number(self, level): + """ Make the current number based upon the current level """ + # Set up the array based on the current level + while len(self.num) > level: # We can go from a level 8 to level 2 + self.num.pop() + if len(self.num) < level: + self.num.append(0) + + # Incriment the current level - initalized with 0 + self.num[-1] += 1 + + def strd(inti): + """ no change needed """ + return "(" + str(inti) + ")" + + # Display + if self.modified is False: + return "".join(map( + lambda x: self.henry[x-1] if x <= len(self.henry) else strd(x) + , self.num)) + else: + return "".join(map( + lambda x: str(x) if x < 10 else strd(x) + , self.num)) + + #------------------------------------------------------------------------ # # PrintSimple -# Simple numbering system # #------------------------------------------------------------------------ class PrintSimple: @@ -373,6 +437,12 @@ class DescendantReport(Report): numbering = menu.get_option_by_name('numbering').get_value() if numbering == "Simple": obj = PrintSimple(self._showdups) + elif numbering == "Henry": + obj = PrintHenry() + elif numbering == "Modified Henry": + obj = PrintHenry(modified=True) + elif numbering == "D'Aboville": + obj = PrintDAboville() elif numbering == "de Villiers/Pama": obj = PrintVilliers() elif numbering == "Meurgey de Tupigny": @@ -439,6 +509,9 @@ class DescendantOptions(MenuReportOptions): numbering = EnumeratedListOption(_("Numbering system"), "Simple") numbering.set_items([ ("Simple", _("Simple numbering")), + ("D'Aboville", _("D'Aboville numbering")), + ("Henry", _("Henry numbering")), + ("Modified Henry", _("Modified Henry numbering")), ("de Villiers/Pama", _("de Villiers/Pama numbering")), ("Meurgey de Tupigny", _("Meurgey de Tupigny numbering"))]) numbering.set_help(_("The numbering system to be used")) diff --git a/gramps/plugins/textreport/detdescendantreport.py b/gramps/plugins/textreport/detdescendantreport.py index 5b60690fd..33c4c36e7 100644 --- a/gramps/plugins/textreport/detdescendantreport.py +++ b/gramps/plugins/textreport/detdescendantreport.py @@ -13,6 +13,7 @@ # Copyright (C) 2011 Matt Keenan # Copyright (C) 2011 Tim G L Lyons # Copyright (C) 2013-2014 Paul Franklin +# Copyright (C) 2015 Craig J. Anderson # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -225,8 +226,33 @@ class DetDescendantReport(Report): pid+HENRY[index], cur_gen+1) index += 1 - # Filter for d'Aboville numbering + def apply_mhenry_filter(self, person_handle, index, pid, cur_gen=1): + """ Filter for Modified Henry numbering """ + def mhenry(): + """ convenience finction """ + return str(index) if index < 10 else "(" + str(index) + ")" + if (not person_handle) or (cur_gen > self.max_generations): + return + self.dnumber[person_handle] = pid + self.map[index] = person_handle + + if len(self.gen_keys) < cur_gen: + self.gen_keys.append([index]) + else: + self.gen_keys[cur_gen-1].append(index) + + person = self._db.get_person_from_handle(person_handle) + index = 1 + for family_handle in person.get_family_handle_list(): + family = self._db.get_family_from_handle(family_handle) + for child_ref in family.get_child_ref_list(): + _ix = max(self.map) + self.apply_henry_filter(child_ref.ref, _ix+1, + pid+mhenry(), cur_gen+1) + index += 1 + def apply_daboville_filter(self, person_handle, index, pid, cur_gen=1): + """ Filter for d'Aboville numbering """ if (not person_handle) or (cur_gen > self.max_generations): return self.dnumber[person_handle] = pid @@ -282,6 +308,8 @@ class DetDescendantReport(Report): """ if self.numbering == "Henry": self.apply_henry_filter(self.center_person.get_handle(), 1, "1") + elif self.numbering == "Modified Henry": + self.apply_mhenry_filter(self.center_person.get_handle(), 1, "1") elif self.numbering == "d'Aboville": self.apply_daboville_filter(self.center_person.get_handle(), 1, "1") elif self.numbering == "Record (Modified Register)": @@ -944,6 +972,7 @@ class DetDescendantOptions(MenuReportOptions): numbering = EnumeratedListOption(_("Numbering system"), "Henry") numbering.set_items([ ("Henry", _("Henry numbering")), + ("Modified Henry", _("Modified Henry numbering")), ("d'Aboville", _("d'Aboville numbering")), ("Record (Modified Register)", _("Record (Modified Register) numbering"))])